UNPKG

@flatfile/angular-sdk

Version:

Flatfile SDK for Angular

91 lines 20 kB
import { Component, Input } from '@angular/core'; import { createListener, createSimpleListener, } from '@flatfile/embedded-utils'; import { getContainerStyles, getIframeStyles } from './embeddedStyles'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../space-close-modal/spaceCloseModal.component"; import * as i3 from "./iframeSafePipe"; export class SpaceFrame { constructor() { this.title = 'space-frame'; this.showExitWarnModal = false; this.spaceCloseModalProps = {}; this.iframeWrapperStyle = {}; this.iframeStyle = {}; this.handlePostMessageInstance = () => { }; this.spaceFrameProps = {}; this.loading = false; } async created() { const { listener, apiUrl, closeSpace, workbook } = this.spaceFrameProps; function closeSpaceNow() { removeMessageListener?.(); } const accessToken = this.spaceFrameProps.localAccessToken; let removeMessageListener; const simpleListenerSlug = workbook?.sheets?.[0].slug || 'slug'; if (listener) { removeMessageListener = await createListener(accessToken, apiUrl, listener, closeSpace, closeSpaceNow, // TODO: add onInit for translations () => { }); } else { removeMessageListener = await createListener(accessToken, apiUrl, createSimpleListener({ onRecordHook: this.spaceFrameProps.onRecordHook, onSubmit: this.spaceFrameProps.onSubmit, slug: simpleListenerSlug, submitSettings: this.spaceFrameProps .submitSettings, }), closeSpace, closeSpaceNow, // TODO: add onInit for translations () => { }); } } openCloseModalDialog() { this.showExitWarnModal = true; } handleConfirm() { const { closeSpace, handleCloseInstance } = this.spaceFrameProps; if (closeSpace?.onClose && typeof closeSpace.onClose === 'function') { closeSpace.onClose({}); } handleCloseInstance && handleCloseInstance(); } handleCancel() { this.showExitWarnModal = false; } ngOnInit() { const { exitText, exitTitle, exitPrimaryButtonText, exitSecondaryButtonText, } = this.spaceFrameProps; this.iframeWrapperStyle = getContainerStyles(this.spaceFrameProps.displayAsModal || false); this.iframeStyle = getIframeStyles(this.spaceFrameProps.iframeStyles); if (!this.spaceFrameProps.localAccessToken) throw new Error('please wait until access token is received'); const accessToken = this.spaceFrameProps.localAccessToken; window.CROSSENV_FLATFILE_API_KEY = accessToken; this.spaceCloseModalProps = { onConfirm: this.handleConfirm.bind(this), onCancel: this.handleCancel.bind(this), exitText, exitTitle, exitPrimaryButtonText, exitSecondaryButtonText, }; this.created(); } ngOnDestroy() { window.removeEventListener('message', this.handlePostMessageInstance); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpaceFrame, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SpaceFrame, selector: "space-frame", inputs: { spaceFrameProps: "spaceFrameProps", loading: "loading" }, ngImport: i0, template: "<div class=\"flatfile_iframe-wrapper\" [ngClass]=\"{ 'flatfile_displayAsModal': this.spaceFrameProps.displayAsModal }\"\n data-testid=\"space-contents\" [ngStyle]=\"this.iframeWrapperStyle\">\n <space-close-modal *ngIf=\"this.showExitWarnModal\" [spaceCloseModalProps]=\"this.spaceCloseModalProps\" />\n <iframe *ngIf=\"this.spaceFrameProps.spaceUrl\"\n [ngClass]=\"{ 'flatfile_iFrameContainer': this.spaceFrameProps.mountElement }\"\n [attr.data-testid]=\"this.spaceFrameProps.mountElement && 'flatfile_iFrameContainer'\"\n [src]=\"this.spaceFrameProps.spaceUrl | safe\" id=\"flatfile_iframe\" allow=\"clipboard-read; clipboard-write\"\n [ngStyle]=\"this.iframeStyle\">\n </iframe>\n\n <div (click)=\"this.openCloseModalDialog()\" data-testid=\"flatfile-close-button\" class=\"flatfile-close-button\"\n style=\"position: absolute; margin: 30px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 100 100\">\n <line x1=\"10\" y1=\"10\" x2=\"90\" y2=\"90\" stroke=\"white\" :stroke-width=\"10\" />\n <line x1=\"10\" y1=\"90\" x2=\"90\" y2=\"10\" stroke=\"white\" :stroke-width=\"10\" />\n </svg>\n </div>\n</div>", styles: [".flatfile_displayAsModal #flatfile_iframe{border-radius:5px;background:#fff}.flatfile_displayAsModal .flatfile-close-button{position:absolute;z-index:10;top:35px;right:35px;display:flex;justify-content:center;width:25px;align-items:center;border-radius:100%;cursor:pointer;border:none;background:#000;box-shadow:0 0 10px #00000080;animation:glow 1.5s linear infinite alternate;transition:box-shadow .3s ease;height:25px}.flatfile_displayAsModal .flatfile-close-button:hover{box-shadow:0 0 10px #000c}.flatfile_displayAsModal .flatfile-close-button svg{fill:#616a7d;width:10px}.flatfile_iframe-wrapper{min-width:768px;min-height:600px;width:992px;height:600px}.flatfile_iframe-wrapper.flatfile_displayAsModal{box-sizing:content-box;position:fixed;top:0;left:0;width:calc(100% - 60px);max-width:100vw;height:calc(100vh - 60px);padding:30px;background:#0003;z-index:1000}.flatfile-close-button{text-align:center;position:relative;top:20px;right:-20px;width:25px;height:25px;border-radius:100%;cursor:pointer;border:none;background:#000;box-shadow:0 0 10px #00000080;animation:glow 1.5s linear infinite alternate;transition:box-shadow .3s ease}.flatfile-close-button:hover{box-shadow:0 0 10px #000c}.flatfile-close-button svg{fill:#d3d3d3;width:10px}#flatfile_iframe{border-width:0px;width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SpaceCloseModal, selector: "space-close-modal", inputs: ["spaceCloseModalProps"] }, { kind: "pipe", type: i3.SafePipe, name: "safe" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpaceFrame, decorators: [{ type: Component, args: [{ selector: 'space-frame', template: "<div class=\"flatfile_iframe-wrapper\" [ngClass]=\"{ 'flatfile_displayAsModal': this.spaceFrameProps.displayAsModal }\"\n data-testid=\"space-contents\" [ngStyle]=\"this.iframeWrapperStyle\">\n <space-close-modal *ngIf=\"this.showExitWarnModal\" [spaceCloseModalProps]=\"this.spaceCloseModalProps\" />\n <iframe *ngIf=\"this.spaceFrameProps.spaceUrl\"\n [ngClass]=\"{ 'flatfile_iFrameContainer': this.spaceFrameProps.mountElement }\"\n [attr.data-testid]=\"this.spaceFrameProps.mountElement && 'flatfile_iFrameContainer'\"\n [src]=\"this.spaceFrameProps.spaceUrl | safe\" id=\"flatfile_iframe\" allow=\"clipboard-read; clipboard-write\"\n [ngStyle]=\"this.iframeStyle\">\n </iframe>\n\n <div (click)=\"this.openCloseModalDialog()\" data-testid=\"flatfile-close-button\" class=\"flatfile-close-button\"\n style=\"position: absolute; margin: 30px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 100 100\">\n <line x1=\"10\" y1=\"10\" x2=\"90\" y2=\"90\" stroke=\"white\" :stroke-width=\"10\" />\n <line x1=\"10\" y1=\"90\" x2=\"90\" y2=\"10\" stroke=\"white\" :stroke-width=\"10\" />\n </svg>\n </div>\n</div>", styles: [".flatfile_displayAsModal #flatfile_iframe{border-radius:5px;background:#fff}.flatfile_displayAsModal .flatfile-close-button{position:absolute;z-index:10;top:35px;right:35px;display:flex;justify-content:center;width:25px;align-items:center;border-radius:100%;cursor:pointer;border:none;background:#000;box-shadow:0 0 10px #00000080;animation:glow 1.5s linear infinite alternate;transition:box-shadow .3s ease;height:25px}.flatfile_displayAsModal .flatfile-close-button:hover{box-shadow:0 0 10px #000c}.flatfile_displayAsModal .flatfile-close-button svg{fill:#616a7d;width:10px}.flatfile_iframe-wrapper{min-width:768px;min-height:600px;width:992px;height:600px}.flatfile_iframe-wrapper.flatfile_displayAsModal{box-sizing:content-box;position:fixed;top:0;left:0;width:calc(100% - 60px);max-width:100vw;height:calc(100vh - 60px);padding:30px;background:#0003;z-index:1000}.flatfile-close-button{text-align:center;position:relative;top:20px;right:-20px;width:25px;height:25px;border-radius:100%;cursor:pointer;border:none;background:#000;box-shadow:0 0 10px #00000080;animation:glow 1.5s linear infinite alternate;transition:box-shadow .3s ease}.flatfile-close-button:hover{box-shadow:0 0 10px #000c}.flatfile-close-button svg{fill:#d3d3d3;width:10px}#flatfile_iframe{border-width:0px;width:100%;height:100%;position:relative}\n"] }] }], propDecorators: { spaceFrameProps: [{ type: Input, args: [{ required: true }] }], loading: [{ type: Input, args: [{ required: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VGcmFtZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Nkay9zcGFjZS1mcmFtZS9zcGFjZUZyYW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2RrL3NwYWNlLWZyYW1lL3NwYWNlRnJhbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUE7QUFDeEQsT0FBTyxFQUdMLGNBQWMsRUFDZCxvQkFBb0IsR0FDckIsTUFBTSwwQkFBMEIsQ0FBQTtBQUdqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7Ozs7O0FBY3RFLE1BQU0sT0FBTyxVQUFVO0lBTHZCO1FBTUUsVUFBSyxHQUFHLGFBQWEsQ0FBQTtRQUNyQixzQkFBaUIsR0FBRyxLQUFLLENBQUE7UUFDekIseUJBQW9CLEdBQ2xCLEVBQThCLENBQUE7UUFDaEMsdUJBQWtCLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLGdCQUFXLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLDhCQUF5QixHQUViLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQTtRQUVPLG9CQUFlLEdBQ3hDLEVBQXlCLENBQUE7UUFDQSxZQUFPLEdBQVksS0FBSyxDQUFBO0tBMkZwRDtJQXpGQyxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBRXZFLFNBQVMsYUFBYTtZQUNwQixxQkFBcUIsRUFBRSxFQUFFLENBQUE7UUFDM0IsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUE7UUFDekQsSUFBSSxxQkFBK0MsQ0FBQTtRQUNuRCxN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dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIElTcGFjZSxcbiAgU2ltcGxlT25ib2FyZGluZyxcbiAgY3JlYXRlTGlzdGVuZXIsXG4gIGNyZWF0ZVNpbXBsZUxpc3RlbmVyLFxufSBmcm9tICdAZmxhdGZpbGUvZW1iZWRkZWQtdXRpbHMnXG5pbXBvcnQgeyBGbGF0ZmlsZUV2ZW50IH0gZnJvbSAnQGZsYXRmaWxlL2xpc3RlbmVyJ1xuaW1wb3J0IHsgU3BhY2VDbG9zZU1vZGFsUHJvcHNUeXBlIH0gZnJvbSAnLi4vc3BhY2UtY2xvc2UtbW9kYWwvc3BhY2VDbG9zZU1vZGFsLmNvbXBvbmVudCdcbmltcG9ydCB7IGdldENvbnRhaW5lclN0eWxlcywgZ2V0SWZyYW1lU3R5bGVzIH0gZnJvbSAnLi9lbWJlZGRlZFN0eWxlcydcbmV4cG9ydCB0eXBlIFNwYWNlRnJhbWVQcm9wc1R5cGUgPSBJU3BhY2UgJiB7XG4gIHNwYWNlSWQ6IHN0cmluZ1xuICBzcGFjZVVybDogc3RyaW5nXG4gIGxvY2FsQWNjZXNzVG9rZW46IHN0cmluZ1xuICBoYW5kbGVDbG9zZUluc3RhbmNlOiAoKSA9PiB2b2lkXG4gIGNsb3NlSW5zdGFuY2U6IGJvb2xlYW5cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3BhY2UtZnJhbWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhY2VGcmFtZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYWNlRnJhbWUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BhY2VGcmFtZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHRpdGxlID0gJ3NwYWNlLWZyYW1lJ1xuICBzaG93RXhpdFdhcm5Nb2RhbCA9IGZhbHNlXG4gIHNwYWNlQ2xvc2VNb2RhbFByb3BzOiBTcGFjZUNsb3NlTW9kYWxQcm9wc1R5cGUgPVxuICAgIHt9IGFzIFNwYWNlQ2xvc2VNb2RhbFByb3BzVHlwZVxuICBpZnJhbWVXcmFwcGVyU3R5bGUgPSB7fVxuICBpZnJhbWVTdHlsZSA9IHt9XG4gIGhhbmRsZVBvc3RNZXNzYWdlSW5zdGFuY2U6IChcbiAgICBldmVudDogTWVzc2FnZUV2ZW50PHsgZmxhdGZpbGVFdmVudDogRmxhdGZpbGVFdmVudCB9PlxuICApID0+IHZvaWQgPSAoKSA9PiB7fVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNwYWNlRnJhbWVQcm9wczogU3BhY2VGcmFtZVByb3BzVHlwZSA9XG4gICAge30gYXMgU3BhY2VGcmFtZVByb3BzVHlwZVxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2VcblxuICBhc3luYyBjcmVhdGVkKCkge1xuICAgIGNvbnN0IHsgbGlzdGVuZXIsIGFwaVVybCwgY2xvc2VTcGFjZSwgd29ya2Jvb2sgfSA9IHRoaXMuc3BhY2VGcmFtZVByb3BzXG5cbiAgICBmdW5jdGlvbiBjbG9zZVNwYWNlTm93KCkge1xuICAgICAgcmVtb3ZlTWVzc2FnZUxpc3RlbmVyPy4oKVxuICAgIH1cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHRoaXMuc3BhY2VGcmFtZVByb3BzLmxvY2FsQWNjZXNzVG9rZW5cbiAgICBsZXQgcmVtb3ZlTWVzc2FnZUxpc3RlbmVyOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgICBjb25zdCBzaW1wbGVMaXN0ZW5lclNsdWcgPSB3b3JrYm9vaz8uc2hlZXRzPy5bMF0uc2x1ZyB8fCAnc2x1ZydcblxuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgcmVtb3ZlTWVzc2FnZUxpc3RlbmVyID0gYXdhaXQgY3JlYXRlTGlzdGVuZXIoXG4gICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICBhcGlVcmwhLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgY2xvc2VTcGFjZSxcbiAgICAgICAgY2xvc2VTcGFjZU5vdyxcbiAgICAgICAgLy8gVE9ETzogYWRkIG9uSW5pdCBmb3IgdHJhbnNsYXRpb25zXG4gICAgICAgICgpID0+IHt9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZU1lc3NhZ2VMaXN0ZW5lciA9IGF3YWl0IGNyZWF0ZUxpc3RlbmVyKFxuICAgICAgICBhY2Nlc3NUb2tlbixcbiAgICAgICAgYXBpVXJsISxcbiAgICAgICAgY3JlYXRlU2ltcGxlTGlzdGVuZXIoe1xuICAgICAgICAgIG9uUmVjb3JkSG9vazogKHRoaXMuc3BhY2VGcmFtZVByb3BzIGFzIFNpbXBsZU9uYm9hcmRpbmcpLm9uUmVjb3JkSG9vayxcbiAgICAgICAgICBvblN1Ym1pdDogKHRoaXMuc3BhY2VGcmFtZVByb3BzIGFzIFNpbXBsZU9uYm9hcmRpbmcpLm9uU3VibWl0LFxuICAgICAgICAgIHNsdWc6IHNpbXBsZUxpc3RlbmVyU2x1ZyxcbiAgICAgICAgICBzdWJtaXRTZXR0aW5nczogKHRoaXMuc3BhY2VGcmFtZVByb3BzIGFzIFNpbXBsZU9uYm9hcmRpbmcpXG4gICAgICAgICAgICAuc3VibWl0U2V0dGluZ3MsXG4gICAgICAgIH0pLFxuICAgICAgICBjbG9zZVNwYWNlLFxuICAgICAgICBjbG9zZVNwYWNlTm93LFxuICAgICAgICAvLyBUT0RPOiBhZGQgb25Jbml0IGZvciB0cmFuc2xhdGlvbnNcbiAgICAgICAgKCkgPT4ge31cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBvcGVuQ2xvc2VNb2RhbERpYWxvZygpIHtcbiAgICB0aGlzLnNob3dFeGl0V2Fybk1vZGFsID0gdHJ1ZVxuICB9XG5cbiAgaGFuZGxlQ29uZmlybSgpIHtcbiAgICBjb25zdCB7IGNsb3NlU3BhY2UsIGhhbmRsZUNsb3NlSW5zdGFuY2UgfSA9IHRoaXMuc3BhY2VGcmFtZVByb3BzXG4gICAgaWYgKGNsb3NlU3BhY2U/Lm9uQ2xvc2UgJiYgdHlwZW9mIGNsb3NlU3BhY2Uub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2xvc2VTcGFjZS5vbkNsb3NlKHt9KVxuICAgIH1cbiAgICBoYW5kbGVDbG9zZUluc3RhbmNlICYmIGhhbmRsZUNsb3NlSW5zdGFuY2UoKVxuICB9XG5cbiAgaGFuZGxlQ2FuY2VsKCkge1xuICAgIHRoaXMuc2hvd0V4aXRXYXJuTW9kYWwgPSBmYWxzZVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgZXhpdFRleHQsXG4gICAgICBleGl0VGl0bGUsXG4gICAgICBleGl0UHJpbWFyeUJ1dHRvblRleHQsXG4gICAgICBleGl0U2Vjb25kYXJ5QnV0dG9uVGV4dCxcbiAgICB9ID0gdGhpcy5zcGFjZUZyYW1lUHJvcHNcblxuICAgIHRoaXMuaWZyYW1lV3JhcHBlclN0eWxlID0gZ2V0Q29udGFpbmVyU3R5bGVzKFxuICAgICAgdGhpcy5zcGFjZUZyYW1lUHJvcHMuZGlzcGxheUFzTW9kYWwgfHwgZmFsc2VcbiAgICApXG4gICAgdGhpcy5pZnJhbWVTdHlsZSA9IGdldElmcmFtZVN0eWxlcyh0aGlzLnNwYWNlRnJhbWVQcm9wcy5pZnJhbWVTdHlsZXMpXG5cbiAgICBpZiAoIXRoaXMuc3BhY2VGcmFtZVByb3BzLmxvY2FsQWNjZXNzVG9rZW4pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BsZWFzZSB3YWl0IHVudGlsIGFjY2VzcyB0b2tlbiBpcyByZWNlaXZlZCcpXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0aGlzLnNwYWNlRnJhbWVQcm9wcy5sb2NhbEFjY2Vzc1Rva2VuXG5cbiAgICB3aW5kb3cuQ1JPU1NFTlZfRkxBVEZJTEVfQVBJX0tFWSA9IGFjY2Vzc1Rva2VuXG5cbiAgICB0aGlzLnNwYWNlQ2xvc2VNb2RhbFByb3BzID0ge1xuICAgICAgb25Db25maXJtOiB0aGlzLmhhbmRsZUNvbmZpcm0uYmluZCh0aGlzKSxcbiAgICAgIG9uQ2FuY2VsOiB0aGlzLmhhbmRsZUNhbmNlbC5iaW5kKHRoaXMpLFxuICAgICAgZXhpdFRleHQsXG4gICAgICBleGl0VGl0bGUsXG4gICAgICBleGl0UHJpbWFyeUJ1dHRvblRleHQsXG4gICAgICBleGl0U2Vjb25kYXJ5QnV0dG9uVGV4dCxcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZWQoKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlSW5zdGFuY2UpXG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBDUk9TU0VOVl9GTEFURklMRV9BUElfS0VZOiBzdHJpbmdcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsYXRmaWxlX2lmcmFtZS13cmFwcGVyXCIgW25nQ2xhc3NdPVwieyAnZmxhdGZpbGVfZGlzcGxheUFzTW9kYWwnOiB0aGlzLnNwYWNlRnJhbWVQcm9wcy5kaXNwbGF5QXNNb2RhbCB9XCJcbiAgZGF0YS10ZXN0aWQ9XCJzcGFjZS1jb250ZW50c1wiIFtuZ1N0eWxlXT1cInRoaXMuaWZyYW1lV3JhcHBlclN0eWxlXCI+XG4gIDxzcGFjZS1jbG9zZS1tb2RhbCAqbmdJZj1cInRoaXMuc2hvd0V4aXRXYXJuTW9kYWxcIiBbc3BhY2VDbG9zZU1vZGFsUHJvcHNdPVwidGhpcy5zcGFjZUNsb3NlTW9kYWxQcm9wc1wiIC8+XG4gIDxpZnJhbWUgKm5nSWY9XCJ0aGlzLnNwYWNlRnJhbWVQcm9wcy5zcGFjZVVybFwiXG4gICAgW25nQ2xhc3NdPVwieyAnZmxhdGZpbGVfaUZyYW1lQ29udGFpbmVyJzogdGhpcy5zcGFjZUZyYW1lUHJvcHMubW91bnRFbGVtZW50IH1cIlxuICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cInRoaXMuc3BhY2VGcmFtZVByb3BzLm1vdW50RWxlbWVudCAmJiAnZmxhdGZpbGVfaUZyYW1lQ29udGFpbmVyJ1wiXG4gICAgW3NyY109XCJ0aGlzLnNwYWNlRnJhbWVQcm9wcy5zcGFjZVVybCB8IHNhZmVcIiBpZD1cImZsYXRmaWxlX2lmcmFtZVwiIGFsbG93PVwiY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZVwiXG4gICAgW25nU3R5bGVdPVwidGhpcy5pZnJhbWVTdHlsZVwiPlxuICA8L2lmcmFtZT5cblxuICA8ZGl2IChjbGljayk9XCJ0aGlzLm9wZW5DbG9zZU1vZGFsRGlhbG9nKClcIiBkYXRhLXRlc3RpZD1cImZsYXRmaWxlLWNsb3NlLWJ1dHRvblwiIGNsYXNzPVwiZmxhdGZpbGUtY2xvc2UtYnV0dG9uXCJcbiAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbWFyZ2luOiAzMHB4O1wiPlxuICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMTAwIDEwMFwiPlxuICAgICAgPGxpbmUgeDE9XCIxMFwiIHkxPVwiMTBcIiB4Mj1cIjkwXCIgeTI9XCI5MFwiIHN0cm9rZT1cIndoaXRlXCIgOnN0cm9rZS13aWR0aD1cIjEwXCIgLz5cbiAgICAgIDxsaW5lIHgxPVwiMTBcIiB5MT1cIjkwXCIgeDI9XCI5MFwiIHkyPVwiMTBcIiBzdHJva2U9XCJ3aGl0ZVwiIDpzdHJva2Utd2lkdGg9XCIxMFwiIC8+XG4gICAgPC9zdmc+XG4gIDwvZGl2PlxuPC9kaXY+Il19