@loxia/imx-viewer 13.3.3 → 13.3.4-240910125838820

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -104,6 +104,9 @@ Met de onderstaande css kan de default breedte van een clickarea aangepast worde
104
104
 
105
105
  ### <!--next.version--> <!--next.release-date-->
106
106
 
107
+ ### 13.3.4 09-09-2024
108
+ * PITS-616 svg presentatie fix voor hoogte en slepen
109
+
107
110
  ### 13.3.3 26-08-2024
108
111
  * PITS-617 Pits needs to store and reset scroll position, so pan event emitted from imx-viewer.
109
112
 
@@ -82,17 +82,23 @@ export declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy
82
82
  static ɵfac: i0.ɵɵFactoryDeclaration<ImxViewerComponent, never>;
83
83
  static ɵcmp: i0.ɵɵComponentDeclaration<ImxViewerComponent, "imx-viewer", never, { "useClickArea": { "alias": "useClickArea"; "required": false; }; "inlineDgnCssImport": { "alias": "inlineDgnCssImport"; "required": false; }; "svgInfo": { "alias": "svgInfo"; "required": false; }; "selectieInfos": { "alias": "selectieInfos"; "required": false; }; "clickableIds": { "alias": "clickableIds"; "required": false; }; "rightClickableIds": { "alias": "rightClickableIds"; "required": false; }; "popoverInfos": { "alias": "popoverInfos"; "required": false; }; "zoomScaleSensitivity": { "alias": "zoomScaleSensitivity"; "required": false; }; "autoAlignSvgsHorizontally": { "alias": "autoAlignSvgsHorizontally"; "required": false; }; "initialPanAndZoom": { "alias": "initialPanAndZoom"; "required": false; }; }, { "clickHandler": "clickHandler"; "rightClickHandler": "rightClickHandler"; "svgLoaded": "svgLoaded"; "panned": "panned"; }, never, never, false, never>;
84
84
  }
85
- interface XandYEnabled {
86
- x: boolean;
87
- y: boolean;
85
+ export interface XandYPanBehaviour {
86
+ x: PanBehaviour;
87
+ y: PanBehaviour;
88
+ }
89
+ export declare enum PanBehaviour {
90
+ DONT_PAN = 0,
91
+ PAN = 1,
92
+ LIMIT_PAN_TO_VIEWPORT = 2
88
93
  }
89
94
  export declare class ImxViewerBehaviourApi {
90
95
  private readonly svgPanZoomRef;
91
96
  constructor(svgPanZoomRef: SvgInstance);
92
97
  pan(x: number, y: number): this;
93
98
  enableZoom(zoomEnabled: boolean): this;
94
- enablePan(panEnabled: boolean | XandYEnabled): this;
99
+ enablePan(panBehaviour: XandYPanBehaviour): this;
100
+ private determineYPan;
101
+ private determineXPan;
95
102
  fit(): this;
96
103
  center(): this;
97
104
  }
98
- export {};
@@ -403,6 +403,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
403
403
  type: HostListener,
404
404
  args: ['window:resize']
405
405
  }] } });
