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.

115 lines 19.8 kB
export class PinchOnMobileSupport { constructor(_zone) { this._zone = _zone; this.startX = 0; this.startY = 0; this.initialPinchDistance = 0; this.pinchScale = 1; this.boundOnViewerTouchStart = this.onViewerTouchStart.bind(this); this.boundOnViewerTouchMove = this.onViewerTouchMove.bind(this); this.boundOnViewerTouchEnd = this.onViewerTouchEnd.bind(this); this.initializePinchZoom(); } isMobile() { return ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); } onViewerTouchStart(event) { this.initialPinchDistance = 0; if (event.touches.length === 2) { const container = document.getElementById('viewerContainer'); const rect = container.getBoundingClientRect(); if (event.touches[0].pageX >= rect.left && event.touches[0].pageX <= rect.right) { if (event.touches[0].pageY >= (rect.top + window.scrollY) && event.touches[0].pageY <= (rect.bottom + window.scrollY)) { if (event.touches[1].pageX >= rect.left && event.touches[1].pageX <= rect.right) { if (event.touches[1].pageY >= (rect.top + window.scrollY) && event.touches[1].pageY <= (rect.bottom + window.scrollY)) { this.startX = (event.touches[0].pageX + event.touches[1].pageX) / 2; this.startY = (event.touches[0].pageY + event.touches[1].pageY) / 2; this.initialPinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY); if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } } } } } } onViewerTouchMove(event) { const PDFViewerApplicationOptions = window.PDFViewerApplicationOptions; const PDFViewerApplication = window.PDFViewerApplication; if (this.initialPinchDistance <= 0 || event.touches.length !== 2) { return; } const pinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY); const container = document.getElementById('viewerContainer'); const originX = this.startX + container.scrollLeft; const originY = this.startY + container.scrollTop; this.pinchScale = pinchDistance / this.initialPinchDistance; let minZoom = Number(PDFViewerApplicationOptions.get('minZoom')); if (!minZoom) { minZoom = 0.1; } const currentZoom = PDFViewerApplication.pdfViewer._currentScale; if (currentZoom * this.pinchScale < minZoom) { this.pinchScale = minZoom / currentZoom; } let maxZoom = Number(PDFViewerApplicationOptions.get('maxZoom')); if (!maxZoom) { maxZoom = 10; } if (currentZoom * this.pinchScale > maxZoom) { this.pinchScale = maxZoom / currentZoom; } this.viewer.style.transform = `scale(${this.pinchScale})`; this.viewer.style.transformOrigin = `${originX}px ${originY}px`; if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } onViewerTouchEnd(event) { const PDFViewerApplication = window.PDFViewerApplication; if (this.initialPinchDistance <= 0) { return; } this.viewer.style.transform = `none`; this.viewer.style.transformOrigin = `unset`; PDFViewerApplication.pdfViewer.currentScale *= this.pinchScale; const container = document.getElementById('viewerContainer'); const rect = container.getBoundingClientRect(); const dx = this.startX - rect.left; const dy = this.startY - rect.top; container.scrollLeft += dx * (this.pinchScale - 1); container.scrollTop += dy * (this.pinchScale - 1); this.resetPinchZoomParams(); if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } resetPinchZoomParams() { this.startX = this.startY = this.initialPinchDistance = 0; this.pinchScale = 1; } initializePinchZoom() { if (!this.isMobile()) { return; } this.viewer = document.getElementById('viewer'); this._zone.runOutsideAngular(() => { document.addEventListener('touchstart', this.boundOnViewerTouchStart); document.addEventListener('touchmove', this.boundOnViewerTouchMove, { passive: false }); document.addEventListener('touchend', this.boundOnViewerTouchEnd); }); } destroyPinchZoom() { if (!this.isMobile()) { return; } document.removeEventListener('touchstart', this.boundOnViewerTouchStart); document.removeEventListener('touchmove', this.boundOnViewerTouchMove); document.removeEventListener('touchend', this.boundOnViewerTouchEnd); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluY2gtb24tbW9iaWxlLXN1cHBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3BpbmNoLW9uLW1vYmlsZS1zdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxvQkFBb0I7SUFXL0IsWUFBb0IsS0FBYTtRQUFiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFUekIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCx5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDekIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQU9yQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sUUFBUTtRQUNkLE9BQU8sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQU8sU0FBVSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFpQjtRQUMxQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBRTlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQW1CLENBQUM7WUFDL0UsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQy9FLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNySCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTt3QkFDL0UsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7NEJBQ3JILElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMs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QUMscUJBQXFCLENBQUMsQ0FBQztJQUN2RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvcGRmLXZpZXdlci1hcHBsaWNhdGlvbi1vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIFBpbmNoT25Nb2JpbGVTdXBwb3J0IHtcbiAgcHJpdmF0ZSB2aWV3ZXI6IGFueTtcbiAgcHJpdmF0ZSBzdGFydFggPSAwO1xuICBwcml2YXRlIHN0YXJ0WSA9IDA7XG4gIHByaXZhdGUgaW5pdGlhbFBpbmNoRGlzdGFuY2UgPSAwO1xuICBwcml2YXRlIHBpbmNoU2NhbGUgPSAxO1xuXG4gIHByaXZhdGUgYm91bmRPblZpZXdlclRvdWNoU3RhcnQ6IGFueTtcbiAgcHJpdmF0ZSBib3VuZE9uVmlld2VyVG91Y2hNb3ZlOiBhbnk7XG4gIHByaXZhdGUgYm91bmRPblZpZXdlclRvdWNoRW5kOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5ib3VuZE9uVmlld2VyVG91Y2hTdGFydCA9IHRoaXMub25WaWV3ZXJUb3VjaFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ib3VuZE9uVmlld2VyVG91Y2hNb3ZlID0gdGhpcy5vblZpZXdlclRvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYm91bmRPblZpZXdlclRvdWNoRW5kID0gdGhpcy5vblZpZXdlclRvdWNoRW5kLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVQaW5jaFpvb20oKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNb2JpbGUoKSB7XG4gICAgcmV0dXJuICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHx8IChuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwKSB8fCAoKDxhbnk+bmF2aWdhdG9yKS5tc01heFRvdWNoUG9pbnRzID4gMCk7XG4gIH1cblxuICBwcml2YXRlIG9uVmlld2VyVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbFBpbmNoRGlzdGFuY2UgPSAwO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyQ29udGFpbmVyJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggPj0gcmVjdC5sZWZ0ICYmIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggPD0gcmVjdC5yaWdodCkge1xuICAgICAgICBpZiAoZXZlbnQudG91Y2hlc1swXS5wYWdlWSA+PSAocmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSkgJiYgZXZlbnQudG91Y2hlc1swXS5wYWdlWSA8PSAocmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSkpIHtcbiAgICAgICAgICBpZiAoZXZlbnQudG91Y2hlc1sxXS5wYWdlWCA+PSByZWN0LmxlZnQgJiYgZXZlbnQudG91Y2hlc1sxXS5wYWdlWCA8PSByZWN0LnJpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudG91Y2hlc1sxXS5wYWdlWSA+PSAocmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSkgJiYgZXZlbnQudG91Y2hlc1sxXS5wYWdlWSA8PSAocmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFggPSAoZXZlbnQudG91Y2hlc1swXS5wYWdlWCArIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVgpIC8gMjtcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFkgPSAoZXZlbnQudG91Y2hlc1swXS5wYWdlWSArIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVkpIC8gMjtcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUGluY2hEaXN0YW5jZSA9IE1hdGguaHlwb3QoZXZlbnQudG91Y2hlc1sxXS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVkgLSBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcblxuICAgICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblZpZXdlclRvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9uczogSVBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IGFueSA9ICh3aW5kb3cgYXMgYW55KS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcblxuICAgIGlmICh0aGlzLmluaXRpYWxQaW5jaERpc3RhbmNlIDw9IDAgfHwgZXZlbnQudG91Y2hlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwaW5jaERpc3RhbmNlID0gTWF0aC5oeXBvdChldmVudC50b3VjaGVzWzFdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1sxXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXJDb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBjb25zdCBvcmlnaW5YID0gdGhpcy5zdGFydFggKyBjb250YWluZXIuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBvcmlnaW5ZID0gdGhpcy5zdGFydFkgKyBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIHRoaXMucGluY2hTY2FsZSA9IHBpbmNoRGlzdGFuY2UgLyB0aGlzLmluaXRpYWxQaW5jaERpc3RhbmNlO1xuICAgIGxldCBtaW5ab29tID0gTnVtYmVyKFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5nZXQoJ21pblpvb20nKSk7XG4gICAgaWYgKCFtaW5ab29tKSB7XG4gICAgICBtaW5ab29tID0gMC4xO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRab29tID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLl9jdXJyZW50U2NhbGU7XG4gICAgaWYgKGN1cnJlbnRab29tICogdGhpcy5waW5jaFNjYWxlIDwgbWluWm9vbSkge1xuICAgICAgdGhpcy5waW5jaFNjYWxlID0gbWluWm9vbSAvIGN1cnJlbnRab29tO1xuICAgIH1cbiAgICBsZXQgbWF4Wm9vbSA9IE51bWJlcihQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuZ2V0KCdtYXhab29tJykpO1xuICAgIGlmICghbWF4Wm9vbSkge1xuICAgICAgbWF4Wm9vbSA9IDEwO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFpvb20gKiB0aGlzLnBpbmNoU2NhbGUgPiBtYXhab29tKSB7XG4gICAgICB0aGlzLnBpbmNoU2NhbGUgPSBtYXhab29tIC8gY3VycmVudFpvb207XG4gICAgfVxuICAgIHRoaXMudmlld2VyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3RoaXMucGluY2hTY2FsZX0pYDtcbiAgICB0aGlzLnZpZXdlci5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBgJHtvcmlnaW5YfXB4ICR7b3JpZ2luWX1weGA7XG5cbiAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIG9uVmlld2VyVG91Y2hFbmQoZXZlbnQ6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogYW55ID0gKHdpbmRvdyBhcyBhbnkpLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIGlmICh0aGlzLmluaXRpYWxQaW5jaERpc3RhbmNlIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXIuc3R5bGUudHJhbnNmb3JtID0gYG5vbmVgO1xuICAgIHRoaXMudmlld2VyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGB1bnNldGA7XG4gICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLmN1cnJlbnRTY2FsZSAqPSB0aGlzLnBpbmNoU2NhbGU7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXdlckNvbnRhaW5lcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZHggPSB0aGlzLnN0YXJ0WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBkeSA9IHRoaXMuc3RhcnRZIC0gcmVjdC50b3A7XG4gICAgY29udGFpbmVyLnNjcm9sbExlZnQgKz0gZHggKiAodGhpcy5waW5jaFNjYWxlIC0gMSk7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBkeSAqICh0aGlzLnBpbmNoU2NhbGUgLSAxKTtcbiAgICB0aGlzLnJlc2V0UGluY2hab29tUGFyYW1zKCk7XG5cbiAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0UGluY2hab29tUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRYID0gdGhpcy5zdGFydFkgPSB0aGlzLmluaXRpYWxQaW5jaERpc3RhbmNlID0gMDtcbiAgICB0aGlzLnBpbmNoU2NhbGUgPSAxO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVQaW5jaFpvb20oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW9iaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyJyk7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5ib3VuZE9uVmlld2VyVG91Y2hTdGFydCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmJvdW5kT25WaWV3ZXJUb3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuYm91bmRPblZpZXdlclRvdWNoRW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95UGluY2hab29tKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vYmlsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmJvdW5kT25WaWV3ZXJUb3VjaFN0YXJ0KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmJvdW5kT25WaWV3ZXJUb3VjaE1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5ib3VuZE9uVmlld2VyVG91Y2hFbmQpO1xuICB9XG59XG4iXX0=