@eui/mobile-core 17.2.0-snapshot-1716538151901 → 17.2.0-snapshot-1716885030476

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.
@@ -1,18 +1,24 @@
1
1
  import { Component, Input, ViewEncapsulation, ViewChild } from '@angular/core';
2
+ import { Subject, throwError } from 'rxjs';
3
+ import { map, switchMap, catchError, startWith } from 'rxjs/operators';
2
4
  import * as i0 from "@angular/core";
3
5
  import * as i1 from "@ionic/angular";
4
- import * as i2 from "ng2-pdf-viewer";
5
- import * as i3 from "@mapaxe/ngx-pinch-zoom";
6
- import * as i4 from "../euim-spinner/euim-spinner.component";
7
- import * as i5 from "../euim-spinner/euim-spinner-message/euim-spinner-message.component";
8
- import * as i6 from "@ngx-translate/core";
6
+ import * as i2 from "@angular/common/http";
7
+ import * as i3 from "ng2-pdf-viewer";
8
+ import * as i4 from "@mapaxe/ngx-pinch-zoom";
9
+ import * as i5 from "../euim-spinner/euim-spinner.component";
10
+ import * as i6 from "../euim-spinner/euim-spinner-message/euim-spinner-message.component";
11
+ import * as i7 from "@ngx-translate/core";
9
12
  export class EuimPdfViewerComponent {
10
- constructor(alertService) {
13
+ constructor(alertService, http) {
11
14
  this.alertService = alertService;
15
+ this.http = http;
12
16
  this.page = 1;
13
17
  this.zoom = 1;
14
18
  this.loading = true;
15
19
  this.errorMessage = '';
20
+ this.pdfNumPages = 1;
21
+ this.urlChange$ = new Subject();
16
22
  this.showDefaultError = true;
17
23
  setTimeout(() => {
18
24
  if (this.showDefaultError) {
@@ -21,6 +27,29 @@ export class EuimPdfViewerComponent {
21
27
  }
22
28
  }, 15000);
23
29
  }
30
+ ngOnInit() {
31
+ // subscribe and cancel previous subscription (if any) for fetching data while URL changes
32
+ this.subscription = this.urlChange$.pipe(startWith(this.url), switchMap((url) => this.getPDFData(url))).subscribe({
33
+ next: (data) => {
34
+ this.data = data;
35
+ this.showDefaultError = false;
36
+ this.loading = false;
37
+ },
38
+ error: () => {
39
+ this.onError();
40
+ this.data = null;
41
+ },
42
+ });
43
+ }
44
+ ngOnChanges(changes) {
45
+ if (changes['url']) {
46
+ this.loading = true;
47
+ this.urlChange$.next(changes['url'].currentValue);
48
+ }
49
+ }
50
+ ngOnDestroy() {
51
+ this.subscription.unsubscribe();
52
+ }
24
53
  zoomChange(event) {
25
54
  this.eventResult = event;
26
55
  this.zoom = this.eventResult.scale;
@@ -29,6 +58,7 @@ export class EuimPdfViewerComponent {
29
58
  this.showDefaultError = false;
30
59
  this.loading = false;
31
60
  this.pdf = pdf;
61
+ this.pdfNumPages = this.pdf.numPages;
32
62
  }
33
63
  onError() {
34
64
  this.showDefaultError = false;
@@ -36,16 +66,8 @@ export class EuimPdfViewerComponent {
36
66
  this.errorMessage = 'File could not be loaded.';
37
67
  }
38
68
  onDownload() {
39
- this.pdf.getData().then((u8) => {
40
- const blob = new Blob([u8.buffer], {
41
- type: 'application/pdf',
42
- });
43
- const url = URL.createObjectURL(blob);
44
- this.openLink(url);
45
- // Remove the link when done
46
- setTimeout(() => {
47
- window.URL.revokeObjectURL(url);
48
- }, 5000);
69
+ this.pdf?.getData().then((u8) => {
70
+ this.downloadFile(u8, 'file.pdf');
49
71
  });
50
72
  }
51
73
  onZoomIn() {
@@ -59,9 +81,6 @@ export class EuimPdfViewerComponent {
59
81
  onResetZoom() {
60
82
  this.pinch.resetZoom();
61
83
  }
62
- // async onDismissModal() {
63
- // await this.modalCtrl.dismiss();
64
- // }
65
84
  nextPage() {
66
85
  if (this.page < this.pdf.numPages) {
67
86
  this.page++;
@@ -72,23 +91,46 @@ export class EuimPdfViewerComponent {
72
91
  this.page--;
73
92
  }
74
93
  }
75
- openLink(url) {
94
+ /**
95
+ * Download file from the given data and filename using Blob.
96
+ * It generates an anchor link and clicks on it to download the file.
97
+ * @param data
98
+ * @param filename
99
+ * @private
100
+ */
101
+ downloadFile(data, filename) {
102
+ const blob = new Blob([data.buffer], { type: 'application/pdf' });
103
+ const url = window.URL.createObjectURL(blob);
76
104
  const a = document.createElement('a');
77
- document.body.appendChild(a);
78
- a.style.display = 'none';
79
105
  a.href = url;
80
- a.download = 'PDF_File.pdf';
106
+ a.download = filename;
107
+ document.body.appendChild(a);
81
108
  a.click();
82
- // Remove the link when done
109
+ setTimeout(() => {
110
+ window.URL.revokeObjectURL(url);
111
+ }, 5000);
83
112
  document.body.removeChild(a);
84
113
  }
85
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, deps: [{ token: i1.AlertController }], target: i0.ɵɵFactoryTarget.Component }); }
86
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.7", type: EuimPdfViewerComponent, selector: "euim-pdf-viewer", inputs: { url: "url", page: "page" }, viewQueries: [{ propertyName: "pinch", first: true, predicate: ["pinch"], descendants: true, static: true }], ngImport: i0, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"url\"\n [zoom]=\"zoom\"\n [original-size]=\"true\"\n [autoresize]=\"false\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [page]=\"page\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i3.PinchZoomComponent, selector: "pinch-zoom, [pinch-zoom]", inputs: ["properties", "transition-duration", "transitionDuration", "double-tap", "doubleTap", "double-tap-scale", "doubleTapScale", "auto-zoom-out", "autoZoomOut", "limit-zoom", "limitZoom", "disabled", "disablePan", "overflow", "zoomControlScale", "disableZoomControl", "backgroundColor", "limitPan", "minPanScale", "minScale", "listeners", "wheel", "autoHeight", "stepZoomFactor", "wheelZoomFactor", "draggableImage"], outputs: ["onZoomChange"], exportAs: ["pinchZoom"] }, { kind: "component", type: i4.EuimSpinnerComponent, selector: "euim-spinner" }, { kind: "component", type: i5.EuimSpinnerMessageComponent, selector: "[euimSpinnerMessage]" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
114
+ /**
115
+ * Fetch PDF data from the given URL and return as Uint8Array.
116
+ * @param url
117
+ * @private
118
+ */
119
+ getPDFData(url) {
120
+ return this.http.get(url, { responseType: 'arraybuffer' })
121
+ // transform ArrayBuffer to Uint8Array
122
+ .pipe(map((data) => new Uint8Array(data)), catchError(err => {
123
+ this.onError();
124
+ return throwError(() => err);
125
+ }));
126
+ }
127
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, deps: [{ token: i1.AlertController }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
128
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.7", type: EuimPdfViewerComponent, selector: "euim-pdf-viewer", inputs: { url: "url", page: "page" }, viewQueries: [{ propertyName: "pinch", first: true, predicate: ["pinch"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [limit-zoom]=\"4\" [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"data\"\n [original-size]=\"false\"\n [zoom-scale]=\"'page-height'\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [(page)]=\"page\"\n [stick-to-page]=\"false\"\n [show-all]=\"false\"\n [render-text]=\"true\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf || !data\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\" [disabled]=\"zoom === 4 || !pdf || !data\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\" [disabled]=\"page === 1 || !pdf || !data\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\" [disabled]=\"page === pdfNumPages || !pdf || !data\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i3.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i4.PinchZoomComponent, selector: "pinch-zoom, [pinch-zoom]", inputs: ["properties", "transition-duration", "transitionDuration", "double-tap", "doubleTap", "double-tap-scale", "doubleTapScale", "auto-zoom-out", "autoZoomOut", "limit-zoom", "limitZoom", "disabled", "disablePan", "overflow", "zoomControlScale", "disableZoomControl", "backgroundColor", "limitPan", "minPanScale", "minScale", "listeners", "wheel", "autoHeight", "stepZoomFactor", "wheelZoomFactor", "draggableImage"], outputs: ["onZoomChange"], exportAs: ["pinchZoom"] }, { kind: "component", type: i5.EuimSpinnerComponent, selector: "euim-spinner" }, { kind: "component", type: i6.EuimSpinnerMessageComponent, selector: "[euimSpinnerMessage]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
87
129
  }
88
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, decorators: [{
89
131
  type: Component,
90
- args: [{ selector: 'euim-pdf-viewer', encapsulation: ViewEncapsulation.None, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"url\"\n [zoom]=\"zoom\"\n [original-size]=\"true\"\n [autoresize]=\"false\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [page]=\"page\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"] }]
91
- }], ctorParameters: () => [{ type: i1.AlertController }], propDecorators: { url: [{
132
+ args: [{ selector: 'euim-pdf-viewer', encapsulation: ViewEncapsulation.None, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [limit-zoom]=\"4\" [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"data\"\n [original-size]=\"false\"\n [zoom-scale]=\"'page-height'\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [(page)]=\"page\"\n [stick-to-page]=\"false\"\n [show-all]=\"false\"\n [render-text]=\"true\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf || !data\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\" [disabled]=\"zoom === 4 || !pdf || !data\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\" [disabled]=\"page === 1 || !pdf || !data\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\" [disabled]=\"page === pdfNumPages || !pdf || !data\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"] }]
133
+ }], ctorParameters: () => [{ type: i1.AlertController }, { type: i2.HttpClient }], propDecorators: { url: [{
92
134
  type: Input
93
135
  }], page: [{
94
136
  type: Input
@@ -96,4 +138,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
96
138
  type: ViewChild,
97
139
  args: ['pinch', { static: true }]
98
140
  }] } });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFXL0UsTUFBTSxPQUFPLHNCQUFzQjtJQWMvQixZQUFvQixZQUE2QjtRQUE3QixpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFaeEMsU0FBSSxHQUFJLENBQUMsQ0FBQztRQUluQixTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBUWQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDM0U7UUFDTCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWdCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFD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LCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQREZEb2N1bWVudFByb3h5IH0gZnJvbSAnbmcyLXBkZi12aWV3ZXInO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUGluY2hab29tQ29tcG9uZW50LCBab29tRXZlbnQgfSBmcm9tICdAbWFwYXhlL25neC1waW5jaC16b29tJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdldWltLXBkZi12aWV3ZXInLFxuICAgIHN0eWxlVXJsczogWycuL3N0eWxlcy9faW5kZXguc2NzcyddLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ldWltLXBkZi12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEV1aW1QZGZWaWV3ZXJDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIHVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHBhZ2UgID0gMTtcblxuICAgIEBWaWV3Q2hpbGQoJ3BpbmNoJywgeyBzdGF0aWM6IHRydWUgfSkgcGluY2ghOiBQaW5jaFpvb21Db21wb25lbnQ7XG5cbiAgICB6b29tID0gMTtcbiAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICBwZGY6IFBERkRvY3VtZW50UHJveHk7XG4gICAgZXZlbnRSZXN1bHQ/OiBab29tRXZlbnQ7XG5cbiAgICBwcml2YXRlIHNob3dEZWZhdWx0RXJyb3I6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRDb250cm9sbGVyKSB7XG5cbiAgICAgICAgdGhpcy5zaG93RGVmYXVsdEVycm9yID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG93RGVmYXVsdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuY3JlYXRlKHsgaGVhZGVyOiAnUERGIGNvdWxkIG5vdCBiZSBsb2FkZWQuJyB9KS50aGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDE1MDAwKTtcbiAgICB9XG5cbiAgICB6b29tQ2hhbmdlKGV2ZW50OiBab29tRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudFJlc3VsdCA9IGV2ZW50O1xuICAgICAgICB0aGlzLnpvb20gPSB0aGlzLmV2ZW50UmVzdWx0LnNjYWxlO1xuICAgIH1cblxuICAgIG9uTG9hZGVkKHBkZjogUERGRG9jdW1lbnRQcm94eSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dEZWZhdWx0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGRmID0gcGRmO1xuICAgIH1cblxuICAgIG9uRXJyb3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0RlZmF1bHRFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkLic7XG4gICAgfVxuXG4gICAgb25Eb3dubG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZGYuZ2V0RGF0YSgpLnRoZW4oKHU4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3U4LmJ1ZmZlcl0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgdGhpcy5vcGVuTGluayh1cmwpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaW5rIHdoZW4gZG9uZVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblpvb21JbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waW5jaC56b29tSW4oKTtcbiAgICB9XG5cbiAgICBvblpvb21PdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnpvb20gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnBpbmNoLnpvb21PdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVzZXRab29tKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpbmNoLnJlc2V0Wm9vbSgpO1xuICAgIH1cblxuICAgIC8vIGFzeW5jIG9uRGlzbWlzc01vZGFsKCkge1xuICAgIC8vICAgICBhd2FpdCB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XG4gICAgLy8gfVxuXG4gICAgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBkZi5udW1QYWdlcykge1xuICAgICAgICAgICAgdGhpcy5wYWdlKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2UGFnZSgpOnZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWdlID4gMSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9wZW5MaW5rKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGEuZG93bmxvYWQgPSAnUERGX0ZpbGUucGRmJztcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpbmsgd2hlbiBkb25lXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgfVxufVxuIiwiQGlmIChsb2FkaW5nIHx8IGVycm9yTWVzc2FnZSkge1xuPGRpdj5cbiAgQGlmIChsb2FkaW5nKSB7XG4gICAgPGV1aW0tc3Bpbm5lcj5cbiAgICAgIDxkaXYgZXVpbVNwaW5uZXJNZXNzYWdlPkxvYWRpbmcgUERGLi4uPC9kaXY+XG4gICAgPC9ldWltLXNwaW5uZXI+XG4gIH1cbiAgQGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICA8ZGl2Pnt7ZXJyb3JNZXNzYWdlfX08L2Rpdj5cbiAgfVxuPC9kaXY+XG59XG5cbjxwaW5jaC16b29tIFt0cmFuc2l0aW9uLWR1cmF0aW9uXT1cIjUwXCIgW3pvb21Db250cm9sU2NhbGVdPVwiMC41XCIgKG9uWm9vbUNoYW5nZSk9XCJ6b29tQ2hhbmdlKCRldmVudClcIiBbd2hlZWxab29tRmFjdG9yXT1cIjAuNVwiIFtzdGVwWm9vbUZhY3Rvcl09XCIwLjVcIiAjcGluY2g+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwMHB4XCI+XG4gICAgICAgIDxwZGYtdmlld2VyIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgICAgW3pvb21dPVwiem9vbVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbC1zaXplXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXV0b3Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChhZnRlci1sb2FkLWNvbXBsZXRlKT1cIm9uTG9hZGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25FcnJvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VdPVwicGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJVwiPlxuICAgICAgICA8L3BkZi12aWV3ZXI+XG4gICAgPC9kaXY+XG48L3BpbmNoLXpvb20+XG5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJldWltLXBkZi12aWV3ZXJfX2Zvb3RlclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJvbkRvd25sb2FkKClcIiBbZGlzYWJsZWRdPVwiIXBkZlwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImRvd25sb2FkLW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tYnV0dG9ucyBjbGFzcz1cImV1aW0tcGRmLXZpZXdlcl9fZm9vdGVyLXpvb20tY29udGFpbmVyXCI+XG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwib25ab29tT3V0KClcIiBbZGlzYWJsZWRdPVwiem9vbSA9PT0gMVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cInJlbW92ZS1jaXJjbGUtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm9uUmVzZXRab29tKClcIj5cbiAgICAgICAgICB7eydldWltLnBkZi12aWV3ZXIucmVzZXQuem9vbScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJvblpvb21JbigpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkLWNpcmNsZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG5cblxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInByZXZQYWdlKClcIj5cbiAgICAgICAgICB7eydldWltLnN0ZXBwZXIucHJldmlvdXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgICB7e3BhZ2V9fVxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm5leHRQYWdlKClcIj5cbiAgICAgICAgICB7eydldWltLnN0ZXBwZXIubmV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1mb290ZXI+XG4iXX0=
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUMsU0FBUyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLNUgsT0FBTyxFQUFjLE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBUXZFLE1BQU0sT0FBTyxzQkFBc0I7SUFrQi9CLFlBQW9CLFlBQTZCLEVBQVUsSUFBZ0I7UUFBdkQsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQWhCbEUsU0FBSSxHQUFJLENBQUMsQ0FBQztRQUluQixTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBR1IsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFJbEIsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFLdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxD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LENBQUMsRUFDaEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNWLENBQUM7aUlBaEpRLHNCQUFzQjtxSEFBdEIsc0JBQXNCLGdPQ2RuQyxreEVBMkRBOzsyRkQ3Q2Esc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNJLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJOzZHQUc1QixHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUVnQyxLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIFZpZXdDaGlsZCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQREZEb2N1bWVudFByb3h5IH0gZnJvbSAnbmcyLXBkZi12aWV3ZXInO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUGluY2hab29tQ29tcG9uZW50LCBab29tRXZlbnQgfSBmcm9tICdAbWFwYXhlL25neC1waW5jaC16b29tJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCBjYXRjaEVycm9yLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZXVpbS1wZGYtdmlld2VyJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdHlsZXMvX2luZGV4LnNjc3MnXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBFdWltUGRmVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgdXJsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGFnZSAgPSAxO1xuXG4gICAgQFZpZXdDaGlsZCgncGluY2gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwaW5jaCE6IFBpbmNoWm9vbUNvbXBvbmVudDtcblxuICAgIHpvb20gPSAxO1xuICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgIGVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHBkZjogUERGRG9jdW1lbnRQcm94eTtcbiAgICBldmVudFJlc3VsdD86IFpvb21FdmVudDtcbiAgICBwcm90ZWN0ZWQgcGRmTnVtUGFnZXMgPSAxO1xuICAgIHByb3RlY3RlZCBkYXRhOiBVaW50OEFycmF5O1xuXG4gICAgcHJpdmF0ZSBzaG93RGVmYXVsdEVycm9yOiBib29sZWFuO1xuICAgIHByaXZhdGUgdXJsQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0Q29udHJvbGxlciwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG5cbiAgICAgICAgdGhpcy5zaG93RGVmYXVsdEVycm9yID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG93RGVmYXVsdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuY3JlYXRlKHsgaGVhZGVyOiAnUERGIGNvdWxkIG5vdCBiZSBsb2FkZWQuJyB9KS50aGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDE1MDAwKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gc3Vic2NyaWJlIGFuZCBjYW5jZWwgcHJldmlvdXMgc3Vic2NyaXB0aW9uIChpZiBhbnkpIGZvciBmZXRjaGluZyBkYXRhIHdoaWxlIFVSTCBjaGFuZ2VzXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy51cmxDaGFuZ2UkLnBpcGUoXG4gICAgICAgICAgICBzdGFydFdpdGgodGhpcy51cmwpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh1cmwpID0+IHRoaXMuZ2V0UERGRGF0YSh1cmwpKSxcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RlZmF1bHRFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYoY2hhbmdlc1sndXJsJ10pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVybENoYW5nZSQubmV4dChjaGFuZ2VzWyd1cmwnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgem9vbUNoYW5nZShldmVudDogWm9vbUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRSZXN1bHQgPSBldmVudDtcbiAgICAgICAgdGhpcy56b29tID0gdGhpcy5ldmVudFJlc3VsdC5zY2FsZTtcbiAgICB9XG5cbiAgICBvbkxvYWRlZChwZGY6IFBERkRvY3VtZW50UHJveHkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93RGVmYXVsdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBkZiA9IHBkZjtcbiAgICAgICAgdGhpcy5wZGZOdW1QYWdlcyA9IHRoaXMucGRmLm51bVBhZ2VzO1xuICAgIH1cblxuICAgIG9uRXJyb3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0RlZmF1bHRFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkLic7XG4gICAgfVxuXG4gICAgb25Eb3dubG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZGY/LmdldERhdGEoKS50aGVuKCh1OCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZEZpbGUodTgsICdmaWxlLnBkZicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblpvb21JbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waW5jaC56b29tSW4oKTtcbiAgICB9XG5cbiAgICBvblpvb21PdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnpvb20gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnBpbmNoLnpvb21PdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVzZXRab29tKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpbmNoLnJlc2V0Wm9vbSgpO1xuICAgIH1cblxuICAgIG5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWdlIDwgdGhpcy5wZGYubnVtUGFnZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJldlBhZ2UoKTp2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZS0tO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgZmlsZSBmcm9tIHRoZSBnaXZlbiBkYXRhIGFuZCBmaWxlbmFtZSB1c2luZyBCbG9iLlxuICAgICAqIEl0IGdlbmVyYXRlcyBhbiBhbmNob3IgbGluayBhbmQgY2xpY2tzIG9uIGl0IHRvIGRvd25sb2FkIHRoZSBmaWxlLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHBhcmFtIGZpbGVuYW1lXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGRvd25sb2FkRmlsZShkYXRhOiBVaW50OEFycmF5LCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBQREYgZGF0YSBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHJldHVybiBhcyBVaW50OEFycmF5LlxuICAgICAqIEBwYXJhbSB1cmxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UERGRGF0YSh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8VWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gQXJyYXlCdWZmZXIgdG8gVWludDhBcnJheVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChkYXRhOiBBcnJheUJ1ZmZlcikgPT4gbmV3IFVpbnQ4QXJyYXkoZGF0YSkpLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cbn1cbiIsIkBpZiAobG9hZGluZyB8fCBlcnJvck1lc3NhZ2UpIHtcbjxkaXY+XG4gIEBpZiAobG9hZGluZykge1xuICAgIDxldWltLXNwaW5uZXI+XG4gICAgICA8ZGl2IGV1aW1TcGlubmVyTWVzc2FnZT5Mb2FkaW5nIFBERi4uLjwvZGl2PlxuICAgIDwvZXVpbS1zcGlubmVyPlxuICB9XG4gIEBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgPGRpdj57e2Vycm9yTWVzc2FnZX19PC9kaXY+XG4gIH1cbjwvZGl2PlxufVxuXG48cGluY2gtem9vbSBbbGltaXQtem9vbV09XCI0XCIgW3RyYW5zaXRpb24tZHVyYXRpb25dPVwiNTBcIiBbem9vbUNvbnRyb2xTY2FsZV09XCIwLjVcIiAob25ab29tQ2hhbmdlKT1cInpvb21DaGFuZ2UoJGV2ZW50KVwiIFt3aGVlbFpvb21GYWN0b3JdPVwiMC41XCIgW3N0ZXBab29tRmFjdG9yXT1cIjAuNVwiICNwaW5jaD5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogYmxvY2s7d2lkdGg6IDEwMCU7IGhlaWdodDogNTAwcHhcIj5cbiAgICAgICAgPHBkZi12aWV3ZXIgW3NyY109XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgW29yaWdpbmFsLXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbem9vbS1zY2FsZV09XCIncGFnZS1oZWlnaHQnXCJcbiAgICAgICAgICAgICAgICAgICAgKGFmdGVyLWxvYWQtY29tcGxldGUpPVwib25Mb2FkZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkVycm9yKClcIlxuICAgICAgICAgICAgICAgICAgICBbKHBhZ2UpXT1cInBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3RpY2stdG8tcGFnZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93LWFsbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZW5kZXItdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCI+XG4gICAgICAgIDwvcGRmLXZpZXdlcj5cbiAgICA8L2Rpdj5cbjwvcGluY2gtem9vbT5cblxuPGlvbi1mb290ZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cImV1aW0tcGRmLXZpZXdlcl9fZm9vdGVyXCI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm9uRG93bmxvYWQoKVwiIFtkaXNhYmxlZF09XCIhcGRmIHx8ICFkYXRhXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWQtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPGlvbi1idXR0b25zIGNsYXNzPVwiZXVpbS1wZGYtdmlld2VyX19mb290ZXItem9vbS1jb250YWluZXJcIj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJvblpvb21PdXQoKVwiIFtkaXNhYmxlZF09XCJ6b29tID09PSAxIHx8ICFwZGYgfHwgIWRhdGFcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZW1vdmUtY2lyY2xlLW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJvblJlc2V0Wm9vbSgpXCIgW2Rpc2FibGVkXT1cInpvb20gPT09IDEgfHwgIXBkZiB8fCAhZGF0YVwiPlxuICAgICAgICAgIHt7J2V1aW0ucGRmLXZpZXdlci5yZXNldC56b29tJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm9uWm9vbUluKClcIiBbZGlzYWJsZWRdPVwiem9vbSA9PT0gNCB8fCAhcGRmIHx8ICFkYXRhXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkLWNpcmNsZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG5cblxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInByZXZQYWdlKClcIiBbZGlzYWJsZWRdPVwicGFnZSA9PT0gMSB8fCAhcGRmIHx8ICFkYXRhXCI+XG4gICAgICAgICAge3snZXVpbS5zdGVwcGVyLnByZXZpb3VzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAge3twYWdlfX1cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJuZXh0UGFnZSgpXCIgW2Rpc2FibGVkXT1cInBhZ2UgPT09IHBkZk51bVBhZ2VzIHx8ICFwZGYgfHwgIWRhdGFcIj5cbiAgICAgICAgICB7eydldWltLnN0ZXBwZXIubmV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1mb290ZXI+XG4iXX0=
@@ -6,6 +6,7 @@ import { PdfViewerModule } from 'ng2-pdf-viewer';
6
6
  import { PinchZoomModule } from '@mapaxe/ngx-pinch-zoom';
7
7
  import { EuimSpinnerComponentModule } from '../euim-spinner';
8
8
  import { TranslateModule } from '@ngx-translate/core';
9
+ import { HttpClientModule } from '@angular/common/http';
9
10
  import * as i0 from "@angular/core";
10
11
  const COMPONENTS = [
11
12
  EuimPdfViewerComponent,
@@ -17,13 +18,15 @@ export class EuimPdfViewerModule {
17
18
  PdfViewerModule,
18
19
  PinchZoomModule,
19
20
  EuimSpinnerComponentModule,
20
- TranslateModule], exports: [EuimPdfViewerComponent] }); }
21
+ TranslateModule,
22
+ HttpClientModule], exports: [EuimPdfViewerComponent] }); }
21
23
  /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerModule, imports: [CommonModule,
22
24
  IonicModule,
23
25
  PdfViewerModule,
24
26
  PinchZoomModule,
25
27
  EuimSpinnerComponentModule,
26
- TranslateModule] }); }
28
+ TranslateModule,
29
+ HttpClientModule] }); }
27
30
  }