406
+ export var PanBehaviour;
407
+ (function (PanBehaviour) {
408
+ PanBehaviour[PanBehaviour["DONT_PAN"] = 0] = "DONT_PAN";
409
+ PanBehaviour[PanBehaviour["PAN"] = 1] = "PAN";
410
+ PanBehaviour[PanBehaviour["LIMIT_PAN_TO_VIEWPORT"] = 2] = "LIMIT_PAN_TO_VIEWPORT";
411
+ })(PanBehaviour || (PanBehaviour = {}));
406
412
  export class ImxViewerBehaviourApi {
407
413
  constructor(svgPanZoomRef) {
408
414
  this.svgPanZoomRef = svgPanZoomRef;
@@ -415,10 +421,47 @@ export class ImxViewerBehaviourApi {
415
421
  this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);
416
422
  return this;
417
423
  }
418
- enablePan(panEnabled) {
419
- this.svgPanZoomRef.setBeforePan(() => panEnabled);
424
+ enablePan(panBehaviour) {
425
+ this.svgPanZoomRef.setBeforePan((oldPan, newPan) => {
426
+ // Computed variables
427
+ const sizes = this.svgPanZoomRef.getSizes();
428
+ const viewBox = sizes.viewBox;
429
+ return {
430
+ x: this.determineXPan(newPan, panBehaviour, viewBox, sizes, oldPan),
431
+ y: this.determineYPan(newPan, panBehaviour, viewBox, sizes, oldPan)
432
+ };
433
+ });
420
434
  return this;
421
435
  }
436
+ determineYPan(newPan, panBehaviour, viewBox, sizes, oldPan) {
437
+ switch (panBehaviour.y) {
438
+ case PanBehaviour.LIMIT_PAN_TO_VIEWPORT:
439
+ {
440
+ const gutterHeight = 400;
441
+ const topLimit = -((viewBox.y + viewBox.height) * sizes.realZoom) + gutterHeight;
442
+ const bottomLimit = sizes.height - gutterHeight - (viewBox.y * sizes.realZoom);
443
+ return Math.max(topLimit, Math.min(bottomLimit, newPan.y));
444
+ }
445
+ case PanBehaviour.DONT_PAN:
446
+ return oldPan.y;
447
+ default:
448
+ return newPan.y;
449
+ }
450
+ }
451
+ determineXPan(newPan, panBehaviour, viewBox, sizes, oldPan) {
452
+ switch (panBehaviour.x) {
453
+ case PanBehaviour.LIMIT_PAN_TO_VIEWPORT: {
454
+ const gutterWidth = 400;
455
+ const leftLimit = -((viewBox.x + viewBox.width) * sizes.realZoom) + gutterWidth;
456
+ const rightLimit = sizes.width - gutterWidth - (viewBox.x * sizes.realZoom);
457
+ return Math.max(leftLimit, Math.min(rightLimit, newPan.x));
458
+ }
459
+ case PanBehaviour.DONT_PAN:
460
+ return oldPan.x;
461
+ default:
462
+ return newPan.x;
463
+ }
464
+ }
422
465
  fit() {
423
466
  this.svgPanZoomRef.fit();
424
467
  return this;
@@ -428,4 +471,4 @@ export class ImxViewerBehaviourApi {
428
471
  return this;
429
472
  }
430
473
  }
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW14LXZpZXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbXgtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsVUFBVSxJQUFJLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVdoRCxNQUFNLE9BQU8sa0JBQWtCO0lBeUMzQixZQUM0QyxRQUFhLEVBQ3BDLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxVQUE2QixFQUM3QixRQUFtQixFQUNuQixxQkFBNEM7UUFMckIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsYUFB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Q0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxHQUFHO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mLCB0aHJvd0Vycm9yIGFzIG9ic2VydmFibGVUaHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCBTdmdQYW5ab29tIGZyb20gJ3N2Zy1wYW4tem9vbSc7XHJcbmltcG9ydCB7IFBhbkV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvcGFuLWV2ZW50JztcclxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludCc7XHJcbmltcG9ydCB7IFBvcG92ZXJJbmZvIH0gZnJvbSAnLi4vbW9kZWwvcG9wb3Zlci1pbmZvJztcclxuaW1wb3J0IHsgU2VsZWN0aWVFdmVudCB9IGZyb20gJy4uL21vZGVsL3NlbGVjdGllLWV2ZW50JztcclxuaW1wb3J0IHsgU2VsZWN0aWVJbmZvIH0gZnJvbSAnLi4vbW9kZWwvc2VsZWN0aWUtaW5mbyc7XHJcbmltcG9ydCB7IFN2Z0luZm8gfSBmcm9tICcuLi9tb2RlbC9zdmctaW5mbyc7XHJcbmltcG9ydCB7IENsaWNrYXJlYVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbGlja2FyZWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFB1aWNIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHVpYy1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENsYXNzZXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2xhc3Nlcy11dGlsJztcclxuaW1wb3J0IHsgRG9jdW1lbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2RvY3VtZW50LXRva2VuJztcclxuaW1wb3J0IHsgRm9jdXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXMtdXRpbCc7XHJcbmltcG9ydCB7IFN2Z0Nvb3JkaW5hdGVzU2VydmljZSB9IGZyb20gJy4vc3ZnLWNvb3JkaW5hdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gU3ZnUGFuWm9vbS5JbnN0YW5jZSBjYW5ub3QgYmUgdXNlZCBpbiBsaWJzIHRoYXQgdXNlIHRoaXMgaW14LXZpZXdlciBsaWIgYmVjYXVzZSBpdCBpcyBleHBvcnRlZCBpbiBhbiBvbGQsIG5vbiBhbmd1bGFyIDE2IGNvbXBhdGlibGUgd2F5LlxyXG5leHBvcnQgdHlwZSBTdmdJbnN0YW5jZSA9IHR5cGVvZiBTdmdQYW5ab29tO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2lteC12aWV3ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vaW14LXZpZXdlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBTVkdfQkFTRTY0X1BSRUZJWCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XHJcbiAgICBwcml2YXRlIFNWR19QUkVGSVggPSAnZGF0YTppbWFnZS9zdmcreG1sLCc7XHJcblxyXG4gICAgQElucHV0KCkgdXNlQ2xpY2tBcmVhID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBpbmxpbmVEZ25Dc3NJbXBvcnQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHN2Z0luZm86IFN2Z0luZm9bXTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGllSW5mb3M6IFNlbGVjdGllSW5mb1tdID0gW107XHJcblxyXG4gICAgLy8gT25kZXJzdGFhbmRlIGlucHV0cyB3b3JkZW4gbWVlZ2Vub21lbiB2b29yIGNsaWNrYXJlYTpcclxuICAgIEBJbnB1dCgpIGNsaWNrYWJsZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIHJpZ2h0Q2xpY2thYmxlSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgcG9wb3ZlckluZm9zOiBQb3BvdmVySW5mb1tdID0gW107XHJcbiAgICBASW5wdXQoKSB6b29tU2NhbGVTZW5zaXRpdml0eSA9IDAuMjtcclxuICAgIEBJbnB1dCgpIGF1dG9BbGlnblN2Z3NIb3Jpem9udGFsbHkgPSBmYWxzZTtcclxuICAgIC8vVXNlIHRoaXMgaW5wdXQgdG8gY2hhbmdlIHRoZSBpbml0aWFsIHBhbiBhbmQgem9vbSBvZiB0aGUgc3ZnLiBEZWZhdWx0IGJlaGF2aW91ciBpcyAuZml0KCkgYW5kIC5jZW50ZXIoKS5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxQYW5BbmRab29tID0gKGlteFZpZXdlckJlaGF2aW91ckFwaTogSW14Vmlld2VyQmVoYXZpb3VyQXBpKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaW14Vmlld2VyQmVoYXZpb3VyQXBpLmZpdCgpO1xyXG4gICAgICAgIGlteFZpZXdlckJlaGF2aW91ckFwaS5jZW50ZXIoKTtcclxuICAgIH07XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc3ZnUGFyZW50JywgeyBzdGF0aWM6IHRydWUgfSkgc3ZnUGFyZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGVycm9ycyA9IGZhbHNlO1xyXG4gICAgcG9wb3ZlclN0eWxlOiBhbnkgPSB7IGRpc3BsYXk6ICdpbmxpbmUnIH07XHJcbiAgICBwb3BvdmVySHRtbENvbnRlbnQgPSAnJztcclxuICAgIHBvcG92ZXJUaXRsZUNvbnRlbnQ6IHN0cmluZztcclxuICAgIHBhcmVudFdpZHRoID0gMDtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcblxyXG4gICAgQE91dHB1dCgpIGNsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSByaWdodENsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBzdmdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgICAvL0JlIG1pbmRmdWwgdGhhdCB0aGUgcGFuLWV2ZW50IG9jY3VycyBvZnRlbi4gQ2F0Y2ggaXQgd2l0aCBhIHRpbWVvdXQgaWYgeW91IGRvIGhlYXZ5IHByb2Nlc3NpbmdcclxuICAgIEBPdXRwdXQoKSBwYW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhbkV2ZW50PigpO1xyXG5cclxuICAgIHByaXZhdGUgc3ZnR2VsYWRlbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogTWFwPHN0cmluZywgTWFwPEVsZW1lbnQsIGFueT4+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBzdmdQYW5ab29tUmVmOiBTdmdJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChEb2N1bWVudFRva2VuKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpY2tBcmVhU2VydmljZTogQ2xpY2thcmVhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1aWNIZWxwZXI6IFB1aWNIZWxwZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN2Z0Nvb3JkaW5hdGVzU2VydmljZTogU3ZnQ29vcmRpbmF0ZXNTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdmdQYW5ab29tUmVmSWZOb3RFeGlzdHMoKTtcclxuICAgICAgICB0aGlzLnB1aWNIZWxwZXIuc2V0Um9vdFN2Zyh0aGlzLmdldFN2Z1BhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICAgIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVEaW1lbnNpb25zRm9yQ2xpcFBhdGgoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHBhcmVudFdpZHRoIGFuZCBwYXJlbnRIZWlnaHQgYmFzZWQgb24gdGhlIHBhcmVudCBkaXYgZGltZW5zaW9uc1xyXG4gICAgICAgIHRoaXMucGFyZW50V2lkdGggPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRIZWlnaHQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBJbXgtdmlld2VyIGlzIGluaXRpYWxpemVkIHdpdGggc3ZnSW5mbywgbmdPbkNoYW5nZXMgaXMgY2FsbGVkIGJlZm9yZSBuZ09uSW5pdC5cclxuICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjcmVhdGUgc3ZnUGFuWm9vbVJlZiBoZXJlLlxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgdXNlQ2xpY2tBcmVhLCBjbGlja2FibGVJZHMsIHJpZ2h0Q2xpY2thYmxlSWRzLCBwb3BvdmVySW5mb3MsIHNlbGVjdGllSW5mb3MsIHN2Z0luZm8gfSA9IGNoYW5nZXM7XHJcblxyXG4gICAgICAgIGlmICh1c2VDbGlja0FyZWEgfHwgY2xpY2thYmxlSWRzIHx8IHJpZ2h0Q2xpY2thYmxlSWRzIHx8IHBvcG92ZXJJbmZvcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3ZnSW5mbyAmJiBzdmdJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkU3ZncygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2thYmxlSWRzICYmIGNsaWNrYWJsZUlkcyAmJiB0aGlzLnN2Z0dlbGFkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnRzKHRoaXMuY2xpY2thYmxlSWRzLCAnY2xpY2snKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0Q2xpY2thYmxlSWRzICYmIHJpZ2h0Q2xpY2thYmxlSWRzICYmIHRoaXMuc3ZnR2VsYWRlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpZUluZm9zICYmIHNlbGVjdGllSW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RWxlbWVudHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJJbmZvcyAmJiBwb3BvdmVySW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTW91c2VvdmVyRXZlbnRIYW5kbGVyVG9FbGVtZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWY/LmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvY3VzT25JZHMoZm9jdXNJZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgRm9jdXNVdGlsLmZvY3VzT25JZHMoZm9jdXNJZHMsIHRoaXMuc3ZnUGFuWm9vbVJlZiwgdGhpcy5wdWljSGVscGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3ZnUGFuWm9vbUluc3RhbmNlOiAoKSA9PiBTdmdJbnN0YW5jZSA9ICgpID0+IHRoaXMuc3ZnUGFuWm9vbVJlZjtcclxuXHJcbiAgICAvLyBIZXJlIG9ubHkgdXNlZCBpbiB0ZXN0LCBidXQgYWxzbyB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gRG8gbm90IHJlbW92ZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0WENvb3JkaW5hdGUoZGVjb2RlZFN2Z0RhdGFVcmw6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBkZWNvZGVkU3ZnRGF0YVVybDtcclxuICAgICAgICAvLyBEZSBTVkctd2lkdGggd29yZHQgaW4gZGUgc3ZnIHRhZyBnZXNwZWNpZmljZWVyZC5cclxuICAgICAgICBjb25zdCB4ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHgpO1xyXG4gICAgICAgIGRpdiA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlUG9wT3ZlciA9ICgpOiBzdHJpbmcgPT4gdGhpcy5wb3BvdmVyU3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zdmdQYW5ab29tUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZiA9IFN2Z1Bhblpvb20odGhpcy5nZXRTdmdQYXJlbnQoKSwge1xyXG4gICAgICAgICAgICAgICAgem9vbVNjYWxlU2Vuc2l0aXZpdHk6IHRoaXMuem9vbVNjYWxlU2Vuc2l0aXZpdHksXHJcbiAgICAgICAgICAgICAgICBmaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2VudGVyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZGJsQ2xpY2tab29tRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBvblpvb206ICgpID0+IHRoaXMuaGlkZVBvcE92ZXIoKSxcclxuICAgICAgICAgICAgICAgIG9uUGFuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUG9wT3ZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFubmVkLmVtaXQoeyB4OiB0aGlzLnN2Z1Bhblpvb21SZWYuZ2V0UGFuKCkueCwgeTogdGhpcy5zdmdQYW5ab29tUmVmLmdldFBhbigpLnkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uVXBkYXRlZENUTTogKCkgPT4gdGhpcy51cGRhdGVDbGlwUGF0aCgpLFxyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFJhdGU6ICdhdXRvJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkU3R5bGVUb1Jvb3RTdmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDbGlwUGF0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5nZXRWaXNpYmxlQXJlYSgpO1xyXG4gICAgICAgIGlmICghYXJlYSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdGhlIGNsaXBQYXRoXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpcFJlY3QgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnF1ZXJ5U2VsZWN0b3IoJyNjbGlwLXBhdGggcmVjdCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShjbGlwUmVjdCwgJ3gnLCBTdHJpbmcoYXJlYS54KSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAneScsIFN0cmluZyhhcmVhLnkpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoY2xpcFJlY3QsICd3aWR0aCcsIFN0cmluZyhhcmVhLndpZHRoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAnaGVpZ2h0JywgU3RyaW5nKGFyZWEuaGVpZ2h0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQXJlYSgpOiBBcmVhIHtcclxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5nZXRTdmdQYW5ab29tSW5zdGFuY2UoKT8uZ2V0Wm9vbSgpO1xyXG4gICAgICAgIGNvbnN0IHBhbiA9IHRoaXMuZ2V0U3ZnUGFuWm9vbUluc3RhbmNlKCk/LmdldFBhbigpO1xyXG5cclxuICAgICAgICBpZiAoIXpvb20gfHwgIXBhbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBCZXBhYWwgZ3Jvb3R0ZSB2YW4gdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVdpZHRoID0gdGhpcy5wYXJlbnRXaWR0aCAvIHpvb207XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUhlaWdodCA9IHRoaXMucGFyZW50SGVpZ2h0IC8gem9vbTtcclxuXHJcbiAgICAgICAgLy8gQmVwYWFsIGhldCBudWxwdW50IChsaW5rc2JvdmVuKSB2YW4gZGUgdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVggPSAtcGFuLnggLyB6b29tO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVZID0gLXBhbi55IC8gem9vbTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmlzaWJsZVgsIHk6IHZpc2libGVZLCB3aWR0aDogdmlzaWJsZVdpZHRoLCBoZWlnaHQ6IHZpc2libGVIZWlnaHQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0eWxlIHdvcmR0IHZhbnVpdCBqYXZhc2NyaXB0IHRvZWdldm9lZ2QgbmEgZGUgY3JlYXRlIHZhbiBTdmdab29tUGFuUmVmIGRlemUgbWFha3QgZWVuIHZpZXdwb3J0IGFhbi5cclxuICAgICAqIC0gQ2xpY2thcmVhIENTUyB3b3JkdCBkeW5hbWlzY2ggYWFuIGRlIFNWRyB0b2VnZXZvZWdkLCBkaXQgdm9vcmtvbXQgZGF0IGRhdCBlciBuZ2NvbnRlbnQgcHJvcGVydHkgb3AgZ2VwbGFhdHN0IHdvcmR0LlxyXG4gICAgICogICBEZSBTVkcncyB3b3JkZW4gbmlldCB2b29yemllbiB2YW4gbmdjb250ZW50IGF0dHJpYnV1dC5cclxuICAgICAqIC0gREdOLmNzcyBpbXBvcnQgd29yZHQgKG9wdGlvbmVlbCkgaW4gZGUgcm9vdCBTVkcgb3BnZW5vbWVuLCBkZXplIGlzIGVlcnN0IHZlcndpamRlcmQgdWl0IGRlIFNWRydzLiBPbSBtZWVyZGVyZSBpbXBvcnRzIHRlIHZvb3Jrb21lbi5cclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGFkZFN0eWxlVG9Sb290U3ZnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN2Z1BhcmVudCgpLmZpcnN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdkZWZzJykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdkZWZzJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmlubGluZURnbkNzc0ltcG9ydCA/ICdAaW1wb3J0IHVybChcImRnbi5jc3NcIik7XFxuJyA6ICcnO1xyXG4gICAgICAgICAgICBzdHlsZSArPVxyXG4gICAgICAgICAgICAgICAgYC5pbXh2aWV3LXNlbGVjdGVkID4gcG9seWxpbmUuaW14dmlldy1jbGlja2FyZWEsIHBvbHlsaW5lLmlteHZpZXctY2xpY2thcmVhIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IHZhcigtLWlteHZpZXctY2xpY2thcmVhLXN0cm9rZSwgdHJhbnNwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aDogdmFyKC0taW14dmlldy1jbGlja2FyZWEtc3Ryb2tlLXdpZHRoLCAxMHB4KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lO1xyXG4gICAgICAgICAgICAgICAgfWA7XHJcbiAgICAgICAgICAgIGRlZnMuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgICAgIDxzdHlsZT4gJHsgc3R5bGUgfSA8L3N0eWxlPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcC1wYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB4PVwiMFwiIHdpZHRoPSR7IHRoaXMucGFyZW50V2lkdGggfSBoZWlnaHQ9JHsgdGhpcy5wYXJlbnRIZWlnaHQgfT5cclxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnRDaGlsZCA9IHRoaXMuZ2V0U3ZnUGFyZW50KCkuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ZnUGFyZW50KCkuaW5zZXJ0QmVmb3JlKGRlZnMsIGZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZURpbWVuc2lvbnNGb3JDbGlwUGF0aCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3ZncygpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuc3ZnSW5mby5tYXAoc3ZnSW5mbyA9PiB0aGlzLmxvYWRTdmcoc3ZnSW5mby5zdmcpKSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3ZncyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmNvbmNhdGVuYXRlU3ZncyhzdmdzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9tKHN2Zyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0dlbGFkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdmdMb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50cyh0aGlzLmNsaWNrYWJsZUlkcywgJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1vdXNlb3ZlckV2ZW50SGFuZGxlclRvRWxlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHRoaXMuZmxhZ0Vycm9ycyhlcnJvcilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN2ZyhzdmdTcmM6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHN2Z1NyYy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgIGlmIChzdmdTcmMuc3RhcnRzV2l0aCh0aGlzLlNWR19CQVNFNjRfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhdG9iKHN2Z1NyYy5zdWJzdHJpbmcodGhpcy5TVkdfQkFTRTY0X1BSRUZJWC5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRocm93RXJyb3IoJ0RhdGEtdXJsIHBhcnNlIGVycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ZnU3JjLnN0YXJ0c1dpdGgodGhpcy5TVkdfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VkID0gc3ZnU3JjLnN1YnN0cmluZyh0aGlzLlNWR19QUkVGSVgubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihwYXJzZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChzdmdTcmMsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnQobGlzdGVuZXJzOiBNYXA8RWxlbWVudCwgYW55PiwgZWxlbSwgZXZlbnRUeXBlOiBzdHJpbmcsIHB1aWM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1BbHJlYWR5SGFzTGlzdGVuZXIgPSBsaXN0ZW5lcnMuZ2V0KGVsZW0pO1xyXG4gICAgICAgIGlmICghZWxlbUFscmVhZHlIYXNMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmbiA9IGV2ZW50VHlwZSA9PT0gJ2NsaWNrJyA/XHJcbiAgICAgICAgICAgICAgICAoZSkgPT4gdGhpcy5jbGlja0hhbmRsZXIuZW1pdChuZXcgU2VsZWN0aWVFdmVudChwdWljLCBlKSkgOlxyXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENsaWNrSGFuZGxlci5lbWl0KG5ldyBTZWxlY3RpZUV2ZW50KHB1aWMsIGUpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHMoY2xpY2thYmxlSWRzOiBzdHJpbmdbXSwgZXZlbnR0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU9sZExpc3RlbmVycyhldmVudHR5cGUpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKGNsaWNrYWJsZUlkcykge1xyXG4gICAgICAgICAgICBjbGlja2FibGVJZHMuZm9yRWFjaChwdWljID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhwdWljKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50KGxpc3RlbmVycywgZWxlbWVudCwgZXZlbnR0eXBlLCBwdWljKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnNldChldmVudHR5cGUsIGxpc3RlbmVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3VzZW92ZXJFdmVudEhhbmRsZXJUb0VsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT2xkTGlzdGVuZXJzKCdtb3VzZW92ZXInKTtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckluZm9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckluZm9zLmZvckVhY2gocG9wb3ZlckluZm8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcG92ZXJJbmZvLnB1aWNBcnJheS5mb3JFYWNoKHB1aWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbXMgPSB0aGlzLnB1aWNIZWxwZXIuZ2V0QWxsRWxlbWVudHNGb3JQdWljKHB1aWMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVySHRtbENvbnRlbnQgPSBwb3BvdmVySW5mby5wb3BvdmVySHRtbENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wb3ZlclRpdGxlQ29udGVudCA9IHBvcG92ZXJJbmZvLnBvcG92ZXJUaXRsZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGltZW91dCB0byBoYXZlIGNvbnRlbnQgcmVuZGVyZWQgYmVmb3JlIGdldHRpbmcgc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvd1BvcHVwKGUpLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXMuaXRlbShpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KCdtb3VzZW92ZXInLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmNhdGVuYXRlU3ZncyhzdmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHN2Z0NvbnRlbnQgPSAnJztcclxuICAgICAgICBsZXQgc3ZnSW5mbyA9IHRoaXMuc3ZnSW5mbztcclxuICAgICAgICBpZiAodGhpcy5hdXRvQWxpZ25TdmdzSG9yaXpvbnRhbGx5KSB7XHJcbiAgICAgICAgICAgIHN2Z0luZm8gPSB0aGlzLnN2Z0Nvb3JkaW5hdGVzU2VydmljZS5zdmdJbmZvc1dpdGhDb29yZGluYXRlcyhzdmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN2Z0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBzdmdJbmZvW2ldLmNvb3JkaW5hdGVzIHx8IG5ldyBQb2ludCgwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAgICAgLyoqIFZlcndpamRlciBkZ24uY3NzIGltcG9ydCB1aXQgZ2VsZXZlcmRlIFNWRydzLlxyXG4gICAgICAgICAgICAgKiAgRGUgaW1wb3J0IHdvcmR0IG9wdGlvbmVlbCAoc3RhbmRhYXJkIGFhbikgaW4gZGUgcm9vdCBTVkcgZ2VwbGFhdHMgb20gdGUgdm9vcmtvbWVuIGRhdCBkZSBpbXBvcnQgbWVlcm1hYWxzIGdlYmV1cmQuXHJcbiAgICAgICAgICAgICAqICB6aWUgYWRkU3R5bGVUb1Jvb3RTdmcoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IHN2Z3NbaV0ucmVwbGFjZSgnQGltcG9ydCB1cmwoXCJkZ24uY3NzXCIpOycsICcnKTtcclxuICAgICAgICAgICAgZGl2LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgneCcsIHNvdXJjZUNvb3JkaW5hdGVzLngudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIGRpdi5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3knLCBzb3VyY2VDb29yZGluYXRlcy55LnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgc3ZnQ29udGVudCArPSBkaXYuaW5uZXJIVE1MO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z0NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmbGFnRXJyb3JzKGVycm9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZU9sZExpc3RlbmVycyhldmVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoZm4sIGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ2NsaWNrJylcclxuICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgSW14Vmlld2VyQ29tcG9uZW50LnNldERlZmF1bHRDdXJzb3IoZWwpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50VHlwZSwgbmV3IE1hcCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEVsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEVsZW1zID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3MqPWlteHZpZXctc2VsZWN0ZWRdJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFsbEVsZW1zKSB7XHJcbiAgICAgICAgICAgIENsYXNzZXNVdGlsLnJlbW92ZUNsYXNzZXNTdGFydGluZ1dpdGgoZWxlbWVudCwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGllSW5mb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RpZUluZm9zLmZvckVhY2goc2VsZWN0aWVJbmZvID0+IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGllSW5mby5pZHMuZm9yRWFjaChpZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhpZCkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Nlc1V0aWwuYWRkQ2xhc3MoZWxlbSwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcnICE9PSBzZWxlY3RpZUluZm8uY2xhenopIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzZXNVdGlsLmFkZENsYXNzKGVsZW0sICdpbXh2aWV3LXNlbGVjdGVkLScgKyBzZWxlY3RpZUluZm8uY2xhenopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHNldERlZmF1bHRDdXJzb3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG91ZGVTdHlsZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICByZXR1cm4gb3VkZVN0eWxlID8gb3VkZVN0eWxlLnJlcGxhY2UoJ3BvaW50ZXInLCAnZGVmYXVsdCcpIDogJ2N1cnNvcjogZGVmYXVsdCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93UG9wdXAoZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcG92ZXInKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gZS5sYXllclggLSAocG9wb3ZlckVsZW0ud2lkdGggLyAyKSArICdweCc7XHJcbiAgICAgICAgY29uc3QgdG9wID0gZS5sYXllclkgLSAocG9wb3ZlckVsZW0uaGVpZ2h0ICsgOCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLCB2aXNpYmlsaXR5OiAndmlzaWJsZSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRG9tKHN2Zzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N2Zy1wYW4tem9vbV92aWV3cG9ydCcpWzBdO1xyXG4gICAgICAgIHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGlwLXBhdGgnLCAndXJsKCNjbGlwLXBhdGgpJyk7XHJcbiAgICAgICAgc3ZnUGFuWm9vbVZpZXdwb3J0RWxlbWVudC5pbm5lckhUTUwgPSBzdmcuc3Vic3RyaW5nKHN2Zy5pbmRleE9mKCc8c3ZnJykpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYudXBkYXRlQkJveCgpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYucmVzaXplKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsUGFuQW5kWm9vbShuZXcgSW14Vmlld2VyQmVoYXZpb3VyQXBpKHRoaXMuc3ZnUGFuWm9vbVJlZikpO1xyXG4gICAgICAgIHRoaXMucHVpY0hlbHBlci5zZXRSb290U3ZnKHRoaXMuZ2V0U3ZnUGFyZW50KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsYXllZENsaWNrQXJlYUNyZWF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN2Z0dlbGFkZW4gJiYgdGhpcy51c2VDbGlja0FyZWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2thcmVhSWRzID0gbmV3IFNldChbLi4udGhpcy5jbGlja2FibGVJZHMsIC4uLnRoaXMucmlnaHRDbGlja2FibGVJZHMsXHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBvcG92ZXJJbmZvcy5mbGF0TWFwKHBpID0+IHBpLnB1aWNBcnJheSldKTtcclxuICAgICAgICAgICAgdGhpcy5jbGlja0FyZWFTZXJ2aWNlLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbihjbGlja2FyZWFJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN2Z1BhcmVudCA9ICgpID0+IHRoaXMuc3ZnUGFyZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcmVhIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIFhhbmRZRW5hYmxlZCB7XHJcbiAgICB4OiBib29sZWFuO1xyXG4gICAgeTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckJlaGF2aW91ckFwaSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN2Z1Bhblpvb21SZWY6IFN2Z0luc3RhbmNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5wYW4obmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlWm9vbSh6b29tRW5hYmxlZDogYm9vbGVhbik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5zZXRCZWZvcmVab29tKCgpID0+IHpvb21FbmFibGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlUGFuKHBhbkVuYWJsZWQ6IGJvb2xlYW4gfCBYYW5kWUVuYWJsZWQpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuc2V0QmVmb3JlUGFuKCgpID0+IHBhbkVuYWJsZWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmaXQoKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmZpdCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjZW50ZXIoKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmNlbnRlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJpbXh2aWV3ZXJcIiBkYXRhLXRlc3QtaWQ9XCJpbXgtdmlld2VyXCI+XG4gICAgPGRpdiBpZD1cInN2Z0NvbnRhaW5lclwiIGNsYXNzPVwiY29sLW1kLTEyIHRvcDEwXCIgW2hpZGRlbl09XCJlcnJvcnNcIiAoY2xpY2spPVwiaGlkZVBvcE92ZXIoKVwiIGRhdGEtdGVzdC1pZD1cInN2Zy1jb250YWluZXJcIj5cbiAgICAgICAgPHN2ZyAjc3ZnUGFyZW50IHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwicG9wb3ZlclwiIGNsYXNzPVwicG9wb3ZlciB0b3AgYnMtcG9wb3Zlci10b3BcIiBbbmdTdHlsZV09XCJwb3BvdmVyU3R5bGVcIiAobW91c2VsZWF2ZSk9XCJoaWRlUG9wT3ZlcigpXCIgZGF0YS10ZXN0LWlkPVwicG9wb3ZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj5cbiAgICAgICAgPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIiAqbmdJZj1cInBvcG92ZXJUaXRsZUNvbnRlbnQgIT09IHVuZGVmaW5lZFwiIFtpbm5lckhUTUxdPVwicG9wb3ZlclRpdGxlQ29udGVudFwiIGRhdGEtdGVzdC1pZD1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiIFtpbm5lckhUTUxdPVwicG9wb3Zlckh0bWxDb250ZW50XCIgZGF0YS10ZXN0LWlkPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
474
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW14LXZpZXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbXgtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsVUFBVSxJQUFJLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVdoRCxNQUFNLE9BQU8sa0JBQWtCO0lBeUMzQixZQUM0QyxRQUFhLEVBQ3BDLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxVQUE2QixFQUM3QixRQUFtQixFQUNuQixxQkFBNEM7UUFMckIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsYUFB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QUksQ0FBQztJQUNoQixDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mLCB0aHJvd0Vycm9yIGFzIG9ic2VydmFibGVUaHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCBTdmdQYW5ab29tIGZyb20gJ3N2Zy1wYW4tem9vbSc7XHJcbmltcG9ydCB7IFBhbkV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvcGFuLWV2ZW50JztcclxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludCc7XHJcbmltcG9ydCB7IFBvcG92ZXJJbmZvIH0gZnJvbSAnLi4vbW9kZWwvcG9wb3Zlci1pbmZvJztcclxuaW1wb3J0IHsgU2VsZWN0aWVFdmVudCB9IGZyb20gJy4uL21vZGVsL3NlbGVjdGllLWV2ZW50JztcclxuaW1wb3J0IHsgU2VsZWN0aWVJbmZvIH0gZnJvbSAnLi4vbW9kZWwvc2VsZWN0aWUtaW5mbyc7XHJcbmltcG9ydCB7IFN2Z0luZm8gfSBmcm9tICcuLi9tb2RlbC9zdmctaW5mbyc7XHJcbmltcG9ydCB7IENsaWNrYXJlYVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbGlja2FyZWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFB1aWNIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHVpYy1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENsYXNzZXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2xhc3Nlcy11dGlsJztcclxuaW1wb3J0IHsgRG9jdW1lbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2RvY3VtZW50LXRva2VuJztcclxuaW1wb3J0IHsgRm9jdXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXMtdXRpbCc7XHJcbmltcG9ydCB7IFN2Z0Nvb3JkaW5hdGVzU2VydmljZSB9IGZyb20gJy4vc3ZnLWNvb3JkaW5hdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gU3ZnUGFuWm9vbS5JbnN0YW5jZSBjYW5ub3QgYmUgdXNlZCBpbiBsaWJzIHRoYXQgdXNlIHRoaXMgaW14LXZpZXdlciBsaWIgYmVjYXVzZSBpdCBpcyBleHBvcnRlZCBpbiBhbiBvbGQsIG5vbiBhbmd1bGFyIDE2IGNvbXBhdGlibGUgd2F5LlxyXG5leHBvcnQgdHlwZSBTdmdJbnN0YW5jZSA9IHR5cGVvZiBTdmdQYW5ab29tO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2lteC12aWV3ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vaW14LXZpZXdlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBTVkdfQkFTRTY0X1BSRUZJWCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XHJcbiAgICBwcml2YXRlIFNWR19QUkVGSVggPSAnZGF0YTppbWFnZS9zdmcreG1sLCc7XHJcblxyXG4gICAgQElucHV0KCkgdXNlQ2xpY2tBcmVhID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBpbmxpbmVEZ25Dc3NJbXBvcnQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHN2Z0luZm86IFN2Z0luZm9bXTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGllSW5mb3M6IFNlbGVjdGllSW5mb1tdID0gW107XHJcblxyXG4gICAgLy8gT25kZXJzdGFhbmRlIGlucHV0cyB3b3JkZW4gbWVlZ2Vub21lbiB2b29yIGNsaWNrYXJlYTpcclxuICAgIEBJbnB1dCgpIGNsaWNrYWJsZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIHJpZ2h0Q2xpY2thYmxlSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgcG9wb3ZlckluZm9zOiBQb3BvdmVySW5mb1tdID0gW107XHJcbiAgICBASW5wdXQoKSB6b29tU2NhbGVTZW5zaXRpdml0eSA9IDAuMjtcclxuICAgIEBJbnB1dCgpIGF1dG9BbGlnblN2Z3NIb3Jpem9udGFsbHkgPSBmYWxzZTtcclxuICAgIC8vVXNlIHRoaXMgaW5wdXQgdG8gY2hhbmdlIHRoZSBpbml0aWFsIHBhbiBhbmQgem9vbSBvZiB0aGUgc3ZnLiBEZWZhdWx0IGJlaGF2aW91ciBpcyAuZml0KCkgYW5kIC5jZW50ZXIoKS5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxQYW5BbmRab29tID0gKGlteFZpZXdlckJlaGF2aW91ckFwaTogSW14Vmlld2VyQmVoYXZpb3VyQXBpKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaW14Vmlld2VyQmVoYXZpb3VyQXBpLmZpdCgpO1xyXG4gICAgICAgIGlteFZpZXdlckJlaGF2aW91ckFwaS5jZW50ZXIoKTtcclxuICAgIH07XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc3ZnUGFyZW50JywgeyBzdGF0aWM6IHRydWUgfSkgc3ZnUGFyZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGVycm9ycyA9IGZhbHNlO1xyXG4gICAgcG9wb3ZlclN0eWxlOiBhbnkgPSB7IGRpc3BsYXk6ICdpbmxpbmUnIH07XHJcbiAgICBwb3BvdmVySHRtbENvbnRlbnQgPSAnJztcclxuICAgIHBvcG92ZXJUaXRsZUNvbnRlbnQ6IHN0cmluZztcclxuICAgIHBhcmVudFdpZHRoID0gMDtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcblxyXG4gICAgQE91dHB1dCgpIGNsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSByaWdodENsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBzdmdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgICAvL0JlIG1pbmRmdWwgdGhhdCB0aGUgcGFuLWV2ZW50IG9jY3VycyBvZnRlbi4gQ2F0Y2ggaXQgd2l0aCBhIHRpbWVvdXQgaWYgeW91IGRvIGhlYXZ5IHByb2Nlc3NpbmdcclxuICAgIEBPdXRwdXQoKSBwYW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhbkV2ZW50PigpO1xyXG5cclxuICAgIHByaXZhdGUgc3ZnR2VsYWRlbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogTWFwPHN0cmluZywgTWFwPEVsZW1lbnQsIGFueT4+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBzdmdQYW5ab29tUmVmOiBTdmdJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChEb2N1bWVudFRva2VuKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpY2tBcmVhU2VydmljZTogQ2xpY2thcmVhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1aWNIZWxwZXI6IFB1aWNIZWxwZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN2Z0Nvb3JkaW5hdGVzU2VydmljZTogU3ZnQ29vcmRpbmF0ZXNTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdmdQYW5ab29tUmVmSWZOb3RFeGlzdHMoKTtcclxuICAgICAgICB0aGlzLnB1aWNIZWxwZXIuc2V0Um9vdFN2Zyh0aGlzLmdldFN2Z1BhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICAgIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVEaW1lbnNpb25zRm9yQ2xpcFBhdGgoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHBhcmVudFdpZHRoIGFuZCBwYXJlbnRIZWlnaHQgYmFzZWQgb24gdGhlIHBhcmVudCBkaXYgZGltZW5zaW9uc1xyXG4gICAgICAgIHRoaXMucGFyZW50V2lkdGggPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRIZWlnaHQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBJbXgtdmlld2VyIGlzIGluaXRpYWxpemVkIHdpdGggc3ZnSW5mbywgbmdPbkNoYW5nZXMgaXMgY2FsbGVkIGJlZm9yZSBuZ09uSW5pdC5cclxuICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjcmVhdGUgc3ZnUGFuWm9vbVJlZiBoZXJlLlxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgdXNlQ2xpY2tBcmVhLCBjbGlja2FibGVJZHMsIHJpZ2h0Q2xpY2thYmxlSWRzLCBwb3BvdmVySW5mb3MsIHNlbGVjdGllSW5mb3MsIHN2Z0luZm8gfSA9IGNoYW5nZXM7XHJcblxyXG4gICAgICAgIGlmICh1c2VDbGlja0FyZWEgfHwgY2xpY2thYmxlSWRzIHx8IHJpZ2h0Q2xpY2thYmxlSWRzIHx8IHBvcG92ZXJJbmZvcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3ZnSW5mbyAmJiBzdmdJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkU3ZncygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2thYmxlSWRzICYmIGNsaWNrYWJsZUlkcyAmJiB0aGlzLnN2Z0dlbGFkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnRzKHRoaXMuY2xpY2thYmxlSWRzLCAnY2xpY2snKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0Q2xpY2thYmxlSWRzICYmIHJpZ2h0Q2xpY2thYmxlSWRzICYmIHRoaXMuc3ZnR2VsYWRlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpZUluZm9zICYmIHNlbGVjdGllSW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RWxlbWVudHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJJbmZvcyAmJiBwb3BvdmVySW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTW91c2VvdmVyRXZlbnRIYW5kbGVyVG9FbGVtZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWY/LmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvY3VzT25JZHMoZm9jdXNJZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgRm9jdXNVdGlsLmZvY3VzT25JZHMoZm9jdXNJZHMsIHRoaXMuc3ZnUGFuWm9vbVJlZiwgdGhpcy5wdWljSGVscGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3ZnUGFuWm9vbUluc3RhbmNlOiAoKSA9PiBTdmdJbnN0YW5jZSA9ICgpID0+IHRoaXMuc3ZnUGFuWm9vbVJlZjtcclxuXHJcbiAgICAvLyBIZXJlIG9ubHkgdXNlZCBpbiB0ZXN0LCBidXQgYWxzbyB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gRG8gbm90IHJlbW92ZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0WENvb3JkaW5hdGUoZGVjb2RlZFN2Z0RhdGFVcmw6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBkZWNvZGVkU3ZnRGF0YVVybDtcclxuICAgICAgICAvLyBEZSBTVkctd2lkdGggd29yZHQgaW4gZGUgc3ZnIHRhZyBnZXNwZWNpZmljZWVyZC5cclxuICAgICAgICBjb25zdCB4ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHgpO1xyXG4gICAgICAgIGRpdiA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlUG9wT3ZlciA9ICgpOiBzdHJpbmcgPT4gdGhpcy5wb3BvdmVyU3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zdmdQYW5ab29tUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZiA9IFN2Z1Bhblpvb20odGhpcy5nZXRTdmdQYXJlbnQoKSwge1xyXG4gICAgICAgICAgICAgICAgem9vbVNjYWxlU2Vuc2l0aXZpdHk6IHRoaXMuem9vbVNjYWxlU2Vuc2l0aXZpdHksXHJcbiAgICAgICAgICAgICAgICBmaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2VudGVyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZGJsQ2xpY2tab29tRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBvblpvb206ICgpID0+IHRoaXMuaGlkZVBvcE92ZXIoKSxcclxuICAgICAgICAgICAgICAgIG9uUGFuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUG9wT3ZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFubmVkLmVtaXQoeyB4OiB0aGlzLnN2Z1Bhblpvb21SZWYuZ2V0UGFuKCkueCwgeTogdGhpcy5zdmdQYW5ab29tUmVmLmdldFBhbigpLnkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uVXBkYXRlZENUTTogKCkgPT4gdGhpcy51cGRhdGVDbGlwUGF0aCgpLFxyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFJhdGU6ICdhdXRvJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkU3R5bGVUb1Jvb3RTdmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDbGlwUGF0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5nZXRWaXNpYmxlQXJlYSgpO1xyXG4gICAgICAgIGlmICghYXJlYSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdGhlIGNsaXBQYXRoXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpcFJlY3QgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnF1ZXJ5U2VsZWN0b3IoJyNjbGlwLXBhdGggcmVjdCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShjbGlwUmVjdCwgJ3gnLCBTdHJpbmcoYXJlYS54KSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAneScsIFN0cmluZyhhcmVhLnkpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoY2xpcFJlY3QsICd3aWR0aCcsIFN0cmluZyhhcmVhLndpZHRoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAnaGVpZ2h0JywgU3RyaW5nKGFyZWEuaGVpZ2h0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQXJlYSgpOiBBcmVhIHtcclxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5nZXRTdmdQYW5ab29tSW5zdGFuY2UoKT8uZ2V0Wm9vbSgpO1xyXG4gICAgICAgIGNvbnN0IHBhbiA9IHRoaXMuZ2V0U3ZnUGFuWm9vbUluc3RhbmNlKCk/LmdldFBhbigpO1xyXG5cclxuICAgICAgICBpZiAoIXpvb20gfHwgIXBhbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBCZXBhYWwgZ3Jvb3R0ZSB2YW4gdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVdpZHRoID0gdGhpcy5wYXJlbnRXaWR0aCAvIHpvb207XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUhlaWdodCA9IHRoaXMucGFyZW50SGVpZ2h0IC8gem9vbTtcclxuXHJcbiAgICAgICAgLy8gQmVwYWFsIGhldCBudWxwdW50IChsaW5rc2JvdmVuKSB2YW4gZGUgdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVggPSAtcGFuLnggLyB6b29tO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVZID0gLXBhbi55IC8gem9vbTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmlzaWJsZVgsIHk6IHZpc2libGVZLCB3aWR0aDogdmlzaWJsZVdpZHRoLCBoZWlnaHQ6IHZpc2libGVIZWlnaHQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0eWxlIHdvcmR0IHZhbnVpdCBqYXZhc2NyaXB0IHRvZWdldm9lZ2QgbmEgZGUgY3JlYXRlIHZhbiBTdmdab29tUGFuUmVmIGRlemUgbWFha3QgZWVuIHZpZXdwb3J0IGFhbi5cclxuICAgICAqIC0gQ2xpY2thcmVhIENTUyB3b3JkdCBkeW5hbWlzY2ggYWFuIGRlIFNWRyB0b2VnZXZvZWdkLCBkaXQgdm9vcmtvbXQgZGF0IGRhdCBlciBuZ2NvbnRlbnQgcHJvcGVydHkgb3AgZ2VwbGFhdHN0IHdvcmR0LlxyXG4gICAgICogICBEZSBTVkcncyB3b3JkZW4gbmlldCB2b29yemllbiB2YW4gbmdjb250ZW50IGF0dHJpYnV1dC5cclxuICAgICAqIC0gREdOLmNzcyBpbXBvcnQgd29yZHQgKG9wdGlvbmVlbCkgaW4gZGUgcm9vdCBTVkcgb3BnZW5vbWVuLCBkZXplIGlzIGVlcnN0IHZlcndpamRlcmQgdWl0IGRlIFNWRydzLiBPbSBtZWVyZGVyZSBpbXBvcnRzIHRlIHZvb3Jrb21lbi5cclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGFkZFN0eWxlVG9Sb290U3ZnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN2Z1BhcmVudCgpLmZpcnN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdkZWZzJykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdkZWZzJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmlubGluZURnbkNzc0ltcG9ydCA/ICdAaW1wb3J0IHVybChcImRnbi5jc3NcIik7XFxuJyA6ICcnO1xyXG4gICAgICAgICAgICBzdHlsZSArPVxyXG4gICAgICAgICAgICAgICAgYC5pbXh2aWV3LXNlbGVjdGVkID4gcG9seWxpbmUuaW14dmlldy1jbGlja2FyZWEsIHBvbHlsaW5lLmlteHZpZXctY2xpY2thcmVhIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IHZhcigtLWlteHZpZXctY2xpY2thcmVhLXN0cm9rZSwgdHJhbnNwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aDogdmFyKC0taW14dmlldy1jbGlja2FyZWEtc3Ryb2tlLXdpZHRoLCAxMHB4KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lO1xyXG4gICAgICAgICAgICAgICAgfWA7XHJcbiAgICAgICAgICAgIGRlZnMuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgICAgIDxzdHlsZT4gJHsgc3R5bGUgfSA8L3N0eWxlPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcC1wYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB4PVwiMFwiIHdpZHRoPSR7IHRoaXMucGFyZW50V2lkdGggfSBoZWlnaHQ9JHsgdGhpcy5wYXJlbnRIZWlnaHQgfT5cclxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnRDaGlsZCA9IHRoaXMuZ2V0U3ZnUGFyZW50KCkuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ZnUGFyZW50KCkuaW5zZXJ0QmVmb3JlKGRlZnMsIGZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZURpbWVuc2lvbnNGb3JDbGlwUGF0aCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3ZncygpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuc3ZnSW5mby5tYXAoc3ZnSW5mbyA9PiB0aGlzLmxvYWRTdmcoc3ZnSW5mby5zdmcpKSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3ZncyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmNvbmNhdGVuYXRlU3ZncyhzdmdzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9tKHN2Zyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0dlbGFkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdmdMb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50cyh0aGlzLmNsaWNrYWJsZUlkcywgJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1vdXNlb3ZlckV2ZW50SGFuZGxlclRvRWxlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHRoaXMuZmxhZ0Vycm9ycyhlcnJvcilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN2ZyhzdmdTcmM6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHN2Z1NyYy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgIGlmIChzdmdTcmMuc3RhcnRzV2l0aCh0aGlzLlNWR19CQVNFNjRfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhdG9iKHN2Z1NyYy5zdWJzdHJpbmcodGhpcy5TVkdfQkFTRTY0X1BSRUZJWC5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRocm93RXJyb3IoJ0RhdGEtdXJsIHBhcnNlIGVycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ZnU3JjLnN0YXJ0c1dpdGgodGhpcy5TVkdfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VkID0gc3ZnU3JjLnN1YnN0cmluZyh0aGlzLlNWR19QUkVGSVgubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihwYXJzZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChzdmdTcmMsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnQobGlzdGVuZXJzOiBNYXA8RWxlbWVudCwgYW55PiwgZWxlbSwgZXZlbnRUeXBlOiBzdHJpbmcsIHB1aWM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1BbHJlYWR5SGFzTGlzdGVuZXIgPSBsaXN0ZW5lcnMuZ2V0KGVsZW0pO1xyXG4gICAgICAgIGlmICghZWxlbUFscmVhZHlIYXNMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmbiA9IGV2ZW50VHlwZSA9PT0gJ2NsaWNrJyA/XHJcbiAgICAgICAgICAgICAgICAoZSkgPT4gdGhpcy5jbGlja0hhbmRsZXIuZW1pdChuZXcgU2VsZWN0aWVFdmVudChwdWljLCBlKSkgOlxyXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENsaWNrSGFuZGxlci5lbWl0KG5ldyBTZWxlY3RpZUV2ZW50KHB1aWMsIGUpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHMoY2xpY2thYmxlSWRzOiBzdHJpbmdbXSwgZXZlbnR0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU9sZExpc3RlbmVycyhldmVudHR5cGUpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKGNsaWNrYWJsZUlkcykge1xyXG4gICAgICAgICAgICBjbGlja2FibGVJZHMuZm9yRWFjaChwdWljID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhwdWljKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50KGxpc3RlbmVycywgZWxlbWVudCwgZXZlbnR0eXBlLCBwdWljKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnNldChldmVudHR5cGUsIGxpc3RlbmVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3VzZW92ZXJFdmVudEhhbmRsZXJUb0VsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT2xkTGlzdGVuZXJzKCdtb3VzZW92ZXInKTtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckluZm9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckluZm9zLmZvckVhY2gocG9wb3ZlckluZm8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcG92ZXJJbmZvLnB1aWNBcnJheS5mb3JFYWNoKHB1aWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbXMgPSB0aGlzLnB1aWNIZWxwZXIuZ2V0QWxsRWxlbWVudHNGb3JQdWljKHB1aWMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVySHRtbENvbnRlbnQgPSBwb3BvdmVySW5mby5wb3BvdmVySHRtbENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wb3ZlclRpdGxlQ29udGVudCA9IHBvcG92ZXJJbmZvLnBvcG92ZXJUaXRsZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGltZW91dCB0byBoYXZlIGNvbnRlbnQgcmVuZGVyZWQgYmVmb3JlIGdldHRpbmcgc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvd1BvcHVwKGUpLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXMuaXRlbShpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KCdtb3VzZW92ZXInLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmNhdGVuYXRlU3ZncyhzdmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHN2Z0NvbnRlbnQgPSAnJztcclxuICAgICAgICBsZXQgc3ZnSW5mbyA9IHRoaXMuc3ZnSW5mbztcclxuICAgICAgICBpZiAodGhpcy5hdXRvQWxpZ25TdmdzSG9yaXpvbnRhbGx5KSB7XHJcbiAgICAgICAgICAgIHN2Z0luZm8gPSB0aGlzLnN2Z0Nvb3JkaW5hdGVzU2VydmljZS5zdmdJbmZvc1dpdGhDb29yZGluYXRlcyhzdmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN2Z0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBzdmdJbmZvW2ldLmNvb3JkaW5hdGVzIHx8IG5ldyBQb2ludCgwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAgICAgLyoqIFZlcndpamRlciBkZ24uY3NzIGltcG9ydCB1aXQgZ2VsZXZlcmRlIFNWRydzLlxyXG4gICAgICAgICAgICAgKiAgRGUgaW1wb3J0IHdvcmR0IG9wdGlvbmVlbCAoc3RhbmRhYXJkIGFhbikgaW4gZGUgcm9vdCBTVkcgZ2VwbGFhdHMgb20gdGUgdm9vcmtvbWVuIGRhdCBkZSBpbXBvcnQgbWVlcm1hYWxzIGdlYmV1cmQuXHJcbiAgICAgICAgICAgICAqICB6aWUgYWRkU3R5bGVUb1Jvb3RTdmcoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IHN2Z3NbaV0ucmVwbGFjZSgnQGltcG9ydCB1cmwoXCJkZ24uY3NzXCIpOycsICcnKTtcclxuICAgICAgICAgICAgZGl2LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgneCcsIHNvdXJjZUNvb3JkaW5hdGVzLngudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIGRpdi5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3knLCBzb3VyY2VDb29yZGluYXRlcy55LnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgc3ZnQ29udGVudCArPSBkaXYuaW5uZXJIVE1MO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z0NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmbGFnRXJyb3JzKGVycm9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZU9sZExpc3RlbmVycyhldmVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoZm4sIGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ2NsaWNrJylcclxuICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgSW14Vmlld2VyQ29tcG9uZW50LnNldERlZmF1bHRDdXJzb3IoZWwpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50VHlwZSwgbmV3IE1hcCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEVsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEVsZW1zID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3MqPWlteHZpZXctc2VsZWN0ZWRdJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFsbEVsZW1zKSB7XHJcbiAgICAgICAgICAgIENsYXNzZXNVdGlsLnJlbW92ZUNsYXNzZXNTdGFydGluZ1dpdGgoZWxlbWVudCwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGllSW5mb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RpZUluZm9zLmZvckVhY2goc2VsZWN0aWVJbmZvID0+IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGllSW5mby5pZHMuZm9yRWFjaChpZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhpZCkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Nlc1V0aWwuYWRkQ2xhc3MoZWxlbSwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcnICE9PSBzZWxlY3RpZUluZm8uY2xhenopIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzZXNVdGlsLmFkZENsYXNzKGVsZW0sICdpbXh2aWV3LXNlbGVjdGVkLScgKyBzZWxlY3RpZUluZm8uY2xhenopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHNldERlZmF1bHRDdXJzb3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG91ZGVTdHlsZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICByZXR1cm4gb3VkZVN0eWxlID8gb3VkZVN0eWxlLnJlcGxhY2UoJ3BvaW50ZXInLCAnZGVmYXVsdCcpIDogJ2N1cnNvcjogZGVmYXVsdCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93UG9wdXAoZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcG92ZXInKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gZS5sYXllclggLSAocG9wb3ZlckVsZW0ud2lkdGggLyAyKSArICdweCc7XHJcbiAgICAgICAgY29uc3QgdG9wID0gZS5sYXllclkgLSAocG9wb3ZlckVsZW0uaGVpZ2h0ICsgOCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLCB2aXNpYmlsaXR5OiAndmlzaWJsZSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRG9tKHN2Zzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N2Zy1wYW4tem9vbV92aWV3cG9ydCcpWzBdO1xyXG4gICAgICAgIHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGlwLXBhdGgnLCAndXJsKCNjbGlwLXBhdGgpJyk7XHJcbiAgICAgICAgc3ZnUGFuWm9vbVZpZXdwb3J0RWxlbWVudC5pbm5lckhUTUwgPSBzdmcuc3Vic3RyaW5nKHN2Zy5pbmRleE9mKCc8c3ZnJykpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYudXBkYXRlQkJveCgpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYucmVzaXplKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsUGFuQW5kWm9vbShuZXcgSW14Vmlld2VyQmVoYXZpb3VyQXBpKHRoaXMuc3ZnUGFuWm9vbVJlZikpO1xyXG4gICAgICAgIHRoaXMucHVpY0hlbHBlci5zZXRSb290U3ZnKHRoaXMuZ2V0U3ZnUGFyZW50KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsYXllZENsaWNrQXJlYUNyZWF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN2Z0dlbGFkZW4gJiYgdGhpcy51c2VDbGlja0FyZWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2thcmVhSWRzID0gbmV3IFNldChbLi4udGhpcy5jbGlja2FibGVJZHMsIC4uLnRoaXMucmlnaHRDbGlja2FibGVJZHMsXHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBvcG92ZXJJbmZvcy5mbGF0TWFwKHBpID0+IHBpLnB1aWNBcnJheSldKTtcclxuICAgICAgICAgICAgdGhpcy5jbGlja0FyZWFTZXJ2aWNlLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbihjbGlja2FyZWFJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN2Z1BhcmVudCA9ICgpID0+IHRoaXMuc3ZnUGFyZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcmVhIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBYYW5kWVBhbkJlaGF2aW91ciB7XHJcbiAgICB4OiBQYW5CZWhhdmlvdXI7XHJcbiAgICB5OiBQYW5CZWhhdmlvdXI7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFBhbkJlaGF2aW91ciB7XHJcbiAgICBET05UX1BBTixcclxuICAgIFBBTixcclxuICAgIExJTUlUX1BBTl9UT19WSUVXUE9SVFxyXG59XHJcblxyXG5pbnRlcmZhY2UgVmlld0JveFdpdGhBbGxKU1Byb3BzIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckJlaGF2aW91ckFwaSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN2Z1Bhblpvb21SZWY6IFN2Z0luc3RhbmNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5wYW4obmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlWm9vbSh6b29tRW5hYmxlZDogYm9vbGVhbik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5zZXRCZWZvcmVab29tKCgpID0+IHpvb21FbmFibGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlUGFuKHBhbkJlaGF2aW91cjogWGFuZFlQYW5CZWhhdmlvdXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuc2V0QmVmb3JlUGFuKChvbGRQYW4sIG5ld1BhbikgPT4ge1xyXG4gICAgICAgICAgICAvLyBDb21wdXRlZCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZXMgPSB0aGlzLnN2Z1Bhblpvb21SZWYuZ2V0U2l6ZXMoKTtcclxuICAgICAgICAgICAgY29uc3Qgdmlld0JveCA9IHNpemVzLnZpZXdCb3ggYXMgVmlld0JveFdpdGhBbGxKU1Byb3BzO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHg6IHRoaXMuZGV0ZXJtaW5lWFBhbihuZXdQYW4sIHBhbkJlaGF2aW91ciwgdmlld0JveCwgc2l6ZXMsIG9sZFBhbiksXHJcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmRldGVybWluZVlQYW4obmV3UGFuLCBwYW5CZWhhdmlvdXIsIHZpZXdCb3gsIHNpemVzLCBvbGRQYW4pXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGV0ZXJtaW5lWVBhbihuZXdQYW46IFN2Z1Bhblpvb20uUG9pbnQsIHBhbkJlaGF2aW91cjogWGFuZFlQYW5CZWhhdmlvdXIsIHZpZXdCb3g6IFZpZXdCb3hXaXRoQWxsSlNQcm9wcywgc2l6ZXM6IFN2Z1Bhblpvb20uU2l6ZXMsIG9sZFBhbjogU3ZnUGFuWm9vbS5Qb2ludCk6IG51bWJlciB7XHJcbiAgICAgICAgc3dpdGNoIChwYW5CZWhhdmlvdXIueSkge1xyXG4gICAgICAgICAgICBjYXNlIFBhbkJlaGF2aW91ci5MSU1JVF9QQU5fVE9fVklFV1BPUlQ6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGd1dHRlckhlaWdodCA9IDQwMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExpbWl0ID0gLSgodmlld0JveC55ICsgdmlld0JveC5oZWlnaHQpICogc2l6ZXMucmVhbFpvb20pICsgZ3V0dGVySGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGltaXQgPSBzaXplcy5oZWlnaHQgLSBndXR0ZXJIZWlnaHQgLSAodmlld0JveC55ICogc2l6ZXMucmVhbFpvb20pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRvcExpbWl0LCBNYXRoLm1pbihib3R0b21MaW1pdCwgbmV3UGFuLnkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFBhbkJlaGF2aW91ci5ET05UX1BBTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBvbGRQYW4ueTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXdQYW4ueTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVYUGFuKG5ld1BhbjogU3ZnUGFuWm9vbS5Qb2ludCwgcGFuQmVoYXZpb3VyOiBYYW5kWVBhbkJlaGF2aW91ciwgdmlld0JveDogVmlld0JveFdpdGhBbGxKU1Byb3BzLCBzaXplczogU3ZnUGFuWm9vbS5TaXplcywgb2xkUGFuOiBTdmdQYW5ab29tLlBvaW50KTogbnVtYmVyIHtcclxuICAgICAgICBzd2l0Y2ggKHBhbkJlaGF2aW91ci54KSB7XHJcbiAgICAgICAgICAgIGNhc2UgUGFuQmVoYXZpb3VyLkxJTUlUX1BBTl9UT19WSUVXUE9SVDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3V0dGVyV2lkdGggPSA0MDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0TGltaXQgPSAtKCh2aWV3Qm94LnggKyB2aWV3Qm94LndpZHRoKSAqIHNpemVzLnJlYWxab29tKSArIGd1dHRlcldpZHRoO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHRMaW1pdCA9IHNpemVzLndpZHRoIC0gZ3V0dGVyV2lkdGggLSAodmlld0JveC54ICogc2l6ZXMucmVhbFpvb20pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGxlZnRMaW1pdCwgTWF0aC5taW4ocmlnaHRMaW1pdCwgbmV3UGFuLngpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFBhbkJlaGF2aW91ci5ET05UX1BBTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBvbGRQYW4ueDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXdQYW4ueDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpdCgpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuZml0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNlbnRlcigpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuY2VudGVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBpZD1cImlteHZpZXdlclwiIGRhdGEtdGVzdC1pZD1cImlteC12aWV3ZXJcIj5cbiAgICA8ZGl2IGlkPVwic3ZnQ29udGFpbmVyXCIgY2xhc3M9XCJjb2wtbWQtMTIgdG9wMTBcIiBbaGlkZGVuXT1cImVycm9yc1wiIChjbGljayk9XCJoaWRlUG9wT3ZlcigpXCIgZGF0YS10ZXN0LWlkPVwic3ZnLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3ZnICNzdmdQYXJlbnQgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJwb3BvdmVyXCIgY2xhc3M9XCJwb3BvdmVyIHRvcCBicy1wb3BvdmVyLXRvcFwiIFtuZ1N0eWxlXT1cInBvcG92ZXJTdHlsZVwiIChtb3VzZWxlYXZlKT1cImhpZGVQb3BPdmVyKClcIiBkYXRhLXRlc3QtaWQ9XCJwb3BvdmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PlxuICAgICAgICA8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiICpuZ0lmPVwicG9wb3ZlclRpdGxlQ29udGVudCAhPT0gdW5kZWZpbmVkXCIgW2lubmVySFRNTF09XCJwb3BvdmVyVGl0bGVDb250ZW50XCIgZGF0YS10ZXN0LWlkPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1ib2R5XCIgW2lubmVySFRNTF09XCJwb3BvdmVySHRtbENvbnRlbnRcIiBkYXRhLXRlc3QtaWQ9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -656,6 +656,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
656
656
  type: HostListener,
657
657
  args: ['window:resize']
658
658
  }] } });
