UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

150 lines 21.9 kB
import { AnnotationMode } from './editor-annotations'; const _isIE11 = typeof window === 'undefined' ? false : !!globalThis.MSInputMethodContext && !!document.documentMode; const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent); const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined'; export const pdfjsVersion = '5.3.732'; export const pdfjsBleedingEdgeVersion = '5.3.732'; export function getVersionSuffix(folder) { if (folder?.includes('bleeding-edge')) { return pdfjsBleedingEdgeVersion; } return pdfjsVersion; } export function assetsUrl(url, postfixIfPathIsRelativ = '') { if (url.includes('://')) { // the assets folder is on an absolute path (like https://example.com/assets) return url; } return `./${url + postfixIfPathIsRelativ}`; } export function isBleedingEdge() { return pdfDefaultOptions.assetsFolder?.includes('bleeding-edge'); } function isTestEnvironment() { return (typeof process !== 'undefined' && typeof process.env !== 'undefined' && (process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined || process.env.VITEST !== undefined)); } export function getSafeCanvasSize() { if (typeof window === 'undefined' || typeof document === 'undefined' || isTestEnvironment()) { return 4096; } // Create a temporary WebGL context const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); let maxTextureSize; if (gl instanceof WebGLRenderingContext) { maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); } else { maxTextureSize = 4096; } // Get available device RAM (in MB) function getAvailableMemoryMB() { if ('deviceMemory' in navigator) { return navigator.deviceMemory * 1024; // Convert GB to MB } if (window.performance && 'memory' in window.performance) { return window.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome, Firefox, and Edgewindow.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome } return 4096; // Default to 4GB if unknown } const availableMemoryMB = getAvailableMemoryMB(); // Conservative formula: Scale by square root of available memory let estimatedSafeSize = Math.floor(Math.sqrt((availableMemoryMB * 1024 * 1024) / 6)); // Apply platform-specific limits const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window); const isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent); const isHighEndDesktop = availableMemoryMB > 12000; // Assume high-end desktops have >12GB RAM if (isIOS) { estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // iOS Safari memory limits } else if (isMobile) { estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // Most mobile devices } else if (isHighEndDesktop) { estimatedSafeSize = Math.min(estimatedSafeSize, 8192); // Allow larger sizes for desktops } else { estimatedSafeSize = Math.min(estimatedSafeSize, 6000); // Mid-range desktops } // Final limit based on GPU and estimated memory safety const maxWidth = Math.min(maxTextureSize, estimatedSafeSize); return maxWidth * maxWidth; } // sonar ignore next line export const pdfDefaultOptions = { needsES5: _isIE11 || isEdge || needsES5, annotationEditorMode: 0, annotationMode: AnnotationMode.ENABLE_FORMS, defaultZoomDelay: 400, cursorToolOnLoad: 0, defaultUrl: '', defaultZoomValue: '', disableHistory: false, disablePageLabels: false, enablePermissions: false, docBaseUrl: '', enablePrintAutoRotate: true, enableSignatureEditor: false, externalLinkRel: 'noopener noreferrer nofollow', externalLinkTarget: 0, findController: undefined, historyUpdateUrl: false, ignoreDestinationZoom: false, imageResourcesPath: './images/', maxCanvasPixels: getSafeCanvasSize(), forcePageColors: false, pageColorsBackground: 'Canvas', pageColorsForeground: 'CanvasText', pdfBugEnabled: false, printResolution: 150, rangeChunkSize: 65536, removePageBorders: false, enableXfa: true, fontExtraProperties: false, sidebarViewOnLoad: -1, scrollModeOnLoad: -1, spreadModeOnLoad: -1, textLayerMode: 1, // viewerCssTheme: 0, // not supported by ngx-extended-pdf-viewer, use [theme] instead viewOnLoad: 0, cMapPacked: true, cMapUrl: function () { return `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/cmaps/`; }, disableAutoFetch: false, disableFontFace: false, disableRange: false, disableStream: true, isEvalSupported: true, isOffscreenCanvasSupported: true, maxImageSize: -1, pdfBug: false, verbosity: 1, workerPort: null, assetsFolder: 'assets', _internalFilenameSuffix: '.min', sandboxBundleSrc: function () { return pdfDefaultOptions.needsES5 ? `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs` : `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`; }, workerSrc: function () { return pdfDefaultOptions.needsES5 ? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs` : `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`; }, standardFontDataUrl: () => `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/standard_fonts/`, // options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js) doubleTapZoomFactor: 'page-width', doubleTapZoomsInHandMode: true, doubleTapZoomsInTextSelectionMode: false, doubleTapResetsZoomOnSecondDoubleTap: false, enableScripting: true, defaultCacheSize: 50, passwordPrompt: undefined, enableHWA: true, positionPopupDialogsWithJavaScript: true, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlZmF1bHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFPLFVBQVcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQU8sUUFBUyxDQUFDLFlBQVksQ0FBQztBQUNuSSxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztBQUNsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDckMsT0FBTyx3QkFBd0IsQ0FBQztLQUNqQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO0lBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2Qiw2RUFBNkU7UUFDN0UsT0FBTyxHQUFHLENBQUM7S0FD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QUMvQixDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGVBQWUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVU7WUFDbEksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxlQUFlLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUNwSCxpQkFBaUIsQ0FBQyx1QkFDcEIsTUFBTSxDQUFDO0lBQ2IsQ0FBQztJQUNELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQWtCO0lBRWhHLG1GQUFtRjtJQUNuRixtQkFBbUIsRUFBRSxZQUFZO0lBQ2pDLHdCQUF3QixFQUFFLElBQUk7SUFDOUIsaUNBQWlDLEVBQUUsS0FBSztJQUN4QyxvQ0FBb0MsRUFBRSxLQUFLO0lBQzNDLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGdCQUFnQixFQUFFLEVBQUU7SUFDcEIsY0FBYyxFQUFFLFNBQVM7SUFDekIsU0FBUyxFQUFFLElBQUk7SUFDZixrQ0FBa0MsRUFBRSxJQUFJO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9uTW9kZSB9IGZyb20gJy4vZWRpdG9yLWFubm90YXRpb25zJztcblxuY29uc3QgX2lzSUUxMSA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiAhISg8YW55Pmdsb2JhbFRoaXMpLk1TSW5wdXRNZXRob2RDb250ZXh0ICYmICEhKDxhbnk+ZG9jdW1lbnQpLmRvY3VtZW50TW9kZTtcbmNvbnN0IGlzRWRnZSA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnIHx8IC9FZGdlXFwvXFxkLi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5jb25zdCBuZWVkc0VTNSA9IHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFByb21pc2VbJ2FsbFNldHRsZWQnXSA9PT0gJ3VuZGVmaW5lZCc7XG5cbmV4cG9ydCBjb25zdCBwZGZqc1ZlcnNpb24gPSAnNS4zLjczMic7XG5leHBvcnQgY29uc3QgcGRmanNCbGVlZGluZ0VkZ2VWZXJzaW9uID0gJzUuMy43MzInO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25TdWZmaXgoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZm9sZGVyPy5pbmNsdWRlcygnYmxlZWRpbmctZWRnZScpKSB7XG4gICAgcmV0dXJuIHBkZmpzQmxlZWRpbmdFZGdlVmVyc2lvbjtcbiAgfVxuICByZXR1cm4gcGRmanNWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXRzVXJsKHVybDogc3RyaW5nLCBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2ID0gJycpOiBzdHJpbmcge1xuICBpZiAodXJsLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgIC8vIHRoZSBhc3NldHMgZm9sZGVyIGlzIG9uIGFuIGFic29sdXRlIHBhdGggKGxpa2UgaHR0cHM6Ly9leGFtcGxlLmNvbS9hc3NldHMpXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gYC4vJHt1cmwgKyBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsZWVkaW5nRWRnZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcj8uaW5jbHVkZXMoJ2JsZWVkaW5nLWVkZ2UnKTtcbn1cblxuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiBhbnk7XG5cbmZ1bmN0aW9uIGlzVGVzdEVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLmVudiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAoKHByb2Nlc3MgYXMgYW55KS5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyB8fCAocHJvY2VzcyBhcyBhbnkpLmVudi5KRVNUX1dPUktFUl9JRCAhPT0gdW5kZWZpbmVkIHx8IChwcm9jZXNzIGFzIGFueSkuZW52LlZJVEVTVCAhPT0gdW5kZWZpbmVkKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUNhbnZhc1NpemUoKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNUZXN0RW52aXJvbm1lbnQoKSkge1xuICAgIHJldHVybiA0MDk2O1xuICB9XG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBXZWJHTCBjb250ZXh0XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgbGV0IG1heFRleHR1cmVTaXplO1xuICBpZiAoZ2wgaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfSBlbHNlIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IDQwOTY7XG4gIH1cbiAgLy8gR2V0IGF2YWlsYWJsZSBkZXZpY2UgUkFNIChpbiBNQilcbiAgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlTWVtb3J5TUIoKTogbnVtYmVyIHtcbiAgICBpZiAoJ2RldmljZU1lbW9yeScgaW4gbmF2aWdhdG9yKSB7XG4gICAgICByZXR1cm4gKG5hdmlnYXRvci5kZXZpY2VNZW1vcnkgYXMgbnVtYmVyKSAqIDEwMjQ7IC8vIENvbnZlcnQgR0IgdG8gTUJcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZSAmJiAnbWVtb3J5JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgIHJldHVybiAod2luZG93LnBlcmZvcm1hbmNlLm1lbW9yeSBhcyBhbnkpLmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZSwgRmlyZWZveCwgYW5kIEVkZ2V3aW5kb3cucGVyZm9ybWFuY2UubWVtb3J5LmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZVxuICAgIH1cbiAgICByZXR1cm4gNDA5NjsgLy8gRGVmYXVsdCB0byA0R0IgaWYgdW5rbm93blxuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlTWVtb3J5TUIgPSBnZXRBdmFpbGFibGVNZW1vcnlNQigpO1xuXG4gIC8vIENvbnNlcnZhdGl2ZSBmb3JtdWxhOiBTY2FsZSBieSBzcXVhcmUgcm9vdCBvZiBhdmFpbGFibGUgbWVtb3J5XG4gIGxldCBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KChhdmFpbGFibGVNZW1vcnlNQiAqIDEwMjQgKiAxMDI0KSAvIDYpKTtcblxuICAvLyBBcHBseSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW1pdHNcbiAgY29uc3QgaXNJT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKCdNU1N0cmVhbScgaW4gd2luZG93KTtcbiAgY29uc3QgaXNNb2JpbGUgPSAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBjb25zdCBpc0hpZ2hFbmREZXNrdG9wID0gYXZhaWxhYmxlTWVtb3J5TUIgPiAxMjAwMDsgLy8gQXNzdW1lIGhpZ2gtZW5kIGRlc2t0b3BzIGhhdmUgPjEyR0IgUkFNXG5cbiAgaWYgKGlzSU9TKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIGlPUyBTYWZhcmkgbWVtb3J5IGxpbWl0c1xuICB9IGVsc2UgaWYgKGlzTW9iaWxlKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIE1vc3QgbW9iaWxlIGRldmljZXNcbiAgfSBlbHNlIGlmIChpc0hpZ2hFbmREZXNrdG9wKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgODE5Mik7IC8vIEFsbG93IGxhcmdlciBzaXplcyBmb3IgZGVza3RvcHNcbiAgfSBlbHNlIHtcbiAgICBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGgubWluKGVzdGltYXRlZFNhZmVTaXplLCA2MDAwKTsgLy8gTWlkLXJhbmdlIGRlc2t0b3BzXG4gIH1cblxuICAvLyBGaW5hbCBsaW1pdCBiYXNlZCBvbiBHUFUgYW5kIGVzdGltYXRlZCBtZW1vcnkgc2FmZXR5XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4obWF4VGV4dHVyZVNpemUsIGVzdGltYXRlZFNhZmVTaXplKTtcbiAgcmV0dXJuIG1heFdpZHRoICogbWF4V2lkdGg7XG59XG5cbi8vIHNvbmFyIGlnbm9yZSBuZXh0IGxpbmVcbmV4cG9ydCBjb25zdCBwZGZEZWZhdWx0T3B0aW9ucyA9IHtcbiAgbmVlZHNFUzU6IF9pc0lFMTEgfHwgaXNFZGdlIHx8IG5lZWRzRVM1LFxuICBhbm5vdGF0aW9uRWRpdG9yTW9kZTogMCxcbiAgYW5ub3RhdGlvbk1vZGU6IEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUyxcbiAgZGVmYXVsdFpvb21EZWxheTogNDAwLCAvLyBtaWxsaXNlY29uZHNcbiAgY3Vyc29yVG9vbE9uTG9hZDogMCxcbiAgZGVmYXVsdFVybDogJycsXG4gIGRlZmF1bHRab29tVmFsdWU6ICcnLFxuICBkaXNhYmxlSGlzdG9yeTogZmFsc2UsXG4gIGRpc2FibGVQYWdlTGFiZWxzOiBmYWxzZSxcbiAgZW5hYmxlUGVybWlzc2lvbnM6IGZhbHNlLFxuICBkb2NCYXNlVXJsOiAnJyxcbiAgZW5hYmxlUHJpbnRBdXRvUm90YXRlOiB0cnVlLFxuICBlbmFibGVTaWduYXR1cmVFZGl0b3I6IGZhbHNlLFxuICBleHRlcm5hbExpbmtSZWw6ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyxcbiAgZXh0ZXJuYWxMaW5rVGFyZ2V0OiAwLFxuICBmaW5kQ29udHJvbGxlcjogdW5kZWZpbmVkLCAvLyBtdXN0IGV4dGVuZCBQREZGaW5kQ29udHJvbGxlclxuICBoaXN0b3J5VXBkYXRlVXJsOiBmYWxzZSxcbiAgaWdub3JlRGVzdGluYXRpb25ab29tOiBmYWxzZSxcbiAgaW1hZ2VSZXNvdXJjZXNQYXRoOiAnLi9pbWFnZXMvJyxcbiAgbWF4Q2FudmFzUGl4ZWxzOiBnZXRTYWZlQ2FudmFzU2l6ZSgpLFxuICBmb3JjZVBhZ2VDb2xvcnM6IGZhbHNlLFxuICBwYWdlQ29sb3JzQmFja2dyb3VuZDogJ0NhbnZhcycsXG4gIHBhZ2VDb2xvcnNGb3JlZ3JvdW5kOiAnQ2FudmFzVGV4dCcsXG4gIHBkZkJ1Z0VuYWJsZWQ6IGZhbHNlLFxuICBwcmludFJlc29sdXRpb246IDE1MCxcbiAgcmFuZ2VDaHVua1NpemU6IDY1NTM2LFxuICByZW1vdmVQYWdlQm9yZGVyczogZmFsc2UsXG4gIGVuYWJsZVhmYTogdHJ1ZSxcbiAgZm9udEV4dHJhUHJvcGVydGllczogZmFsc2UsXG4gIHNpZGViYXJWaWV3T25Mb2FkOiAtMSxcbiAgc2Nyb2xsTW9kZU9uTG9hZDogLTEsXG4gIHNwcmVhZE1vZGVPbkxvYWQ6IC0xLFxuICB0ZXh0TGF5ZXJNb2RlOiAxLFxuICAvLyB2aWV3ZXJDc3NUaGVtZTogMCwgLy8gbm90IHN1cHBvcnRlZCBieSBuZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlciwgdXNlIFt0aGVtZV0gaW5zdGVhZFxuICB2aWV3T25Mb2FkOiAwLFxuICBjTWFwUGFja2VkOiB0cnVlLFxuICBjTWFwVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIsICcvLi4nKX0vY21hcHMvYDtcbiAgfSxcbiAgZGlzYWJsZUF1dG9GZXRjaDogZmFsc2UsXG4gIGRpc2FibGVGb250RmFjZTogZmFsc2UsXG4gIGRpc2FibGVSYW5nZTogZmFsc2UsXG4gIGRpc2FibGVTdHJlYW06IHRydWUsXG4gIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSxcbiAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRydWUsXG4gIG1heEltYWdlU2l6ZTogLTEsXG4gIHBkZkJ1ZzogZmFsc2UsXG4gIHZlcmJvc2l0eTogMSxcbiAgd29ya2VyUG9ydDogbnVsbCxcbiAgYXNzZXRzRm9sZGVyOiAnYXNzZXRzJyxcbiAgX2ludGVybmFsRmlsZW5hbWVTdWZmaXg6ICcubWluJywgLy8gZG9uJ3QgbW9kaWZ5IHRoaXMgLSBpdCdzIGFuIGludGVybmFsIGZpZWxkXG4gIHNhbmRib3hCdW5kbGVTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke3BkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4fS5tanNgO1xuICB9LFxuICB3b3JrZXJTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke1xuICAgICAgICAgIHBkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4XG4gICAgICAgIH0ubWpzYDtcbiAgfSxcbiAgc3RhbmRhcmRGb250RGF0YVVybDogKCkgPT4gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlciwgJy8uLicpfS9zdGFuZGFyZF9mb250cy9gLFxuXG4gIC8vIG9wdGlvbnMgc3BlY2lmaWMgdG8gbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIgKGFzIG9wcG9zZWQgdG8gYmVpbmcgdXNlZCBieSBwZGYuanMpXG4gIGRvdWJsZVRhcFpvb21GYWN0b3I6ICdwYWdlLXdpZHRoJyxcbiAgZG91YmxlVGFwWm9vbXNJbkhhbmRNb2RlOiB0cnVlLFxuICBkb3VibGVUYXBab29tc0luVGV4dFNlbGVjdGlvbk1vZGU6IGZhbHNlLFxuICBkb3VibGVUYXBSZXNldHNab29tT25TZWNvbmREb3VibGVUYXA6IGZhbHNlLFxuICBlbmFibGVTY3JpcHRpbmc6IHRydWUsXG4gIGRlZmF1bHRDYWNoZVNpemU6IDUwLFxuICBwYXNzd29yZFByb21wdDogdW5kZWZpbmVkLFxuICBlbmFibGVIV0E6IHRydWUsIC8vIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uIEFjdGl2ZSBzaW5jZSBwZGYuanMgNC40LlxuICBwb3NpdGlvblBvcHVwRGlhbG9nc1dpdGhKYXZhU2NyaXB0OiB0cnVlLFxufTtcbiJdfQ==