@loxia/imx-viewer 17.0.0 → 18.0.0

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
@@ -105,6 +105,9 @@ Met de onderstaande css kan de default breedte van een clickarea aangepast worde
105
105
 
106
106
  ### <!--next.version--> <!--next.release-date-->
107
107
 
108
+ ### 18.0.0 09-03-2026
109
+ * BREAKING: PW-20843 upgrade to angular 21
110
+
108
111
  ### 17.0.0 12-12-2025
109
112
  * BREAKING: PITS-4352 upgrade to angular 20
110
113
 
@@ -1,12 +1,11 @@
1
- import * as i5 from '@angular/common';
1
+ import * as i1 from '@angular/common';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, EventEmitter, HostListener, Output, ViewChild, Input, Inject, Component, NgModule } from '@angular/core';
4
+ import { Injectable, inject, InjectionToken, Renderer2, EventEmitter, HostListener, Output, ViewChild, Input, Component, NgModule } from '@angular/core';
5
+ import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
5
6
  import { combineLatest, throwError, of } from 'rxjs';
6
7
  import { take } from 'rxjs/operators';
7
8
  import SvgPanZoom from 'svg-pan-zoom';
8
- import * as i1 from '@angular/common/http';
9
- import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
10
9
 
11
10
  class Point {
12
11
  constructor(x, y) {
@@ -22,6 +21,100 @@ class SelectieEvent {
22
21
  }
23
22
  }
24
23
 
24
+ class ParentChildId {
25
+ constructor(parentId, childId) {
26
+ this.parentId = parentId;
27
+ this.childId = childId;
28
+ }
29
+ }
30
+
31
+ class PuicHelperService {
32
+ constructor() {
33
+ this.setRootSvg = (svgParent) => this.rootSvg = svgParent;
34
+ this.getAllElementsForPuic = (puic) => {
35
+ if (!this.rootSvg)
36
+ return {};
37
+ if (puic instanceof ParentChildId) {
38
+ return this.rootSvg.querySelectorAll(`.p${puic.parentId} > .p${puic.childId}, #p${puic.parentId} > .p${puic.childId},` +
39
+ `#p${puic.parentId} > #p${puic.childId}, .p${puic.parentId} #p${puic.childId}`);
40
+ }
41
+ else {
42
+ return this.rootSvg.querySelectorAll(`.p${puic}, #p${puic}`);
43
+ }
44
+ };
45
+ }
46
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PuicHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
47
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PuicHelperService, providedIn: 'root' }); }
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PuicHelperService, decorators: [{
50
+ type: Injectable,
51
+ args: [{
52
+ providedIn: 'root'
53
+ }]
54
+ }] });
55
+
56
+ class ClickareaService {
57
+ constructor() {
58
+ this.puicHelper = inject(PuicHelperService);
59
+ this.timeout = 250;
60
+ }
61
+ delayedClickAreaCreation(ids) {
62
+ if (ids.size === 0) {
63
+ return;
64
+ }
65
+ window.clearTimeout(this.timer);
66
+ this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);
67
+ }
68
+ /**
69
+ * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids
70
+ */
71
+ createClickareas(ids) {
72
+ Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());
73
+ ids.forEach(id => {
74
+ this.puicHelper.getAllElementsForPuic(id).forEach(element => {
75
+ if (element) {
76
+ const polylines = Array.from(element.getElementsByTagName('polyline'));
77
+ polylines.forEach(p => {
78
+ const clone = p.cloneNode(true);
79
+ clone.setAttribute('class', 'imxview-clickarea');
80
+ clone.removeAttribute('id');
81
+ element.insertBefore(clone, p);
82
+ });
83
+ if (element instanceof SVGTextElement && polylines.length === 0 && id instanceof ParentChildId) {
84
+ this.createClickAreaRect(element);
85
+ }
86
+ }
87
+ });
88
+ });
89
+ }
90
+ createClickAreaRect(element) {
91
+ const bbox = element.getBBox();
92
+ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
93
+ rect.setAttribute('x', bbox.x.toString());
94
+ rect.setAttribute('y', bbox.y.toString());
95
+ rect.setAttribute('width', bbox.width.toString());
96
+ rect.setAttribute('height', bbox.height.toString());
97
+ rect.setAttribute('class', 'imxview-clickarea-rect-text');
98
+ rect.setAttribute('fill', 'transparent');
99
+ rect.setAttribute('stroke', 'none');
100
+ const transform = element.getAttribute('transform');
101
+ if (transform) {
102
+ rect.setAttribute('transform', transform);
103
+ }
104
+ if (element.parentNode) {
105
+ element.parentNode.insertBefore(rect, element);
106
+ }
107
+ }
108
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ClickareaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
109
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ClickareaService, providedIn: 'root' }); }
110
+ }
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ClickareaService, decorators: [{
112
+ type: Injectable,
113
+ args: [{
114
+ providedIn: 'root'
115
+ }]
116
+ }], ctorParameters: () => [] });
117
+
25
118
  class ClassesUtil {
26
119
  static addClass(elem, cls) {
27
120
  if ('' === cls) {
@@ -172,100 +265,6 @@ class FocusUtil {
172
265
  }
173
266
  }
174
267
 
175
- class ParentChildId {
176
- constructor(parentId, childId) {
177
- this.parentId = parentId;
178
- this.childId = childId;
179
- }
180
- }
181
-
182
- class PuicHelperService {
183
- constructor() {
184
- this.setRootSvg = (svgParent) => this.rootSvg = svgParent;
185
- this.getAllElementsForPuic = (puic) => {
186
- if (!this.rootSvg)
187
- return {};
188
- if (puic instanceof ParentChildId) {
189
- return this.rootSvg.querySelectorAll(`.p${puic.parentId} > .p${puic.childId}, #p${puic.parentId} > .p${puic.childId},` +
190
- `#p${puic.parentId} > #p${puic.childId}, .p${puic.parentId} #p${puic.childId}`);
191
- }
192
- else {
193
- return this.rootSvg.querySelectorAll(`.p${puic}, #p${puic}`);
194
- }
195
- };
196
- }
197
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PuicHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
198
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PuicHelperService, providedIn: 'root' }); }
199
- }
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PuicHelperService, decorators: [{
201
- type: Injectable,
202
- args: [{
203
- providedIn: 'root'
204
- }]
205
- }] });
206
-
207
- class ClickareaService {
208
- constructor(puicHelper) {
209
- this.puicHelper = puicHelper;
210
- this.timeout = 250;
211
- }
212
- delayedClickAreaCreation(ids) {
213
- if (ids.size === 0) {
214
- return;
215
- }
216
- window.clearTimeout(this.timer);
217
- this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);
218
- }
219
- /**
220
- * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids
221
- */
222
- createClickareas(ids) {
223
- Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());
224
- ids.forEach(id => {
225
- this.puicHelper.getAllElementsForPuic(id).forEach(element => {
226
- if (element) {
227
- const polylines = Array.from(element.getElementsByTagName('polyline'));
228
- polylines.forEach(p => {
229
- const clone = p.cloneNode(true);
230
- clone.setAttribute('class', 'imxview-clickarea');
231
- clone.removeAttribute('id');
232
- element.insertBefore(clone, p);
233
- });
234
- if (element instanceof SVGTextElement && polylines.length === 0 && id instanceof ParentChildId) {
235
- this.createClickAreaRect(element);
236
- }
237
- }
238
- });
239
- });
240
- }
241
- createClickAreaRect(element) {
242
- const bbox = element.getBBox();
243
- const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
244
- rect.setAttribute('x', bbox.x.toString());
245
- rect.setAttribute('y', bbox.y.toString());
246
- rect.setAttribute('width', bbox.width.toString());
247
- rect.setAttribute('height', bbox.height.toString());
248
- rect.setAttribute('class', 'imxview-clickarea-rect-text');
249
- rect.setAttribute('fill', 'transparent');
250
- rect.setAttribute('stroke', 'none');
251
- const transform = element.getAttribute('transform');
252
- if (transform) {
253
- rect.setAttribute('transform', transform);
254
- }
255
- if (element.parentNode) {
256
- element.parentNode.insertBefore(rect, element);
257
- }
258
- }
259
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ClickareaService, deps: [{ token: PuicHelperService }], target: i0.ɵɵFactoryTarget.Injectable }); }
260
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ClickareaService, providedIn: 'root' }); }
261
- }
262
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ClickareaService, decorators: [{
263
- type: Injectable,
264
- args: [{
265
- providedIn: 'root'
266
- }]
267
- }], ctorParameters: () => [{ type: PuicHelperService }] });
268
-
269
268
  class SvgInfo {
270
269
  constructor(svg, coordinates) {
271
270
  this.svg = svg;
@@ -294,10 +293,10 @@ class SvgCoordinatesService {
294
293
  div = null;
295
294
  return result;
296
295
  }
297
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SvgCoordinatesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
298
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SvgCoordinatesService, providedIn: 'root' }); }
296
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SvgCoordinatesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
297
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SvgCoordinatesService, providedIn: 'root' }); }
299
298
  }
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SvgCoordinatesService, decorators: [{
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SvgCoordinatesService, decorators: [{
301
300
  type: Injectable,
302
301
  args: [{
303
302
  providedIn: 'root'
@@ -305,13 +304,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
305
304
  }] });
306
305
 
307
306
  class ImxViewerComponent {
308
- constructor(document, http, clickAreaService, puicHelper, renderer, svgCoordinatesService) {
309
- this.document = document;
310
- this.http = http;
311
- this.clickAreaService = clickAreaService;
312
- this.puicHelper = puicHelper;
313
- this.renderer = renderer;
314
- this.svgCoordinatesService = svgCoordinatesService;
307
+ constructor() {
308
+ this.document = inject(DocumentToken);
309
+ this.http = inject(HttpClient);
310
+ this.clickAreaService = inject(ClickareaService);
311
+ this.puicHelper = inject(PuicHelperService);
312
+ this.renderer = inject(Renderer2);
313
+ this.svgCoordinatesService = inject(SvgCoordinatesService);
315
314
  this.SVG_BASE64_PREFIX = 'data:image/svg+xml;base64,';
316
315
  this.SVG_PREFIX = 'data:image/svg+xml,';
317
316
  this.useClickArea = false;
@@ -509,8 +508,8 @@ class ImxViewerComponent {
509
508
  try {
510
509
  parsed = atob(svgSrc.substring(this.SVG_BASE64_PREFIX.length));
511
510
  }
512
- catch (e) {
513
- return throwError('Data-url parse error');
511
+ catch (error) {
512
+ return throwError(() => new Error(`Data-url parse error: ${error.message}`));
514
513
  }
515
514
  }
516
515
  else if (svgSrc.startsWith(this.SVG_PREFIX)) {
@@ -714,16 +713,13 @@ class ImxViewerComponent {
714
713
  this.clickAreaService.delayedClickAreaCreation(clickareaIds);
715
714
  }
716
715
  }
717
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerComponent, deps: [{ token: DocumentToken }, { token: i1.HttpClient }, { token: ClickareaService }, { token: PuicHelperService }, { token: i0.Renderer2 }, { token: SvgCoordinatesService }], target: i0.ɵɵFactoryTarget.Component }); }
718
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ImxViewerComponent, isStandalone: false, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom", buttons: "buttons", preDestroy: "preDestroy" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded", panned: "panned" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<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", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
716
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
717
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ImxViewerComponent, isStandalone: false, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom", buttons: "buttons", preDestroy: "preDestroy" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded", panned: "panned" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\"\n 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()\"\n data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n @if (popoverTitleContent !== undefined) {\n <h3 class=\"popover-header\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n }\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
719
718
  }
720
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerComponent, decorators: [{
719
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerComponent, decorators: [{
721
720
  type: Component,
722
- args: [{ selector: 'imx-viewer', standalone: false, template: "<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", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"] }]
723
- }], ctorParameters: () => [{ type: undefined, decorators: [{
724
- type: Inject,
725
- args: [DocumentToken]
726
- }] }, { type: i1.HttpClient }, { type: ClickareaService }, { type: PuicHelperService }, { type: i0.Renderer2 }, { type: SvgCoordinatesService }], propDecorators: { useClickArea: [{
721
+ args: [{ selector: 'imx-viewer', standalone: false, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\"\n 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()\"\n data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n @if (popoverTitleContent !== undefined) {\n <h3 class=\"popover-header\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n }\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"] }]
722
+ }], ctorParameters: () => [], propDecorators: { useClickArea: [{
727
723
  type: Input
728
724
  }], inlineDgnCssImport: [{
729
725
  type: Input
@@ -832,14 +828,14 @@ class ImxViewerBehaviourApi {
832
828
  }
833
829
 
834
830
  class ImxViewerModule {
835
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
836
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerModule, declarations: [ImxViewerComponent], imports: [CommonModule], exports: [ImxViewerComponent] }); }
837
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerModule, providers: [
831
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
832
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerModule, declarations: [ImxViewerComponent], imports: [CommonModule], exports: [ImxViewerComponent] }); }
833
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerModule, providers: [
838
834
  { provide: DocumentToken, useFactory: documentProvider },
839
835
  provideHttpClient(withInterceptorsFromDi())
840
836
  ], imports: [CommonModule] }); }
841
837
  }
842
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ImxViewerModule, decorators: [{
838
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImxViewerModule, decorators: [{
843
839
  type: NgModule,
844
840
  args: [{ declarations: [
845
841
  ImxViewerComponent
@@ -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/model/elements-ids.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","import { ElementId } from './elements-ids';\r\n\r\nexport class SelectieEvent {\r\n constructor(public id: ElementId, 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 + Number.parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + Number.parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - Number.parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - Number.parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\n }\n}\n","export type ElementId = (string | ParentChildId);\nexport type ElementIds = ElementId[];\n\nexport class ParentChildId {\n constructor(\n public parentId: string,\n public childId: string,\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { ElementId, ParentChildId } from '../model/elements-ids';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: SVGSVGElement;\n\n public setRootSvg = (svgParent: SVGSVGElement): SVGSVGElement => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: ElementId): NodeListOf<HTMLElement> => {\n if (!this.rootSvg) return {} as NodeListOf<HTMLElement>;\n if (puic instanceof ParentChildId) {\n return this.rootSvg.querySelectorAll(\n `.p${ puic.parentId } > .p${ puic.childId }, #p${ puic.parentId } > .p${ puic.childId },` +\n `#p${ puic.parentId } > #p${ puic.childId }, .p${ puic.parentId } #p${ puic.childId }`);\n } else {\n return this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`);\n }\n };\n}\n","import { Injectable } from '@angular/core';\nimport { ElementId, ParentChildId } from '../model/elements-ids';\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<ElementId>): void {\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<ElementId>): void {\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 if( element instanceof SVGTextElement && polylines.length === 0 && id instanceof ParentChildId) {\n this.createClickAreaRect(element);\n }\n }\n });\n });\n }\n private createClickAreaRect(element: SVGTextElement): void {\n const bbox = element.getBBox();\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', bbox.x.toString());\n rect.setAttribute('y', bbox.y.toString());\n rect.setAttribute('width', bbox.width.toString());\n rect.setAttribute('height', bbox.height.toString());\n rect.setAttribute('class', 'imxview-clickarea-rect-text');\n rect.setAttribute('fill', 'transparent');\n rect.setAttribute('stroke', 'none');\n\n const transform = element.getAttribute('transform');\n if (transform) {\n rect.setAttribute('transform', transform);\n }\n if (element.parentNode) {\n element.parentNode.insertBefore(rect, element);\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): number {\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 = Number.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 { ImxViewerButton } from '../model/button';\r\nimport { ElementId, ElementIds } from '../model/elements-ids';\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 standalone: false\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: ElementIds = [];\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 @Input() buttons: ImxViewerButton[] | null = null;\r\n\r\n @Input() preDestroy: () => void = () => {};\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 buttonWidth = 128;\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 if (this.svgGeladen && this.buttons) {\r\n this.removeExistingButtons();\r\n this.injectButtons();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.preDestroy();\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 = Number.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, elementId: ElementId): 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(elementId, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(elementId, 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: ElementIds, eventtype: string): void {\r\n this.removeOldListeners(eventtype);\r\n\r\n const listeners = new Map();\r\n if (clickableIds) {\r\n clickableIds.forEach(clickableId => {\r\n const elements = this.puicHelper.getAllElementsForPuic(clickableId);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, clickableId));\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 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 this.getSvgParent().querySelectorAll('[class*=imxview-selected]').forEach(element => {\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.resetZoom();\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private injectButtons(): void {\r\n const svgEl = this.getSvgParent().querySelector('svg');\r\n if (!svgEl || !Array.isArray(this.buttons)) return;\r\n\r\n const padding = 64;\r\n const { x: bboxX, width: bboxWidth } = svgEl.getBBox();\r\n const newWidth = bboxWidth + (padding * 2) + (this.buttonWidth * 2);\r\n\r\n svgEl.setAttribute('width', newWidth.toString());\r\n svgEl.setAttribute('viewBox', `${bboxX - padding - this.buttonWidth} 0 ${newWidth} 175`);\r\n\r\n const sideCounts = this.buttons.reduce(\r\n (acc, btn) => {\r\n return { ...acc, [btn.side]: acc[btn.side] + 1 };\r\n },\r\n { left: 0, right: 0 }\r\n );\r\n\r\n let sideIndexes = { left: 0, right: 0 };\r\n this.buttons.forEach(btn => {\r\n const group = this.createButtonGroup(\r\n btn,\r\n sideIndexes[btn.side],\r\n sideCounts[btn.side],\r\n bboxX,\r\n bboxWidth\r\n );\r\n sideIndexes = { ...sideIndexes, [btn.side]: sideIndexes[btn.side] + 1 };\r\n svgEl.appendChild(group);\r\n });\r\n }\r\n\r\n private createButtonGroup(\r\n btn: ImxViewerButton,\r\n index: number,\r\n sideCount: number,\r\n bboxX: number,\r\n bboxWidth: number\r\n ): SVGGElement {\r\n const buttonHeight = 24;\r\n const spacing = 10;\r\n const yOffsetBase = 42;\r\n const yOffsetAdjust = 21;\r\n\r\n const buttonX = btn.side === 'left'\r\n ? bboxX - this.buttonWidth - spacing\r\n : bboxX + bboxWidth + spacing;\r\n\r\n let buttonY = index * (buttonHeight + spacing) + yOffsetBase;\r\n if (sideCount >= 4) buttonY -= yOffsetBase;\r\n else if (sideCount >= 3) buttonY -= yOffsetAdjust;\r\n\r\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n group.setAttribute('class', 'imxviewer-button');\r\n group.setAttribute('id', btn.id || '');\r\n group.setAttribute('tabindex', '0');\r\n group.setAttribute('role', 'button');\r\n group.setAttribute('style', 'cursor:pointer');\r\n group.setAttribute('transform', `translate(${buttonX}, ${buttonY})`);\r\n group.addEventListener('click', () => btn.clickEvent?.());\r\n\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n rect.setAttribute('x', '0');\r\n rect.setAttribute('y', '0');\r\n rect.setAttribute('width', this.buttonWidth.toString());\r\n rect.setAttribute('height', buttonHeight.toString());\r\n rect.setAttribute('rx', '6');\r\n rect.setAttribute('fill', '#88888f');\r\n rect.setAttribute('stroke', '#88888f');\r\n rect.setAttribute('stroke-width', '2');\r\n\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n text.setAttribute('x', (this.buttonWidth / 2).toString());\r\n text.setAttribute('y', (buttonHeight / 2 + 5).toString());\r\n text.setAttribute('text-anchor', 'middle');\r\n text.setAttribute('font-size', '14');\r\n text.setAttribute('font-family', 'Roboto-Condensed');\r\n text.textContent = btn.label;\r\n\r\n group.appendChild(rect);\r\n group.appendChild(text);\r\n\r\n return group;\r\n }\r\n\r\n private removeExistingButtons(): void {\r\n const svgEl = this.getSvgParent().querySelector('svg');\r\n svgEl.querySelectorAll('.imxviewer-button').forEach(el => el?.remove());\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 readonly getSvgParent = (): SVGSVGElement => 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 { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({ declarations: [\n ImxViewerComponent\n ],\n exports: [\n ImxViewerComponent\n ], imports: [CommonModule], providers: [\n { provide: DocumentToken, useFactory: documentProvider },\n provideHttpClient(withInterceptorsFromDi())\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","import { ElementIds } from './elements-ids';\n\nexport class SelectieInfo {\n constructor(public ids: ElementIds, 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,WAAA,CAAmB,CAAS,EAAS,CAAS,EAAA;QAA3B,IAAA,CAAA,CAAC,GAAD,CAAC;QAAiB,IAAA,CAAA,CAAC,GAAD,CAAC;IACtC;AACD;;MCDY,aAAa,CAAA;IACtB,WAAA,CAAmB,EAAa,EAAS,KAAiB,EAAA;QAAvC,IAAA,CAAA,EAAE,GAAF,EAAE;QAAoB,IAAA,CAAA,KAAK,GAAL,KAAK;IAC9C;AACH;;MCLY,WAAW,CAAA;AACpB,IAAA,OAAO,QAAQ,CAAC,IAAa,EAAE,GAAW,EAAA;AACtC,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACZ;QACJ;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AACrD,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;YACJ;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvE;AAEA,IAAA,OAAO,yBAAyB,CAAC,IAAa,EAAE,GAAW,EAAA;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE;YACZ;QACJ;QACA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;QACtB,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;YACxB;QACJ;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QACjC;aAAO;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD;IACJ;AACH;;AChCM,MAAM,aAAa,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC;SAC3C,gBAAgB,GAAA;AAC5B,IAAA,OAAO,QAAQ;AACnB;;MCLa,WAAW,CAAA;;AAGb,IAAA,OAAO,SAAS,CAAC,EAAW,EAAE,EAAW,EAAA;QAC5C,IAAI,CAAC,EAAE,EAAE;AACL,YAAA,OAAO,EAAE;QACb;AAEA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK;AAClB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;;;;;;;AAOjB,YAAA,OAAO,EAAE;QACb;AACA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK;AAClB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,EAAE;QACb;AACA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AACd,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;QACd,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;AACV,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;AAChB,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;QAChB,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;AACV,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;QACA,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;QAEV,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC1C;AACH;;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;AAC5D,YAAA,MAAM,UAAU,GAAG,YAAY,CAAC,UAA2B;AAC3D,YAAA,IAAI,UAAmB;YACvB,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;AAC7E,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;wBAC9E,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC;oBAC/D;AACJ,gBAAA,CAAC,CAAC;YACN;AACA,YAAA,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC;QACtG;IACJ;IAEA,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;;AAG5G,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE;AAC5C,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACtC,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACvC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;;AAG5D,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,EAAE;AACxC,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;AACnB,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;YACpB,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;;YAG9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAChF,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;;YAEhG,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;AACzE,aAAA,CAAC;QACN;IACJ;IAEQ,OAAO,sCAAsC,CAAC,IAAa,EAAA;QAC/D,MAAM,OAAO,GAAyB,IAAK;AAC3C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;QAE9B,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC1C,YAAA,IAAI,GAAG,IAAI,CAAC,aAAa;QAC7B;AACA,QAAA,IAAI,GAAG,IAAI,CAAC,aAAa;QACzB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QAC5C,IAAI,OAAO,EAAE;YACT,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5D,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChE;AACA,QAAA,OAAO,IAAI;IACf;AACH;;MCtEY,aAAa,CAAA;IACtB,WAAA,CACW,QAAgB,EAChB,OAAe,EAAA;QADf,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,OAAO,GAAP,OAAO;IACf;AACN;;MCFY,iBAAiB,CAAA;AAH9B,IAAA,WAAA,GAAA;QAMW,IAAA,CAAA,UAAU,GAAG,CAAC,SAAwB,KAAoB,IAAI,CAAC,OAAO,GAAG,SAAS;AAClF,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,IAAe,KAA6B;YACxE,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,EAA6B;AACvD,YAAA,IAAI,IAAI,YAAY,aAAa,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAChC,CAAA,EAAA,EAAM,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,OAAQ,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,CAAA,CAAA,CAAG;AACzF,oBAAA,CAAA,EAAA,EAAM,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,CAAA,IAAA,EAAQ,IAAI,CAAC,QAAS,CAAA,GAAA,EAAO,IAAI,CAAC,OAAQ,CAAA,CAAE,CAAC;YAC/F;iBAAO;AACH,gBAAA,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAM,IAAK,CAAA,IAAA,EAAQ,IAAK,CAAA,CAAE,CAAC;YACpE;AACJ,QAAA,CAAC;AACJ,IAAA;+GAdY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAET,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCEY,gBAAgB,CAAA;AAIzB,IAAA,WAAA,CAAoB,UAA6B,EAAA;QAA7B,IAAA,CAAA,UAAU,GAAV,UAAU;QAF9B,IAAA,CAAA,OAAO,GAAG,GAAG;IAGb;AAEA,IAAA,wBAAwB,CAAC,GAAmB,EAAA;AACxC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE;YAChB;QACJ;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IAClF;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,GAAmB,EAAA;QACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AAEzF,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;AACtE,oBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAG;wBAClB,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAY;AAC1C,wBAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,mBAAmB,CAAC;AAChD,wBAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3B,wBAAA,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;AAClC,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,OAAO,YAAY,cAAc,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,YAAY,aAAa,EAAE;AAC5F,wBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;oBACrC;gBACJ;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AACQ,IAAA,mBAAmB,CAAC,OAAuB,EAAA;AAC/C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,6BAA6B,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;QAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;QACnD,IAAI,SAAS,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC;QAC7C;AACA,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;QAClD;IACJ;+GAzDS,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAET,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCJY,OAAO,CAAA;IAClB,WAAA,CAAmB,GAAW,EAAS,WAAmB,EAAA;QAAvC,IAAA,CAAA,GAAG,GAAH,GAAG;QAAiB,IAAA,CAAA,WAAW,GAAX,WAAW;IAClD;AACD;;MCEY,qBAAqB,CAAA;AAC9B,IAAA,uBAAuB,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAc,EAAE;AAC3B,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;AAChE,gBAAA,UAAU,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtE;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,KAAK;IAChB;AAEQ,IAAA,cAAc,CAAC,iBAAyB,EAAA;QAC5C,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACvC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB;;AAEjC,QAAA,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI;AACV,QAAA,OAAO,MAAM;IACjB;+GArBS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAET,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCqCY,kBAAkB,CAAA;IA6C3B,WAAA,CAC4C,QAAa,EACpC,IAAgB,EAChB,gBAAkC,EAClC,UAA6B,EAC7B,QAAmB,EACnB,qBAA4C,EAAA;QALrB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAC/B,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;QAlDlC,IAAA,CAAA,iBAAiB,GAAG,4BAA4B;QAChD,IAAA,CAAA,UAAU,GAAG,qBAAqB;QAEjC,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAE1B,IAAA,CAAA,aAAa,GAAmB,EAAE;;QAGlC,IAAA,CAAA,YAAY,GAAe,EAAE;QAC7B,IAAA,CAAA,iBAAiB,GAAa,EAAE;QAChC,IAAA,CAAA,YAAY,GAAkB,EAAE;QAChC,IAAA,CAAA,oBAAoB,GAAG,GAAG;QAC1B,IAAA,CAAA,yBAAyB,GAAG,KAAK;;AAEjC,QAAA,IAAA,CAAA,iBAAiB,GAAG,CAAC,qBAA4C,KAAU;YAChF,qBAAqB,CAAC,GAAG,EAAE;YAC3B,qBAAqB,CAAC,MAAM,EAAE;AAClC,QAAA,CAAC;QACQ,IAAA,CAAA,OAAO,GAA6B,IAAI;AAExC,QAAA,IAAA,CAAA,UAAU,GAAe,MAAK,EAAE,CAAC;QAI1C,IAAA,CAAA,MAAM,GAAG,KAAK;AACd,QAAA,IAAA,CAAA,YAAY,GAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;QACzC,IAAA,CAAA,kBAAkB,GAAG,EAAE;QAEvB,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,WAAW,GAAG,GAAG;AAEP,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAChD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAiB;AACrD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;;AAEpC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAY;QAEvC,IAAA,CAAA,UAAU,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,cAAc,GAAmC,IAAI,GAAG,EAAE;QAE1D,IAAA,CAAA,2BAA2B,GAAY,KAAK;AA2E7C,QAAA,IAAA,CAAA,qBAAqB,GAAsB,MAAM,IAAI,CAAC,aAAa;QAa1E,IAAA,CAAA,WAAW,GAAG,MAAc,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,QAAQ;QAoXlD,IAAA,CAAA,YAAY,GAAG,MAAqB,IAAI,CAAC,YAAY,CAAC,aAAa;IAncpF;IAEA,QAAQ,GAAA;QACJ,IAAI,CAAC,8BAA8B,EAAE;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD;IAGA,QAAQ,GAAA;QACJ,IAAI,CAAC,2BAA2B,EAAE;IACtC;IAEQ,2BAA2B,GAAA;;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,WAAW;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,YAAY;IACtE;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;;QAG9B,IAAI,CAAC,8BAA8B,EAAE;AAErC,QAAA,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO;QAEvG,IAAI,YAAY,IAAI,YAAY,IAAI,iBAAiB,IAAI,YAAY,EAAE;YACnE,IAAI,CAAC,wBAAwB,EAAE;QACnC;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;YACvC,IAAI,CAAC,QAAQ,EAAE;QACnB;QAEA,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;QACpE;QAEA,IAAI,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,IAAI,CAAC,UAAU,EAAE;YAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC/E;QAEA,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE;YACxD,IAAI,CAAC,cAAc,EAAE;QACzB;QAEA,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,kCAAkC,EAAE;QAC7C;QAEA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;YACjC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,aAAa,EAAE;QACxB;IACJ;IAEA,WAAW,GAAA;QACP,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;IAClC;AAEO,IAAA,UAAU,CAAC,QAAkB,EAAA;AAChC,QAAA,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;IACvE;;IAKO,OAAO,cAAc,CAAC,iBAAyB,EAAA;QAClD,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACvC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB;;QAEjC,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI;AACV,QAAA,OAAO,MAAM;IACjB;IAIQ,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;AAClB,oBAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AAClC,wBAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK;oBAC5C;yBAAO;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;oBAC5F;gBACJ,CAAC;AACD,gBAAA,YAAY,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;AACzC,gBAAA,WAAW,EAAE;AAChB,aAAA,CAAC;YAEF,IAAI,CAAC,iBAAiB,EAAE;QAC5B;IACJ;IAEQ,cAAc,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,IAAI,CAAC,IAAI,EAAE;YACP;QACJ;;QAGA,qBAAqB,CAAC,MAAK;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACrE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,QAAA,CAAC,CAAC;IACN;IAEQ,cAAc,GAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE;AAElD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;YACf;QACJ;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI;AAC5C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI;;QAG9C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;AAE9B,QAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;IACnF;AAEA;;;;;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;AAE3E,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,kBAAkB,GAAG,2BAA2B,GAAG,EAAE;YACtE,KAAK;AACD,gBAAA,CAAA;;;;kBAIE;AACN,YAAA,IAAI,CAAC,SAAS;AACV,gBAAA,CAAA;0BACW,KAAM,CAAA;;AAEc,4CAAA,EAAA,IAAI,CAAC,WAAY,CAAA,QAAA,EAAY,IAAI,CAAC,YAAa,CAAA;;iBAE7E;YACL,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB;YAC/D,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACzD,UAAU,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxD;IACJ;IAEQ,QAAQ,GAAA;QACZ,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACnE,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACZ,SAAS,CAAC,IAAI,IAAG;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACrB,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;YAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;YAC3E,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,kCAAkC,EAAE;YACzC,IAAI,CAAC,2BAA2B,EAAE;AACtC,QAAA,CAAC,EACD,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAClC;IACL;AAEQ,IAAA,OAAO,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC5B,YAAA,IAAI,MAAM;YACV,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;gBAClE;gBAAE,OAAO,CAAC,EAAE;AACR,oBAAA,OAAOC,UAAoB,CAAC,sBAAsB,CAAC;gBACvD;YACJ;iBAAO,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC3C,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACrD;YAEA,IAAI,MAAM,EAAE;AACR,gBAAA,OAAOC,EAAY,CAAC,MAAM,CAAC;YAC/B;QACJ;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAC1D;AAEQ,IAAA,8BAA8B,CAAC,SAA4B,EAAE,IAAI,EAAE,SAAiB,EAAE,SAAoB,EAAA;QAC9G,MAAM,sBAAsB,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAClD,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,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,KAAI;oBACF,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC5D,oBAAA,OAAO,KAAK;AAChB,gBAAA,CAAC;AACL,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;AACpC,YAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;YACjC;QACJ;IACJ;IAEQ,+BAA+B,CAAC,YAAwB,EAAE,SAAiB,EAAA;AAC/E,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;AAElC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE;QAC3B,IAAI,YAAY,EAAE;AACd,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,IAAG;gBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,WAAW,CAAC;gBACnE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,8BAA8B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAClH,YAAA,CAAC,CAAC;QACN;QACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;IACjD;IAEQ,kCAAkC,GAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE;AAC3B,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;AACzD,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;AACxD,4BAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB;;AAG1D,4BAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1C,wBAAA,CAAC;wBAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,wBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AACvB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1C;AACJ,gBAAA,CAAC,CACJ;AACL,YAAA,CAAC,CACJ;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;QACnD;IACJ;AAEQ,IAAA,eAAe,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,EAAE;AACnB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;AAC1B,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACtE;AACA,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;YAEnE,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAEzC,YAAA,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;AAC9D,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACvE,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEvE,YAAA,UAAU,IAAI,GAAG,CAAC,SAAS;QAC/B;AAEA,QAAA,OAAO,UAAU;IACrB;AAEQ,IAAA,UAAU,CAAC,KAAK,EAAA;AACpB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;IACtB;AAEQ,IAAA,kBAAkB,CAAC,SAAiB,EAAA;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QACpD,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAI;AACzB,gBAAA,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACrC,IAAI,SAAS,KAAK,OAAO;AACrB,oBAAA,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACzE,YAAA,CAAC,CAAC;QACN;QACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC;IACjD;IAEQ,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;AAChF,YAAA,WAAW,CAAC,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC;AACtE,QAAA,CAAC,CAAC;AAEF,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;AAC9C,wBAAA,IAAI,EAAE,KAAK,YAAY,CAAC,KAAK,EAAE;4BAC3B,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAAC,KAAK,CAAC;wBACxE;AACJ,oBAAA,CAAC,CAAC;AACN,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;QACN;IACJ;IAEQ,OAAO,gBAAgB,CAAC,EAAW,EAAA;QACvC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;AAC1C,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,iBAAiB;IAClF;AAEQ,IAAA,SAAS,CAAC,CAAC,EAAA;QACf,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,qBAAqB,EAAE;AAC9E,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI;AACtD,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI;QACtD,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;AAC1C,YAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;SAClC;IACL;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AAC9B,QAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACxG,QAAA,yBAAyB,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB,CAAC;AAEtE,QAAA,yBAAyB,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAExE,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;QAC/B,IAAI,CAAC,iBAAiB,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD;IAEQ,aAAa,GAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE;QAE5C,MAAM,OAAO,GAAG,EAAE;AAClB,QAAA,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AACtD,QAAA,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAEnE,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAChD,QAAA,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW,MAAM,QAAQ,CAAA,IAAA,CAAM,CAAC;AAExF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,GAAG,KAAI;AACT,YAAA,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACpD,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CACxB;QAED,IAAI,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CACpC,GAAG,EACH,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EACrB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EACpB,KAAK,EACL,SAAS,CACR;YACD,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACvE,YAAA,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,QAAA,CAAC,CAAC;IACN;IAEQ,iBAAiB,CACrB,GAAoB,EACpB,KAAa,EACb,SAAiB,EACjB,KAAa,EACb,SAAiB,EAAA;QAEjB,MAAM,YAAY,GAAG,EAAE;QACvB,MAAM,OAAO,GAAG,EAAE;QAClB,MAAM,WAAW,GAAG,EAAE;QACtB,MAAM,aAAa,GAAG,EAAE;AAExB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK;AACzB,cAAE,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG;AAC7B,cAAE,KAAK,GAAG,SAAS,GAAG,OAAO;QAEjC,IAAI,OAAO,GAAG,KAAK,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,WAAW;QAC5D,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,IAAI,WAAW;aACrC,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,IAAI,aAAa;QAEjD,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,GAAG,CAAC;AACzE,QAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAC/C,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;AACtC,QAAA,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC;AACnC,QAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACpC,QAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC;QAC7C,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG,CAAC;AACpE,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,UAAU,IAAI,CAAC;QAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC;QAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK;AAE5B,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AAEvB,QAAA,OAAO,KAAK;IAChB;IAEQ,qBAAqB,GAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;AACtD,QAAA,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IAC3E;IAEQ,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;AACtD,YAAA,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,YAAY,CAAC;QAChE;IACJ;AArfS,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBA8Cf,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;AA9ChB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,kzBC3C/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;;4FDiCa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cAGV,KAAK,EAAA,QAAA,EAAA,iuBAAA,EAAA,MAAA,EAAA,CAAA,spGAAA,CAAA,EAAA;;0BAgDZ,MAAM;2BAAC,aAAa;;sBA1CxB;;sBACA;;sBACA;;sBACA;;sBAGA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAIA;;sBAEA;;sBAEA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAUvC;;sBACA;;sBACA;;sBAEA;;sBAqBA,YAAY;uBAAC,eAAe;;IA2crB;AAAZ,CAAA,UAAY,YAAY,EAAA;AACpB,IAAA,YAAA,CAAA,YAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ;AACR,IAAA,YAAA,CAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACH,IAAA,YAAA,CAAA,YAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAqB;AACzB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;MAaX,qBAAqB,CAAA;AAC9B,IAAA,WAAA,CAA6B,aAA0B,EAAA;QAA1B,IAAA,CAAA,aAAa,GAAb,aAAa;IAC1C;IAEO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,UAAU,CAAC,WAAoB,EAAA;QAClC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,WAAW,CAAC;AACnD,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,SAAS,CAAC,YAA+B,EAAA;QAC5C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,KAAI;;YAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC3C,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgC;YAEtD,OAAO;AACH,gBAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;AACnE,gBAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;aACrE;AACL,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACf;IAEQ,aAAa,CAAC,MAAwB,EAAE,YAA+B,EAAE,OAA8B,EAAE,KAAuB,EAAE,MAAwB,EAAA;AAC9J,QAAA,QAAQ,YAAY,CAAC,CAAC;YAClB,KAAK,YAAY,CAAC,qBAAqB;gBACvC;oBACI,MAAM,YAAY,GAAG,GAAG;oBACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY;AAChF,oBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC9E,oBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9D;YACA,KAAK,YAAY,CAAC,QAAQ;gBACtB,OAAO,MAAM,CAAC,CAAC;AACnB,YAAA;gBACI,OAAO,MAAM,CAAC,CAAC;;IAE3B;IAEQ,aAAa,CAAC,MAAwB,EAAE,YAA+B,EAAE,OAA8B,EAAE,KAAuB,EAAE,MAAwB,EAAA;AAC9J,QAAA,QAAQ,YAAY,CAAC,CAAC;AAClB,YAAA,KAAK,YAAY,CAAC,qBAAqB,EAAE;gBACrC,MAAM,WAAW,GAAG,GAAG;gBACvB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,WAAW;AAC/E,gBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC3E,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9D;YACA,KAAK,YAAY,CAAC,QAAQ;gBACtB,OAAO,MAAM,CAAC,CAAC;AACnB,YAAA;gBACI,OAAO,MAAM,CAAC,CAAC;;IAE3B;IAEO,GAAG,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE;AACxB,QAAA,OAAO,IAAI;IACf;IAEO,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC3B,QAAA,OAAO,IAAI;IACf;AACH;;MEpnBY,eAAe,CAAA;+GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,CARpB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAIT,YAAY,aADrB,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAKb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,SAAA,EAJe;AACnC,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACxD,iBAAiB,CAAC,sBAAsB,EAAE;AAC7C,SAAA,EAAA,OAAA,EAAA,CAHY,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAIhB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAT3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,YAAY,EAAE;wBAClB;AACH,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL;AACH,qBAAA,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE;AACnC,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;wBACxD,iBAAiB,CAAC,sBAAsB,EAAE;qBAC7C,EAAE;;;MCdM,WAAW,CAAA;IAEpB,WAAA,CAAoB,SAAmB,EAAS,kBAA0B,EAAA;QAAtD,IAAA,CAAA,SAAS,GAAT,SAAS;QAAmB,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;IAClE;AACH;;MCFY,YAAY,CAAA;IACrB,WAAA,CAAmB,GAAe,EAAS,KAAa,EAAA;QAArC,IAAA,CAAA,GAAG,GAAH,GAAG;QAAqB,IAAA,CAAA,KAAK,GAAL,KAAK;IAChD;AACH;;ACLD;;AAEG;;;;"}
1
+ {"version":3,"file":"loxia-imx-viewer.mjs","sources":["../../src/model/point.ts","../../src/model/selectie-event.ts","../../src/model/elements-ids.ts","../../src/services/puic-helper.service.ts","../../src/services/clickarea.service.ts","../../src/utils/classes-util.ts","../../src/utils/document-token.ts","../../src/utils/svg-rect-util.ts","../../src/utils/focus-util.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","import { ElementId } from './elements-ids';\r\n\r\nexport class SelectieEvent {\r\n constructor(public id: ElementId, public event: MouseEvent) {\r\n }\r\n}\r\n","export type ElementId = (string | ParentChildId);\nexport type ElementIds = ElementId[];\n\nexport class ParentChildId {\n constructor(\n public parentId: string,\n public childId: string,\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { ElementId, ParentChildId } from '../model/elements-ids';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: SVGSVGElement;\n\n public setRootSvg = (svgParent: SVGSVGElement): SVGSVGElement => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: ElementId): NodeListOf<HTMLElement> => {\n if (!this.rootSvg) return {} as NodeListOf<HTMLElement>;\n if (puic instanceof ParentChildId) {\n return this.rootSvg.querySelectorAll(\n `.p${ puic.parentId } > .p${ puic.childId }, #p${ puic.parentId } > .p${ puic.childId },` +\n `#p${ puic.parentId } > #p${ puic.childId }, .p${ puic.parentId } #p${ puic.childId }`);\n } else {\n return this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`);\n }\n };\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ElementId, ParentChildId } from '../model/elements-ids';\nimport { PuicHelperService } from './puic-helper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClickareaService {\n private readonly puicHelper = inject(PuicHelperService);\n\n private timer: number;\n timeout = 250;\n\n constructor() {\n }\n\n delayedClickAreaCreation(ids: Set<ElementId>): void {\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<ElementId>): void {\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 if( element instanceof SVGTextElement && polylines.length === 0 && id instanceof ParentChildId) {\n this.createClickAreaRect(element);\n }\n }\n });\n });\n }\n private createClickAreaRect(element: SVGTextElement): void {\n const bbox = element.getBBox();\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', bbox.x.toString());\n rect.setAttribute('y', bbox.y.toString());\n rect.setAttribute('width', bbox.width.toString());\n rect.setAttribute('height', bbox.height.toString());\n rect.setAttribute('class', 'imxview-clickarea-rect-text');\n rect.setAttribute('fill', 'transparent');\n rect.setAttribute('stroke', 'none');\n\n const transform = element.getAttribute('transform');\n if (transform) {\n rect.setAttribute('transform', transform);\n }\n if (element.parentNode) {\n element.parentNode.insertBefore(rect, element);\n }\n }\n}\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 + Number.parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + Number.parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - Number.parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - Number.parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\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): number {\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 = Number.parseFloat(x);\n div = null;\n return result;\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewChild, inject } from '@angular/core';\r\nimport { combineLatest, Observable, of as observableOf, throwError } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport SvgPanZoom from 'svg-pan-zoom';\r\nimport { ImxViewerButton } from '../model/button';\r\nimport { ElementId, ElementIds } from '../model/elements-ids';\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 standalone: false\r\n})\r\nexport class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n private readonly document = inject(DocumentToken);\r\n private readonly http = inject(HttpClient);\r\n private readonly clickAreaService = inject(ClickareaService);\r\n private readonly puicHelper = inject(PuicHelperService);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly svgCoordinatesService = inject(SvgCoordinatesService);\r\n\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: ElementIds = [];\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 @Input() buttons: ImxViewerButton[] | null = null;\r\n\r\n @Input() preDestroy: () => void = () => {};\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 buttonWidth = 128;\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 }\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 if (this.svgGeladen && this.buttons) {\r\n this.removeExistingButtons();\r\n this.injectButtons();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.preDestroy();\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 = Number.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 (error) {\r\n return throwError(() => new Error(`Data-url parse error: ${error.message}`));\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, elementId: ElementId): 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(elementId, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(elementId, 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: ElementIds, eventtype: string): void {\r\n this.removeOldListeners(eventtype);\r\n\r\n const listeners = new Map();\r\n if (clickableIds) {\r\n clickableIds.forEach(clickableId => {\r\n const elements = this.puicHelper.getAllElementsForPuic(clickableId);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, clickableId));\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 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 this.getSvgParent().querySelectorAll('[class*=imxview-selected]').forEach(element => {\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.resetZoom();\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private injectButtons(): void {\r\n const svgEl = this.getSvgParent().querySelector('svg');\r\n if (!svgEl || !Array.isArray(this.buttons)) return;\r\n\r\n const padding = 64;\r\n const { x: bboxX, width: bboxWidth } = svgEl.getBBox();\r\n const newWidth = bboxWidth + (padding * 2) + (this.buttonWidth * 2);\r\n\r\n svgEl.setAttribute('width', newWidth.toString());\r\n svgEl.setAttribute('viewBox', `${bboxX - padding - this.buttonWidth} 0 ${newWidth} 175`);\r\n\r\n const sideCounts = this.buttons.reduce(\r\n (acc, btn) => {\r\n return { ...acc, [btn.side]: acc[btn.side] + 1 };\r\n },\r\n { left: 0, right: 0 }\r\n );\r\n\r\n let sideIndexes = { left: 0, right: 0 };\r\n this.buttons.forEach(btn => {\r\n const group = this.createButtonGroup(\r\n btn,\r\n sideIndexes[btn.side],\r\n sideCounts[btn.side],\r\n bboxX,\r\n bboxWidth\r\n );\r\n sideIndexes = { ...sideIndexes, [btn.side]: sideIndexes[btn.side] + 1 };\r\n svgEl.appendChild(group);\r\n });\r\n }\r\n\r\n private createButtonGroup(\r\n btn: ImxViewerButton,\r\n index: number,\r\n sideCount: number,\r\n bboxX: number,\r\n bboxWidth: number\r\n ): SVGGElement {\r\n const buttonHeight = 24;\r\n const spacing = 10;\r\n const yOffsetBase = 42;\r\n const yOffsetAdjust = 21;\r\n\r\n const buttonX = btn.side === 'left'\r\n ? bboxX - this.buttonWidth - spacing\r\n : bboxX + bboxWidth + spacing;\r\n\r\n let buttonY = index * (buttonHeight + spacing) + yOffsetBase;\r\n if (sideCount >= 4) buttonY -= yOffsetBase;\r\n else if (sideCount >= 3) buttonY -= yOffsetAdjust;\r\n\r\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n group.setAttribute('class', 'imxviewer-button');\r\n group.setAttribute('id', btn.id || '');\r\n group.setAttribute('tabindex', '0');\r\n group.setAttribute('role', 'button');\r\n group.setAttribute('style', 'cursor:pointer');\r\n group.setAttribute('transform', `translate(${buttonX}, ${buttonY})`);\r\n group.addEventListener('click', () => btn.clickEvent?.());\r\n\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n rect.setAttribute('x', '0');\r\n rect.setAttribute('y', '0');\r\n rect.setAttribute('width', this.buttonWidth.toString());\r\n rect.setAttribute('height', buttonHeight.toString());\r\n rect.setAttribute('rx', '6');\r\n rect.setAttribute('fill', '#88888f');\r\n rect.setAttribute('stroke', '#88888f');\r\n rect.setAttribute('stroke-width', '2');\r\n\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n text.setAttribute('x', (this.buttonWidth / 2).toString());\r\n text.setAttribute('y', (buttonHeight / 2 + 5).toString());\r\n text.setAttribute('text-anchor', 'middle');\r\n text.setAttribute('font-size', '14');\r\n text.setAttribute('font-family', 'Roboto-Condensed');\r\n text.textContent = btn.label;\r\n\r\n group.appendChild(rect);\r\n group.appendChild(text);\r\n\r\n return group;\r\n }\r\n\r\n private removeExistingButtons(): void {\r\n const svgEl = this.getSvgParent().querySelector('svg');\r\n svgEl.querySelectorAll('.imxviewer-button').forEach(el => el?.remove());\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 readonly getSvgParent = (): SVGSVGElement => 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()\"\n 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()\"\n data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n @if (popoverTitleContent !== undefined) {\n <h3 class=\"popover-header\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n }\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 { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({ declarations: [\n ImxViewerComponent\n ],\n exports: [\n ImxViewerComponent\n ], imports: [CommonModule], providers: [\n { provide: DocumentToken, useFactory: documentProvider },\n provideHttpClient(withInterceptorsFromDi())\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","import { ElementIds } from './elements-ids';\n\nexport class SelectieInfo {\n constructor(public ids: ElementIds, public clazz: string) {\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["observableOf"],"mappings":";;;;;;;;;MAAa,KAAK,CAAA;IAChB,WAAA,CAAmB,CAAS,EAAS,CAAS,EAAA;QAA3B,IAAA,CAAA,CAAC,GAAD,CAAC;QAAiB,IAAA,CAAA,CAAC,GAAD,CAAC;IACtC;AACD;;MCDY,aAAa,CAAA;IACtB,WAAA,CAAmB,EAAa,EAAS,KAAiB,EAAA;QAAvC,IAAA,CAAA,EAAE,GAAF,EAAE;QAAoB,IAAA,CAAA,KAAK,GAAL,KAAK;IAC9C;AACH;;MCFY,aAAa,CAAA;IACtB,WAAA,CACW,QAAgB,EAChB,OAAe,EAAA;QADf,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,OAAO,GAAP,OAAO;IACf;AACN;;MCFY,iBAAiB,CAAA;AAH9B,IAAA,WAAA,GAAA;QAMW,IAAA,CAAA,UAAU,GAAG,CAAC,SAAwB,KAAoB,IAAI,CAAC,OAAO,GAAG,SAAS;AAClF,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,IAAe,KAA6B;YACxE,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,EAA6B;AACvD,YAAA,IAAI,IAAI,YAAY,aAAa,EAAE;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAChC,CAAA,EAAA,EAAM,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,OAAQ,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,CAAA,CAAA,CAAG;AACzF,oBAAA,CAAA,EAAA,EAAM,IAAI,CAAC,QAAS,CAAA,KAAA,EAAS,IAAI,CAAC,OAAQ,CAAA,IAAA,EAAQ,IAAI,CAAC,QAAS,CAAA,GAAA,EAAO,IAAI,CAAC,OAAQ,CAAA,CAAE,CAAC;YAC/F;iBAAO;AACH,gBAAA,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAM,IAAK,CAAA,IAAA,EAAQ,IAAK,CAAA,CAAE,CAAC;YACpE;AACJ,QAAA,CAAC;AACJ,IAAA;8GAdY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;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;;2FAET,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCEY,gBAAgB,CAAA;AAMzB,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAGvD,IAAA,CAAA,OAAO,GAAG,GAAG;IAGb;AAEA,IAAA,wBAAwB,CAAC,GAAmB,EAAA;AACxC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE;YAChB;QACJ;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IAClF;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,GAAmB,EAAA;QACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AAEzF,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;AACtE,oBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAG;wBAClB,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAY;AAC1C,wBAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,mBAAmB,CAAC;AAChD,wBAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3B,wBAAA,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;AAClC,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,OAAO,YAAY,cAAc,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,YAAY,aAAa,EAAE;AAC5F,wBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;oBACrC;gBACJ;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AACQ,IAAA,mBAAmB,CAAC,OAAuB,EAAA;AAC/C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,6BAA6B,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;QAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;QACnD,IAAI,SAAS,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC;QAC7C;AACA,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;QAClD;IACJ;8GA3DS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;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;;2FAET,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCNY,WAAW,CAAA;AACpB,IAAA,OAAO,QAAQ,CAAC,IAAa,EAAE,GAAW,EAAA;AACtC,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACZ;QACJ;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AACrD,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;YACJ;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvE;AAEA,IAAA,OAAO,yBAAyB,CAAC,IAAa,EAAE,GAAW,EAAA;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE;YACZ;QACJ;QACA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;QACtB,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;YACxB;QACJ;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QACjC;aAAO;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD;IACJ;AACH;;AChCM,MAAM,aAAa,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC;SAC3C,gBAAgB,GAAA;AAC5B,IAAA,OAAO,QAAQ;AACnB;;MCLa,WAAW,CAAA;;AAGb,IAAA,OAAO,SAAS,CAAC,EAAW,EAAE,EAAW,EAAA;QAC5C,IAAI,CAAC,EAAE,EAAE;AACL,YAAA,OAAO,EAAE;QACb;AAEA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK;AAClB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;;;;;;;AAOjB,YAAA,OAAO,EAAE;QACb;AACA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK;AAClB,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,EAAE;QACb;AACA,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AACd,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;QACd,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;AACV,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;AAChB,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;QAChB,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;AACV,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;AACA,QAAA,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,GAAG,GAAG,GAAG;QACb;QACA,GAAG,IAAI,GAAG;QACV,GAAG,IAAI,GAAG;QAEV,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC1C;AACH;;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;AAC5D,YAAA,MAAM,UAAU,GAAG,YAAY,CAAC,UAA2B;AAC3D,YAAA,IAAI,UAAmB;YACvB,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;AAC7E,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;wBAC9E,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC;oBAC/D;AACJ,gBAAA,CAAC,CAAC;YACN;AACA,YAAA,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC;QACtG;IACJ;IAEA,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;;AAG5G,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE;AAC5C,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACtC,YAAA,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACvC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;;AAG5D,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,EAAE;AACxC,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;AACnB,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;YACpB,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;;YAG9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAChF,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;;YAEhG,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;AACzE,aAAA,CAAC;QACN;IACJ;IAEQ,OAAO,sCAAsC,CAAC,IAAa,EAAA;QAC/D,MAAM,OAAO,GAAyB,IAAK;AAC3C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;QAE9B,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC1C,YAAA,IAAI,GAAG,IAAI,CAAC,aAAa;QAC7B;AACA,QAAA,IAAI,GAAG,IAAI,CAAC,aAAa;QACzB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QAC5C,IAAI,OAAO,EAAE;YACT,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5D,YAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChE;AACA,QAAA,OAAO,IAAI;IACf;AACH;;MCvEY,OAAO,CAAA;IAClB,WAAA,CAAmB,GAAW,EAAS,WAAmB,EAAA;QAAvC,IAAA,CAAA,GAAG,GAAH,GAAG;QAAiB,IAAA,CAAA,WAAW,GAAX,WAAW;IAClD;AACD;;MCEY,qBAAqB,CAAA;AAC9B,IAAA,uBAAuB,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAc,EAAE;AAC3B,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;AAChE,gBAAA,UAAU,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtE;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,KAAK;IAChB;AAEQ,IAAA,cAAc,CAAC,iBAAyB,EAAA;QAC5C,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACvC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB;;AAEjC,QAAA,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI;AACV,QAAA,OAAO,MAAM;IACjB;8GArBS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;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;;2FAET,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCuBY,kBAAkB,CAAA;AAoD3B,IAAA,WAAA,GAAA;AAnDiB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;AAChC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;QAE9D,IAAA,CAAA,iBAAiB,GAAG,4BAA4B;QAChD,IAAA,CAAA,UAAU,GAAG,qBAAqB;QAEjC,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAE1B,IAAA,CAAA,aAAa,GAAmB,EAAE;;QAGlC,IAAA,CAAA,YAAY,GAAe,EAAE;QAC7B,IAAA,CAAA,iBAAiB,GAAa,EAAE;QAChC,IAAA,CAAA,YAAY,GAAkB,EAAE;QAChC,IAAA,CAAA,oBAAoB,GAAG,GAAG;QAC1B,IAAA,CAAA,yBAAyB,GAAG,KAAK;;AAEjC,QAAA,IAAA,CAAA,iBAAiB,GAAG,CAAC,qBAA4C,KAAU;YAChF,qBAAqB,CAAC,GAAG,EAAE;YAC3B,qBAAqB,CAAC,MAAM,EAAE;AAClC,QAAA,CAAC;QACQ,IAAA,CAAA,OAAO,GAA6B,IAAI;AAExC,QAAA,IAAA,CAAA,UAAU,GAAe,MAAK,EAAE,CAAC;QAI1C,IAAA,CAAA,MAAM,GAAG,KAAK;AACd,QAAA,IAAA,CAAA,YAAY,GAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;QACzC,IAAA,CAAA,kBAAkB,GAAG,EAAE;QAEvB,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,WAAW,GAAG,GAAG;AAEP,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAChD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAiB;AACrD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;;AAEpC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAY;QAEvC,IAAA,CAAA,UAAU,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,cAAc,GAAmC,IAAI,GAAG,EAAE;QAE1D,IAAA,CAAA,2BAA2B,GAAY,KAAK;AAqE7C,QAAA,IAAA,CAAA,qBAAqB,GAAsB,MAAM,IAAI,CAAC,aAAa;QAa1E,IAAA,CAAA,WAAW,GAAG,MAAc,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,QAAQ;QAoXlD,IAAA,CAAA,YAAY,GAAG,MAAqB,IAAI,CAAC,YAAY,CAAC,aAAa;IAncpF;IAEA,QAAQ,GAAA;QACJ,IAAI,CAAC,8BAA8B,EAAE;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD;IAGA,QAAQ,GAAA;QACJ,IAAI,CAAC,2BAA2B,EAAE;IACtC;IAEQ,2BAA2B,GAAA;;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,WAAW;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,YAAY;IACtE;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;;QAG9B,IAAI,CAAC,8BAA8B,EAAE;AAErC,QAAA,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO;QAEvG,IAAI,YAAY,IAAI,YAAY,IAAI,iBAAiB,IAAI,YAAY,EAAE;YACnE,IAAI,CAAC,wBAAwB,EAAE;QACnC;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;YACvC,IAAI,CAAC,QAAQ,EAAE;QACnB;QAEA,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;QACpE;QAEA,IAAI,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,IAAI,CAAC,UAAU,EAAE;YAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC/E;QAEA,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE;YACxD,IAAI,CAAC,cAAc,EAAE;QACzB;QAEA,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,kCAAkC,EAAE;QAC7C;QAEA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;YACjC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,aAAa,EAAE;QACxB;IACJ;IAEA,WAAW,GAAA;QACP,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;IAClC;AAEO,IAAA,UAAU,CAAC,QAAkB,EAAA;AAChC,QAAA,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;IACvE;;IAKO,OAAO,cAAc,CAAC,iBAAyB,EAAA;QAClD,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACvC,QAAA,GAAG,CAAC,SAAS,GAAG,iBAAiB;;QAEjC,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI;AACV,QAAA,OAAO,MAAM;IACjB;IAIQ,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;AAClB,oBAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AAClC,wBAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK;oBAC5C;yBAAO;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;oBAC5F;gBACJ,CAAC;AACD,gBAAA,YAAY,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;AACzC,gBAAA,WAAW,EAAE;AAChB,aAAA,CAAC;YAEF,IAAI,CAAC,iBAAiB,EAAE;QAC5B;IACJ;IAEQ,cAAc,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,IAAI,CAAC,IAAI,EAAE;YACP;QACJ;;QAGA,qBAAqB,CAAC,MAAK;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACrE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,QAAA,CAAC,CAAC;IACN;IAEQ,cAAc,GAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE;AAElD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;YACf;QACJ;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI;AAC5C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI;;QAG9C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;AAE9B,QAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;IACnF;AAEA;;;;;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;AAE3E,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,kBAAkB,GAAG,2BAA2B,GAAG,EAAE;YACtE,KAAK;AACD,gBAAA,CAAA;;;;kBAIE;AACN,YAAA,IAAI,CAAC,SAAS;AACV,gBAAA,CAAA;0BACW,KAAM,CAAA;;AAEc,4CAAA,EAAA,IAAI,CAAC,WAAY,CAAA,QAAA,EAAY,IAAI,CAAC,YAAa,CAAA;;iBAE7E;YACL,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB;YAC/D,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACzD,UAAU,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxD;IACJ;IAEQ,QAAQ,GAAA;QACZ,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACnE,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACZ,SAAS,CAAC,IAAI,IAAG;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACrB,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;YAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;YAC3E,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,kCAAkC,EAAE;YACzC,IAAI,CAAC,2BAA2B,EAAE;AACtC,QAAA,CAAC,EACD,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAClC;IACL;AAEQ,IAAA,OAAO,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC5B,YAAA,IAAI,MAAM;YACV,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;gBAClE;gBAAE,OAAO,KAAK,EAAE;AACZ,oBAAA,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;gBAChF;YACJ;iBAAO,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC3C,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACrD;YAEA,IAAI,MAAM,EAAE;AACR,gBAAA,OAAOA,EAAY,CAAC,MAAM,CAAC;YAC/B;QACJ;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAC1D;AAEQ,IAAA,8BAA8B,CAAC,SAA4B,EAAE,IAAI,EAAE,SAAiB,EAAE,SAAoB,EAAA;QAC9G,MAAM,sBAAsB,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAClD,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,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,KAAI;oBACF,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC5D,oBAAA,OAAO,KAAK;AAChB,gBAAA,CAAC;AACL,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;AACpC,YAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;YACjC;QACJ;IACJ;IAEQ,+BAA+B,CAAC,YAAwB,EAAE,SAAiB,EAAA;AAC/E,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;AAElC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE;QAC3B,IAAI,YAAY,EAAE;AACd,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,IAAG;gBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,WAAW,CAAC;gBACnE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,8BAA8B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAClH,YAAA,CAAC,CAAC;QACN;QACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;IACjD;IAEQ,kCAAkC,GAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE;AAC3B,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;AACzD,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;AACxD,4BAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB;;AAG1D,4BAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1C,wBAAA,CAAC;wBAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,wBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AACvB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1C;AACJ,gBAAA,CAAC,CACJ;AACL,YAAA,CAAC,CACJ;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;QACnD;IACJ;AAEQ,IAAA,eAAe,CAAC,IAAc,EAAA;QAClC,IAAI,UAAU,GAAG,EAAE;AACnB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;AAC1B,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACtE;AACA,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;YAEnE,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAEzC,YAAA,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;AAC9D,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACvE,YAAA,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEvE,YAAA,UAAU,IAAI,GAAG,CAAC,SAAS;QAC/B;AAEA,QAAA,OAAO,UAAU;IACrB;AAEQ,IAAA,UAAU,CAAC,KAAK,EAAA;AACpB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;IACtB;AAEQ,IAAA,kBAAkB,CAAC,SAAiB,EAAA;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QACpD,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAI;AACzB,gBAAA,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACrC,IAAI,SAAS,KAAK,OAAO;AACrB,oBAAA,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACzE,YAAA,CAAC,CAAC;QACN;QACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC;IACjD;IAEQ,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;AAChF,YAAA,WAAW,CAAC,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC;AACtE,QAAA,CAAC,CAAC;AAEF,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;AAC9C,wBAAA,IAAI,EAAE,KAAK,YAAY,CAAC,KAAK,EAAE;4BAC3B,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAAC,KAAK,CAAC;wBACxE;AACJ,oBAAA,CAAC,CAAC;AACN,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;QACN;IACJ;IAEQ,OAAO,gBAAgB,CAAC,EAAW,EAAA;QACvC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;AAC1C,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,iBAAiB;IAClF;AAEQ,IAAA,SAAS,CAAC,CAAC,EAAA;QACf,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,qBAAqB,EAAE;AAC9E,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI;AACtD,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI;QACtD,IAAI,CAAC,YAAY,GAAG;YAChB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;AAC1C,YAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;SAClC;IACL;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AAC9B,QAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACxG,QAAA,yBAAyB,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB,CAAC;AAEtE,QAAA,yBAAyB,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAExE,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;QAC/B,IAAI,CAAC,iBAAiB,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD;IAEQ,aAAa,GAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE;QAE5C,MAAM,OAAO,GAAG,EAAE;AAClB,QAAA,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AACtD,QAAA,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAEnE,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAChD,QAAA,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW,MAAM,QAAQ,CAAA,IAAA,CAAM,CAAC;AAExF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,GAAG,KAAI;AACT,YAAA,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACpD,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CACxB;QAED,IAAI,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CACpC,GAAG,EACH,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EACrB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EACpB,KAAK,EACL,SAAS,CACR;YACD,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACvE,YAAA,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,QAAA,CAAC,CAAC;IACN;IAEQ,iBAAiB,CACrB,GAAoB,EACpB,KAAa,EACb,SAAiB,EACjB,KAAa,EACb,SAAiB,EAAA;QAEjB,MAAM,YAAY,GAAG,EAAE;QACvB,MAAM,OAAO,GAAG,EAAE;QAClB,MAAM,WAAW,GAAG,EAAE;QACtB,MAAM,aAAa,GAAG,EAAE;AAExB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK;AACzB,cAAE,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG;AAC7B,cAAE,KAAK,GAAG,SAAS,GAAG,OAAO;QAEjC,IAAI,OAAO,GAAG,KAAK,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,WAAW;QAC5D,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,IAAI,WAAW;aACrC,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,IAAI,aAAa;QAEjD,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,GAAG,CAAC;AACzE,QAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAC/C,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;AACtC,QAAA,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC;AACnC,QAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACpC,QAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC;QAC7C,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG,CAAC;AACpE,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,UAAU,IAAI,CAAC;QAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC;QAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK;AAE5B,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AAEvB,QAAA,OAAO,KAAK;IAChB;IAEQ,qBAAqB,GAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;AACtD,QAAA,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IAC3E;IAEQ,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;AACtD,YAAA,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,YAAY,CAAC;QAChE;IACJ;8GAtfS,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,kzBC7B/B,2wBAcA,EAAA,MAAA,EAAA,CAAA,spGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,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;;2FDea,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cAGV,KAAK,EAAA,QAAA,EAAA,2wBAAA,EAAA,MAAA,EAAA,CAAA,spGAAA,CAAA,EAAA;;sBAahB;;sBACA;;sBACA;;sBACA;;sBAGA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAIA;;sBAEA;;sBAEA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAUvC;;sBACA;;sBACA;;sBAEA;;sBAeA,YAAY;uBAAC,eAAe;;IA2crB;AAAZ,CAAA,UAAY,YAAY,EAAA;AACpB,IAAA,YAAA,CAAA,YAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ;AACR,IAAA,YAAA,CAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACH,IAAA,YAAA,CAAA,YAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAqB;AACzB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;MAaX,qBAAqB,CAAA;AAC9B,IAAA,WAAA,CAA6B,aAA0B,EAAA;QAA1B,IAAA,CAAA,aAAa,GAAb,aAAa;IAC1C;IAEO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,UAAU,CAAC,WAAoB,EAAA;QAClC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,WAAW,CAAC;AACnD,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,SAAS,CAAC,YAA+B,EAAA;QAC5C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,KAAI;;YAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC3C,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgC;YAEtD,OAAO;AACH,gBAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;AACnE,gBAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;aACrE;AACL,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACf;IAEQ,aAAa,CAAC,MAAwB,EAAE,YAA+B,EAAE,OAA8B,EAAE,KAAuB,EAAE,MAAwB,EAAA;AAC9J,QAAA,QAAQ,YAAY,CAAC,CAAC;YAClB,KAAK,YAAY,CAAC,qBAAqB;gBACvC;oBACI,MAAM,YAAY,GAAG,GAAG;oBACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY;AAChF,oBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC9E,oBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9D;YACA,KAAK,YAAY,CAAC,QAAQ;gBACtB,OAAO,MAAM,CAAC,CAAC;AACnB,YAAA;gBACI,OAAO,MAAM,CAAC,CAAC;;IAE3B;IAEQ,aAAa,CAAC,MAAwB,EAAE,YAA+B,EAAE,OAA8B,EAAE,KAAuB,EAAE,MAAwB,EAAA;AAC9J,QAAA,QAAQ,YAAY,CAAC,CAAC;AAClB,YAAA,KAAK,YAAY,CAAC,qBAAqB,EAAE;gBACrC,MAAM,WAAW,GAAG,GAAG;gBACvB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,WAAW;AAC/E,gBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC3E,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9D;YACA,KAAK,YAAY,CAAC,QAAQ;gBACtB,OAAO,MAAM,CAAC,CAAC;AACnB,YAAA;gBACI,OAAO,MAAM,CAAC,CAAC;;IAE3B;IAEO,GAAG,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE;AACxB,QAAA,OAAO,IAAI;IACf;IAEO,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC3B,QAAA,OAAO,IAAI;IACf;AACH;;MEvmBY,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,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,EAAA,YAAA,EAAA,CARpB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAIT,YAAY,aADrB,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAKb,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,EAAA,SAAA,EAJe;AACnC,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACxD,iBAAiB,CAAC,sBAAsB,EAAE;AAC7C,SAAA,EAAA,OAAA,EAAA,CAHY,YAAY,CAAA,EAAA,CAAA,CAAA;;2FAIhB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAT3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,YAAY,EAAE;wBAClB;AACH,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL;AACH,qBAAA,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE;AACnC,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE;wBACxD,iBAAiB,CAAC,sBAAsB,EAAE;qBAC7C,EAAE;;;MCdM,WAAW,CAAA;IAEpB,WAAA,CAAoB,SAAmB,EAAS,kBAA0B,EAAA;QAAtD,IAAA,CAAA,SAAS,GAAT,SAAS;QAAmB,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;IAClE;AACH;;MCFY,YAAY,CAAA;IACrB,WAAA,CAAmB,GAAe,EAAS,KAAa,EAAA;QAArC,IAAA,CAAA,GAAG,GAAH,GAAG;QAAqB,IAAA,CAAA,KAAK,GAAL,KAAK;IAChD;AACH;;ACLD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loxia/imx-viewer",
3
- "version": "17.0.0",
3
+ "version": "18.0.0",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org"
@@ -15,13 +15,13 @@
15
15
  "zone.js": "~0.15.0"
16
16
  },
17
17
  "module": "fesm2022/loxia-imx-viewer.mjs",
18
- "typings": "index.d.ts",
18
+ "typings": "types/loxia-imx-viewer.d.ts",
19
19
  "exports": {
20
20
  "./package.json": {
21
21
  "default": "./package.json"
22
22
  },
23
23
  ".": {
24
- "types": "./index.d.ts",
24
+ "types": "./types/loxia-imx-viewer.d.ts",
25
25
  "default": "./fesm2022/loxia-imx-viewer.mjs"
26
26
  }
27
27
  },
@@ -1,6 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnChanges, OnInit, OnDestroy, ElementRef, EventEmitter, Renderer2, SimpleChanges } from '@angular/core';
3
- import { HttpClient } from '@angular/common/http';
2
+ import { OnChanges, OnInit, OnDestroy, ElementRef, EventEmitter, SimpleChanges } from '@angular/core';
4
3
  import SvgPanZoom from 'svg-pan-zoom';
5
4
  import * as i2 from '@angular/common';
6
5
 
@@ -55,36 +54,6 @@ declare class SvgInfo {
55
54
  constructor(svg: string, coordinates?: Point);
56
55
  }
57
56
 
58
- declare class PuicHelperService {
59
- private rootSvg;
60
- setRootSvg: (svgParent: SVGSVGElement) => SVGSVGElement;
61
- getAllElementsForPuic: (puic: ElementId) => NodeListOf<HTMLElement>;
62
- static ɵfac: i0.ɵɵFactoryDeclaration<PuicHelperService, never>;
63
- static ɵprov: i0.ɵɵInjectableDeclaration<PuicHelperService>;
64
- }
65
-
66
- declare class ClickareaService {
67
- private puicHelper;
68
- private timer;
69
- timeout: number;
70
- constructor(puicHelper: PuicHelperService);
71
- delayedClickAreaCreation(ids: Set<ElementId>): void;
72
- /**
73
- * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids
74
- */
75
- private createClickareas;
76
- private createClickAreaRect;
77
- static ɵfac: i0.ɵɵFactoryDeclaration<ClickareaService, never>;
78
- static ɵprov: i0.ɵɵInjectableDeclaration<ClickareaService>;
79
- }
80
-
81
- declare class SvgCoordinatesService {
82
- svgInfosWithCoordinates(svgs: string[]): SvgInfo[];
83
- private getXCoordinate;
84
- static ɵfac: i0.ɵɵFactoryDeclaration<SvgCoordinatesService, never>;
85
- static ɵprov: i0.ɵɵInjectableDeclaration<SvgCoordinatesService>;
86
- }
87
-
88
57
  type SvgInstance = typeof SvgPanZoom;
89
58
  declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {
90
59
  private readonly document;
@@ -123,7 +92,7 @@ declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {
123
92
  private eventListeners;
124
93
  private svgPanZoomRef;
125
94
  private ignorePanEventBecauseReload;
126
- constructor(document: any, http: HttpClient, clickAreaService: ClickareaService, puicHelper: PuicHelperService, renderer: Renderer2, svgCoordinatesService: SvgCoordinatesService);
95
+ constructor();
127
96
  ngOnInit(): void;
128
97
  onResize(): void;
129
98
  private updateDimensionsForClipPath;