659
+ var PanBehaviour;
660
+ (function (PanBehaviour) {
661
+ PanBehaviour[PanBehaviour["DONT_PAN"] = 0] = "DONT_PAN";
662
+ PanBehaviour[PanBehaviour["PAN"] = 1] = "PAN";
663
+ PanBehaviour[PanBehaviour["LIMIT_PAN_TO_VIEWPORT"] = 2] = "LIMIT_PAN_TO_VIEWPORT";
664
+ })(PanBehaviour || (PanBehaviour = {}));
659
665
  class ImxViewerBehaviourApi {
660
666
  constructor(svgPanZoomRef) {
661
667
  this.svgPanZoomRef = svgPanZoomRef;
@@ -668,10 +674,47 @@ class ImxViewerBehaviourApi {
668
674
  this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);
669
675
  return this;
670
676
  }
671
- enablePan(panEnabled) {
672
- this.svgPanZoomRef.setBeforePan(() => panEnabled);
677
+ enablePan(panBehaviour) {
678
+ this.svgPanZoomRef.setBeforePan((oldPan, newPan) => {
679
+ // Computed variables
680
+ const sizes = this.svgPanZoomRef.getSizes();
681
+ const viewBox = sizes.viewBox;
682
+ return {
683
+ x: this.determineXPan(newPan, panBehaviour, viewBox, sizes, oldPan),
684
+ y: this.determineYPan(newPan, panBehaviour, viewBox, sizes, oldPan)
685
+ };
686
+ });
673
687
  return this;
674
688
  }
689
+ determineYPan(newPan, panBehaviour, viewBox, sizes, oldPan) {
690
+ switch (panBehaviour.y) {
691
+ case PanBehaviour.LIMIT_PAN_TO_VIEWPORT:
692
+ {
693
+ const gutterHeight = 400;
694
+ const topLimit = -((viewBox.y + viewBox.height) * sizes.realZoom) + gutterHeight;
695
+ const bottomLimit = sizes.height - gutterHeight - (viewBox.y * sizes.realZoom);
696
+ return Math.max(topLimit, Math.min(bottomLimit, newPan.y));
697
+ }
698
+ case PanBehaviour.DONT_PAN:
699
+ return oldPan.y;
700
+ default:
701
+ return newPan.y;
702
+ }
703
+ }
704
+ determineXPan(newPan, panBehaviour, viewBox, sizes, oldPan) {
705
+ switch (panBehaviour.x) {
706
+ case PanBehaviour.LIMIT_PAN_TO_VIEWPORT: {
707
+ const gutterWidth = 400;
708
+ const leftLimit = -((viewBox.x + viewBox.width) * sizes.realZoom) + gutterWidth;
709
+ const rightLimit = sizes.width - gutterWidth - (viewBox.x * sizes.realZoom);
710
+ return Math.max(leftLimit, Math.min(rightLimit, newPan.x));
711
+ }
712
+ case PanBehaviour.DONT_PAN:
713
+ return oldPan.x;
714
+ default:
715
+ return newPan.x;
716
+ }
717
+ }
675
718
  fit() {
676
719
  this.svgPanZoomRef.fit();
677
720
  return this;
@@ -728,5 +771,5 @@ class SelectieInfo {
728
771
  * Generated bundle index. Do not edit.
729
772
  */
730
773
 
731
- export { ImxViewerBehaviourApi, ImxViewerComponent, ImxViewerModule, Point, PopoverInfo, SelectieEvent, SelectieInfo, SvgInfo };
774
+ export { ImxViewerBehaviourApi, ImxViewerComponent, ImxViewerModule, PanBehaviour, Point, PopoverInfo, SelectieEvent, SelectieInfo, SvgInfo };
732
775
  //# sourceMappingURL=loxia-imx-viewer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"loxia-imx-viewer.mjs","sources":["../../src/model/point.ts","../../src/model/selectie-event.ts","../../src/utils/classes-util.ts","../../src/utils/document-token.ts","../../src/utils/svg-rect-util.ts","../../src/utils/focus-util.ts","../../src/services/puic-helper.service.ts","../../src/services/clickarea.service.ts","../../src/model/svg-info.ts","../../src/components/svg-coordinates.service.ts","../../src/components/imx-viewer.component.ts","../../src/components/imx-viewer.component.html","../../src/imx-viewer.module.ts","../../src/model/popover-info.ts","../../src/model/selectie-info.ts","../../src/loxia-imx-viewer.ts"],"sourcesContent":["export class Point {\r\n constructor(public x: number, public y: number) {\r\n }\r\n}\r\n","export class SelectieEvent {\r\n constructor(public id: string, public event: MouseEvent) {\r\n }\r\n}\r\n","export class ClassesUtil {\n static addClass(elem: Element, cls: string) {\n if ('' === cls) {\n return;\n }\n const classAttr = elem.getAttribute('class');\n const classes = classAttr ? classAttr.split(' ') : [];\n for (let j = 0; j < classes.length; j++) {\n if (classes[j] === cls) {\n return;\n }\n }\n elem.setAttribute('class', classAttr ? classAttr + ' ' + cls : cls);\n }\n\n static removeClassesStartingWith(elem: Element, cls: string) {\n const classAttr = elem.getAttribute('class');\n if (!classAttr) {\n return;\n }\n const classes = classAttr.split(' ');\n let j = classes.length;\n while (j--) {\n if (classes[j].indexOf(cls) === 0) {\n classes.splice(j, 1);\n }\n }\n\n if (classes.length === 0) {\n elem.removeAttribute('class');\n } else {\n elem.setAttribute('class', classes.join(' '));\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const DocumentToken = new InjectionToken('Document');\nexport function documentProvider(): Document {\n return document;\n}\n","export class SvgRectUtil {\n\n // copied from java.awt.Rectangle\n public static rectUnion(r1: SVGRect, r2: SVGRect): SVGRect {\n if (!r1) {\n return r2;\n }\n\n let tx2 = r1.width;\n let ty2 = r1.height;\n if ((tx2 | ty2) < 0) { // tslint:disable-line\n // This rectangle has negative dimensions...\n // If r has non-negative dimensions then it is the answer.\n // If r is non-existant (has a negative dimension), then both\n // are non-existant and we can return any non-existant rectangle\n // as an answer. Thus, returning r meets that criterion.\n // Either way, r is our answer.\n return r2;\n }\n let rx2 = r2.width;\n let ry2 = r2.height;\n if ((rx2 | ry2) < 0) { // tslint:disable-line\n return r1;\n }\n let tx1 = r1.x;\n let ty1 = r1.y;\n tx2 += tx1;\n ty2 += ty1;\n const rx1 = r2.x;\n const ry1 = r2.y;\n rx2 += rx1;\n ry2 += ry1;\n if (tx1 > rx1) {\n tx1 = rx1;\n }\n if (ty1 > ry1) {\n ty1 = ry1;\n }\n if (tx2 < rx2) {\n tx2 = rx2;\n }\n if (ty2 < ry2) {\n ty2 = ry2;\n }\n tx2 -= tx1;\n ty2 -= ty1;\n\n return new DOMRect(tx1, ty1, tx2, ty2);\n }\n}\n","import { SvgInstance } from '../components/imx-viewer.component';\nimport { PuicHelperService } from '../services/puic-helper.service';\nimport { SvgRectUtil } from './svg-rect-util';\n\nexport class FocusUtil {\n\n public static focusOnIds(focusIds: string[], svgPanZoomRef: SvgInstance, puicHelper: PuicHelperService) {\n if (focusIds && focusIds.length > 0) {\n\n // calculate the union rectangle of elements with ids\n const svgContainer = document.getElementById('svgContainer');\n const rootSvgDoc = svgContainer.firstChild as SVGSVGElement;\n let resultRect: SVGRect;\n if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {\n focusIds.forEach(puic => {\n const elems: NodeListOf<HTMLElement> = puicHelper.getAllElementsForPuic(puic);\n for (let i = 0; i < elems.length; i++) {\n const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);\n resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);\n }\n });\n }\n FocusUtil.focusOnRect(resultRect, svgContainer.getBoundingClientRect(), rootSvgDoc, svgPanZoomRef);\n }\n }\n\n static focusOnRect(rect: SVGRect, elementRect: ClientRect, rootSvgDoc: SVGSVGElement, svgPanZoomRef: any) {\n if (rect) {\n // make sure we are in the svgpanzoom transformed area\n const matrix = (rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0] as SVGGElement).getScreenCTM();\n\n // get from svg coordinate system to webpage coordinate system\n const location = rootSvgDoc.createSVGPoint();\n location.x = rect.x + (rect.width / 2);\n location.y = rect.y + (rect.height / 2);\n const transformedLocation = location.matrixTransform(matrix);\n\n // transform the rectangle dimension (we have to use a SVGPoint since there is no SVGDimension)\n const size = rootSvgDoc.createSVGPoint();\n size.x = rect.width;\n size.y = rect.height;\n const transformedSize = size.matrixTransform(matrix.inverse());\n\n // tel the svgPanZoom to zoom on the rectangle in relation to the total view size\n const zoomFactor = Math.min(5, elementRect.height / Math.abs(transformedSize.y));\n svgPanZoomRef.zoomAtPoint(zoomFactor,\n { x: transformedLocation.x - elementRect.left, y: transformedLocation.y - elementRect.top });\n // tel the svgPanZoom to pan to the middel of the rectangle\n svgPanZoomRef.panBy({\n x: (elementRect.width / 2) - transformedLocation.x,\n y: ((elementRect.height + elementRect.top) / 2) - transformedLocation.y\n });\n }\n }\n\n private static getElementRectangleWithNestedSvgOffset(elem: Element): SVGRect {\n const svgElem = (<SVGGraphicsElement> elem);\n const rect = svgElem.getBBox();\n\n while (elem.parentElement.nodeName !== 'svg') {\n elem = elem.parentElement;\n }\n elem = elem.parentElement;\n rect.x = rect.x + parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: any;\n\n public setRootSvg = (svgParent: SVGSVGElement) => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: string) => this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`) as NodeListOf<HTMLElement>;\n}\n","import { Injectable } from '@angular/core';\nimport { PuicHelperService } from './puic-helper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClickareaService {\n private timer: number;\n timeout = 250;\n\n constructor(private puicHelper: PuicHelperService) {\n }\n\n delayedClickAreaCreation(ids: Set<string>) {\n if (ids.size === 0) {\n return;\n }\n\n window.clearTimeout(this.timer);\n this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);\n }\n\n /**\n * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids\n */\n private createClickareas(ids: Set<string>) {\n Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());\n\n ids.forEach(id => {\n this.puicHelper.getAllElementsForPuic(id).forEach(element => {\n if (element) {\n const polylines = Array.from(element.getElementsByTagName('polyline'));\n polylines.forEach(p => {\n const clone = p.cloneNode(true) as Element;\n clone.setAttribute('class', 'imxview-clickarea');\n clone.removeAttribute('id');\n element.insertBefore(clone, p);\n });\n }\n });\n });\n }\n}\n","import { Point } from './point';\r\n\r\nexport class SvgInfo {\r\n constructor(public svg: string, public coordinates?: Point) {\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Point } from '../model/point';\nimport { SvgInfo } from '../model/svg-info';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SvgCoordinatesService {\n svgInfosWithCoordinates(svgs: string[]): SvgInfo[] {\n let nextCoords = new Point(0, 0);\n const infos: SvgInfo[] = [];\n svgs.forEach(svg => {\n if (svg) {\n infos.push(new SvgInfo('data:image/svg+xml,' + svg, nextCoords));\n nextCoords = new Point(nextCoords.x + this.getXCoordinate(svg), 0);\n }\n });\n return infos;\n }\n\n private getXCoordinate(decodedSvgDataUrl: string) {\n let div = document.createElement('div');\n div.innerHTML = decodedSvgDataUrl;\n // De SVG-width wordt in de eerste group gespecificeerd.\n const x = div.firstElementChild.querySelector('g').getAttribute('width');\n const result = parseFloat(x);\n div = null;\n return result;\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { combineLatest, Observable, of as observableOf, throwError as observableThrowError } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport SvgPanZoom from 'svg-pan-zoom';\r\nimport { PanEvent } from '../model/pan-event';\r\nimport { Point } from '../model/point';\r\nimport { PopoverInfo } from '../model/popover-info';\r\nimport { SelectieEvent } from '../model/selectie-event';\r\nimport { SelectieInfo } from '../model/selectie-info';\r\nimport { SvgInfo } from '../model/svg-info';\r\nimport { ClickareaService } from '../services/clickarea.service';\r\nimport { PuicHelperService } from '../services/puic-helper.service';\r\nimport { ClassesUtil } from '../utils/classes-util';\r\nimport { DocumentToken } from '../utils/document-token';\r\nimport { FocusUtil } from '../utils/focus-util';\r\nimport { SvgCoordinatesService } from './svg-coordinates.service';\r\n\r\n// SvgPanZoom.Instance cannot be used in libs that use this imx-viewer lib because it is exported in an old, non angular 16 compatible way.\r\nexport type SvgInstance = typeof SvgPanZoom;\r\n\r\n@Component({\r\n selector: 'imx-viewer',\r\n templateUrl: './imx-viewer.component.html',\r\n styleUrls: ['./imx-viewer.component.css']\r\n})\r\nexport class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n private SVG_BASE64_PREFIX = 'data:image/svg+xml;base64,';\r\n private SVG_PREFIX = 'data:image/svg+xml,';\r\n\r\n @Input() useClickArea = false;\r\n @Input() inlineDgnCssImport = false;\r\n @Input() svgInfo: SvgInfo[];\r\n @Input() selectieInfos: SelectieInfo[] = [];\r\n\r\n // Onderstaande inputs worden meegenomen voor clickarea:\r\n @Input() clickableIds: string[] = [];\r\n @Input() rightClickableIds: string[] = [];\r\n @Input() popoverInfos: PopoverInfo[] = [];\r\n @Input() zoomScaleSensitivity = 0.2;\r\n @Input() autoAlignSvgsHorizontally = false;\r\n //Use this input to change the initial pan and zoom of the svg. Default behaviour is .fit() and .center().\r\n @Input() initialPanAndZoom = (imxViewerBehaviourApi: ImxViewerBehaviourApi): void => {\r\n imxViewerBehaviourApi.fit();\r\n imxViewerBehaviourApi.center();\r\n };\r\n\r\n @ViewChild('svgParent', { static: true }) svgParentRef: ElementRef;\r\n\r\n errors = false;\r\n popoverStyle: any = { display: 'inline' };\r\n popoverHtmlContent = '';\r\n popoverTitleContent: string;\r\n parentWidth = 0;\r\n parentHeight = 0;\r\n\r\n @Output() clickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() rightClickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() svgLoaded = new EventEmitter<void>();\r\n //Be mindful that the pan-event occurs often. Catch it with a timeout if you do heavy processing\r\n @Output() panned = new EventEmitter<PanEvent>();\r\n\r\n private svgGeladen = false;\r\n private eventListeners: Map<string, Map<Element, any>> = new Map();\r\n private svgPanZoomRef: SvgInstance;\r\n private ignorePanEventBecauseReload: boolean = false;\r\n\r\n constructor(\r\n @Inject(DocumentToken) private readonly document: any,\r\n private readonly http: HttpClient,\r\n private readonly clickAreaService: ClickareaService,\r\n private readonly puicHelper: PuicHelperService,\r\n private readonly renderer: Renderer2,\r\n private readonly svgCoordinatesService: SvgCoordinatesService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createSvgPanZoomRefIfNotExists();\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize(): void {\r\n this.updateDimensionsForClipPath();\r\n }\r\n\r\n private updateDimensionsForClipPath(): void {\r\n // Update parentWidth and parentHeight based on the parent div dimensions\r\n this.parentWidth = this.getSvgParent().parentElement.offsetWidth;\r\n this.parentHeight = this.getSvgParent().parentElement.offsetHeight;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // If Imx-viewer is initialized with svgInfo, ngOnChanges is called before ngOnInit.\r\n // In that case we need to create svgPanZoomRef here.\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const { useClickArea, clickableIds, rightClickableIds, popoverInfos, selectieInfos, svgInfo } = changes;\r\n\r\n if (useClickArea || clickableIds || rightClickableIds || popoverInfos) {\r\n this.delayedClickAreaCreation();\r\n }\r\n\r\n if (this.svgInfo && svgInfo) {\r\n this.ignorePanEventBecauseReload = true;\r\n this.loadSvgs();\r\n }\r\n\r\n if (this.clickableIds && clickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n }\r\n\r\n if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n }\r\n\r\n if (this.selectieInfos && selectieInfos && this.svgGeladen) {\r\n this.selectElements();\r\n }\r\n\r\n if (this.popoverInfos && popoverInfos && this.svgGeladen) {\r\n this.addMouseoverEventHandlerToElements();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.svgPanZoomRef?.destroy();\r\n this.svgPanZoomRef = undefined;\r\n }\r\n\r\n public focusOnIds(focusIds: string[]): void {\r\n FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef, this.puicHelper);\r\n }\r\n\r\n public getSvgPanZoomInstance: () => SvgInstance = () => this.svgPanZoomRef;\r\n\r\n // Here only used in test, but also used by applications. Do not remove.\r\n public static getXCoordinate(decodedSvgDataUrl: string): number {\r\n let div = document.createElement('div');\r\n div.innerHTML = decodedSvgDataUrl;\r\n // De SVG-width wordt in de svg tag gespecificeerd.\r\n const x = div.firstElementChild.getAttribute('width');\r\n const result = parseFloat(x);\r\n div = null;\r\n return result;\r\n }\r\n\r\n hidePopOver = (): string => this.popoverStyle.visibility = 'hidden';\r\n\r\n private createSvgPanZoomRefIfNotExists(): void {\r\n if (!this.svgPanZoomRef) {\r\n this.svgPanZoomRef = SvgPanZoom(this.getSvgParent(), {\r\n zoomScaleSensitivity: this.zoomScaleSensitivity,\r\n fit: false,\r\n center: true,\r\n dblClickZoomEnabled: false,\r\n onZoom: () => this.hidePopOver(),\r\n onPan: () => {\r\n this.hidePopOver();\r\n if (this.ignorePanEventBecauseReload) {\r\n this.ignorePanEventBecauseReload = false;\r\n } else {\r\n this.panned.emit({ x: this.svgPanZoomRef.getPan().x, y: this.svgPanZoomRef.getPan().y });\r\n }\r\n },\r\n onUpdatedCTM: () => this.updateClipPath(),\r\n refreshRate: 'auto'\r\n });\r\n\r\n this.addStyleToRootSvg();\r\n }\r\n }\r\n\r\n private updateClipPath(): void {\r\n const area = this.getVisibleArea();\r\n if (!area) {\r\n return;\r\n }\r\n\r\n // update the clipPath\r\n requestAnimationFrame(() => {\r\n const clipRect = this.getSvgParent().querySelector('#clip-path rect');\r\n this.renderer.setAttribute(clipRect, 'x', String(area.x));\r\n this.renderer.setAttribute(clipRect, 'y', String(area.y));\r\n this.renderer.setAttribute(clipRect, 'width', String(area.width));\r\n this.renderer.setAttribute(clipRect, 'height', String(area.height));\r\n });\r\n }\r\n\r\n private getVisibleArea(): Area {\r\n const zoom = this.getSvgPanZoomInstance()?.getZoom();\r\n const pan = this.getSvgPanZoomInstance()?.getPan();\r\n\r\n if (!zoom || !pan) {\r\n return;\r\n }\r\n\r\n // Bepaal grootte van visible area\r\n const visibleWidth = this.parentWidth / zoom;\r\n const visibleHeight = this.parentHeight / zoom;\r\n\r\n // Bepaal het nulpunt (linksboven) van de visible area\r\n const visibleX = -pan.x / zoom;\r\n const visibleY = -pan.y / zoom;\r\n\r\n return { x: visibleX, y: visibleY, width: visibleWidth, height: visibleHeight };\r\n }\r\n\r\n /**\r\n * Style wordt vanuit javascript toegevoegd na de create van SvgZoomPanRef deze maakt een viewport aan.\r\n * - Clickarea CSS wordt dynamisch aan de SVG toegevoegd, dit voorkomt dat dat er ngcontent property op geplaatst wordt.\r\n * De SVG's worden niet voorzien van ngcontent attribuut.\r\n * - DGN.css import wordt (optioneel) in de root SVG opgenomen, deze is eerst verwijderd uit de SVG's. Om meerdere imports te voorkomen.\r\n * */\r\n private addStyleToRootSvg(): void {\r\n if (this.getSvgParent().firstElementChild.tagName !== 'defs') {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n let style = this.inlineDgnCssImport ? '@import url(\"dgn.css\");\\n' : '';\r\n style +=\r\n `.imxview-selected > polyline.imxview-clickarea, polyline.imxview-clickarea {\r\n stroke: var(--imxview-clickarea-stroke, transparent);\r\n stroke-width: var(--imxview-clickarea-stroke-width, 10px);\r\n stroke-dasharray: none;\r\n }`;\r\n defs.innerHTML =\r\n `\r\n <style> ${ style } </style>\r\n <clipPath id=\"clip-path\">\r\n <rect x=\"0\" x=\"0\" width=${ this.parentWidth } height=${ this.parentHeight }>\r\n </clipPath>\r\n `;\r\n const firstElementChild = this.getSvgParent().firstElementChild;\r\n this.getSvgParent().insertBefore(defs, firstElementChild);\r\n setTimeout(() => this.updateDimensionsForClipPath());\r\n }\r\n }\r\n\r\n private loadSvgs(): void {\r\n combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))\r\n .pipe(take(1))\r\n .subscribe(svgs => {\r\n const svg = this.concatenateSvgs(svgs);\r\n this.updateDom(svg);\r\n this.svgGeladen = true;\r\n this.svgLoaded.emit();\r\n this.delayedClickAreaCreation();\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n this.selectElements();\r\n this.addMouseoverEventHandlerToElements();\r\n this.updateDimensionsForClipPath();\r\n },\r\n error => this.flagErrors(error)\r\n );\r\n }\r\n\r\n private loadSvg(svgSrc: string): Observable<string> {\r\n if (svgSrc.startsWith('data:')) {\r\n let parsed;\r\n if (svgSrc.startsWith(this.SVG_BASE64_PREFIX)) {\r\n try {\r\n parsed = atob(svgSrc.substring(this.SVG_BASE64_PREFIX.length));\r\n } catch (e) {\r\n return observableThrowError('Data-url parse error');\r\n }\r\n } else if (svgSrc.startsWith(this.SVG_PREFIX)) {\r\n parsed = svgSrc.substring(this.SVG_PREFIX.length);\r\n }\r\n\r\n if (parsed) {\r\n return observableOf(parsed);\r\n }\r\n }\r\n\r\n return this.http.get(svgSrc, { responseType: 'text' });\r\n }\r\n\r\n private addClickEventHandlersToElement(listeners: Map<Element, any>, elem, eventType: string, puic: string): void {\r\n const elemAlreadyHasListener = listeners.get(elem);\r\n if (!elemAlreadyHasListener) {\r\n const fn = eventType === 'click' ?\r\n (e) => this.clickHandler.emit(new SelectieEvent(puic, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(puic, e));\r\n return false;\r\n };\r\n listeners.set(elem, fn);\r\n elem.addEventListener(eventType, fn);\r\n if (eventType === 'click') {\r\n elem.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n\r\n private addClickEventHandlersToElements(clickableIds: string[], eventtype: string): void {\r\n this.removeOldListeners(eventtype);\r\n\r\n const listeners = new Map();\r\n if (clickableIds) {\r\n clickableIds.forEach(puic => {\r\n const elements = this.puicHelper.getAllElementsForPuic(puic);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));\r\n });\r\n }\r\n this.eventListeners.set(eventtype, listeners);\r\n }\r\n\r\n private addMouseoverEventHandlerToElements(): void {\r\n this.removeOldListeners('mouseover');\r\n const listeners = new Map();\r\n if (this.popoverInfos) {\r\n this.popoverInfos.forEach(popoverInfo => {\r\n popoverInfo.puicArray.forEach(puic => {\r\n const elems = this.puicHelper.getAllElementsForPuic(puic);\r\n for (let i = 0; i < elems.length; i++) {\r\n const fn = (e) => {\r\n this.popoverHtmlContent = popoverInfo.popoverHtmlContent;\r\n this.popoverTitleContent = popoverInfo.popoverTitleContent;\r\n\r\n // use timeout to have content rendered before getting size\r\n setTimeout(() => this.showPopup(e), 0);\r\n };\r\n\r\n const elem = elems.item(i);\r\n listeners.set(elem, fn);\r\n elem.addEventListener('mouseover', fn);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n this.eventListeners.set('mouseover', listeners);\r\n }\r\n }\r\n\r\n private concatenateSvgs(svgs: string[]): string {\r\n let svgContent = '';\r\n let svgInfo = this.svgInfo;\r\n if (this.autoAlignSvgsHorizontally) {\r\n svgInfo = this.svgCoordinatesService.svgInfosWithCoordinates(svgs);\r\n }\r\n for (let i = 0, len = svgInfo.length; i < len; i++) {\r\n const sourceCoordinates = svgInfo[i].coordinates || new Point(0, 0);\r\n\r\n const div = document.createElement('div');\r\n\r\n /** Verwijder dgn.css import uit geleverde SVG's.\r\n * De import wordt optioneel (standaard aan) in de root SVG geplaats om te voorkomen dat de import meermaals gebeurd.\r\n * zie addStyleToRootSvg()\r\n */\r\n div.innerHTML = svgs[i].replace('@import url(\"dgn.css\");', '');\r\n div.firstElementChild.setAttribute('x', sourceCoordinates.x.toString());\r\n div.firstElementChild.setAttribute('y', sourceCoordinates.y.toString());\r\n\r\n svgContent += div.innerHTML;\r\n }\r\n\r\n return svgContent;\r\n }\r\n\r\n private flagErrors(error): void {\r\n console.log(error);\r\n this.errors = true;\r\n }\r\n\r\n private removeOldListeners(eventType: string): void {\r\n const listeners = this.eventListeners.get(eventType);\r\n if (listeners) {\r\n listeners.forEach((fn, el) => {\r\n el.removeEventListener(eventType, fn);\r\n if (eventType === 'click')\r\n el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));\r\n });\r\n }\r\n this.eventListeners.set(eventType, new Map());\r\n }\r\n\r\n private selectElements(): void {\r\n const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');\r\n for (const element of allElems) {\r\n ClassesUtil.removeClassesStartingWith(element, 'imxview-selected');\r\n }\r\n\r\n if (this.selectieInfos) {\r\n this.selectieInfos.forEach(selectieInfo => {\r\n selectieInfo.ids.forEach(id => {\r\n this.puicHelper.getAllElementsForPuic(id).forEach(elem => {\r\n ClassesUtil.addClass(elem, 'imxview-selected');\r\n if ('' !== selectieInfo.clazz) {\r\n ClassesUtil.addClass(elem, 'imxview-selected-' + selectieInfo.clazz);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private static setDefaultCursor(el: Element): string {\r\n const oudeStyle = el.getAttribute('style');\r\n return oudeStyle ? oudeStyle.replace('pointer', 'default') : 'cursor: default';\r\n }\r\n\r\n private showPopup(e): void {\r\n const popoverElem = document.getElementById('popover').getBoundingClientRect();\r\n const left = e.layerX - (popoverElem.width / 2) + 'px';\r\n const top = e.layerY - (popoverElem.height + 8) + 'px';\r\n this.popoverStyle = {\r\n left: left, top: top, position: 'absolute',\r\n display: 'inline', visibility: 'visible'\r\n };\r\n }\r\n\r\n private updateDom(svg: string): void {\r\n this.svgPanZoomRef.destroy();\r\n this.svgPanZoomRef = null;\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n\r\n this.svgPanZoomRef.resize();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private delayedClickAreaCreation(): void {\r\n if (this.svgGeladen && this.useClickArea) {\r\n const clickareaIds = new Set([...this.clickableIds, ...this.rightClickableIds,\r\n ...this.popoverInfos.flatMap(pi => pi.puicArray)]);\r\n this.clickAreaService.delayedClickAreaCreation(clickareaIds);\r\n }\r\n }\r\n\r\n private getSvgParent = () => this.svgParentRef.nativeElement;\r\n}\r\n\r\ninterface Area {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface XandYEnabled {\r\n x: boolean;\r\n y: boolean;\r\n}\r\n\r\nexport class ImxViewerBehaviourApi {\r\n constructor(private readonly svgPanZoomRef: SvgInstance) {\r\n }\r\n\r\n public pan(x: number, y: number): this {\r\n this.svgPanZoomRef.pan(new Point(x, y));\r\n return this;\r\n }\r\n\r\n public enableZoom(zoomEnabled: boolean): this {\r\n this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);\r\n return this;\r\n }\r\n\r\n public enablePan(panEnabled: boolean | XandYEnabled): this {\r\n this.svgPanZoomRef.setBeforePan(() => panEnabled);\r\n return this;\r\n }\r\n\r\n public fit(): this {\r\n this.svgPanZoomRef.fit();\r\n return this;\r\n }\r\n\r\n public center(): this {\r\n this.svgPanZoomRef.center();\r\n return this;\r\n }\r\n}\r\n","<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ImxViewerComponent } from './components/imx-viewer.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule\r\n ],\r\n declarations: [\r\n ImxViewerComponent\r\n ],\r\n exports: [\r\n ImxViewerComponent\r\n ],\r\n providers: [\r\n { provide: DocumentToken, useFactory: documentProvider }\r\n ]\r\n})\r\nexport class ImxViewerModule {\r\n}\r\n","export class PopoverInfo {\r\n public popoverTitleContent: string;\r\n constructor (public puicArray: string[], public popoverHtmlContent: string) {\r\n }\r\n}\r\n","export class SelectieInfo {\n constructor(public ids: string[], public clazz: string) {\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PuicHelperService","observableThrowError","observableOf","i2.ClickareaService","i3.PuicHelperService","i4.SvgCoordinatesService"],"mappings":";;;;;;;;;;MAAa,KAAK,CAAA;IAChB,WAAmB,CAAA,CAAS,EAAS,CAAS,EAAA;QAA3B,IAAC,CAAA,CAAA,GAAD,CAAC,CAAQ;QAAS,IAAC,CAAA,CAAA,GAAD,CAAC,CAAQ;KAC7C;AACF;;MCHY,aAAa,CAAA;IACtB,WAAmB,CAAA,EAAU,EAAS,KAAiB,EAAA;QAApC,IAAE,CAAA,EAAA,GAAF,EAAE,CAAQ;QAAS,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;KACtD;AACJ;;MCHY,WAAW,CAAA;AACpB,IAAA,OAAO,QAAQ,CAAC,IAAa,EAAE,GAAW,EAAA;AACtC,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACZ,OAAO;SACV;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC7C,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AACtD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBACpB,OAAO;aACV;SACJ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;KACvE;AAED,IAAA,OAAO,yBAAyB,CAAC,IAAa,EAAE,GAAW,EAAA;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE;YACZ,OAAO;SACV;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,EAAE;AACR,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC/B,gBAAA,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACxB;SACJ;AAED,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACjC;aAAM;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SACjD;KACJ;AACJ;;AChCM,MAAM,aAAa,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;SAC5C,gBAAgB,GAAA;AAC5B,IAAA,OAAO,QAAQ,CAAC;AACpB;;MCLa,WAAW,CAAA;;AAGb,IAAA,OAAO,SAAS,CAAC,EAAW,EAAE,EAAW,EAAA;QAC5C,IAAI,CAAC,EAAE,EAAE;AACL,YAAA,OAAO,EAAE,CAAC;SACb;AAED,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;;;;;;;AAOjB,YAAA,OAAO,EAAE,CAAC;SACb;AACD,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC;SACb;AACD,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AACf,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QACf,GAAG,IAAI,GAAG,CAAC;QACX,GAAG,IAAI,GAAG,CAAC;AACX,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AACjB,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QACjB,GAAG,IAAI,GAAG,CAAC;QACX,GAAG,IAAI,GAAG,CAAC;AACX,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG,CAAC;SACb;AACD,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG,CAAC;SACb;AACD,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG,CAAC;SACb;AACD,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG,CAAC;SACb;QACD,GAAG,IAAI,GAAG,CAAC;QACX,GAAG,IAAI,GAAG,CAAC;QAEX,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;KAC1C;AACJ;;MC7CY,SAAS,CAAA;AAEX,IAAA,OAAO,UAAU,CAAC,QAAkB,EAAE,aAA0B,EAAE,UAA6B,EAAA;QAClG,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;;YAGjC,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,YAAA,MAAM,UAAU,GAAG,YAAY,CAAC,UAA2B,CAAC;AAC5D,YAAA,IAAI,UAAmB,CAAC;YACxB,IAAI,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC7C,gBAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAG;oBACpB,MAAM,KAAK,GAA4B,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC9E,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBACnC,MAAM,WAAW,GAAG,SAAS,CAAC,sCAAsC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/E,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;qBAC/D;AACL,iBAAC,CAAC,CAAC;aACN;AACD,YAAA,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;SACtG;KACJ;IAED,OAAO,WAAW,CAAC,IAAa,EAAE,WAAuB,EAAE,UAAyB,EAAE,aAAkB,EAAA;QACpG,IAAI,IAAI,EAAE;;AAEN,YAAA,MAAM,MAAM,GAAI,UAAU,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAiB,CAAC,YAAY,EAAE,CAAC;;AAG7G,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;AAC7C,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;;AAG7D,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACrB,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;;YAG/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,aAAa,CAAC,WAAW,CAAC,UAAU,EAChC,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;;YAEjG,aAAa,CAAC,KAAK,CAAC;gBAChB,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC;AAClD,gBAAA,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;AAC1E,aAAA,CAAC,CAAC;SACN;KACJ;IAEO,OAAO,sCAAsC,CAAC,IAAa,EAAA;QAC/D,MAAM,OAAO,GAAyB,IAAK,CAAC;AAC5C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAE/B,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC1C,YAAA,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;SAC7B;AACD,QAAA,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1B,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE;YACT,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACzD;AACD,QAAA,OAAO,IAAI,CAAC;KACf;AACJ;;MCpEY,iBAAiB,CAAA;AAH9B,IAAA,WAAA,GAAA;QAMW,IAAU,CAAA,UAAA,GAAG,CAAC,SAAwB,KAAK,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AACpE,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,IAAY,KAAK,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAM,EAAA,EAAA,IAAK,OAAQ,IAAK,CAAA,CAAE,CAA4B,CAAC;AACzI,KAAA;8GALY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFd,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAET,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCEY,gBAAgB,CAAA;AAIzB,IAAA,WAAA,CAAoB,UAA6B,EAAA;QAA7B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAmB;QAFjD,IAAO,CAAA,OAAA,GAAG,GAAG,CAAC;KAGb;AAED,IAAA,wBAAwB,CAAC,GAAgB,EAAA;AACrC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE;YAChB,OAAO;SACV;AAED,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAClF;AAED;;AAEG;AACK,IAAA,gBAAgB,CAAC,GAAgB,EAAA;QACrC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAE1F,QAAA,GAAG,CAAC,OAAO,CAAC,EAAE,IAAG;AACb,YAAA,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;gBACxD,IAAI,OAAO,EAAE;AACT,oBAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;AACvE,oBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAG;wBAClB,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;AAC3C,wBAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AACjD,wBAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAA,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnC,qBAAC,CAAC,CAAC;iBACN;AACL,aAAC,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;KACN;8GAnCQ,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFb,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAET,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCHY,OAAO,CAAA;IAClB,WAAmB,CAAA,GAAW,EAAS,WAAmB,EAAA;QAAvC,IAAG,CAAA,GAAA,GAAH,GAAG,CAAQ;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;KACzD;AACF;;MCEY,qBAAqB,CAAA;AAC9B,IAAA,uBAAuB,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAc,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAG;YACf,IAAI,GAAG,EAAE;AACL,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,qBAAqB,GAAG,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;AACjE,gBAAA,UAAU,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;aACtE;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;KAChB;AAEO,IAAA,cAAc,CAAC,iBAAyB,EAAA;QAC5C,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACxC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB,CAAC;;AAElC,QAAA,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACzE,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,GAAG,GAAG,IAAI,CAAC;AACX,QAAA,OAAO,MAAM,CAAC;KACjB;8GArBQ,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFlB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAET,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCkCY,kBAAkB,CAAA;IAyC3B,WAC4C,CAAA,QAAa,EACpC,IAAgB,EAChB,gBAAkC,EAClC,UAA6B,EAC7B,QAAmB,EACnB,qBAA4C,EAAA;QALrB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAK;QACpC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QAChB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAmB;QAC7B,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAW;QACnB,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QA9CzD,IAAiB,CAAA,iBAAA,GAAG,4BAA4B,CAAC;QACjD,IAAU,CAAA,UAAA,GAAG,qBAAqB,CAAC;QAElC,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QACrB,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;QAE3B,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;;QAGnC,IAAY,CAAA,YAAA,GAAa,EAAE,CAAC;QAC5B,IAAiB,CAAA,iBAAA,GAAa,EAAE,CAAC;QACjC,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;QACjC,IAAoB,CAAA,oBAAA,GAAG,GAAG,CAAC;QAC3B,IAAyB,CAAA,yBAAA,GAAG,KAAK,CAAC;;AAElC,QAAA,IAAA,CAAA,iBAAiB,GAAG,CAAC,qBAA4C,KAAU;YAChF,qBAAqB,CAAC,GAAG,EAAE,CAAC;YAC5B,qBAAqB,CAAC,MAAM,EAAE,CAAC;AACnC,SAAC,CAAC;QAIF,IAAM,CAAA,MAAA,GAAG,KAAK,CAAC;AACf,QAAA,IAAA,CAAA,YAAY,GAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC1C,IAAkB,CAAA,kBAAA,GAAG,EAAE,CAAC;QAExB,IAAW,CAAA,WAAA,GAAG,CAAC,CAAC;QAChB,IAAY,CAAA,YAAA,GAAG,CAAC,CAAC;AAEP,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAiB,CAAC;AACjD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAiB,CAAC;AACtD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;;AAErC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAY,CAAC;QAExC,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;AACnB,QAAA,IAAA,CAAA,cAAc,GAAmC,IAAI,GAAG,EAAE,CAAC;QAE3D,IAA2B,CAAA,2BAAA,GAAY,KAAK,CAAC;AAqE9C,QAAA,IAAA,CAAA,qBAAqB,GAAsB,MAAM,IAAI,CAAC,aAAa,CAAC;QAa3E,IAAW,CAAA,WAAA,GAAG,MAAc,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,QAAQ,CAAC;QAmS5D,IAAY,CAAA,YAAA,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;KA5W5D;IAED,QAAQ,GAAA;QACJ,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACnD;IAGD,QAAQ,GAAA;QACJ,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACtC;IAEO,2BAA2B,GAAA;;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC;QACjE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;KACtE;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;;;QAG9B,IAAI,CAAC,8BAA8B,EAAE,CAAC;AAEtC,QAAA,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAExG,IAAI,YAAY,IAAI,YAAY,IAAI,iBAAiB,IAAI,YAAY,EAAE;YACnE,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACnC;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;SACnB;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SACpE;QAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,IAAI,CAAC,UAAU,EAAE;YAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;SAC/E;QAED,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE;YACxD,IAAI,CAAC,cAAc,EAAE,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAC7C;KACJ;IAED,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;KAClC;AAEM,IAAA,UAAU,CAAC,QAAkB,EAAA;AAChC,QAAA,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;KACvE;;IAKM,OAAO,cAAc,CAAC,iBAAyB,EAAA;QAClD,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACxC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB,CAAC;;QAElC,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,GAAG,GAAG,IAAI,CAAC;AACX,QAAA,OAAO,MAAM,CAAC;KACjB;IAIO,8BAA8B,GAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;gBACjD,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;AAC/C,gBAAA,GAAG,EAAE,KAAK;AACV,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,MAAM,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE;gBAChC,KAAK,EAAE,MAAK;oBACR,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,oBAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AAClC,wBAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;qBAC5C;yBAAM;AACH,wBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;qBAC5F;iBACJ;AACD,gBAAA,YAAY,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;AACzC,gBAAA,WAAW,EAAE,MAAM;AACtB,aAAA,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC5B;KACJ;IAEO,cAAc,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE;YACP,OAAO;SACV;;QAGD,qBAAqB,CAAC,MAAK;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;AACtE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,SAAC,CAAC,CAAC;KACN;IAEO,cAAc,GAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,CAAC;AAEnD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;YACf,OAAO;SACV;;AAGD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAC7C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;QAG/C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAE/B,QAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;KACnF;AAED;;;;;AAKK;IACG,iBAAiB,GAAA;QACrB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB,CAAC,OAAO,KAAK,MAAM,EAAE;YAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;AAE5E,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,kBAAkB,GAAG,2BAA2B,GAAG,EAAE,CAAC;YACvE,KAAK;AACD,gBAAA,CAAA;;;;kBAIE,CAAC;AACP,YAAA,IAAI,CAAC,SAAS;AACV,gBAAA,CAAA;0BACW,KAAM,CAAA;;AAEc,4CAAA,EAAA,IAAI,CAAC,WAAY,CAAY,QAAA,EAAA,IAAI,CAAC,YAAa,CAAA;;iBAE7E,CAAC;YACN,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB,CAAC;YAChE,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC1D,UAAU,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC;SACxD;KACJ;IAEO,QAAQ,GAAA;QACZ,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACb,SAAS,CAAC,IAAI,IAAG;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC5E,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,kCAAkC,EAAE,CAAC;YAC1C,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACvC,SAAC,EACD,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAClC,CAAC;KACL;AAEO,IAAA,OAAO,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC5B,YAAA,IAAI,MAAM,CAAC;YACX,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC3C,gBAAA,IAAI;AACA,oBAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClE;gBAAC,OAAO,CAAC,EAAE;AACR,oBAAA,OAAOC,UAAoB,CAAC,sBAAsB,CAAC,CAAC;iBACvD;aACJ;iBAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC3C,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACrD;YAED,IAAI,MAAM,EAAE;AACR,gBAAA,OAAOC,EAAY,CAAC,MAAM,CAAC,CAAC;aAC/B;SACJ;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;KAC1D;AAEO,IAAA,8BAA8B,CAAC,SAA4B,EAAE,IAAI,EAAE,SAAiB,EAAE,IAAY,EAAA;QACtG,MAAM,sBAAsB,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,sBAAsB,EAAE;AACzB,YAAA,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO;AAC5B,gBAAA,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,KAAI;oBACF,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,oBAAA,OAAO,KAAK,CAAC;AACjB,iBAAC,CAAC;AACN,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACrC,YAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;aACjC;SACJ;KACJ;IAEO,+BAA+B,CAAC,YAAsB,EAAE,SAAiB,EAAA;AAC7E,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAEnC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,YAAY,EAAE;AACd,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,IAAG;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC7D,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,8BAA8B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5G,aAAC,CAAC,CAAC;SACN;QACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;KACjD;IAEO,kCAAkC,GAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACrC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,IAAG;AAChC,gBAAA,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAG;oBAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC1D,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,wBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,KAAI;AACb,4BAAA,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,CAAC;AACzD,4BAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC;;AAG3D,4BAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,yBAAC,CAAC;wBAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,wBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACxB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;qBAC1C;AACL,iBAAC,CACJ,CAAC;AACN,aAAC,CACJ,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;SACnD;KACJ;AAEO,IAAA,eAAe,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AAC3B,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;SACtE;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAChD,YAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEpE,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAE1C;;;AAGG;AACH,YAAA,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;AAC/D,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACxE,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAExE,YAAA,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC;SAC/B;AAED,QAAA,OAAO,UAAU,CAAC;KACrB;AAEO,IAAA,UAAU,CAAC,KAAK,EAAA;AACpB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;KACtB;AAEO,IAAA,kBAAkB,CAAC,SAAiB,EAAA;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAI;AACzB,gBAAA,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI,SAAS,KAAK,OAAO;AACrB,oBAAA,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,aAAC,CAAC,CAAC;SACN;QACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;KACjD;IAEO,cAAc,GAAA;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;AACnF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC5B,YAAA,WAAW,CAAC,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;SACtE;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,IAAG;AACtC,gBAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAG;AAC1B,oBAAA,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;AACrD,wBAAA,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;AAC/C,wBAAA,IAAI,EAAE,KAAK,YAAY,CAAC,KAAK,EAAE;4BAC3B,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;yBACxE;AACL,qBAAC,CAAC,CAAC;AACP,iBAAC,CAAC,CAAC;AACP,aAAC,CAAC,CAAC;SACN;KACJ;IAEO,OAAO,gBAAgB,CAAC,EAAW,EAAA;QACvC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC3C,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,iBAAiB,CAAC;KAClF;AAEO,IAAA,SAAS,CAAC,CAAC,EAAA;QACf,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,qBAAqB,EAAE,CAAC;AAC/E,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AACvD,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACvD,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;AAC1C,YAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS;SAC3C,CAAC;KACL;AAEO,IAAA,SAAS,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,8BAA8B,EAAE,CAAC;AAEtC,QAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;AACzG,QAAA,yBAAyB,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACvE,QAAA,yBAAyB,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzE,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;AAEhC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACnD;IAEO,wBAAwB,GAAA;QAC5B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;AACtC,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,iBAAiB;AACzE,gBAAA,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACvD,YAAA,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;SAChE;KACJ;AA1ZQ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBA0Cf,aAAa,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AA1ChB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,+uBCxC/B,iuBAUA,EAAA,MAAA,EAAA,CAAA,spGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FD8Ba,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACI,YAAY,EAAA,QAAA,EAAA,iuBAAA,EAAA,MAAA,EAAA,CAAA,spGAAA,CAAA,EAAA,CAAA;;0BA8CjB,MAAM;2BAAC,aAAa,CAAA;oLAtChB,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAGG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,oBAAoB,EAAA,CAAA;sBAA5B,KAAK;gBACG,yBAAyB,EAAA,CAAA;sBAAjC,KAAK;gBAEG,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;gBAKoC,YAAY,EAAA,CAAA;sBAArD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAS9B,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,iBAAiB,EAAA,CAAA;sBAA1B,MAAM;gBACG,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBAEG,MAAM,EAAA,CAAA;sBAAf,MAAM;gBAsBP,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,eAAe,CAAA;;MAoXpB,qBAAqB,CAAA;AAC9B,IAAA,WAAA,CAA6B,aAA0B,EAAA;QAA1B,IAAa,CAAA,aAAA,GAAb,aAAa,CAAa;KACtD;IAEM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,QAAA,OAAO,IAAI,CAAC;KACf;AAEM,IAAA,UAAU,CAAC,WAAoB,EAAA;QAClC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,WAAW,CAAC,CAAC;AACpD,QAAA,OAAO,IAAI,CAAC;KACf;AAEM,IAAA,SAAS,CAAC,UAAkC,EAAA;QAC/C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC;KACf;IAEM,GAAG,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;AACzB,QAAA,OAAO,IAAI,CAAC;KACf;IAEM,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AAC5B,QAAA,OAAO,IAAI,CAAC;KACf;AACJ;;ME1dY,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;+GAAf,eAAe,EAAA,YAAA,EAAA,CATxB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAJlB,YAAY;AACZ,YAAA,gBAAgB,aAMhB,kBAAkB,CAAA,EAAA,CAAA,CAAA,EAAA;AAMT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAJf,SAAA,EAAA;AACP,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;AAC3D,SAAA,EAAA,OAAA,EAAA,CAXC,YAAY;YACZ,gBAAgB,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAYP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAf3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;AACjB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,kBAAkB;AACnB,qBAAA;AACD,oBAAA,SAAS,EAAE;AACP,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;AAC3D,qBAAA;AACF,iBAAA,CAAA;;;MCpBY,WAAW,CAAA;IAEpB,WAAoB,CAAA,SAAmB,EAAS,kBAA0B,EAAA;QAAtD,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;QAAS,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAQ;KACzE;AACJ;;MCJY,YAAY,CAAA;IACvB,WAAmB,CAAA,GAAa,EAAS,KAAa,EAAA;QAAnC,IAAG,CAAA,GAAA,GAAH,GAAG,CAAU;QAAS,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;KACrD;AACF;;ACHD;;AAEG;;;;"}
1
+ {"version":3,"file":"loxia-imx-viewer.mjs","sources":["../../src/model/point.ts","../../src/model/selectie-event.ts","../../src/utils/classes-util.ts","../../src/utils/document-token.ts","../../src/utils/svg-rect-util.ts","../../src/utils/focus-util.ts","../../src/services/puic-helper.service.ts","../../src/services/clickarea.service.ts","../../src/model/svg-info.ts","../../src/components/svg-coordinates.service.ts","../../src/components/imx-viewer.component.ts","../../src/components/imx-viewer.component.html","../../src/imx-viewer.module.ts","../../src/model/popover-info.ts","../../src/model/selectie-info.ts","../../src/loxia-imx-viewer.ts"],"sourcesContent":["export class Point {\r\n constructor(public x: number, public y: number) {\r\n }\r\n}\r\n","export class SelectieEvent {\r\n constructor(public id: string, public event: MouseEvent) {\r\n }\r\n}\r\n","export class ClassesUtil {\n static addClass(elem: Element, cls: string) {\n if ('' === cls) {\n return;\n }\n const classAttr = elem.getAttribute('class');\n const classes = classAttr ? classAttr.split(' ') : [];\n for (let j = 0; j < classes.length; j++) {\n if (classes[j] === cls) {\n return;\n }\n }\n elem.setAttribute('class', classAttr ? classAttr + ' ' + cls : cls);\n }\n\n static removeClassesStartingWith(elem: Element, cls: string) {\n const classAttr = elem.getAttribute('class');\n if (!classAttr) {\n return;\n }\n const classes = classAttr.split(' ');\n let j = classes.length;\n while (j--) {\n if (classes[j].indexOf(cls) === 0) {\n classes.splice(j, 1);\n }\n }\n\n if (classes.length === 0) {\n elem.removeAttribute('class');\n } else {\n elem.setAttribute('class', classes.join(' '));\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const DocumentToken = new InjectionToken('Document');\nexport function documentProvider(): Document {\n return document;\n}\n","export class SvgRectUtil {\n\n // copied from java.awt.Rectangle\n public static rectUnion(r1: SVGRect, r2: SVGRect): SVGRect {\n if (!r1) {\n return r2;\n }\n\n let tx2 = r1.width;\n let ty2 = r1.height;\n if ((tx2 | ty2) < 0) { // tslint:disable-line\n // This rectangle has negative dimensions...\n // If r has non-negative dimensions then it is the answer.\n // If r is non-existant (has a negative dimension), then both\n // are non-existant and we can return any non-existant rectangle\n // as an answer. Thus, returning r meets that criterion.\n // Either way, r is our answer.\n return r2;\n }\n let rx2 = r2.width;\n let ry2 = r2.height;\n if ((rx2 | ry2) < 0) { // tslint:disable-line\n return r1;\n }\n let tx1 = r1.x;\n let ty1 = r1.y;\n tx2 += tx1;\n ty2 += ty1;\n const rx1 = r2.x;\n const ry1 = r2.y;\n rx2 += rx1;\n ry2 += ry1;\n if (tx1 > rx1) {\n tx1 = rx1;\n }\n if (ty1 > ry1) {\n ty1 = ry1;\n }\n if (tx2 < rx2) {\n tx2 = rx2;\n }\n if (ty2 < ry2) {\n ty2 = ry2;\n }\n tx2 -= tx1;\n ty2 -= ty1;\n\n return new DOMRect(tx1, ty1, tx2, ty2);\n }\n}\n","import { SvgInstance } from '../components/imx-viewer.component';\nimport { PuicHelperService } from '../services/puic-helper.service';\nimport { SvgRectUtil } from './svg-rect-util';\n\nexport class FocusUtil {\n\n public static focusOnIds(focusIds: string[], svgPanZoomRef: SvgInstance, puicHelper: PuicHelperService) {\n if (focusIds && focusIds.length > 0) {\n\n // calculate the union rectangle of elements with ids\n const svgContainer = document.getElementById('svgContainer');\n const rootSvgDoc = svgContainer.firstChild as SVGSVGElement;\n let resultRect: SVGRect;\n if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {\n focusIds.forEach(puic => {\n const elems: NodeListOf<HTMLElement> = puicHelper.getAllElementsForPuic(puic);\n for (let i = 0; i < elems.length; i++) {\n const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);\n resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);\n }\n });\n }\n FocusUtil.focusOnRect(resultRect, svgContainer.getBoundingClientRect(), rootSvgDoc, svgPanZoomRef);\n }\n }\n\n static focusOnRect(rect: SVGRect, elementRect: ClientRect, rootSvgDoc: SVGSVGElement, svgPanZoomRef: any) {\n if (rect) {\n // make sure we are in the svgpanzoom transformed area\n const matrix = (rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0] as SVGGElement).getScreenCTM();\n\n // get from svg coordinate system to webpage coordinate system\n const location = rootSvgDoc.createSVGPoint();\n location.x = rect.x + (rect.width / 2);\n location.y = rect.y + (rect.height / 2);\n const transformedLocation = location.matrixTransform(matrix);\n\n // transform the rectangle dimension (we have to use a SVGPoint since there is no SVGDimension)\n const size = rootSvgDoc.createSVGPoint();\n size.x = rect.width;\n size.y = rect.height;\n const transformedSize = size.matrixTransform(matrix.inverse());\n\n // tel the svgPanZoom to zoom on the rectangle in relation to the total view size\n const zoomFactor = Math.min(5, elementRect.height / Math.abs(transformedSize.y));\n svgPanZoomRef.zoomAtPoint(zoomFactor,\n { x: transformedLocation.x - elementRect.left, y: transformedLocation.y - elementRect.top });\n // tel the svgPanZoom to pan to the middel of the rectangle\n svgPanZoomRef.panBy({\n x: (elementRect.width / 2) - transformedLocation.x,\n y: ((elementRect.height + elementRect.top) / 2) - transformedLocation.y\n });\n }\n }\n\n private static getElementRectangleWithNestedSvgOffset(elem: Element): SVGRect {\n const svgElem = (<SVGGraphicsElement> elem);\n const rect = svgElem.getBBox();\n\n while (elem.parentElement.nodeName !== 'svg') {\n elem = elem.parentElement;\n }\n elem = elem.parentElement;\n rect.x = rect.x + parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: any;\n\n public setRootSvg = (svgParent: SVGSVGElement) => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: string) => this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`) as NodeListOf<HTMLElement>;\n}\n","import { Injectable } from '@angular/core';\nimport { PuicHelperService } from './puic-helper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClickareaService {\n private timer: number;\n timeout = 250;\n\n constructor(private puicHelper: PuicHelperService) {\n }\n\n delayedClickAreaCreation(ids: Set<string>) {\n if (ids.size === 0) {\n return;\n }\n\n window.clearTimeout(this.timer);\n this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);\n }\n\n /**\n * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids\n */\n private createClickareas(ids: Set<string>) {\n Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());\n\n ids.forEach(id => {\n this.puicHelper.getAllElementsForPuic(id).forEach(element => {\n if (element) {\n const polylines = Array.from(element.getElementsByTagName('polyline'));\n polylines.forEach(p => {\n const clone = p.cloneNode(true) as Element;\n clone.setAttribute('class', 'imxview-clickarea');\n clone.removeAttribute('id');\n element.insertBefore(clone, p);\n });\n }\n });\n });\n }\n}\n","import { Point } from './point';\r\n\r\nexport class SvgInfo {\r\n constructor(public svg: string, public coordinates?: Point) {\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Point } from '../model/point';\nimport { SvgInfo } from '../model/svg-info';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SvgCoordinatesService {\n svgInfosWithCoordinates(svgs: string[]): SvgInfo[] {\n let nextCoords = new Point(0, 0);\n const infos: SvgInfo[] = [];\n svgs.forEach(svg => {\n if (svg) {\n infos.push(new SvgInfo('data:image/svg+xml,' + svg, nextCoords));\n nextCoords = new Point(nextCoords.x + this.getXCoordinate(svg), 0);\n }\n });\n return infos;\n }\n\n private getXCoordinate(decodedSvgDataUrl: string) {\n let div = document.createElement('div');\n div.innerHTML = decodedSvgDataUrl;\n // De SVG-width wordt in de eerste group gespecificeerd.\n const x = div.firstElementChild.querySelector('g').getAttribute('width');\n const result = parseFloat(x);\n div = null;\n return result;\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { combineLatest, Observable, of as observableOf, throwError as observableThrowError } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport SvgPanZoom from 'svg-pan-zoom';\r\nimport { PanEvent } from '../model/pan-event';\r\nimport { Point } from '../model/point';\r\nimport { PopoverInfo } from '../model/popover-info';\r\nimport { SelectieEvent } from '../model/selectie-event';\r\nimport { SelectieInfo } from '../model/selectie-info';\r\nimport { SvgInfo } from '../model/svg-info';\r\nimport { ClickareaService } from '../services/clickarea.service';\r\nimport { PuicHelperService } from '../services/puic-helper.service';\r\nimport { ClassesUtil } from '../utils/classes-util';\r\nimport { DocumentToken } from '../utils/document-token';\r\nimport { FocusUtil } from '../utils/focus-util';\r\nimport { SvgCoordinatesService } from './svg-coordinates.service';\r\n\r\n// SvgPanZoom.Instance cannot be used in libs that use this imx-viewer lib because it is exported in an old, non angular 16 compatible way.\r\nexport type SvgInstance = typeof SvgPanZoom;\r\n\r\n@Component({\r\n selector: 'imx-viewer',\r\n templateUrl: './imx-viewer.component.html',\r\n styleUrls: ['./imx-viewer.component.css']\r\n})\r\nexport class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n private SVG_BASE64_PREFIX = 'data:image/svg+xml;base64,';\r\n private SVG_PREFIX = 'data:image/svg+xml,';\r\n\r\n @Input() useClickArea = false;\r\n @Input() inlineDgnCssImport = false;\r\n @Input() svgInfo: SvgInfo[];\r\n @Input() selectieInfos: SelectieInfo[] = [];\r\n\r\n // Onderstaande inputs worden meegenomen voor clickarea:\r\n @Input() clickableIds: string[] = [];\r\n @Input() rightClickableIds: string[] = [];\r\n @Input() popoverInfos: PopoverInfo[] = [];\r\n @Input() zoomScaleSensitivity = 0.2;\r\n @Input() autoAlignSvgsHorizontally = false;\r\n //Use this input to change the initial pan and zoom of the svg. Default behaviour is .fit() and .center().\r\n @Input() initialPanAndZoom = (imxViewerBehaviourApi: ImxViewerBehaviourApi): void => {\r\n imxViewerBehaviourApi.fit();\r\n imxViewerBehaviourApi.center();\r\n };\r\n\r\n @ViewChild('svgParent', { static: true }) svgParentRef: ElementRef;\r\n\r\n errors = false;\r\n popoverStyle: any = { display: 'inline' };\r\n popoverHtmlContent = '';\r\n popoverTitleContent: string;\r\n parentWidth = 0;\r\n parentHeight = 0;\r\n\r\n @Output() clickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() rightClickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() svgLoaded = new EventEmitter<void>();\r\n //Be mindful that the pan-event occurs often. Catch it with a timeout if you do heavy processing\r\n @Output() panned = new EventEmitter<PanEvent>();\r\n\r\n private svgGeladen = false;\r\n private eventListeners: Map<string, Map<Element, any>> = new Map();\r\n private svgPanZoomRef: SvgInstance;\r\n private ignorePanEventBecauseReload: boolean = false;\r\n\r\n constructor(\r\n @Inject(DocumentToken) private readonly document: any,\r\n private readonly http: HttpClient,\r\n private readonly clickAreaService: ClickareaService,\r\n private readonly puicHelper: PuicHelperService,\r\n private readonly renderer: Renderer2,\r\n private readonly svgCoordinatesService: SvgCoordinatesService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createSvgPanZoomRefIfNotExists();\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize(): void {\r\n this.updateDimensionsForClipPath();\r\n }\r\n\r\n private updateDimensionsForClipPath(): void {\r\n // Update parentWidth and parentHeight based on the parent div dimensions\r\n this.parentWidth = this.getSvgParent().parentElement.offsetWidth;\r\n this.parentHeight = this.getSvgParent().parentElement.offsetHeight;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // If Imx-viewer is initialized with svgInfo, ngOnChanges is called before ngOnInit.\r\n // In that case we need to create svgPanZoomRef here.\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const { useClickArea, clickableIds, rightClickableIds, popoverInfos, selectieInfos, svgInfo } = changes;\r\n\r\n if (useClickArea || clickableIds || rightClickableIds || popoverInfos) {\r\n this.delayedClickAreaCreation();\r\n }\r\n\r\n if (this.svgInfo && svgInfo) {\r\n this.ignorePanEventBecauseReload = true;\r\n this.loadSvgs();\r\n }\r\n\r\n if (this.clickableIds && clickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n }\r\n\r\n if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n }\r\n\r\n if (this.selectieInfos && selectieInfos && this.svgGeladen) {\r\n this.selectElements();\r\n }\r\n\r\n if (this.popoverInfos && popoverInfos && this.svgGeladen) {\r\n this.addMouseoverEventHandlerToElements();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.svgPanZoomRef?.destroy();\r\n this.svgPanZoomRef = undefined;\r\n }\r\n\r\n public focusOnIds(focusIds: string[]): void {\r\n FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef, this.puicHelper);\r\n }\r\n\r\n public getSvgPanZoomInstance: () => SvgInstance = () => this.svgPanZoomRef;\r\n\r\n // Here only used in test, but also used by applications. Do not remove.\r\n public static getXCoordinate(decodedSvgDataUrl: string): number {\r\n let div = document.createElement('div');\r\n div.innerHTML = decodedSvgDataUrl;\r\n // De SVG-width wordt in de svg tag gespecificeerd.\r\n const x = div.firstElementChild.getAttribute('width');\r\n const result = parseFloat(x);\r\n div = null;\r\n return result;\r\n }\r\n\r\n hidePopOver = (): string => this.popoverStyle.visibility = 'hidden';\r\n\r\n private createSvgPanZoomRefIfNotExists(): void {\r\n if (!this.svgPanZoomRef) {\r\n this.svgPanZoomRef = SvgPanZoom(this.getSvgParent(), {\r\n zoomScaleSensitivity: this.zoomScaleSensitivity,\r\n fit: false,\r\n center: true,\r\n dblClickZoomEnabled: false,\r\n onZoom: () => this.hidePopOver(),\r\n onPan: () => {\r\n this.hidePopOver();\r\n if (this.ignorePanEventBecauseReload) {\r\n this.ignorePanEventBecauseReload = false;\r\n } else {\r\n this.panned.emit({ x: this.svgPanZoomRef.getPan().x, y: this.svgPanZoomRef.getPan().y });\r\n }\r\n },\r\n onUpdatedCTM: () => this.updateClipPath(),\r\n refreshRate: 'auto'\r\n });\r\n\r\n this.addStyleToRootSvg();\r\n }\r\n }\r\n\r\n private updateClipPath(): void {\r\n const area = this.getVisibleArea();\r\n if (!area) {\r\n return;\r\n }\r\n\r\n // update the clipPath\r\n requestAnimationFrame(() => {\r\n const clipRect = this.getSvgParent().querySelector('#clip-path rect');\r\n this.renderer.setAttribute(clipRect, 'x', String(area.x));\r\n this.renderer.setAttribute(clipRect, 'y', String(area.y));\r\n this.renderer.setAttribute(clipRect, 'width', String(area.width));\r\n this.renderer.setAttribute(clipRect, 'height', String(area.height));\r\n });\r\n }\r\n\r\n private getVisibleArea(): Area {\r\n const zoom = this.getSvgPanZoomInstance()?.getZoom();\r\n const pan = this.getSvgPanZoomInstance()?.getPan();\r\n\r\n if (!zoom || !pan) {\r\n return;\r\n }\r\n\r\n // Bepaal grootte van visible area\r\n const visibleWidth = this.parentWidth / zoom;\r\n const visibleHeight = this.parentHeight / zoom;\r\n\r\n // Bepaal het nulpunt (linksboven) van de visible area\r\n const visibleX = -pan.x / zoom;\r\n const visibleY = -pan.y / zoom;\r\n\r\n return { x: visibleX, y: visibleY, width: visibleWidth, height: visibleHeight };\r\n }\r\n\r\n /**\r\n * Style wordt vanuit javascript toegevoegd na de create van SvgZoomPanRef deze maakt een viewport aan.\r\n * - Clickarea CSS wordt dynamisch aan de SVG toegevoegd, dit voorkomt dat dat er ngcontent property op geplaatst wordt.\r\n * De SVG's worden niet voorzien van ngcontent attribuut.\r\n * - DGN.css import wordt (optioneel) in de root SVG opgenomen, deze is eerst verwijderd uit de SVG's. Om meerdere imports te voorkomen.\r\n * */\r\n private addStyleToRootSvg(): void {\r\n if (this.getSvgParent().firstElementChild.tagName !== 'defs') {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n let style = this.inlineDgnCssImport ? '@import url(\"dgn.css\");\\n' : '';\r\n style +=\r\n `.imxview-selected > polyline.imxview-clickarea, polyline.imxview-clickarea {\r\n stroke: var(--imxview-clickarea-stroke, transparent);\r\n stroke-width: var(--imxview-clickarea-stroke-width, 10px);\r\n stroke-dasharray: none;\r\n }`;\r\n defs.innerHTML =\r\n `\r\n <style> ${ style } </style>\r\n <clipPath id=\"clip-path\">\r\n <rect x=\"0\" x=\"0\" width=${ this.parentWidth } height=${ this.parentHeight }>\r\n </clipPath>\r\n `;\r\n const firstElementChild = this.getSvgParent().firstElementChild;\r\n this.getSvgParent().insertBefore(defs, firstElementChild);\r\n setTimeout(() => this.updateDimensionsForClipPath());\r\n }\r\n }\r\n\r\n private loadSvgs(): void {\r\n combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))\r\n .pipe(take(1))\r\n .subscribe(svgs => {\r\n const svg = this.concatenateSvgs(svgs);\r\n this.updateDom(svg);\r\n this.svgGeladen = true;\r\n this.svgLoaded.emit();\r\n this.delayedClickAreaCreation();\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n this.selectElements();\r\n this.addMouseoverEventHandlerToElements();\r\n this.updateDimensionsForClipPath();\r\n },\r\n error => this.flagErrors(error)\r\n );\r\n }\r\n\r\n private loadSvg(svgSrc: string): Observable<string> {\r\n if (svgSrc.startsWith('data:')) {\r\n let parsed;\r\n if (svgSrc.startsWith(this.SVG_BASE64_PREFIX)) {\r\n try {\r\n parsed = atob(svgSrc.substring(this.SVG_BASE64_PREFIX.length));\r\n } catch (e) {\r\n return observableThrowError('Data-url parse error');\r\n }\r\n } else if (svgSrc.startsWith(this.SVG_PREFIX)) {\r\n parsed = svgSrc.substring(this.SVG_PREFIX.length);\r\n }\r\n\r\n if (parsed) {\r\n return observableOf(parsed);\r\n }\r\n }\r\n\r\n return this.http.get(svgSrc, { responseType: 'text' });\r\n }\r\n\r\n private addClickEventHandlersToElement(listeners: Map<Element, any>, elem, eventType: string, puic: string): void {\r\n const elemAlreadyHasListener = listeners.get(elem);\r\n if (!elemAlreadyHasListener) {\r\n const fn = eventType === 'click' ?\r\n (e) => this.clickHandler.emit(new SelectieEvent(puic, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(puic, e));\r\n return false;\r\n };\r\n listeners.set(elem, fn);\r\n elem.addEventListener(eventType, fn);\r\n if (eventType === 'click') {\r\n elem.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n\r\n private addClickEventHandlersToElements(clickableIds: string[], eventtype: string): void {\r\n this.removeOldListeners(eventtype);\r\n\r\n const listeners = new Map();\r\n if (clickableIds) {\r\n clickableIds.forEach(puic => {\r\n const elements = this.puicHelper.getAllElementsForPuic(puic);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));\r\n });\r\n }\r\n this.eventListeners.set(eventtype, listeners);\r\n }\r\n\r\n private addMouseoverEventHandlerToElements(): void {\r\n this.removeOldListeners('mouseover');\r\n const listeners = new Map();\r\n if (this.popoverInfos) {\r\n this.popoverInfos.forEach(popoverInfo => {\r\n popoverInfo.puicArray.forEach(puic => {\r\n const elems = this.puicHelper.getAllElementsForPuic(puic);\r\n for (let i = 0; i < elems.length; i++) {\r\n const fn = (e) => {\r\n this.popoverHtmlContent = popoverInfo.popoverHtmlContent;\r\n this.popoverTitleContent = popoverInfo.popoverTitleContent;\r\n\r\n // use timeout to have content rendered before getting size\r\n setTimeout(() => this.showPopup(e), 0);\r\n };\r\n\r\n const elem = elems.item(i);\r\n listeners.set(elem, fn);\r\n elem.addEventListener('mouseover', fn);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n this.eventListeners.set('mouseover', listeners);\r\n }\r\n }\r\n\r\n private concatenateSvgs(svgs: string[]): string {\r\n let svgContent = '';\r\n let svgInfo = this.svgInfo;\r\n if (this.autoAlignSvgsHorizontally) {\r\n svgInfo = this.svgCoordinatesService.svgInfosWithCoordinates(svgs);\r\n }\r\n for (let i = 0, len = svgInfo.length; i < len; i++) {\r\n const sourceCoordinates = svgInfo[i].coordinates || new Point(0, 0);\r\n\r\n const div = document.createElement('div');\r\n\r\n /** Verwijder dgn.css import uit geleverde SVG's.\r\n * De import wordt optioneel (standaard aan) in de root SVG geplaats om te voorkomen dat de import meermaals gebeurd.\r\n * zie addStyleToRootSvg()\r\n */\r\n div.innerHTML = svgs[i].replace('@import url(\"dgn.css\");', '');\r\n div.firstElementChild.setAttribute('x', sourceCoordinates.x.toString());\r\n div.firstElementChild.setAttribute('y', sourceCoordinates.y.toString());\r\n\r\n svgContent += div.innerHTML;\r\n }\r\n\r\n return svgContent;\r\n }\r\n\r\n private flagErrors(error): void {\r\n console.log(error);\r\n this.errors = true;\r\n }\r\n\r\n private removeOldListeners(eventType: string): void {\r\n const listeners = this.eventListeners.get(eventType);\r\n if (listeners) {\r\n listeners.forEach((fn, el) => {\r\n el.removeEventListener(eventType, fn);\r\n if (eventType === 'click')\r\n el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));\r\n });\r\n }\r\n this.eventListeners.set(eventType, new Map());\r\n }\r\n\r\n private selectElements(): void {\r\n const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');\r\n for (const element of allElems) {\r\n ClassesUtil.removeClassesStartingWith(element, 'imxview-selected');\r\n }\r\n\r\n if (this.selectieInfos) {\r\n this.selectieInfos.forEach(selectieInfo => {\r\n selectieInfo.ids.forEach(id => {\r\n this.puicHelper.getAllElementsForPuic(id).forEach(elem => {\r\n ClassesUtil.addClass(elem, 'imxview-selected');\r\n if ('' !== selectieInfo.clazz) {\r\n ClassesUtil.addClass(elem, 'imxview-selected-' + selectieInfo.clazz);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private static setDefaultCursor(el: Element): string {\r\n const oudeStyle = el.getAttribute('style');\r\n return oudeStyle ? oudeStyle.replace('pointer', 'default') : 'cursor: default';\r\n }\r\n\r\n private showPopup(e): void {\r\n const popoverElem = document.getElementById('popover').getBoundingClientRect();\r\n const left = e.layerX - (popoverElem.width / 2) + 'px';\r\n const top = e.layerY - (popoverElem.height + 8) + 'px';\r\n this.popoverStyle = {\r\n left: left, top: top, position: 'absolute',\r\n display: 'inline', visibility: 'visible'\r\n };\r\n }\r\n\r\n private updateDom(svg: string): void {\r\n this.svgPanZoomRef.destroy();\r\n this.svgPanZoomRef = null;\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n\r\n this.svgPanZoomRef.resize();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private delayedClickAreaCreation(): void {\r\n if (this.svgGeladen && this.useClickArea) {\r\n const clickareaIds = new Set([...this.clickableIds, ...this.rightClickableIds,\r\n ...this.popoverInfos.flatMap(pi => pi.puicArray)]);\r\n this.clickAreaService.delayedClickAreaCreation(clickareaIds);\r\n }\r\n }\r\n\r\n private getSvgParent = () => this.svgParentRef.nativeElement;\r\n}\r\n\r\ninterface Area {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface XandYPanBehaviour {\r\n x: PanBehaviour;\r\n y: PanBehaviour;\r\n}\r\n\r\nexport enum PanBehaviour {\r\n DONT_PAN,\r\n PAN,\r\n LIMIT_PAN_TO_VIEWPORT\r\n}\r\n\r\ninterface ViewBoxWithAllJSProps {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport class ImxViewerBehaviourApi {\r\n constructor(private readonly svgPanZoomRef: SvgInstance) {\r\n }\r\n\r\n public pan(x: number, y: number): this {\r\n this.svgPanZoomRef.pan(new Point(x, y));\r\n return this;\r\n }\r\n\r\n public enableZoom(zoomEnabled: boolean): this {\r\n this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);\r\n return this;\r\n }\r\n\r\n public enablePan(panBehaviour: XandYPanBehaviour): this {\r\n this.svgPanZoomRef.setBeforePan((oldPan, newPan) => {\r\n // Computed variables\r\n const sizes = this.svgPanZoomRef.getSizes();\r\n const viewBox = sizes.viewBox as ViewBoxWithAllJSProps;\r\n\r\n return {\r\n x: this.determineXPan(newPan, panBehaviour, viewBox, sizes, oldPan),\r\n y: this.determineYPan(newPan, panBehaviour, viewBox, sizes, oldPan)\r\n };\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private determineYPan(newPan: SvgPanZoom.Point, panBehaviour: XandYPanBehaviour, viewBox: ViewBoxWithAllJSProps, sizes: SvgPanZoom.Sizes, oldPan: SvgPanZoom.Point): number {\r\n switch (panBehaviour.y) {\r\n case PanBehaviour.LIMIT_PAN_TO_VIEWPORT:\r\n {\r\n const gutterHeight = 400;\r\n const topLimit = -((viewBox.y + viewBox.height) * sizes.realZoom) + gutterHeight;\r\n const bottomLimit = sizes.height - gutterHeight - (viewBox.y * sizes.realZoom);\r\n return Math.max(topLimit, Math.min(bottomLimit, newPan.y));\r\n }\r\n case PanBehaviour.DONT_PAN:\r\n return oldPan.y;\r\n default:\r\n return newPan.y;\r\n }\r\n }\r\n\r\n private determineXPan(newPan: SvgPanZoom.Point, panBehaviour: XandYPanBehaviour, viewBox: ViewBoxWithAllJSProps, sizes: SvgPanZoom.Sizes, oldPan: SvgPanZoom.Point): number {\r\n switch (panBehaviour.x) {\r\n case PanBehaviour.LIMIT_PAN_TO_VIEWPORT: {\r\n const gutterWidth = 400;\r\n const leftLimit = -((viewBox.x + viewBox.width) * sizes.realZoom) + gutterWidth;\r\n const rightLimit = sizes.width - gutterWidth - (viewBox.x * sizes.realZoom);\r\n return Math.max(leftLimit, Math.min(rightLimit, newPan.x));\r\n }\r\n case PanBehaviour.DONT_PAN:\r\n return oldPan.x;\r\n default:\r\n return newPan.x;\r\n }\r\n }\r\n\r\n public fit(): this {\r\n this.svgPanZoomRef.fit();\r\n return this;\r\n }\r\n\r\n public center(): this {\r\n this.svgPanZoomRef.center();\r\n return this;\r\n }\r\n}\r\n","<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ImxViewerComponent } from './components/imx-viewer.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule\r\n ],\r\n declarations: [\r\n ImxViewerComponent\r\n ],\r\n exports: [\r\n ImxViewerComponent\r\n ],\r\n providers: [\r\n { provide: DocumentToken, useFactory: documentProvider }\r\n ]\r\n})\r\nexport class ImxViewerModule {\r\n}\r\n","export class PopoverInfo {\r\n public popoverTitleContent: string;\r\n constructor (public puicArray: string[], public popoverHtmlContent: string) {\r\n }\r\n}\r\n","export class SelectieInfo {\n constructor(public ids: string[], public clazz: string) {\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PuicHelperService","observableThrowError","observableOf","i2.ClickareaService","i3.PuicHelperService","i4.SvgCoordinatesService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loxia/imx-viewer",
3
- "version": "13.3.3",
3
+ "version": "13.3.4-240910125838820",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org"