28
31
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerModule, decorators: [{
29
32
  type: NgModule,
@@ -35,6 +38,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
35
38
  PinchZoomModule,
36
39
  EuimSpinnerComponentModule,
37
40
  TranslateModule,
41
+ HttpClientModule,
38
42
  ],
39
43
  exports: [
40
44
  ...COMPONENTS,
@@ -44,4 +48,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
44
48
  ],
45
49
  }]
46
50
  }] });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpbS1wZGYtdmlld2VyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRXRELE1BQU0sVUFBVSxHQUFHO0lBQ2Ysc0JBQXNCO0NBQ3pCLENBQUM7QUFtQkYsTUFBTSxPQUFPLG1CQUFtQjtpSUFBbkIsbUJBQW1CO2tJQUFuQixtQkFBbUIsaUJBcEI1QixzQkFBc0IsYUFNbEIsWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2YsZUFBZTtZQUNmLDBCQUEwQjtZQUMxQixlQUFlLGFBWG5CLHNCQUFzQjtrSUFvQmIsbUJBQW1CLFlBZHhCLFlBQVk7WUFDWixXQUFXO1lBQ1gsZUFBZTtZQUNmLGVBQWU7WUFDZiwwQkFBMEI7WUFDMUIsZUFBZTs7MkZBU1YsbUJBQW1CO2tCQWpCL0IsUUFBUTttQkFBQztvQkFFTixPQUFPLEVBQUU7d0JBQ0wsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZiwwQkFBMEI7d0JBQzFCLGVBQWU7cUJBQ2xCO29CQUNELE9BQU8sRUFBRTt3QkFDTCxHQUFHLFVBQVU7cUJBQ2hCO29CQUNELFlBQVksRUFBRTt3QkFDVixHQUFHLFVBQVU7cUJBQ2hCO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFdWltUGRmVmlld2VyQ29tcG9uZW50IH0gZnJvbSAnLi9ldWltLXBkZi12aWV3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUGRmVmlld2VyTW9kdWxlIH0gZnJvbSAnbmcyLXBkZi12aWV3ZXInO1xuaW1wb3J0IHsgUGluY2hab29tTW9kdWxlIH0gZnJvbSAnQG1hcGF4ZS9uZ3gtcGluY2gtem9vbSc7XG5pbXBvcnQgeyBFdWltU3Bpbm5lckNvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uL2V1aW0tc3Bpbm5lcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuY29uc3QgQ09NUE9ORU5UUyA9IFtcbiAgICBFdWltUGRmVmlld2VyQ29tcG9uZW50LFxuXTtcblxuQE5nTW9kdWxlKHtcblxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBJb25pY01vZHVsZSxcbiAgICAgICAgUGRmVmlld2VyTW9kdWxlLFxuICAgICAgICBQaW5jaFpvb21Nb2R1bGUsXG4gICAgICAgIEV1aW1TcGlubmVyQ29tcG9uZW50TW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIC4uLkNPTVBPTkVOVFMsXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgLi4uQ09NUE9ORU5UUyxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBFdWltUGRmVmlld2VyTW9kdWxlIHtcbn1cbiJdfQ==
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpbS1wZGYtdmlld2VyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9ldWltLXBkZi12aWV3ZXIvZXVpbS1wZGYtdmlld2VyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRXhELE1BQU0sVUFBVSxHQUFHO0lBQ2Ysc0JBQXNCO0NBQ3pCLENBQUM7QUFvQkYsTUFBTSxPQUFPLG1CQUFtQjtpSUFBbkIsbUJBQW1CO2tJQUFuQixtQkFBbUIsaUJBckI1QixzQkFBc0IsYUFNbEIsWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2YsZUFBZTtZQUNmLDBCQUEwQjtZQUMxQixlQUFlO1lBQ2YsZ0JBQWdCLGFBWnBCLHNCQUFzQjtrSUFxQmIsbUJBQW1CLFlBZnhCLFlBQVk7WUFDWixXQUFXO1lBQ1gsZUFBZTtZQUNmLGVBQWU7WUFDZiwwQkFBMEI7WUFDMUIsZUFBZTtZQUNmLGdCQUFnQjs7MkZBU1gsbUJBQW1CO2tCQWxCL0IsUUFBUTttQkFBQztvQkFFTixPQUFPLEVBQUU7d0JBQ0wsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZiwwQkFBMEI7d0JBQzFCLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsR0FBRyxVQUFVO3FCQUNoQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1YsR0FBRyxVQUFVO3FCQUNoQjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRXVpbVBkZlZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4vZXVpbS1wZGYtdmlld2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFBkZlZpZXdlck1vZHVsZSB9IGZyb20gJ25nMi1wZGYtdmlld2VyJztcbmltcG9ydCB7IFBpbmNoWm9vbU1vZHVsZSB9IGZyb20gJ0BtYXBheGUvbmd4LXBpbmNoLXpvb20nO1xuaW1wb3J0IHsgRXVpbVNwaW5uZXJDb21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi9ldWltLXNwaW5uZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5jb25zdCBDT01QT05FTlRTID0gW1xuICAgIEV1aW1QZGZWaWV3ZXJDb21wb25lbnQsXG5dO1xuXG5ATmdNb2R1bGUoe1xuXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIElvbmljTW9kdWxlLFxuICAgICAgICBQZGZWaWV3ZXJNb2R1bGUsXG4gICAgICAgIFBpbmNoWm9vbU1vZHVsZSxcbiAgICAgICAgRXVpbVNwaW5uZXJDb21wb25lbnRNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgSHR0cENsaWVudE1vZHVsZSxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgLi4uQ09NUE9ORU5UUyxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICAuLi5DT01QT05FTlRTLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEV1aW1QZGZWaWV3ZXJNb2R1bGUge1xufVxuIl19
@@ -1,7 +1,7 @@
1
1
  export * from '@eui/base';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Injectable, booleanAttribute, Directive, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, HostBinding, NgModule, EventEmitter, Output, ContentChildren, ViewChild, HostListener, ContentChild } from '@angular/core';
