keevo-components 2.0.88 → 2.0.89

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.
@@ -0,0 +1,48 @@
1
+ // pdf.service.ts (VERSÃO FINAL - com html2canvas)
2
+ import { Injectable } from '@angular/core';
3
+ import jsPDF from 'jspdf';
4
+ import html2canvas from 'html2canvas';
5
+ import * as i0 from "@angular/core";
6
+ export class PdfService {
7
+ constructor() { }
8
+ async gerarPdfBlobPorElementoId(elementId) {
9
+ const element = document.getElementById(elementId);
10
+ if (!element) {
11
+ throw new Error(`Elemento com id "${elementId}" para renderização do PDF não foi encontrado.`);
12
+ }
13
+ const canvas = await html2canvas(element, {
14
+ scale: 2, // Boa relação entre qualidade e performance
15
+ useCORS: true,
16
+ });
17
+ const imgData = canvas.toDataURL('image/png');
18
+ const pdf = new jsPDF({
19
+ orientation: 'p',
20
+ unit: 'mm',
21
+ format: 'a4'
22
+ });
23
+ const pdfWidth = pdf.internal.pageSize.getWidth();
24
+ const pdfPageHeight = pdf.internal.pageSize.getHeight();
25
+ const imgProps = pdf.getImageProperties(imgData);
26
+ const imgHeight = (imgProps.height * pdfWidth) / imgProps.width;
27
+ let heightLeft = imgHeight;
28
+ let position = 0;
29
+ pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, imgHeight);
30
+ heightLeft -= pdfPageHeight;
31
+ while (heightLeft > 0) {
32
+ position -= pdfPageHeight;
33
+ pdf.addPage();
34
+ pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, imgHeight);
35
+ heightLeft -= pdfPageHeight;
36
+ }
37
+ return pdf.output('blob');
38
+ }
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: PdfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
40
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: PdfService, providedIn: 'root' }); }
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: PdfService, decorators: [{
43
+ type: Injectable,
44
+ args: [{
45
+ providedIn: 'root'
46
+ }]
47
+ }], ctorParameters: () => [] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvYXBpL3NlcnZpY2VzL3BkZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7O0FBS3RDLE1BQU0sT0FBTyxVQUFVO0lBRW5CLGdCQUFnQixDQUFDO0lBRVYsS0FBSyxDQUFDLHlCQUF5QixDQUFDLFNBQWlCO1FBRXBELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsU0FBUyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsS0FBSyxFQUFFLENBQUMsRUFBRSw0Q0FBNEM7WUFDdEQsT0FBTyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQztZQUNsQixXQUFXLEVBQUUsR0FBRztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRWhFLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFakIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELFVBQVUsSUFBSSxhQUFhLENBQUM7UUFFNUIsT0FBTyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsUUFBUSxJQUFJLGFBQWEsQ0FBQztZQUMxQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0QsVUFBVSxJQUFJLGFBQWEsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBM0NRLFVBQVU7a0hBQVYsVUFBVSxjQUZQLE1BQU07OzJGQUVULFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcGRmLnNlcnZpY2UudHMgKFZFUlPDg08gRklOQUwgLSBjb20gaHRtbDJjYW52YXMpXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XHJcbmltcG9ydCBodG1sMmNhbnZhcyBmcm9tICdodG1sMmNhbnZhcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBkZlNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdlcmFyUGRmQmxvYlBvckVsZW1lbnRvSWQoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50byBjb20gaWQgXCIke2VsZW1lbnRJZH1cIiBwYXJhIHJlbmRlcml6YcOnw6NvIGRvIFBERiBuw6NvIGZvaSBlbmNvbnRyYWRvLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZWxlbWVudCwge1xyXG4gICAgICAgICAgICBzY2FsZTogMiwgLy8gQm9hIHJlbGHDp8OjbyBlbnRyZSBxdWFsaWRhZGUgZSBwZXJmb3JtYW5jZVxyXG4gICAgICAgICAgICB1c2VDT1JTOiB0cnVlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBpbWdEYXRhID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERih7XHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAncCcsXHJcbiAgICAgICAgICAgIHVuaXQ6ICdtbScsXHJcbiAgICAgICAgICAgIGZvcm1hdDogJ2E0J1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBwZGZXaWR0aCA9IHBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgICAgIGNvbnN0IHBkZlBhZ2VIZWlnaHQgPSBwZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgaW1nUHJvcHMgPSBwZGYuZ2V0SW1hZ2VQcm9wZXJ0aWVzKGltZ0RhdGEpO1xyXG4gICAgICAgIGNvbnN0IGltZ0hlaWdodCA9IChpbWdQcm9wcy5oZWlnaHQgKiBwZGZXaWR0aCkgLyBpbWdQcm9wcy53aWR0aDtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgaGVpZ2h0TGVmdCA9IGltZ0hlaWdodDtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgICBwZGYuYWRkSW1hZ2UoaW1nRGF0YSwgJ1BORycsIDAsIHBvc2l0aW9uLCBwZGZXaWR0aCwgaW1nSGVpZ2h0KTtcclxuICAgICAgICBoZWlnaHRMZWZ0IC09IHBkZlBhZ2VIZWlnaHQ7XHJcblxyXG4gICAgICAgIHdoaWxlIChoZWlnaHRMZWZ0ID4gMCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiAtPSBwZGZQYWdlSGVpZ2h0O1xyXG4gICAgICAgICAgICBwZGYuYWRkUGFnZSgpO1xyXG4gICAgICAgICAgICBwZGYuYWRkSW1hZ2UoaW1nRGF0YSwgJ1BORycsIDAsIHBvc2l0aW9uLCBwZGZXaWR0aCwgaW1nSGVpZ2h0KTtcclxuICAgICAgICAgICAgaGVpZ2h0TGVmdCAtPSBwZGZQYWdlSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBkZi5vdXRwdXQoJ2Jsb2InKTtcclxuICAgIH1cclxufSJdfQ==
@@ -0,0 +1,40 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { DomSanitizer } from '@angular/platform-browser';
3
+ import { DynamicDialogConfig } from 'primeng/dynamicdialog';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as i0 from "@angular/core";
6
+ export class KvReportModalComponent {
7
+ constructor() {
8
+ // Injeções
9
+ this.dynamicDialogConfig = inject(DynamicDialogConfig);
10
+ this.sanitizer = inject(DomSanitizer);
11
+ // A única URL que precisamos
12
+ this.pdfUrl = null;
13
+ this.objectUrl = null;
14
+ }
15
+ ngOnInit() {
16
+ // 1. Recebe o Blob PRONTO vindo do componente pai
17
+ const pdfBlob = this.dynamicDialogConfig.data?.pdfBlob;
18
+ if (pdfBlob) {
19
+ // 2. Cria a URL segura para o iframe
20
+ this.objectUrl = URL.createObjectURL(pdfBlob);
21
+ this.pdfUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.objectUrl);
22
+ }
23
+ else {
24
+ console.error("O modal do relatório foi aberto sem um Blob de PDF.");
25
+ }
26
+ }
27
+ // Limpa a memória quando o modal é fechado
28
+ ngOnDestroy() {
29
+ if (this.objectUrl) {
30
+ URL.revokeObjectURL(this.objectUrl);
31
+ }
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvReportModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvReportModalComponent, isStandalone: true, selector: "kv-report-modal", ngImport: i0, template: "@if (pdfUrl) {\r\n<div class=\"h-full w-full overflow-hidden\">\r\n <iframe\r\n [src]=\"pdfUrl\"\r\n class=\"w-full h-full\"\r\n style=\"border: none\"\r\n title=\"Pr\u00E9-visualiza\u00E7\u00E3o do Relat\u00F3rio\"\r\n >\r\n </iframe>\r\n</div>\r\n} @else {\r\n<div class=\"w-full h-full flex items-center justify-center bg-gray-200\">\r\n <div class=\"text-center text-red-600\">\r\n <p class=\"font-bold\">Erro!</p>\r\n <p>N\u00E3o foi poss\u00EDvel carregar o arquivo do relat\u00F3rio.</p>\r\n </div>\r\n</div>\r\n}\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvReportModalComponent, decorators: [{
37
+ type: Component,
38
+ args: [{ selector: 'kv-report-modal', standalone: true, imports: [CommonModule], template: "@if (pdfUrl) {\r\n<div class=\"h-full w-full overflow-hidden\">\r\n <iframe\r\n [src]=\"pdfUrl\"\r\n class=\"w-full h-full\"\r\n style=\"border: none\"\r\n title=\"Pr\u00E9-visualiza\u00E7\u00E3o do Relat\u00F3rio\"\r\n >\r\n </iframe>\r\n</div>\r\n} @else {\r\n<div class=\"w-full h-full flex items-center justify-center bg-gray-200\">\r\n <div class=\"text-center text-red-600\">\r\n <p class=\"font-bold\">Erro!</p>\r\n <p>N\u00E3o foi poss\u00EDvel carregar o arquivo do relat\u00F3rio.</p>\r\n </div>\r\n</div>\r\n}\r\n" }]
39
+ }] });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtcmVwb3J0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3IvY29tcG9uZW50cy9rdi1yZXBvcnQtbW9kYWwva3YtcmVwb3J0LW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3IvY29tcG9uZW50cy9rdi1yZXBvcnQtbW9kYWwva3YtcmVwb3J0LW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLDJCQUEyQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFTL0MsTUFBTSxPQUFPLHNCQUFzQjtJQVBuQztRQVFFLFdBQVc7UUFDWCx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxjQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpDLDZCQUE2QjtRQUM3QixXQUFNLEdBQTJCLElBQUksQ0FBQztRQUM5QixjQUFTLEdBQWtCLElBQUksQ0FBQztLQXFCekM7SUFuQkMsUUFBUTtRQUNOLGtEQUFrRDtRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUV2RCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1oscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQzs4R0EzQlUsc0JBQXNCO2tHQUF0QixzQkFBc0IsMkVDWm5DLHFpQkFrQkEseUREVlksWUFBWTs7MkZBSVgsc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAna3YtcmVwb3J0LW1vZGFsJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9rdi1yZXBvcnQtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2t2LXJlcG9ydC1tb2RhbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdlJlcG9ydE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIEluamXDp8O1ZXNcclxuICBkeW5hbWljRGlhbG9nQ29uZmlnID0gaW5qZWN0KER5bmFtaWNEaWFsb2dDb25maWcpO1xyXG4gIHNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xyXG5cclxuICAvLyBBIMO6bmljYSBVUkwgcXVlIHByZWNpc2Ftb3NcclxuICBwZGZVcmw6IFNhZmVSZXNvdXJjZVVybCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgb2JqZWN0VXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyAxLiBSZWNlYmUgbyBCbG9iIFBST05UTyB2aW5kbyBkbyBjb21wb25lbnRlIHBhaVxyXG4gICAgY29uc3QgcGRmQmxvYiA9IHRoaXMuZHluYW1pY0RpYWxvZ0NvbmZpZy5kYXRhPy5wZGZCbG9iO1xyXG5cclxuICAgIGlmIChwZGZCbG9iKSB7XHJcbiAgICAgIC8vIDIuIENyaWEgYSBVUkwgc2VndXJhIHBhcmEgbyBpZnJhbWVcclxuICAgICAgdGhpcy5vYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHBkZkJsb2IpO1xyXG4gICAgICB0aGlzLnBkZlVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLm9iamVjdFVybCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiTyBtb2RhbCBkbyByZWxhdMOzcmlvIGZvaSBhYmVydG8gc2VtIHVtIEJsb2IgZGUgUERGLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIExpbXBhIGEgbWVtw7NyaWEgcXVhbmRvIG8gbW9kYWwgw6kgZmVjaGFkb1xyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMub2JqZWN0VXJsKSB7XHJcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5vYmplY3RVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIkBpZiAocGRmVXJsKSB7XHJcbjxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gIDxpZnJhbWVcclxuICAgIFtzcmNdPVwicGRmVXJsXCJcclxuICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICBzdHlsZT1cImJvcmRlcjogbm9uZVwiXHJcbiAgICB0aXRsZT1cIlByw6ktdmlzdWFsaXphw6fDo28gZG8gUmVsYXTDs3Jpb1wiXHJcbiAgPlxyXG4gIDwvaWZyYW1lPlxyXG48L2Rpdj5cclxufSBAZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLWdyYXktMjAwXCI+XHJcbiAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHRleHQtcmVkLTYwMFwiPlxyXG4gICAgPHAgY2xhc3M9XCJmb250LWJvbGRcIj5FcnJvITwvcD5cclxuICAgIDxwPk7Do28gZm9pIHBvc3PDrXZlbCBjYXJyZWdhciBvIGFycXVpdm8gZG8gcmVsYXTDs3Jpby48L3A+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcbiJdfQ==