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.
152 lines • 22.4 kB
JavaScript
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.754';
export const pdfjsBleedingEdgeVersion = '5.4.784';
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/`,
wasmUrl: () => `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/wasm/`,
// 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,
enablePageReordering: false, // allows users to reorder pages by dragging thumbnails
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlZmF1bHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFPLFVBQVcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQU8sUUFBUyxDQUFDLFlBQVksQ0FBQztBQUNuSSxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztBQUNsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDckMsT0FBTyx3QkFBd0IsQ0FBQztLQUNqQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO0lBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2Qiw2RUFBNkU7UUFDN0UsT0FBTyxHQUFHLENBQUM7S0FD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QUMvQixDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGVBQWUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVU7WUFDbEksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxlQUFlLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUNwSCxpQkFBaUIsQ0FBQyx1QkFDcEIsTUFBTSxDQUFDO0lBQ2IsQ0FBQztJQUNELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQWtCO0lBQ2hHLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVE7SUFFMUUsbUZBQW1GO0lBQ25GLG1CQUFtQixFQUFFLFlBQVk7SUFDakMsd0JBQXdCLEVBQUUsSUFBSTtJQUM5QixpQ0FBaUMsRUFBRSxLQUFLO0lBQ3hDLG9DQUFvQyxFQUFFLEtBQUs7SUFDM0MsZUFBZSxFQUFFLElBQUk7SUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixjQUFjLEVBQUUsU0FBUztJQUN6QixTQUFTLEVBQUUsSUFBSTtJQUNmLGtDQUFrQyxFQUFFLElBQUk7SUFDeEMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLHVEQUF1RDtDQUNyRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbk1vZGUgfSBmcm9tICcuL2VkaXRvci1hbm5vdGF0aW9ucyc7XG5cbmNvbnN0IF9pc0lFMTEgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogISEoPGFueT5nbG9iYWxUaGlzKS5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhISg8YW55PmRvY3VtZW50KS5kb2N1bWVudE1vZGU7XG5jb25zdCBpc0VkZ2UgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuY29uc3QgbmVlZHNFUzUgPSB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBQcm9taXNlWydhbGxTZXR0bGVkJ10gPT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgY29uc3QgcGRmanNWZXJzaW9uID0gJzUuMy43NTQnO1xuZXhwb3J0IGNvbnN0IHBkZmpzQmxlZWRpbmdFZGdlVmVyc2lvbiA9ICc1LjQuNzg0JztcbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uU3VmZml4KGZvbGRlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGZvbGRlcj8uaW5jbHVkZXMoJ2JsZWVkaW5nLWVkZ2UnKSkge1xuICAgIHJldHVybiBwZGZqc0JsZWVkaW5nRWRnZVZlcnNpb247XG4gIH1cbiAgcmV0dXJuIHBkZmpzVmVyc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2V0c1VybCh1cmw6IHN0cmluZywgcG9zdGZpeElmUGF0aElzUmVsYXRpdiA9ICcnKTogc3RyaW5nIHtcbiAgaWYgKHVybC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAvLyB0aGUgYXNzZXRzIGZvbGRlciBpcyBvbiBhbiBhYnNvbHV0ZSBwYXRoIChsaWtlIGh0dHBzOi8vZXhhbXBsZS5jb20vYXNzZXRzKVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgcmV0dXJuIGAuLyR7dXJsICsgcG9zdGZpeElmUGF0aElzUmVsYXRpdn1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCbGVlZGluZ0VkZ2UoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXI/LmluY2x1ZGVzKCdibGVlZGluZy1lZGdlJyk7XG59XG5cbmRlY2xhcmUgY29uc3QgcHJvY2VzczogYW55O1xuXG5mdW5jdGlvbiBpc1Rlc3RFbnZpcm9ubWVudCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5lbnYgIT09ICd1bmRlZmluZWQnICYmXG4gICAgKChwcm9jZXNzIGFzIGFueSkuZW52Lk5PREVfRU5WID09PSAndGVzdCcgfHwgKHByb2Nlc3MgYXMgYW55KS5lbnYuSkVTVF9XT1JLRVJfSUQgIT09IHVuZGVmaW5lZCB8fCAocHJvY2VzcyBhcyBhbnkpLmVudi5WSVRFU1QgIT09IHVuZGVmaW5lZClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmVDYW52YXNTaXplKCk6IG51bWJlciB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGlzVGVzdEVudmlyb25tZW50KCkpIHtcbiAgICByZXR1cm4gNDA5NjtcbiAgfVxuICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgV2ViR0wgY29udGV4dFxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJyk7XG4gIGxldCBtYXhUZXh0dXJlU2l6ZTtcbiAgaWYgKGdsIGluc3RhbmNlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgbWF4VGV4dHVyZVNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG4gIH0gZWxzZSB7XG4gICAgbWF4VGV4dHVyZVNpemUgPSA0MDk2O1xuICB9XG4gIC8vIEdldCBhdmFpbGFibGUgZGV2aWNlIFJBTSAoaW4gTUIpXG4gIGZ1bmN0aW9uIGdldEF2YWlsYWJsZU1lbW9yeU1CKCk6IG51bWJlciB7XG4gICAgaWYgKCdkZXZpY2VNZW1vcnknIGluIG5hdmlnYXRvcikge1xuICAgICAgcmV0dXJuIChuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5IGFzIG51bWJlcikgKiAxMDI0OyAvLyBDb252ZXJ0IEdCIHRvIE1CXG4gICAgfVxuICAgIGlmICh3aW5kb3cucGVyZm9ybWFuY2UgJiYgJ21lbW9yeScgaW4gd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgICByZXR1cm4gKHdpbmRvdy5wZXJmb3JtYW5jZS5tZW1vcnkgYXMgYW55KS5qc0hlYXBTaXplTGltaXQgLyAxMDI0IC8gMTAyNDsgLy8gT25seSB3b3JrcyBvbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBFZGdld2luZG93LnBlcmZvcm1hbmNlLm1lbW9yeS5qc0hlYXBTaXplTGltaXQgLyAxMDI0IC8gMTAyNDsgLy8gT25seSB3b3JrcyBvbiBDaHJvbWVcbiAgICB9XG4gICAgcmV0dXJuIDQwOTY7IC8vIERlZmF1bHQgdG8gNEdCIGlmIHVua25vd25cbiAgfVxuXG4gIGNvbnN0IGF2YWlsYWJsZU1lbW9yeU1CID0gZ2V0QXZhaWxhYmxlTWVtb3J5TUIoKTtcblxuICAvLyBDb25zZXJ2YXRpdmUgZm9ybXVsYTogU2NhbGUgYnkgc3F1YXJlIHJvb3Qgb2YgYXZhaWxhYmxlIG1lbW9yeVxuICBsZXQgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLmZsb29yKE1hdGguc3FydCgoYXZhaWxhYmxlTWVtb3J5TUIgKiAxMDI0ICogMTAyNCkgLyA2KSk7XG5cbiAgLy8gQXBwbHkgcGxhdGZvcm0tc3BlY2lmaWMgbGltaXRzXG4gIGNvbnN0IGlzSU9TID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgISgnTVNTdHJlYW0nIGluIHdpbmRvdyk7XG4gIGNvbnN0IGlzTW9iaWxlID0gL0FuZHJvaWR8aVBob25lfGlQYWR8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgY29uc3QgaXNIaWdoRW5kRGVza3RvcCA9IGF2YWlsYWJsZU1lbW9yeU1CID4gMTIwMDA7IC8vIEFzc3VtZSBoaWdoLWVuZCBkZXNrdG9wcyBoYXZlID4xMkdCIFJBTVxuXG4gIGlmIChpc0lPUykge1xuICAgIGVzdGltYXRlZFNhZmVTaXplID0gTWF0aC5taW4oZXN0aW1hdGVkU2FmZVNpemUsIDQwOTYpOyAvLyBpT1MgU2FmYXJpIG1lbW9yeSBsaW1pdHNcbiAgfSBlbHNlIGlmIChpc01vYmlsZSkge1xuICAgIGVzdGltYXRlZFNhZmVTaXplID0gTWF0aC5taW4oZXN0aW1hdGVkU2FmZVNpemUsIDQwOTYpOyAvLyBNb3N0IG1vYmlsZSBkZXZpY2VzXG4gIH0gZWxzZSBpZiAoaXNIaWdoRW5kRGVza3RvcCkge1xuICAgIGVzdGltYXRlZFNhZmVTaXplID0gTWF0aC5taW4oZXN0aW1hdGVkU2FmZVNpemUsIDgxOTIpOyAvLyBBbGxvdyBsYXJnZXIgc2l6ZXMgZm9yIGRlc2t0b3BzXG4gIH0gZWxzZSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNjAwMCk7IC8vIE1pZC1yYW5nZSBkZXNrdG9wc1xuICB9XG5cbiAgLy8gRmluYWwgbGltaXQgYmFzZWQgb24gR1BVIGFuZCBlc3RpbWF0ZWQgbWVtb3J5IHNhZmV0eVxuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWluKG1heFRleHR1cmVTaXplLCBlc3RpbWF0ZWRTYWZlU2l6ZSk7XG4gIHJldHVybiBtYXhXaWR0aCAqIG1heFdpZHRoO1xufVxuXG4vLyBzb25hciBpZ25vcmUgbmV4dCBsaW5lXG5leHBvcnQgY29uc3QgcGRmRGVmYXVsdE9wdGlvbnMgPSB7XG4gIG5lZWRzRVM1OiBfaXNJRTExIHx8IGlzRWRnZSB8fCBuZWVkc0VTNSxcbiAgYW5ub3RhdGlvbkVkaXRvck1vZGU6IDAsXG4gIGFubm90YXRpb25Nb2RlOiBBbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVMsXG4gIGRlZmF1bHRab29tRGVsYXk6IDQwMCwgLy8gbWlsbGlzZWNvbmRzXG4gIGN1cnNvclRvb2xPbkxvYWQ6IDAsXG4gIGRlZmF1bHRVcmw6ICcnLFxuICBkZWZhdWx0Wm9vbVZhbHVlOiAnJyxcbiAgZGlzYWJsZUhpc3Rvcnk6IGZhbHNlLFxuICBkaXNhYmxlUGFnZUxhYmVsczogZmFsc2UsXG4gIGVuYWJsZVBlcm1pc3Npb25zOiBmYWxzZSxcbiAgZG9jQmFzZVVybDogJycsXG4gIGVuYWJsZVByaW50QXV0b1JvdGF0ZTogdHJ1ZSxcbiAgZW5hYmxlU2lnbmF0dXJlRWRpdG9yOiBmYWxzZSxcbiAgZXh0ZXJuYWxMaW5rUmVsOiAnbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdycsXG4gIGV4dGVybmFsTGlua1RhcmdldDogMCxcbiAgZmluZENvbnRyb2xsZXI6IHVuZGVmaW5lZCwgLy8gbXVzdCBleHRlbmQgUERGRmluZENvbnRyb2xsZXJcbiAgaGlzdG9yeVVwZGF0ZVVybDogZmFsc2UsXG4gIGlnbm9yZURlc3RpbmF0aW9uWm9vbTogZmFsc2UsXG4gIGltYWdlUmVzb3VyY2VzUGF0aDogJy4vaW1hZ2VzLycsXG4gIG1heENhbnZhc1BpeGVsczogZ2V0U2FmZUNhbnZhc1NpemUoKSxcbiAgZm9yY2VQYWdlQ29sb3JzOiBmYWxzZSxcbiAgcGFnZUNvbG9yc0JhY2tncm91bmQ6ICdDYW52YXMnLFxuICBwYWdlQ29sb3JzRm9yZWdyb3VuZDogJ0NhbnZhc1RleHQnLFxuICBwZGZCdWdFbmFibGVkOiBmYWxzZSxcbiAgcHJpbnRSZXNvbHV0aW9uOiAxNTAsXG4gIHJhbmdlQ2h1bmtTaXplOiA2NTUzNixcbiAgcmVtb3ZlUGFnZUJvcmRlcnM6IGZhbHNlLFxuICBlbmFibGVYZmE6IHRydWUsXG4gIGZvbnRFeHRyYVByb3BlcnRpZXM6IGZhbHNlLFxuICBzaWRlYmFyVmlld09uTG9hZDogLTEsXG4gIHNjcm9sbE1vZGVPbkxvYWQ6IC0xLFxuICBzcHJlYWRNb2RlT25Mb2FkOiAtMSxcbiAgdGV4dExheWVyTW9kZTogMSxcbiAgLy8gdmlld2VyQ3NzVGhlbWU6IDAsIC8vIG5vdCBzdXBwb3J0ZWQgYnkgbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIsIHVzZSBbdGhlbWVdIGluc3RlYWRcbiAgdmlld09uTG9hZDogMCxcbiAgY01hcFBhY2tlZDogdHJ1ZSxcbiAgY01hcFVybDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBgJHthc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyLCAnLy4uJyl9L2NtYXBzL2A7XG4gIH0sXG4gIGRpc2FibGVBdXRvRmV0Y2g6IGZhbHNlLFxuICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLFxuICBkaXNhYmxlUmFuZ2U6IGZhbHNlLFxuICBkaXNhYmxlU3RyZWFtOiB0cnVlLFxuICBpc0V2YWxTdXBwb3J0ZWQ6IHRydWUsXG4gIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiB0cnVlLFxuICBtYXhJbWFnZVNpemU6IC0xLFxuICBwZGZCdWc6IGZhbHNlLFxuICB2ZXJib3NpdHk6IDEsXG4gIHdvcmtlclBvcnQ6IG51bGwsXG4gIGFzc2V0c0ZvbGRlcjogJ2Fzc2V0cycsXG4gIF9pbnRlcm5hbEZpbGVuYW1lU3VmZml4OiAnLm1pbicsIC8vIGRvbid0IG1vZGlmeSB0aGlzIC0gaXQncyBhbiBpbnRlcm5hbCBmaWVsZFxuICBzYW5kYm94QnVuZGxlU3JjOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBkZkRlZmF1bHRPcHRpb25zLm5lZWRzRVM1XG4gICAgICA/IGAuL3BkZi5zYW5kYm94LSR7Z2V0VmVyc2lvblN1ZmZpeChhc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKSl9LWVzNS5tanNgXG4gICAgICA6IGAuL3BkZi5zYW5kYm94LSR7Z2V0VmVyc2lvblN1ZmZpeChhc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKSl9JHtwZGZEZWZhdWx0T3B0aW9ucy5faW50ZXJuYWxGaWxlbmFtZVN1ZmZpeH0ubWpzYDtcbiAgfSxcbiAgd29ya2VyU3JjOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBkZkRlZmF1bHRPcHRpb25zLm5lZWRzRVM1XG4gICAgICA/IGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpfS9wZGYud29ya2VyLSR7Z2V0VmVyc2lvblN1ZmZpeChhc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKSl9LWVzNS5tanNgXG4gICAgICA6IGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpfS9wZGYud29ya2VyLSR7Z2V0VmVyc2lvblN1ZmZpeChhc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKSl9JHtcbiAgICAgICAgICBwZGZEZWZhdWx0T3B0aW9ucy5faW50ZXJuYWxGaWxlbmFtZVN1ZmZpeFxuICAgICAgICB9Lm1qc2A7XG4gIH0sXG4gIHN0YW5kYXJkRm9udERhdGFVcmw6ICgpID0+IGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIsICcvLi4nKX0vc3RhbmRhcmRfZm9udHMvYCxcbiAgd2FzbVVybDogKCkgPT4gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlciwgJy8uLicpfS93YXNtL2AsXG5cbiAgLy8gb3B0aW9ucyBzcGVjaWZpYyB0byBuZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlciAoYXMgb3Bwb3NlZCB0byBiZWluZyB1c2VkIGJ5IHBkZi5qcylcbiAgZG91YmxlVGFwWm9vbUZhY3RvcjogJ3BhZ2Utd2lkdGgnLFxuICBkb3VibGVUYXBab29tc0luSGFuZE1vZGU6IHRydWUsXG4gIGRvdWJsZVRhcFpvb21zSW5UZXh0U2VsZWN0aW9uTW9kZTogZmFsc2UsXG4gIGRvdWJsZVRhcFJlc2V0c1pvb21PblNlY29uZERvdWJsZVRhcDogZmFsc2UsXG4gIGVuYWJsZVNjcmlwdGluZzogdHJ1ZSxcbiAgZGVmYXVsdENhY2hlU2l6ZTogNTAsXG4gIHBhc3N3b3JkUHJvbXB0OiB1bmRlZmluZWQsXG4gIGVuYWJsZUhXQTogdHJ1ZSwgLy8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4gQWN0aXZlIHNpbmNlIHBkZi5qcyA0LjQuXG4gIHBvc2l0aW9uUG9wdXBEaWFsb2dzV2l0aEphdmFTY3JpcHQ6IHRydWUsXG4gIGVuYWJsZVBhZ2VSZW9yZGVyaW5nOiBmYWxzZSwgLy8gYWxsb3dzIHVzZXJzIHRvIHJlb3JkZXIgcGFnZXMgYnkgZHJhZ2dpbmcgdGh1bWJuYWlsc1xufTtcbiJdfQ==