4
- import { BehaviorSubject, Subject } from 'rxjs';
4
+ import { BehaviorSubject, Subject, throwError } from 'rxjs';
5
5
  import * as i2$1 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
7
7
  import * as i1 from '@ionic/angular';
@@ -9,14 +9,16 @@ import { IonicModule } from '@ionic/angular';
9
9
  import { EclLanguageService, EclDefaultLanguageService } from '@eui/ecl';
10
10
  import * as i2 from '@eui/core';
11
11
  import { EuiEuLanguages } from '@eui/core';
12
- import { takeUntil, distinctUntilKeyChanged } from 'rxjs/operators';
12
+ import { takeUntil, distinctUntilKeyChanged, startWith, switchMap, map, catchError } from 'rxjs/operators';
13
13
  import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslateModule } from '@ngx-translate/core';
15
15
  import * as i1$2 from '@angular/router';
16
16
  import { NavigationEnd, RouterModule } from '@angular/router';
17
- import * as i2$2 from 'ng2-pdf-viewer';
17
+ import * as i2$2 from '@angular/common/http';
18
+ import { HttpClientModule } from '@angular/common/http';
19
+ import * as i3 from 'ng2-pdf-viewer';
18
20
  import { PdfViewerModule } from 'ng2-pdf-viewer';
19
- import * as i3 from '@mapaxe/ngx-pinch-zoom';
21
+ import * as i4 from '@mapaxe/ngx-pinch-zoom';
20
22
  import { PinchZoomModule } from '@mapaxe/ngx-pinch-zoom';
21
23
  import * as i2$3 from 'angularx-qrcode';
22
24
  import { QRCodeModule } from 'angularx-qrcode';
@@ -3046,12 +3048,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
3046
3048
  }] });
3047
3049
 
3048
3050
  class EuimPdfViewerComponent {
3049
- constructor(alertService) {
3051
+ constructor(alertService, http) {
3050
3052
  this.alertService = alertService;
3053
+ this.http = http;
3051
3054
  this.page = 1;
3052
3055
  this.zoom = 1;
3053
3056
  this.loading = true;
3054
3057
  this.errorMessage = '';
3058
+ this.pdfNumPages = 1;
3059
+ this.urlChange$ = new Subject();
3055
3060
  this.showDefaultError = true;
3056
3061
  setTimeout(() => {
3057
3062
  if (this.showDefaultError) {
@@ -3060,6 +3065,29 @@ class EuimPdfViewerComponent {
3060
3065
  }
3061
3066
  }, 15000);
3062
3067
  }
3068
+ ngOnInit() {
3069
+ // subscribe and cancel previous subscription (if any) for fetching data while URL changes
3070
+ this.subscription = this.urlChange$.pipe(startWith(this.url), switchMap((url) => this.getPDFData(url))).subscribe({
3071
+ next: (data) => {
3072
+ this.data = data;
3073
+ this.showDefaultError = false;
3074
+ this.loading = false;
3075
+ },
3076
+ error: () => {
3077
+ this.onError();
3078
+ this.data = null;
3079
+ },
3080
+ });
3081
+ }
3082
+ ngOnChanges(changes) {
3083
+ if (changes['url']) {
3084
+ this.loading = true;
3085
+ this.urlChange$.next(changes['url'].currentValue);
3086
+ }
3087
+ }
3088
+ ngOnDestroy() {
3089
+ this.subscription.unsubscribe();
3090
+ }
3063
3091
  zoomChange(event) {
3064
3092
  this.eventResult = event;
3065
3093
  this.zoom = this.eventResult.scale;
@@ -3068,6 +3096,7 @@ class EuimPdfViewerComponent {
3068
3096
  this.showDefaultError = false;
3069
3097
  this.loading = false;
3070
3098
  this.pdf = pdf;
3099
+ this.pdfNumPages = this.pdf.numPages;
3071
3100
  }
3072
3101
  onError() {
3073
3102
  this.showDefaultError = false;
@@ -3075,16 +3104,8 @@ class EuimPdfViewerComponent {
3075
3104
  this.errorMessage = 'File could not be loaded.';
3076
3105
  }
3077
3106
  onDownload() {
3078
- this.pdf.getData().then((u8) => {
3079
- const blob = new Blob([u8.buffer], {
3080
- type: 'application/pdf',
3081
- });
3082
- const url = URL.createObjectURL(blob);
3083
- this.openLink(url);
3084
- // Remove the link when done
3085
- setTimeout(() => {
3086
- window.URL.revokeObjectURL(url);
3087
- }, 5000);
3107
+ this.pdf?.getData().then((u8) => {
3108
+ this.downloadFile(u8, 'file.pdf');
3088
3109
  });
3089
3110
  }
3090
3111
  onZoomIn() {
@@ -3098,9 +3119,6 @@ class EuimPdfViewerComponent {
3098
3119
  onResetZoom() {
3099
3120
  this.pinch.resetZoom();
3100
3121
  }
3101
- // async onDismissModal() {
3102
- // await this.modalCtrl.dismiss();
3103
- // }
3104
3122
  nextPage() {
3105
3123
  if (this.page < this.pdf.numPages) {
3106
3124
  this.page++;
@@ -3111,23 +3129,46 @@ class EuimPdfViewerComponent {
3111
3129
  this.page--;
3112
3130
  }
3113
3131
  }
3114
- openLink(url) {
3132
+ /**
3133
+ * Download file from the given data and filename using Blob.
3134
+ * It generates an anchor link and clicks on it to download the file.
3135
+ * @param data
3136
+ * @param filename
3137
+ * @private
3138
+ */
3139
+ downloadFile(data, filename) {
3140
+ const blob = new Blob([data.buffer], { type: 'application/pdf' });
3141
+ const url = window.URL.createObjectURL(blob);
3115
3142
  const a = document.createElement('a');
3116
- document.body.appendChild(a);
3117
- a.style.display = 'none';
3118
3143
  a.href = url;
3119
- a.download = 'PDF_File.pdf';
3144
+ a.download = filename;
3145
+ document.body.appendChild(a);
3120
3146
  a.click();
3121
- // Remove the link when done
3147
+ setTimeout(() => {
3148
+ window.URL.revokeObjectURL(url);
3149
+ }, 5000);
3122
3150
  document.body.removeChild(a);
3123
3151
  }
3124
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, deps: [{ token: i1.AlertController }], target: i0.ɵɵFactoryTarget.Component }); }
3125
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.7", type: EuimPdfViewerComponent, selector: "euim-pdf-viewer", inputs: { url: "url", page: "page" }, viewQueries: [{ propertyName: "pinch", first: true, predicate: ["pinch"], descendants: true, static: true }], ngImport: i0, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"url\"\n [zoom]=\"zoom\"\n [original-size]=\"true\"\n [autoresize]=\"false\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [page]=\"page\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2$2.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i3.PinchZoomComponent, selector: "pinch-zoom, [pinch-zoom]", inputs: ["properties", "transition-duration", "transitionDuration", "double-tap", "doubleTap", "double-tap-scale", "doubleTapScale", "auto-zoom-out", "autoZoomOut", "limit-zoom", "limitZoom", "disabled", "disablePan", "overflow", "zoomControlScale", "disableZoomControl", "backgroundColor", "limitPan", "minPanScale", "minScale", "listeners", "wheel", "autoHeight", "stepZoomFactor", "wheelZoomFactor", "draggableImage"], outputs: ["onZoomChange"], exportAs: ["pinchZoom"] }, { kind: "component", type: EuimSpinnerComponent, selector: "euim-spinner" }, { kind: "component", type: EuimSpinnerMessageComponent, selector: "[euimSpinnerMessage]" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
3152
+ /**
3153
+ * Fetch PDF data from the given URL and return as Uint8Array.
3154
+ * @param url
3155
+ * @private
3156
+ */
3157
+ getPDFData(url) {
3158
+ return this.http.get(url, { responseType: 'arraybuffer' })
3159
+ // transform ArrayBuffer to Uint8Array
3160
+ .pipe(map((data) => new Uint8Array(data)), catchError(err => {
3161
+ this.onError();
3162
+ return throwError(() => err);
3163
+ }));
3164
+ }
3165
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, deps: [{ token: i1.AlertController }, { token: i2$2.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
3166
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.7", type: EuimPdfViewerComponent, selector: "euim-pdf-viewer", inputs: { url: "url", page: "page" }, viewQueries: [{ propertyName: "pinch", first: true, predicate: ["pinch"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [limit-zoom]=\"4\" [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"data\"\n [original-size]=\"false\"\n [zoom-scale]=\"'page-height'\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [(page)]=\"page\"\n [stick-to-page]=\"false\"\n [show-all]=\"false\"\n [render-text]=\"true\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf || !data\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\" [disabled]=\"zoom === 4 || !pdf || !data\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\" [disabled]=\"page === 1 || !pdf || !data\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\" [disabled]=\"page === pdfNumPages || !pdf || !data\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i3.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i4.PinchZoomComponent, selector: "pinch-zoom, [pinch-zoom]", inputs: ["properties", "transition-duration", "transitionDuration", "double-tap", "doubleTap", "double-tap-scale", "doubleTapScale", "auto-zoom-out", "autoZoomOut", "limit-zoom", "limitZoom", "disabled", "disablePan", "overflow", "zoomControlScale", "disableZoomControl", "backgroundColor", "limitPan", "minPanScale", "minScale", "listeners", "wheel", "autoHeight", "stepZoomFactor", "wheelZoomFactor", "draggableImage"], outputs: ["onZoomChange"], exportAs: ["pinchZoom"] }, { kind: "component", type: EuimSpinnerComponent, selector: "euim-spinner" }, { kind: "component", type: EuimSpinnerMessageComponent, selector: "[euimSpinnerMessage]" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
3126
3167
  }
3127
3168
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerComponent, decorators: [{
3128
3169
  type: Component,
3129
- args: [{ selector: 'euim-pdf-viewer', encapsulation: ViewEncapsulation.None, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"url\"\n [zoom]=\"zoom\"\n [original-size]=\"true\"\n [autoresize]=\"false\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [page]=\"page\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"] }]
3130
- }], ctorParameters: () => [{ type: i1.AlertController }], propDecorators: { url: [{
3170
+ args: [{ selector: 'euim-pdf-viewer', encapsulation: ViewEncapsulation.None, template: "@if (loading || errorMessage) {\n<div>\n @if (loading) {\n <euim-spinner>\n <div euimSpinnerMessage>Loading PDF...</div>\n </euim-spinner>\n }\n @if (errorMessage) {\n <div>{{errorMessage}}</div>\n }\n</div>\n}\n\n<pinch-zoom [limit-zoom]=\"4\" [transition-duration]=\"50\" [zoomControlScale]=\"0.5\" (onZoomChange)=\"zoomChange($event)\" [wheelZoomFactor]=\"0.5\" [stepZoomFactor]=\"0.5\" #pinch>\n <div style=\"display: block;width: 100%; height: 500px\">\n <pdf-viewer [src]=\"data\"\n [original-size]=\"false\"\n [zoom-scale]=\"'page-height'\"\n (after-load-complete)=\"onLoaded($event)\"\n (error)=\"onError()\"\n [(page)]=\"page\"\n [stick-to-page]=\"false\"\n [show-all]=\"false\"\n [render-text]=\"true\"\n style=\"width: 100%; height: 100%\">\n </pdf-viewer>\n </div>\n</pinch-zoom>\n\n<ion-footer>\n <ion-toolbar color=\"primary\" class=\"euim-pdf-viewer__footer\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"onDownload()\" [disabled]=\"!pdf || !data\">\n <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-buttons class=\"euim-pdf-viewer__footer-zoom-container\">\n <ion-button (click)=\"onZoomOut()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n <ion-icon name=\"remove-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"onResetZoom()\" [disabled]=\"zoom === 1 || !pdf || !data\">\n {{'euim.pdf-viewer.reset.zoom' | translate }}\n </ion-button>\n <ion-button (click)=\"onZoomIn()\" [disabled]=\"zoom === 4 || !pdf || !data\">\n <ion-icon name=\"add-circle-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n\n <ion-button (click)=\"prevPage()\" [disabled]=\"page === 1 || !pdf || !data\">\n {{'euim.stepper.previous' | translate }}\n </ion-button>\n {{page}}\n <ion-button (click)=\"nextPage()\" [disabled]=\"page === pdfNumPages || !pdf || !data\">\n {{'euim.stepper.next' | translate }}\n </ion-button>\n\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n", styles: [".euim-pdf-viewer__footer-zoom-container{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}\n"] }]
3171
+ }], ctorParameters: () => [{ type: i1.AlertController }, { type: i2$2.HttpClient }], propDecorators: { url: [{
3131
3172
  type: Input
3132
3173
  }], page: [{
3133
3174
  type: Input
@@ -3146,13 +3187,15 @@ class EuimPdfViewerModule {
3146
3187
  PdfViewerModule,
3147
3188
  PinchZoomModule,
3148
3189
  EuimSpinnerComponentModule,
3149
- TranslateModule], exports: [EuimPdfViewerComponent] }); }
3190
+ TranslateModule,
3191
+ HttpClientModule], exports: [EuimPdfViewerComponent] }); }
3150
3192
  /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerModule, imports: [CommonModule,
3151
3193
  IonicModule,
3152
3194
  PdfViewerModule,
3153
3195
  PinchZoomModule,
3154
3196
  EuimSpinnerComponentModule,
3155
- TranslateModule] }); }
3197
+ TranslateModule,
3198
+ HttpClientModule] }); }
3156
3199
  }
3157
3200
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: EuimPdfViewerModule, decorators: [{
3158
3201
  type: NgModule,
@@ -3164,6 +3207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
3164
3207
  PinchZoomModule,
3165
3208
  EuimSpinnerComponentModule,
3166
3209
  TranslateModule,
3210
+ HttpClientModule,
3167
3211
  ],
3168
3212
  exports: [
3169
3213
  ...COMPONENTS$1,