{"version":3,"sources":["webpack://pdfjs-dist/web/pdf_viewer/webpack/universalModuleDefinition","webpack://pdfjs-dist/web/pdf_viewer/webpack/bootstrap","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_viewer.component.js","webpack://pdfjs-dist/web/pdf_viewer/web/annotation_layer_builder.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdfjs.js","webpack://pdfjs-dist/web/pdf_viewer/web/ui_utils.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_link_service.js","webpack://pdfjs-dist/web/pdf_viewer/web/text_layer_builder.js","webpack://pdfjs-dist/web/pdf_viewer/web/download_manager.js","webpack://pdfjs-dist/web/pdf_viewer/web/viewer_compatibility.js","webpack://pdfjs-dist/web/pdf_viewer/web/genericl10n.js","webpack://pdfjs-dist/web/pdf_viewer/external/webL10n/l10n.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_find_controller.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_find_utils.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_history.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_page_view.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_rendering_queue.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_single_page_viewer.js","webpack://pdfjs-dist/web/pdf_viewer/web/base_viewer.js","webpack://pdfjs-dist/web/pdf_viewer/web/pdf_viewer.js"],"names":["pdfjsVersion","pdfjsBuild","constructor","annotationStorage","imageResourcesPath","renderInteractiveForms","l10n","render","intent","annotations","parameters","viewport","dontFlip","div","page","linkService","downloadManager","AnnotationLayer","document","cancel","hide","createAnnotationLayerBuilder","window","pdfjsLib","__non_webpack_require__","module","CSS_UNITS","DEFAULT_SCALE_VALUE","DEFAULT_SCALE","MIN_SCALE","MAX_SCALE","UNKNOWN_SCALE","MAX_AUTO_SCALE","SCROLLBAR_PADDING","VERTICAL_PADDING","PresentationModeState","UNKNOWN","NORMAL","CHANGING","FULLSCREEN","RendererType","CANVAS","SVG","TextLayerMode","DISABLE","ENABLE","ENABLE_ENHANCE","ScrollMode","VERTICAL","HORIZONTAL","WRAPPED","SpreadMode","NONE","ODD","EVEN","AutoPrintRegExp","name","args","NullL10n","formatL10nValue","devicePixelRatio","backingStoreRatio","ctx","pixelRatio","sx","sy","scaled","skipOverflowHiddenElements","parent","element","console","offsetY","offsetX","getComputedStyle","spot","debounceScroll","rAF","currentX","viewAreaElement","lastX","state","currentY","lastY","callback","right","down","_eventHandler","parts","query","params","Object","i","ii","param","key","value","decodeURIComponent","minIndex","maxIndex","items","condition","currentIndex","currentItem","Math","xinv","limit","x_","x","a","b","c","d","p","q","result","r","changeOrientation","rotate","width","height","index","elt","views","pageTop","sortByVisibility","horizontal","top","scrollEl","bottom","left","view","elementBottom","elementRight","visible","numViews","firstVisibleElementInd","binarySearchFirstItem","backtrackBeforeAllVisibleElements","lastEdge","currentWidth","currentHeight","viewWidth","viewHeight","viewRight","viewBottom","hiddenHeight","hiddenWidth","percent","id","y","first","last","pc","evt","url","defaultFilename","isDataSchema","reURI","reFilename","splitURI","suggestedFilename","delta","angle","normalizeWheelEventDirection","MOUSE_DOM_DELTA_PIXEL_MODE","MOUSE_DOM_DELTA_LINE_MODE","MOUSE_PIXELS_PER_LINE","MOUSE_LINES_PER_PAGE","Number","mode","size","WaitOnType","EVENT","TIMEOUT","delay","target","clearTimeout","resolve","eventHandler","handler","timeoutHandler","timeout","setTimeout","animationStarted","on","external","off","dispatch","eventListeners","Array","externalListeners","listener","_on","options","_off","units","_updateBar","progressSize","isNaN","clamp","setWidth","container","viewer","scrollbarWidth","show","moved","len","arr","write","read","externalLinkTarget","externalLinkRel","externalLinkEnabled","ignoreDestinationZoom","setDocument","baseUrl","setViewer","setHistory","navigateTo","goToDestination","destRef","explicitDest","pageNumber","pageIndex","destArray","namedDest","data","getDestinationHash","escape","str","JSON","getAnchorUrl","setHash","hash","parseQueryString","source","phraseSearch","zoomArgs","zoomArg","zoomArgNumber","parseFloat","dest","allowNegativeOffset","unescape","isValidExplicitDestination","executeNamedAction","cachePageRef","refStr","pageRef","_cachedPageNumber","isPageVisible","destLength","zoom","allowNull","EXPAND_DIVS_TIMEOUT","findController","enhanceTextSelection","_finishRendering","endOfContent","numTextDivs","textLayerFrag","textContent","textContentStream","textDivs","textContentItemsStr","setTextContentStream","setTextContent","_convertMatches","iIndex","end","queryLen","m","mm","matches","matchIdx","match","begin","divIdx","offset","matchesLength","_renderMatches","isSelectedPage","pageIdx","selectedMatchIdx","highlightAll","prevEnd","infinity","appendTextToDiv","content","node","span","i0","i1","isSelected","highlightSuffix","matchIndex","beginText","n0","n1","_updateMatches","clearedUntilDivIdx","n","pageMatches","pageMatchesLength","_bindMouse","expandDivsTimer","adjustTop","divBounds","createTextLayerBuilder","downloadUrl","createValidAbsoluteUrl","download","downloadData","navigator","type","blobUrl","createObjectURL","viewerCompatibilityParams","sourceEventType","URL","compatibilityParams","userAgent","platform","maxTouchPoints","isAndroid","isIE","isIOS","isIOSChrome","webL10n","gL10nData","gTextData","gTextProp","gLanguage","gMacros","gReadyState","gAsyncResourceLoading","script","l10nId","l10nArgs","onSuccess","onFailure","xhr","baseURL","href","text","dictionary","reBlank","reComment","reSection","reImport","reSplit","entries","rawText","currentLang","genericLang","lang","skipLang","parsedRawLinesCallback","line","loadImport","tmp","evalString","nextEntry","xhrLoadText","parseRawLines","parsedPropertiesCallback","parseProperties","prop","successCallback","clear","langLinks","getL10nResourceLinks","langCount","dict","getL10nDictionary","defaultLocale","anyCaseLang","onResourceLoaded","gResourceCount","link","parseResource","resource","locales2rules","list","start","pluralRules","isBetween","getPluralRules","rv","substIndexes","substArguments","reIndex","reMatch","macroName","paramName","macro","reArgs","arg","getL10nAttributes","getL10nData","getChildElementCount","children","found","l","textNode","count","getTranslatableChildren","elementCount","translateElement","get","fallback","getData","getText","getLanguage","setLanguage","loadLocale","getDirection","rtlList","shortCode","translate","getReadyState","ready","FindState","FOUND","NOT_FOUND","PENDING","FIND_TIMEOUT","MATCH_SCROLL_OFFSET_TOP","MATCH_SCROLL_OFFSET_LEFT","CHARACTERS_TO_NORMALIZE","normalizationRegex","replace","eventBus","executeCommand","pdfDocument","cmd","findbarClosed","pendingTimeout","scrollMatchIntoView","scrollIntoView","_reset","wrapped","normalize","_shouldDirtyMatch","_prepareMatches","currentElem","matchesWithLength","nextElem","prevElem","isSubTerm","_isEntireWord","startIdx","getCharacterType","endIdx","_calculatePhraseMatch","pageContent","entireWord","_calculateWordMatch","queryArray","subquery","subqueryLen","matchLength","skipped","_calculateMatch","pageMatchesCount","_extractText","promise","Promise","extractTextCapability","pdfPage","normalizeWhitespace","textItems","strBuf","j","jj","reason","_updatePage","_updateAllPages","_nextMatch","previous","currentPageIndex","numPages","numPageMatches","_matchesReady","numMatches","_nextPageMatch","_advanceOffsetPage","_updateMatch","previousPage","_onFindBarClose","_requestMatchesCount","current","total","_updateUIResultsCount","matchesCount","_updateUIState","rawQuery","CharacterType","SPACE","ALPHA_LETTER","PUNCT","HAN_LETTER","KATAKANA_LETTER","HIRAGANA_LETTER","HALFWIDTH_KATAKANA_LETTER","THAI_LETTER","charCode","isAlphabeticalScript","isAscii","isAsciiSpace","isAsciiAlpha","isAsciiDigit","isThai","isHan","isKatakana","isHiragana","isHalfwidthKatakana","HASH_CHANGE_TIMEOUT","POSITION_UPDATED_THRESHOLD","UPDATE_VIEWAREA_TIMEOUT","onPagesLoaded","initialize","resetHistory","updateUrl","reInitialized","getCurrentHash","destination","reset","push","forceReplace","isDestArraysEqual","rotation","pushCurrentPosition","back","forward","_pushOrReplaceState","shouldReplace","newState","fingerprint","uid","newUrl","_tryPushCurrentPosition","temporary","position","_isValidState","checkReload","performance","perfEntry","_updateInternalState","removeTemporary","_parseCurrentHash","checkNameddest","nameddest","_updateViewarea","location","_popState","newHash","hashChanged","waitOnEventOrTimeout","isValidRotation","_pageHide","_bindEvents","updateViewarea","popState","pageHide","_unbindEvents","destHash","second","isEntryEqual","firstDest","secondDest","MAX_CANVAS_PIXELS","defaultViewport","RenderingStates","setPdfPage","totalRotation","scale","destroy","error","_resetZoomLayer","removeFromDOM","zoomLayerCanvas","keepZoomLayer","keepAnnotations","childNodes","currentZoomLayerNode","currentAnnotationNode","update","optionalContentConfigPromise","cssTransform","timestamp","isScalingRestricted","outputScale","cancelRendering","redrawAnnotations","relativeRotation","absRotation","scaleX","scaleY","textLayerViewport","textRelativeRotation","textAbsRotation","textLayerDiv","transX","transY","getPagePoint","draw","canvasWrapper","textLayer","renderContinueCallback","cont","finishPaintTask","paintTask","resultPromise","readableStream","paintOnCanvas","renderCapability","onRenderContinue","renderTask","canvas","msg","isCanvasHidden","showCanvas","alpha","getOutputScale","actualSizeViewport","pixelsInViewport","maxScale","sfx","approximateFraction","sfy","roundToDivide","transform","renderContext","canvasContext","enableWebGL","paintOnSvg","cancelled","ensureNotCancelled","opList","svgGfx","svg","wrapper","setPageLabel","CLEANUP_TIMEOUT","INITIAL","RUNNING","PAUSED","FINISHED","setThumbnailViewer","isHighestPriority","renderHighestPriority","getHighestPriority","visibleViews","numVisible","nextPageIndex","previousPageIndex","isViewFinished","renderView","shadow","_resetView","_ensurePageViewVisible","pageView","previousPageView","viewerNodes","_scrollUpdate","_scrollIntoView","pageSpot","scrolledDown","_getVisiblePages","_updateHelper","_updateScrollMode","_updateSpreadMode","DEFAULT_CACHE_SIZE","pageIdsToKeep","iMax","pagesToKeep","moveToEndOfArray","newScale","watchScroll","getPageView","_setCurrentPageNumber","resetCurrentPageView","val","pageLabel","pagesRotation","_onePageRenderedOrForceFetch","pagesCount","firstPagePromise","firstPdfPage","textLayerFactory","pageNum","renderingQueue","textLayerMode","annotationLayerFactory","renderer","useOnlyCssZoom","maxCanvasPixels","firstPageView","getPagesLeft","setPageLabels","labels","label","_setScaleUpdatePages","noScroll","preset","newValue","isSameScale","presetValue","_setScale","currentPage","noPadding","hPadding","vPadding","pageWidthScale","pageHeightScale","horizontalScale","isPortraitOrientation","_resetCurrentPageView","pageDiv","scrollPageIntoView","pageWidth","pageHeight","widthScale","heightScale","boundingRect","_updateLocation","currentScale","currentScaleValue","normalizedScaleValue","firstPage","pdfOpenParams","currentPageView","topLeft","intLeft","intTop","visiblePages","numVisiblePages","newCacheSize","containsElement","focus","_getCurrentVisiblePage","getVisibleElements","cleanup","_cancelRendering","_ensurePdfPageLoaded","forceRendering","currentlyVisiblePages","scrollAhead","getPagesOverview","pagesOverview","isValidScrollMode","scrollMode","isValidSpreadMode","pages","parity","spread","scrollLeft","currentId","stillFullyVisible"],"mappings":"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","file":"pdf_viewer.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/web/pdf_viewer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/web/pdf_viewer\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/web/pdf_viewer\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __w_pdfjs_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__w_pdfjs_require__.m = modules;\n\n \t// expose the module cache\n \t__w_pdfjs_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__w_pdfjs_require__.d = function(exports, name, getter) {\n \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__w_pdfjs_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__w_pdfjs_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __w_pdfjs_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__w_pdfjs_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__w_pdfjs_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__w_pdfjs_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 0);\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationLayerBuilder,\n  DefaultAnnotationLayerFactory,\n} from \"./annotation_layer_builder.js\";\nimport {\n  DefaultTextLayerFactory,\n  TextLayerBuilder,\n} from \"./text_layer_builder.js\";\nimport { EventBus, NullL10n, ProgressBar } from \"./ui_utils.js\";\nimport { PDFLinkService, SimpleLinkService } from \"./pdf_link_service.js\";\nimport { DownloadManager } from \"./download_manager.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { PDFFindController } from \"./pdf_find_controller.js\";\nimport { PDFHistory } from \"./pdf_history.js\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { PDFSinglePageViewer } from \"./pdf_single_page_viewer.js\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\n\n// eslint-disable-next-line no-unused-vars\nconst pdfjsVersion = PDFJSDev.eval(\"BUNDLE_VERSION\");\n// eslint-disable-next-line no-unused-vars\nconst pdfjsBuild = PDFJSDev.eval(\"BUNDLE_BUILD\");\n\nexport {\n  PDFViewer,\n  PDFSinglePageViewer,\n  PDFPageView,\n  PDFLinkService,\n  SimpleLinkService,\n  TextLayerBuilder,\n  DefaultTextLayerFactory,\n  AnnotationLayerBuilder,\n  DefaultAnnotationLayerFactory,\n  PDFHistory,\n  PDFFindController,\n  EventBus,\n  DownloadManager,\n  ProgressBar,\n  GenericL10n,\n  NullL10n,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationLayer } from \"pdfjs-lib\";\nimport { NullL10n } from \"./ui_utils.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\n\n/**\n * @typedef {Object} AnnotationLayerBuilderOptions\n * @property {HTMLDivElement} pageDiv\n * @property {PDFPage} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms\n * @property {IPDFLinkService} linkService\n * @property {DownloadManager} downloadManager\n * @property {IL10n} l10n - Localization service.\n */\n\nclass AnnotationLayerBuilder {\n  /**\n   * @param {AnnotationLayerBuilderOptions} options\n   */\n  constructor({\n    pageDiv,\n    pdfPage,\n    linkService,\n    downloadManager,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderInteractiveForms = true,\n    l10n = NullL10n,\n  }) {\n    this.pageDiv = pageDiv;\n    this.pdfPage = pdfPage;\n    this.linkService = linkService;\n    this.downloadManager = downloadManager;\n    this.imageResourcesPath = imageResourcesPath;\n    this.renderInteractiveForms = renderInteractiveForms;\n    this.l10n = l10n;\n    this.annotationStorage = annotationStorage;\n\n    this.div = null;\n    this._cancelled = false;\n  }\n\n  /**\n   * @param {PageViewport} viewport\n   * @param {string} intent (default value is 'display')\n   * @returns {Promise<void>} A promise that is resolved when rendering of the\n   *   annotations is complete.\n   */\n  render(viewport, intent = \"display\") {\n    return this.pdfPage.getAnnotations({ intent }).then(annotations => {\n      if (this._cancelled) {\n        return;\n      }\n      if (annotations.length === 0) {\n        return;\n      }\n\n      const parameters = {\n        viewport: viewport.clone({ dontFlip: true }),\n        div: this.div,\n        annotations,\n        page: this.pdfPage,\n        imageResourcesPath: this.imageResourcesPath,\n        renderInteractiveForms: this.renderInteractiveForms,\n        linkService: this.linkService,\n        downloadManager: this.downloadManager,\n        annotationStorage: this.annotationStorage,\n      };\n\n      if (this.div) {\n        // If an annotationLayer already exists, refresh its children's\n        // transformation matrices.\n        AnnotationLayer.update(parameters);\n      } else {\n        // Create an annotation layer div and render the annotations\n        // if there is at least one annotation.\n        this.div = document.createElement(\"div\");\n        this.div.className = \"annotationLayer\";\n        this.pageDiv.appendChild(this.div);\n        parameters.div = this.div;\n\n        AnnotationLayer.render(parameters);\n        this.l10n.translate(this.div);\n      }\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.setAttribute(\"hidden\", \"true\");\n  }\n}\n\n/**\n * @implements IPDFAnnotationLayerFactory\n */\nclass DefaultAnnotationLayerFactory {\n  /**\n   * @param {HTMLDivElement} pageDiv\n   * @param {PDFPage} pdfPage\n   * @param {AnnotationStorage} [annotationStorage]\n   * @param {string} [imageResourcesPath] - Path for image resources, mainly\n   *   for annotation icons. Include trailing slash.\n   * @param {boolean} renderInteractiveForms\n   * @param {IL10n} l10n\n   * @returns {AnnotationLayerBuilder}\n   */\n  createAnnotationLayerBuilder(\n    pageDiv,\n    pdfPage,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderInteractiveForms = true,\n    l10n = NullL10n\n  ) {\n    return new AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: new SimpleLinkService(),\n      l10n,\n      annotationStorage,\n    });\n  }\n}\n\nexport { AnnotationLayerBuilder, DefaultAnnotationLayerFactory };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module, __non_webpack_require__ */\n\n\"use strict\";\n\nlet pdfjsLib;\nif (typeof window !== \"undefined\" && window[\"pdfjs-dist/build/pdf\"]) {\n  pdfjsLib = window[\"pdfjs-dist/build/pdf\"];\n} else {\n  pdfjsLib = __non_webpack_require__(\"../build/pdf.js\");\n}\nmodule.exports = pdfjsLib;\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CSS_UNITS = 96.0 / 72.0;\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3,\n};\n\nconst RendererType = {\n  CANVAS: \"canvas\",\n  SVG: \"svg\",\n};\n\nconst TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_ENHANCE: 2,\n};\n\nconst ScrollMode = {\n  UNKNOWN: -1,\n  VERTICAL: 0, // Default value.\n  HORIZONTAL: 1,\n  WRAPPED: 2,\n};\n\nconst SpreadMode = {\n  UNKNOWN: -1,\n  NONE: 0, // Default value.\n  ODD: 1,\n  EVEN: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n// Replaces {{arguments}} with their values.\nfunction formatL10nValue(text, args) {\n  if (!args) {\n    return text;\n  }\n  return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (all, name) => {\n    return name in args ? args[name] : \"{{\" + name + \"}}\";\n  });\n}\n\n/**\n * No-op implementation of the localization service.\n * @implements {IL10n}\n */\nconst NullL10n = {\n  async getLanguage() {\n    return \"en-us\";\n  },\n\n  async getDirection() {\n    return \"ltr\";\n  },\n\n  async get(property, args, fallback) {\n    return formatL10nValue(fallback, args);\n  },\n\n  async translate(element) {},\n};\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @returns {Object} The object with horizontal (sx) and vertical (sy)\n *                   scales. The scaled property is set to false if scaling is\n *                   not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n  const devicePixelRatio = window.devicePixelRatio || 1;\n  const backingStoreRatio =\n    ctx.webkitBackingStorePixelRatio ||\n    ctx.mozBackingStorePixelRatio ||\n    ctx.msBackingStorePixelRatio ||\n    ctx.oBackingStorePixelRatio ||\n    ctx.backingStorePixelRatio ||\n    1;\n  const pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio !== 1,\n  };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {Object} element - The element to be visible.\n * @param {Object} spot - An object with optional top and left properties,\n *   specifying the offset from the top left edge.\n * @param {boolean} skipOverflowHiddenElements - Ignore elements that have\n *   the CSS rule `overflow: hidden;` set. The default is false.\n */\nfunction scrollIntoView(element, spot, skipOverflowHiddenElements = false) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStarted.\n  let parent = element.offsetParent;\n  if (!parent) {\n    console.error(\"offsetParent is not set -- cannot scroll\");\n    return;\n  }\n  let offsetY = element.offsetTop + element.clientTop;\n  let offsetX = element.offsetLeft + element.clientLeft;\n  while (\n    (parent.clientHeight === parent.scrollHeight &&\n      parent.clientWidth === parent.scrollWidth) ||\n    (skipOverflowHiddenElements &&\n      getComputedStyle(parent).overflow === \"hidden\")\n  ) {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n  const debounceScroll = function (evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      const currentX = viewAreaElement.scrollLeft;\n      const lastX = state.lastX;\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n      state.lastX = currentX;\n      const currentY = viewAreaElement.scrollTop;\n      const lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  const state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll,\n  };\n\n  let rAF = null;\n  viewAreaElement.addEventListener(\"scroll\", debounceScroll, true);\n  return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&parm2=...).\n */\nfunction parseQueryString(query) {\n  const parts = query.split(\"&\");\n  const params = Object.create(null);\n  for (let i = 0, ii = parts.length; i < ii; ++i) {\n    const param = parts[i].split(\"=\");\n    const key = param[0].toLowerCase();\n    const value = param.length > 1 ? param[1] : null;\n    params[decodeURIComponent(key)] = decodeURIComponent(value);\n  }\n  return params;\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition) {\n  let minIndex = 0;\n  let maxIndex = items.length - 1;\n\n  if (maxIndex < 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    const currentIndex = (minIndex + maxIndex) >> 1;\n    const currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n *  Approximates float number as a fraction using Farey sequence (max order\n *  of 8).\n *  @param {number} x - Positive float number.\n *  @returns {Array} Estimated fraction: the first array item is a numerator,\n *                   the second one is a denominator.\n */\nfunction approximateFraction(x) {\n  // Fast paths for int numbers or their inversions.\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n  const xinv = 1 / x;\n  const limit = 8;\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  const x_ = x > 1 ? xinv : x;\n  // a/b and c/d are neighbours in Farey sequence.\n  let a = 0,\n    b = 1,\n    c = 1,\n    d = 1;\n  // Limiting search to order 8.\n  while (true) {\n    // Generating next term in sequence (order of q).\n    const p = a + c,\n      q = b + d;\n    if (q > limit) {\n      break;\n    }\n    if (x_ <= p / q) {\n      c = p;\n      d = q;\n    } else {\n      a = p;\n      b = q;\n    }\n  }\n  let result;\n  // Select closest of the neighbours to x.\n  if (x_ - a / b < c / d - x_) {\n    result = x_ === x ? [a, b] : [b, a];\n  } else {\n    result = x_ === x ? [c, d] : [d, c];\n  }\n  return result;\n}\n\nfunction roundToDivide(x, div) {\n  const r = x % div;\n  return r === 0 ? x : Math.round(x - r + div);\n}\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {Object} An Object containing the properties: {Array} `view`,\n *   {number} `userUnit`, and {number} `rotate`.\n * @returns {Object} An Object containing the properties: {number} `width`\n *   and {number} `height`, given in inches.\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n  const [x1, y1, x2, y2] = view;\n  // We need to take the page rotation into account as well.\n  const changeOrientation = rotate % 180 !== 0;\n\n  const width = ((x2 - x1) / 72) * userUnit;\n  const height = ((y2 - y1) / 72) * userUnit;\n\n  return {\n    width: changeOrientation ? height : width,\n    height: changeOrientation ? width : height,\n  };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n *   before the first visible element in `views`, but not by too much. (Usually,\n *   this will be the first element in the first partially visible row in\n *   `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  // binarySearchFirstItem's assumption is that the input is ordered, with only\n  // one index where the conditions flips from false to true: [false ...,\n  // true...]. With vertical scrolling and spreads, it is possible to have\n  // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n  // similar sequence, with many more mixed true and false in the middle.\n  //\n  // So there is no guarantee that the binary search yields the index of the\n  // first visible element. It could have been any of the other visible elements\n  // that were preceded by a hidden element.\n\n  // Of course, if either this element or the previous (hidden) element is also\n  // the first element, there's nothing to worry about.\n  if (index < 2) {\n    return index;\n  }\n\n  // That aside, the possible cases are represented below.\n  //\n  //     ****  = fully hidden\n  //     A*B*  = mix of partially visible and/or hidden pages\n  //     CDEF  = fully visible\n  //\n  // (1) Binary search could have returned A, in which case we can stop.\n  // (2) Binary search could also have returned B, in which case we need to\n  // check the whole row.\n  // (3) Binary search could also have returned C, in which case we need to\n  // check the whole previous row.\n  //\n  // There's one other possibility:\n  //\n  //     ****  = fully hidden\n  //     ABCD  = mix of fully and/or partially visible pages\n  //\n  // (4) Binary search could only have returned A.\n\n  // Initially assume that we need to find the beginning of the current row\n  // (case 1, 2, or 4), which means finding a page that is above the current\n  // page's top. If the found page is partially visible, we're definitely not in\n  // case 3, and this assumption is correct.\n  let elt = views[index].div;\n  let pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    // The found page is fully visible, so we're actually either in case 3 or 4,\n    // and unfortunately we can't tell the difference between them without\n    // scanning the entire previous row, so we just conservatively assume that\n    // we do need to backtrack to that row. In both cases, the previous page is\n    // in the previous row, so use its top instead.\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  // Now we backtrack to the first page that still has its bottom below\n  // `pageTop`, which is the top of a page in the first visible row (unless\n  // we're in case 4, in which case it's the row before that).\n  // `index` is found by binary search, so the page at `index - 1` is\n  // invisible and we can start looking for potentially visible pages from\n  // `index - 2`. (However, if this loop terminates on its first iteration,\n  // which is the case when pages are stacked vertically, `index` should remain\n  // unchanged, so we use a distinct loop variable.)\n  for (let i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      // We have reached the previous row, so stop now.\n      // This loop is expected to terminate relatively quickly because the\n      // number of pages per row is expected to be small.\n      break;\n    }\n    index = i;\n  }\n  return index;\n}\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n *   - If `horizontal`, no left of any earlier element is to the right of the\n *     left of any later element.\n *   - Otherwise, `views` can be split into contiguous rows where, within a row,\n *     no top of any element is below the bottom of any other element, and\n *     between rows, no bottom of any element in an earlier row is below the\n *     top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param scrollEl {HTMLElement} - a container that can possibly scroll\n * @param views {Array} - objects with a `div` property that contains an\n *   HTMLElement, which should all be descendents of `scrollEl` satisfying the\n *   above layout assumptions\n * @param sortByVisibility {boolean} - if true, the returned elements are sorted\n *   in descending order of the percent of their padding box that is visible\n * @param horizontal {boolean} - if true, the elements are assumed to be laid\n *   out horizontally instead of vertically\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements(\n  scrollEl,\n  views,\n  sortByVisibility = false,\n  horizontal = false\n) {\n  const top = scrollEl.scrollTop,\n    bottom = top + scrollEl.clientHeight;\n  const left = scrollEl.scrollLeft,\n    right = left + scrollEl.clientWidth;\n\n  // Throughout this \"generic\" function, comments will assume we're working with\n  // PDF document pages, which is the most important and complex case. In this\n  // case, the visible elements we're actually interested is the page canvas,\n  // which is contained in a wrapper which adds no padding/border/margin, which\n  // is itself contained in `view.div` which adds no padding (but does add a\n  // border). So, as specified in this function's doc comment, this function\n  // does all of its work on the padding edge of the provided views, starting at\n  // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n  // the border). Adding clientWidth/Height gets us the bottom-right corner of\n  // the padding edge.\n  function isElementBottomAfterViewTop(view) {\n    const element = view.div;\n    const elementBottom =\n      element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n  function isElementRightAfterViewLeft(view) {\n    const element = view.div;\n    const elementRight =\n      element.offsetLeft + element.clientLeft + element.clientWidth;\n    return elementRight > left;\n  }\n\n  const visible = [],\n    numViews = views.length;\n  let firstVisibleElementInd =\n    numViews === 0\n      ? 0\n      : binarySearchFirstItem(\n          views,\n          horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop\n        );\n\n  // Please note the return value of the `binarySearchFirstItem` function when\n  // no valid element is found (hence the `firstVisibleElementInd` check below).\n  if (\n    firstVisibleElementInd > 0 &&\n    firstVisibleElementInd < numViews &&\n    !horizontal\n  ) {\n    // In wrapped scrolling (or vertical scrolling with spreads), with some page\n    // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n    // condition: there can be pages with bottoms above the view top between\n    // pages with bottoms below. This function detects and corrects that error;\n    // see it for more comments.\n    firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n      firstVisibleElementInd,\n      views,\n      top\n    );\n  }\n\n  // lastEdge acts as a cutoff for us to stop looping, because we know all\n  // subsequent pages will be hidden.\n  //\n  // When using wrapped scrolling or vertical scrolling with spreads, we can't\n  // simply stop the first time we reach a page below the bottom of the view;\n  // the tops of subsequent pages on the same row could still be visible. In\n  // horizontal scrolling, we don't have that issue, so we can stop as soon as\n  // we pass `right`, without needing the code below that handles the -1 case.\n  let lastEdge = horizontal ? right : -1;\n\n  for (let i = firstVisibleElementInd; i < numViews; i++) {\n    const view = views[i],\n      element = view.div;\n    const currentWidth = element.offsetLeft + element.clientLeft;\n    const currentHeight = element.offsetTop + element.clientTop;\n    const viewWidth = element.clientWidth,\n      viewHeight = element.clientHeight;\n    const viewRight = currentWidth + viewWidth;\n    const viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      // As commented above, this is only needed in non-horizontal cases.\n      // Setting lastEdge to the bottom of the first page that is partially\n      // visible ensures that the next page fully below lastEdge is on the\n      // next row, which has to be fully hidden along with all subsequent rows.\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (\n      viewBottom <= top ||\n      currentHeight >= bottom ||\n      viewRight <= left ||\n      currentWidth >= right\n    ) {\n      continue;\n    }\n\n    const hiddenHeight =\n      Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n    const hiddenWidth =\n      Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n    const percent =\n      (((viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100) /\n        viewHeight /\n        viewWidth) |\n      0;\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view,\n      percent,\n    });\n  }\n\n  const first = visible[0],\n    last = visible[visible.length - 1];\n\n  if (sortByVisibility) {\n    visible.sort(function (a, b) {\n      const pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return { first, last, views: visible };\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(evt) {\n  evt.preventDefault();\n}\n\nfunction isDataSchema(url) {\n  let i = 0;\n  const ii = url.length;\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n *   unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPDFFileNameFromURL(url, defaultFilename = \"document.pdf\") {\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n  if (isDataSchema(url)) {\n    console.warn(\n      \"getPDFFileNameFromURL: \" +\n        'ignoring \"data:\" URL for performance reasons.'\n    );\n    return defaultFilename;\n  }\n  const reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //              SCHEME        HOST         1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  const reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  const splitURI = reURI.exec(url);\n  let suggestedFilename =\n    reFilename.exec(splitURI[1]) ||\n    reFilename.exec(splitURI[2]) ||\n    reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.includes(\"%\")) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename = reFilename.exec(\n          decodeURIComponent(suggestedFilename)\n        )[0];\n      } catch (ex) {\n        // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || defaultFilename;\n}\n\nfunction normalizeWheelEventDirection(evt) {\n  let delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n  const angle = Math.atan2(evt.deltaY, evt.deltaX);\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    // All that is left-up oriented has to change the sign.\n    delta = -delta;\n  }\n  return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  let delta = normalizeWheelEventDirection(evt);\n\n  const MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n  const MOUSE_DOM_DELTA_LINE_MODE = 1;\n  const MOUSE_PIXELS_PER_LINE = 30;\n  const MOUSE_LINES_PER_PAGE = 30;\n\n  // Converts delta to per-page units\n  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(ScrollMode).includes(mode) &&\n    mode !== ScrollMode.UNKNOWN\n  );\n}\n\nfunction isValidSpreadMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(SpreadMode).includes(mode) &&\n    mode !== SpreadMode.UNKNOWN\n  );\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\nconst WaitOnType = {\n  EVENT: \"event\",\n  TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n *   `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n *   timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nfunction waitOnEventOrTimeout({ target, name, delay = 0 }) {\n  return new Promise(function (resolve, reject) {\n    if (\n      typeof target !== \"object\" ||\n      !(name && typeof name === \"string\") ||\n      !(Number.isInteger(delay) && delay >= 0)\n    ) {\n      throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n    }\n\n    function handler(type) {\n      if (target instanceof EventBus) {\n        target._off(name, eventHandler);\n      } else {\n        target.removeEventListener(name, eventHandler);\n      }\n\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      resolve(type);\n    }\n\n    const eventHandler = handler.bind(null, WaitOnType.EVENT);\n    if (target instanceof EventBus) {\n      target._on(name, eventHandler);\n    } else {\n      target.addEventListener(name, eventHandler);\n    }\n\n    const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n    const timeout = setTimeout(timeoutHandler, delay);\n  });\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"LIB && TESTING\") &&\n    typeof window === \"undefined\"\n  ) {\n    // Prevent \"ReferenceError: window is not defined\" errors when running the\n    // unit-tests in Node.js/Travis.\n    setTimeout(resolve, 20);\n    return;\n  }\n  window.requestAnimationFrame(resolve);\n});\n\n/**\n * NOTE: Only used to support various PDF viewer tests in `mozilla-central`.\n */\nfunction dispatchDOMEvent(eventName, args = null) {\n  if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n    throw new Error(\"Not implemented: dispatchDOMEvent\");\n  }\n  const details = Object.create(null);\n  if (args && args.length > 0) {\n    const obj = args[0];\n    for (const key in obj) {\n      const value = obj[key];\n      if (key === \"source\") {\n        if (value === window || value === document) {\n          return; // No need to re-dispatch (already) global events.\n        }\n        continue; // Ignore the `source` property.\n      }\n      details[key] = value;\n    }\n  }\n  const event = document.createEvent(\"CustomEvent\");\n  event.initCustomEvent(eventName, true, true, details);\n  document.dispatchEvent(event);\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n  constructor(options) {\n    this._listeners = Object.create(null);\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) {\n      this._isInAutomation = (options && options.isInAutomation) === true;\n    }\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   */\n  on(eventName, listener) {\n    this._on(eventName, listener, { external: true });\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   */\n  off(eventName, listener) {\n    this._off(eventName, listener, { external: true });\n  }\n\n  dispatch(eventName) {\n    const eventListeners = this._listeners[eventName];\n    if (!eventListeners || eventListeners.length === 0) {\n      if (\n        (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) &&\n        this._isInAutomation\n      ) {\n        const args = Array.prototype.slice.call(arguments, 1);\n        dispatchDOMEvent(eventName, args);\n      }\n      return;\n    }\n    // Passing all arguments after the eventName to the listeners.\n    const args = Array.prototype.slice.call(arguments, 1);\n    let externalListeners;\n    // Making copy of the listeners array in case if it will be modified\n    // during dispatch.\n    eventListeners.slice(0).forEach(function ({ listener, external }) {\n      if (external) {\n        if (!externalListeners) {\n          externalListeners = [];\n        }\n        externalListeners.push(listener);\n        return;\n      }\n      listener.apply(null, args);\n    });\n    // Dispatch any \"external\" listeners *after* the internal ones, to give the\n    // viewer components time to handle events and update their state first.\n    if (externalListeners) {\n      externalListeners.forEach(function (listener) {\n        listener.apply(null, args);\n      });\n      externalListeners = null;\n    }\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) &&\n      this._isInAutomation\n    ) {\n      dispatchDOMEvent(eventName, args);\n    }\n  }\n\n  /**\n   * @ignore\n   */\n  _on(eventName, listener, options = null) {\n    let eventListeners = this._listeners[eventName];\n    if (!eventListeners) {\n      this._listeners[eventName] = eventListeners = [];\n    }\n    eventListeners.push({\n      listener,\n      external: (options && options.external) === true,\n    });\n  }\n\n  /**\n   * @ignore\n   */\n  _off(eventName, listener, options = null) {\n    const eventListeners = this._listeners[eventName];\n    if (!eventListeners) {\n      return;\n    }\n    for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n      if (eventListeners[i].listener === listener) {\n        eventListeners.splice(i, 1);\n        return;\n      }\n    }\n  }\n}\n\nfunction clamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n  constructor(id, { height, width, units } = {}) {\n    this.visible = true;\n\n    // Fetch the sub-elements for later.\n    this.div = document.querySelector(id + \" .progress\");\n    // Get the loading bar element, so it can be resized to fit the viewer.\n    this.bar = this.div.parentNode;\n\n    // Get options, with sensible defaults.\n    this.height = height || 100;\n    this.width = width || 100;\n    this.units = units || \"%\";\n\n    // Initialize heights.\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  _updateBar() {\n    if (this._indeterminate) {\n      this.div.classList.add(\"indeterminate\");\n      this.div.style.width = this.width + this.units;\n      return;\n    }\n\n    this.div.classList.remove(\"indeterminate\");\n    const progressSize = (this.width * this._percent) / 100;\n    this.div.style.width = progressSize + this.units;\n  }\n\n  get percent() {\n    return this._percent;\n  }\n\n  set percent(val) {\n    this._indeterminate = isNaN(val);\n    this._percent = clamp(val, 0, 100);\n    this._updateBar();\n  }\n\n  setWidth(viewer) {\n    if (!viewer) {\n      return;\n    }\n    const container = viewer.parentNode;\n    const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n    if (scrollbarWidth > 0) {\n      this.bar.style.width = `calc(100% - ${scrollbarWidth}px)`;\n    }\n  }\n\n  hide() {\n    if (!this.visible) {\n      return;\n    }\n    this.visible = false;\n    this.bar.classList.add(\"hidden\");\n    document.body.classList.remove(\"loadingInProgress\");\n  }\n\n  show() {\n    if (this.visible) {\n      return;\n    }\n    this.visible = true;\n    document.body.classList.add(\"loadingInProgress\");\n    this.bar.classList.remove(\"hidden\");\n  }\n}\n\n/**\n * Moves all elements of an array that satisfy condition to the end of the\n * array, preserving the order of the rest.\n */\nfunction moveToEndOfArray(arr, condition) {\n  const moved = [],\n    len = arr.length;\n  let write = 0;\n  for (let read = 0; read < len; ++read) {\n    if (condition(arr[read])) {\n      moved.push(arr[read]);\n    } else {\n      arr[write] = arr[read];\n      ++write;\n    }\n  }\n  for (let read = 0; write < len; ++read, ++write) {\n    arr[write] = moved[read];\n  }\n}\n\nexport {\n  AutoPrintRegExp,\n  CSS_UNITS,\n  DEFAULT_SCALE_VALUE,\n  DEFAULT_SCALE,\n  MIN_SCALE,\n  MAX_SCALE,\n  UNKNOWN_SCALE,\n  MAX_AUTO_SCALE,\n  SCROLLBAR_PADDING,\n  VERTICAL_PADDING,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  isPortraitOrientation,\n  PresentationModeState,\n  RendererType,\n  TextLayerMode,\n  ScrollMode,\n  SpreadMode,\n  NullL10n,\n  EventBus,\n  clamp,\n  ProgressBar,\n  getPDFFileNameFromURL,\n  noContextMenuHandler,\n  parseQueryString,\n  backtrackBeforeAllVisibleElements, // only exported for testing\n  getVisibleElements,\n  roundToDivide,\n  getPageSizeInches,\n  approximateFraction,\n  getOutputScale,\n  scrollIntoView,\n  watchScroll,\n  binarySearchFirstItem,\n  normalizeWheelEventDirection,\n  normalizeWheelEventDelta,\n  animationStarted,\n  WaitOnType,\n  waitOnEventOrTimeout,\n  moveToEndOfArray,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { parseQueryString } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n *   for external links. Must use one of the values from {LinkTarget}.\n *   Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n *   external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n *   thus preserving the current zoom level in the viewer, when navigating\n *   to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n  /**\n   * @param {PDFLinkServiceOptions} options\n   */\n  constructor({\n    eventBus,\n    externalLinkTarget = null,\n    externalLinkRel = null,\n    externalLinkEnabled = true,\n    ignoreDestinationZoom = false,\n  } = {}) {\n    this.eventBus = eventBus;\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n    this.externalLinkEnabled = externalLinkEnabled;\n    this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n\n    this._pagesRefCache = null;\n  }\n\n  setDocument(pdfDocument, baseUrl = null) {\n    this.baseUrl = baseUrl;\n    this.pdfDocument = pdfDocument;\n    this._pagesRefCache = Object.create(null);\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setHistory(pdfHistory) {\n    this.pdfHistory = pdfHistory;\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  }\n\n  /**\n   * @type {number}\n   */\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {\n    this.pdfViewer.currentPageNumber = value;\n  }\n\n  /**\n   * @type {number}\n   */\n  get rotation() {\n    return this.pdfViewer.pagesRotation;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {\n    this.pdfViewer.pagesRotation = value;\n  }\n\n  /**\n   * @param {string|Array} dest - The named, or explicit, PDF destination.\n   */\n  navigateTo(dest) {\n    const goToDestination = ({ namedDest, explicitDest }) => {\n      // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n      const destRef = explicitDest[0];\n      let pageNumber;\n\n      if (destRef instanceof Object) {\n        pageNumber = this._cachedPageNumber(destRef);\n\n        if (pageNumber === null) {\n          // Fetch the page reference if it's not yet available. This could\n          // only occur during loading, before all pages have been resolved.\n          this.pdfDocument\n            .getPageIndex(destRef)\n            .then(pageIndex => {\n              this.cachePageRef(pageIndex + 1, destRef);\n              goToDestination({ namedDest, explicitDest });\n            })\n            .catch(() => {\n              console.error(\n                `PDFLinkService.navigateTo: \"${destRef}\" is not ` +\n                  `a valid page reference, for dest=\"${dest}\".`\n              );\n            });\n          return;\n        }\n      } else if (Number.isInteger(destRef)) {\n        pageNumber = destRef + 1;\n      } else {\n        console.error(\n          `PDFLinkService.navigateTo: \"${destRef}\" is not ` +\n            `a valid destination reference, for dest=\"${dest}\".`\n        );\n        return;\n      }\n      if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n        console.error(\n          `PDFLinkService.navigateTo: \"${pageNumber}\" is not ` +\n            `a valid page number, for dest=\"${dest}\".`\n        );\n        return;\n      }\n\n      if (this.pdfHistory) {\n        // Update the browser history before scrolling the new destination into\n        // view, to be able to accurately capture the current document position.\n        this.pdfHistory.pushCurrentPosition();\n        this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n      }\n\n      this.pdfViewer.scrollPageIntoView({\n        pageNumber,\n        destArray: explicitDest,\n        ignoreDestinationZoom: this._ignoreDestinationZoom,\n      });\n    };\n\n    new Promise((resolve, reject) => {\n      if (typeof dest === \"string\") {\n        this.pdfDocument.getDestination(dest).then(destArray => {\n          resolve({\n            namedDest: dest,\n            explicitDest: destArray,\n          });\n        });\n        return;\n      }\n      resolve({\n        namedDest: \"\",\n        explicitDest: dest,\n      });\n    }).then(data => {\n      if (!Array.isArray(data.explicitDest)) {\n        console.error(\n          `PDFLinkService.navigateTo: \"${data.explicitDest}\" is` +\n            ` not a valid destination array, for dest=\"${dest}\".`\n        );\n        return;\n      }\n      goToDestination(data);\n    });\n  }\n\n  /**\n   * @param {string|Array} dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    if (typeof dest === \"string\") {\n      return this.getAnchorUrl(\"#\" + escape(dest));\n    }\n    if (Array.isArray(dest)) {\n      const str = JSON.stringify(dest);\n      return this.getAnchorUrl(\"#\" + escape(str));\n    }\n    return this.getAnchorUrl(\"\");\n  }\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {string} anchor The anchor hash, including the #.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(anchor) {\n    return (this.baseUrl || \"\") + anchor;\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {\n    let pageNumber, dest;\n    if (hash.includes(\"=\")) {\n      const params = parseQueryString(hash);\n      if (\"search\" in params) {\n        this.eventBus.dispatch(\"findfromurlhash\", {\n          source: this,\n          query: params.search.replace(/\"/g, \"\"),\n          phraseSearch: params.phrase === \"true\",\n        });\n      }\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if (\"page\" in params) {\n        pageNumber = params.page | 0 || 1;\n      }\n      if (\"zoom\" in params) {\n        // Build the destination array.\n        const zoomArgs = params.zoom.split(\",\"); // scale,left,top\n        const zoomArg = zoomArgs[0];\n        const zoomArgNumber = parseFloat(zoomArg);\n\n        if (!zoomArg.includes(\"Fit\")) {\n          // If the zoomArg is a number, it has to get divided by 100. If it's\n          // a string, it should stay as it is.\n          dest = [\n            null,\n            { name: \"XYZ\" },\n            zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n            zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n            zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n          ];\n        } else {\n          if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n            dest = [null, { name: zoomArg }];\n          } else if (\n            zoomArg === \"FitH\" ||\n            zoomArg === \"FitBH\" ||\n            zoomArg === \"FitV\" ||\n            zoomArg === \"FitBV\"\n          ) {\n            dest = [\n              null,\n              { name: zoomArg },\n              zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n            ];\n          } else if (zoomArg === \"FitR\") {\n            if (zoomArgs.length !== 5) {\n              console.error(\n                'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n              );\n            } else {\n              dest = [\n                null,\n                { name: zoomArg },\n                zoomArgs[1] | 0,\n                zoomArgs[2] | 0,\n                zoomArgs[3] | 0,\n                zoomArgs[4] | 0,\n              ];\n            }\n          } else {\n            console.error(\n              `PDFLinkService.setHash: \"${zoomArg}\" is not ` +\n                \"a valid zoom value.\"\n            );\n          }\n        }\n      }\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber || this.page,\n          destArray: dest,\n          allowNegativeOffset: true,\n        });\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if (\"pagemode\" in params) {\n        this.eventBus.dispatch(\"pagemode\", {\n          source: this,\n          mode: params.pagemode,\n        });\n      }\n      // Ensure that this parameter is *always* handled last, in order to\n      // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n      if (\"nameddest\" in params) {\n        this.navigateTo(params.nameddest);\n      }\n    } else {\n      // Named (or explicit) destination.\n      dest = unescape(hash);\n      try {\n        dest = JSON.parse(dest);\n\n        if (!Array.isArray(dest)) {\n          // Avoid incorrectly rejecting a valid named destination, such as\n          // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n          dest = dest.toString();\n        }\n      } catch (ex) {}\n\n      if (typeof dest === \"string\" || isValidExplicitDestination(dest)) {\n        this.navigateTo(dest);\n        return;\n      }\n      console.error(\n        `PDFLinkService.setHash: \"${unescape(hash)}\" is not ` +\n          \"a valid destination.\"\n      );\n    }\n  }\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {\n    // See PDF reference, table 8.45 - Named action\n    switch (action) {\n      case \"GoBack\":\n        if (this.pdfHistory) {\n          this.pdfHistory.back();\n        }\n        break;\n\n      case \"GoForward\":\n        if (this.pdfHistory) {\n          this.pdfHistory.forward();\n        }\n        break;\n\n      case \"NextPage\":\n        if (this.page < this.pagesCount) {\n          this.page++;\n        }\n        break;\n\n      case \"PrevPage\":\n        if (this.page > 1) {\n          this.page--;\n        }\n        break;\n\n      case \"LastPage\":\n        this.page = this.pagesCount;\n        break;\n\n      case \"FirstPage\":\n        this.page = 1;\n        break;\n\n      default:\n        break; // No action according to spec\n    }\n\n    this.eventBus.dispatch(\"namedaction\", {\n      source: this,\n      action,\n    });\n  }\n\n  /**\n   * @param {number} pageNum - page number.\n   * @param {Object} pageRef - reference to the page.\n   */\n  cachePageRef(pageNum, pageRef) {\n    if (!pageRef) {\n      return;\n    }\n    const refStr =\n      pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n    this._pagesRefCache[refStr] = pageNum;\n  }\n\n  _cachedPageNumber(pageRef) {\n    const refStr =\n      pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n    return (this._pagesRefCache && this._pagesRefCache[refStr]) || null;\n  }\n\n  /**\n   * @param {number} pageNumber\n   */\n  isPageVisible(pageNumber) {\n    return this.pdfViewer.isPageVisible(pageNumber);\n  }\n}\n\nfunction isValidExplicitDestination(dest) {\n  if (!Array.isArray(dest)) {\n    return false;\n  }\n  const destLength = dest.length;\n  if (destLength < 2) {\n    return false;\n  }\n  const page = dest[0];\n  if (\n    !(\n      typeof page === \"object\" &&\n      Number.isInteger(page.num) &&\n      Number.isInteger(page.gen)\n    ) &&\n    !(Number.isInteger(page) && page >= 0)\n  ) {\n    return false;\n  }\n  const zoom = dest[1];\n  if (!(typeof zoom === \"object\" && typeof zoom.name === \"string\")) {\n    return false;\n  }\n  let allowNull = true;\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (destLength !== 5) {\n        return false;\n      }\n      break;\n    case \"Fit\":\n    case \"FitB\":\n      return destLength === 2;\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (destLength !== 3) {\n        return false;\n      }\n      break;\n    case \"FitR\":\n      if (destLength !== 6) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (let i = 2; i < destLength; i++) {\n    const param = dest[i];\n    if (!(typeof param === \"number\" || (allowNull && param === null))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService {\n  constructor() {\n    this.externalLinkTarget = null;\n    this.externalLinkRel = null;\n    this.externalLinkEnabled = true;\n    this._ignoreDestinationZoom = false;\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesCount() {\n    return 0;\n  }\n\n  /**\n   * @type {number}\n   */\n  get page() {\n    return 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {}\n\n  /**\n   * @type {number}\n   */\n  get rotation() {\n    return 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {}\n\n  /**\n   * @param dest - The PDF destination object.\n   */\n  navigateTo(dest) {}\n\n  /**\n   * @param dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    return \"#\";\n  }\n\n  /**\n   * @param hash - The PDF parameters/hash.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(hash) {\n    return \"#\";\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {}\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {}\n\n  /**\n   * @param {number} pageNum - page number.\n   * @param {Object} pageRef - reference to the page.\n   */\n  cachePageRef(pageNum, pageRef) {}\n\n  /**\n   * @param {number} pageNumber\n   */\n  isPageVisible(pageNumber) {\n    return true;\n  }\n}\n\nexport { PDFLinkService, SimpleLinkService };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { renderTextLayer } from \"pdfjs-lib\";\n\nconst EXPAND_DIVS_TIMEOUT = 300; // ms\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {HTMLDivElement} textLayerDiv - The text layer container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} pageIndex - The page index.\n * @property {PageViewport} viewport - The viewport of the text layer.\n * @property {PDFFindController} findController\n * @property {boolean} enhanceTextSelection - Option to turn on improved\n *   text selection.\n */\n\n/**\n * The text layer builder provides text selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF's text. These divs\n * contain text that matches the PDF text they are overlaying. This object\n * also provides a way to highlight text that is being searched for.\n */\nclass TextLayerBuilder {\n  constructor({\n    textLayerDiv,\n    eventBus,\n    pageIndex,\n    viewport,\n    findController = null,\n    enhanceTextSelection = false,\n  }) {\n    this.textLayerDiv = textLayerDiv;\n    this.eventBus = eventBus;\n    this.textContent = null;\n    this.textContentItemsStr = [];\n    this.textContentStream = null;\n    this.renderingDone = false;\n    this.pageIdx = pageIndex;\n    this.pageNumber = this.pageIdx + 1;\n    this.matches = [];\n    this.viewport = viewport;\n    this.textDivs = [];\n    this.findController = findController;\n    this.textLayerRenderTask = null;\n    this.enhanceTextSelection = enhanceTextSelection;\n\n    this._onUpdateTextLayerMatches = null;\n    this._bindMouse();\n  }\n\n  /**\n   * @private\n   */\n  _finishRendering() {\n    this.renderingDone = true;\n\n    if (!this.enhanceTextSelection) {\n      const endOfContent = document.createElement(\"div\");\n      endOfContent.className = \"endOfContent\";\n      this.textLayerDiv.appendChild(endOfContent);\n    }\n\n    this.eventBus.dispatch(\"textlayerrendered\", {\n      source: this,\n      pageNumber: this.pageNumber,\n      numTextDivs: this.textDivs.length,\n    });\n  }\n\n  /**\n   * Renders the text layer.\n   *\n   * @param {number} [timeout] - Wait for a specified amount of milliseconds\n   *                             before rendering.\n   */\n  render(timeout = 0) {\n    if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n      return;\n    }\n    this.cancel();\n\n    this.textDivs = [];\n    const textLayerFrag = document.createDocumentFragment();\n    this.textLayerRenderTask = renderTextLayer({\n      textContent: this.textContent,\n      textContentStream: this.textContentStream,\n      container: textLayerFrag,\n      viewport: this.viewport,\n      textDivs: this.textDivs,\n      textContentItemsStr: this.textContentItemsStr,\n      timeout,\n      enhanceTextSelection: this.enhanceTextSelection,\n    });\n    this.textLayerRenderTask.promise.then(\n      () => {\n        this.textLayerDiv.appendChild(textLayerFrag);\n        this._finishRendering();\n        this._updateMatches();\n      },\n      function (reason) {\n        // Cancelled or failed to render text layer; skipping errors.\n      }\n    );\n\n    if (!this._onUpdateTextLayerMatches) {\n      this._onUpdateTextLayerMatches = evt => {\n        if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {\n          this._updateMatches();\n        }\n      };\n      this.eventBus._on(\n        \"updatetextlayermatches\",\n        this._onUpdateTextLayerMatches\n      );\n    }\n  }\n\n  /**\n   * Cancel rendering of the text layer.\n   */\n  cancel() {\n    if (this.textLayerRenderTask) {\n      this.textLayerRenderTask.cancel();\n      this.textLayerRenderTask = null;\n    }\n    if (this._onUpdateTextLayerMatches) {\n      this.eventBus._off(\n        \"updatetextlayermatches\",\n        this._onUpdateTextLayerMatches\n      );\n      this._onUpdateTextLayerMatches = null;\n    }\n  }\n\n  setTextContentStream(readableStream) {\n    this.cancel();\n    this.textContentStream = readableStream;\n  }\n\n  setTextContent(textContent) {\n    this.cancel();\n    this.textContent = textContent;\n  }\n\n  _convertMatches(matches, matchesLength) {\n    // Early exit if there is nothing to convert.\n    if (!matches) {\n      return [];\n    }\n    const { findController, textContentItemsStr } = this;\n\n    let i = 0,\n      iIndex = 0;\n    const end = textContentItemsStr.length - 1;\n    const queryLen = findController.state.query.length;\n    const result = [];\n\n    for (let m = 0, mm = matches.length; m < mm; m++) {\n      // Calculate the start position.\n      let matchIdx = matches[m];\n\n      // Loop over the divIdxs.\n      while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      if (i === textContentItemsStr.length) {\n        console.error(\"Could not find a matching mapping\");\n      }\n\n      const match = {\n        begin: {\n          divIdx: i,\n          offset: matchIdx - iIndex,\n        },\n      };\n\n      // Calculate the end position.\n      if (matchesLength) {\n        // Multiterm search.\n        matchIdx += matchesLength[m];\n      } else {\n        // Phrase search.\n        matchIdx += queryLen;\n      }\n\n      // Somewhat the same array as above, but use > instead of >= to get\n      // the end position right.\n      while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      match.end = {\n        divIdx: i,\n        offset: matchIdx - iIndex,\n      };\n      result.push(match);\n    }\n    return result;\n  }\n\n  _renderMatches(matches) {\n    // Early exit if there is nothing to render.\n    if (matches.length === 0) {\n      return;\n    }\n    const { findController, pageIdx, textContentItemsStr, textDivs } = this;\n\n    const isSelectedPage = pageIdx === findController.selected.pageIdx;\n    const selectedMatchIdx = findController.selected.matchIdx;\n    const highlightAll = findController.state.highlightAll;\n    let prevEnd = null;\n    const infinity = {\n      divIdx: -1,\n      offset: undefined,\n    };\n\n    function beginText(begin, className) {\n      const divIdx = begin.divIdx;\n      textDivs[divIdx].textContent = \"\";\n      appendTextToDiv(divIdx, 0, begin.offset, className);\n    }\n\n    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n      const div = textDivs[divIdx];\n      const content = textContentItemsStr[divIdx].substring(\n        fromOffset,\n        toOffset\n      );\n      const node = document.createTextNode(content);\n      if (className) {\n        const span = document.createElement(\"span\");\n        span.className = className;\n        span.appendChild(node);\n        div.appendChild(span);\n        return;\n      }\n      div.appendChild(node);\n    }\n\n    let i0 = selectedMatchIdx,\n      i1 = i0 + 1;\n    if (highlightAll) {\n      i0 = 0;\n      i1 = matches.length;\n    } else if (!isSelectedPage) {\n      // Not highlighting all and this isn't the selected page, so do nothing.\n      return;\n    }\n\n    for (let i = i0; i < i1; i++) {\n      const match = matches[i];\n      const begin = match.begin;\n      const end = match.end;\n      const isSelected = isSelectedPage && i === selectedMatchIdx;\n      const highlightSuffix = isSelected ? \" selected\" : \"\";\n\n      if (isSelected) {\n        // Attempt to scroll the selected match into view.\n        findController.scrollMatchIntoView({\n          element: textDivs[begin.divIdx],\n          pageIndex: pageIdx,\n          matchIndex: selectedMatchIdx,\n        });\n      }\n\n      // Match inside new div.\n      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n        // If there was a previous div, then add the text at the end.\n        if (prevEnd !== null) {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n        }\n        // Clear the divs and set the content until the starting point.\n        beginText(begin);\n      } else {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n      }\n\n      if (begin.divIdx === end.divIdx) {\n        appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          end.offset,\n          \"highlight\" + highlightSuffix\n        );\n      } else {\n        appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          infinity.offset,\n          \"highlight begin\" + highlightSuffix\n        );\n        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n          textDivs[n0].className = \"highlight middle\" + highlightSuffix;\n        }\n        beginText(end, \"highlight end\" + highlightSuffix);\n      }\n      prevEnd = end;\n    }\n\n    if (prevEnd) {\n      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n    }\n  }\n\n  _updateMatches() {\n    // Only show matches when all rendering is done.\n    if (!this.renderingDone) {\n      return;\n    }\n    const {\n      findController,\n      matches,\n      pageIdx,\n      textContentItemsStr,\n      textDivs,\n    } = this;\n    let clearedUntilDivIdx = -1;\n\n    // Clear all current matches.\n    for (let i = 0, ii = matches.length; i < ii; i++) {\n      const match = matches[i];\n      const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n      for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n        const div = textDivs[n];\n        div.textContent = textContentItemsStr[n];\n        div.className = \"\";\n      }\n      clearedUntilDivIdx = match.end.divIdx + 1;\n    }\n\n    if (!findController || !findController.highlightMatches) {\n      return;\n    }\n    // Convert the matches on the `findController` into the match format\n    // used for the textLayer.\n    const pageMatches = findController.pageMatches[pageIdx] || null;\n    const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n\n    this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n    this._renderMatches(this.matches);\n  }\n\n  /**\n   * Improves text selection by adding an additional div where the mouse was\n   * clicked. This reduces flickering of the content if the mouse is slowly\n   * dragged up or down.\n   *\n   * @private\n   */\n  _bindMouse() {\n    const div = this.textLayerDiv;\n    let expandDivsTimer = null;\n\n    div.addEventListener(\"mousedown\", evt => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        this.textLayerRenderTask.expandTextDivs(true);\n        if (\n          (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n          expandDivsTimer\n        ) {\n          clearTimeout(expandDivsTimer);\n          expandDivsTimer = null;\n        }\n        return;\n      }\n\n      const end = div.querySelector(\".endOfContent\");\n      if (!end) {\n        return;\n      }\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        // On non-Firefox browsers, the selection will feel better if the height\n        // of the `endOfContent` div is adjusted to start at mouse click\n        // location. This avoids flickering when the selection moves up.\n        // However it does not work when selection is started on empty space.\n        let adjustTop = evt.target !== div;\n        if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n          adjustTop =\n            adjustTop &&\n            window\n              .getComputedStyle(end)\n              .getPropertyValue(\"-moz-user-select\") !== \"none\";\n        }\n        if (adjustTop) {\n          const divBounds = div.getBoundingClientRect();\n          const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n          end.style.top = (r * 100).toFixed(2) + \"%\";\n        }\n      }\n      end.classList.add(\"active\");\n    });\n\n    div.addEventListener(\"mouseup\", () => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n          expandDivsTimer = setTimeout(() => {\n            if (this.textLayerRenderTask) {\n              this.textLayerRenderTask.expandTextDivs(false);\n            }\n            expandDivsTimer = null;\n          }, EXPAND_DIVS_TIMEOUT);\n        } else {\n          this.textLayerRenderTask.expandTextDivs(false);\n        }\n        return;\n      }\n\n      const end = div.querySelector(\".endOfContent\");\n      if (!end) {\n        return;\n      }\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        end.style.top = \"\";\n      }\n      end.classList.remove(\"active\");\n    });\n  }\n}\n\n/**\n * @implements IPDFTextLayerFactory\n */\nclass DefaultTextLayerFactory {\n  /**\n   * @param {HTMLDivElement} textLayerDiv\n   * @param {number} pageIndex\n   * @param {PageViewport} viewport\n   * @param {boolean} enhanceTextSelection\n   * @param {EventBus} eventBus\n   * @returns {TextLayerBuilder}\n   */\n  createTextLayerBuilder(\n    textLayerDiv,\n    pageIndex,\n    viewport,\n    enhanceTextSelection = false,\n    eventBus\n  ) {\n    return new TextLayerBuilder({\n      textLayerDiv,\n      pageIndex,\n      viewport,\n      enhanceTextSelection,\n      eventBus,\n    });\n  }\n}\n\nexport { TextLayerBuilder, DefaultTextLayerFactory };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createObjectURL, createValidAbsoluteUrl } from \"pdfjs-lib\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n  throw new Error(\n    'Module \"pdfjs-web/download_manager\" shall not be used ' +\n      \"outside CHROME and GENERIC builds.\"\n  );\n}\n\nfunction download(blobUrl, filename) {\n  const a = document.createElement(\"a\");\n  if (!a.click) {\n    throw new Error('DownloadManager: \"a.click()\" is not supported.');\n  }\n  a.href = blobUrl;\n  a.target = \"_parent\";\n  // Use a.download if available. This increases the likelihood that\n  // the file is downloaded instead of opened by another PDF plugin.\n  if (\"download\" in a) {\n    a.download = filename;\n  }\n  // <a> must be in the document for IE and recent Firefox versions,\n  // otherwise .click() is ignored.\n  (document.body || document.documentElement).appendChild(a);\n  a.click();\n  a.remove();\n}\n\nclass DownloadManager {\n  downloadUrl(url, filename) {\n    if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n      return; // restricted/invalid URL\n    }\n    download(url + \"#pdfjs.action=download\", filename);\n  }\n\n  downloadData(data, filename, contentType) {\n    if (navigator.msSaveBlob) {\n      // IE10 and above\n      navigator.msSaveBlob(new Blob([data], { type: contentType }), filename);\n      return;\n    }\n    const blobUrl = createObjectURL(\n      data,\n      contentType,\n      viewerCompatibilityParams.disableCreateObjectURL\n    );\n    download(blobUrl, filename);\n  }\n\n  /**\n   * @param sourceEventType {string} Used to signal what triggered the download.\n   *   The version of PDF.js integrated with Firefox uses this to to determine\n   *   which dialog to show. \"save\" triggers \"save as\" and \"download\" triggers\n   *   the \"open with\" dialog.\n   */\n  download(blob, url, filename, sourceEventType = \"download\") {\n    if (navigator.msSaveBlob) {\n      // IE10 / IE11\n      if (!navigator.msSaveBlob(blob, filename)) {\n        this.downloadUrl(url, filename);\n      }\n      return;\n    }\n\n    if (viewerCompatibilityParams.disableCreateObjectURL) {\n      // URL.createObjectURL is not supported\n      this.downloadUrl(url, filename);\n      return;\n    }\n\n    const blobUrl = URL.createObjectURL(blob);\n    download(blobUrl, filename);\n  }\n}\n\nexport { DownloadManager };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst compatibilityParams = Object.create(null);\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  const userAgent =\n    (typeof navigator !== \"undefined\" && navigator.userAgent) || \"\";\n  const platform =\n    (typeof navigator !== \"undefined\" && navigator.platform) || \"\";\n  const maxTouchPoints =\n    (typeof navigator !== \"undefined\" && navigator.maxTouchPoints) || 1;\n\n  const isAndroid = /Android/.test(userAgent);\n  const isIE = /Trident/.test(userAgent);\n  const isIOS =\n    /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n    (platform === \"MacIntel\" && maxTouchPoints > 1);\n  const isIOSChrome = /CriOS/.test(userAgent);\n\n  // Checks if possible to use URL.createObjectURL()\n  // Support: IE, Chrome on iOS\n  (function checkOnBlobSupport() {\n    // Sometimes IE and Chrome on iOS losing the data created with\n    // createObjectURL(), see issues #3977 and #8081.\n    if (isIE || isIOSChrome) {\n      compatibilityParams.disableCreateObjectURL = true;\n    }\n  })();\n\n  // Limit canvas size to 5 mega-pixels on mobile.\n  // Support: Android, iOS\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      compatibilityParams.maxCanvasPixels = 5242880;\n    }\n  })();\n}\nconst viewerCompatibilityParams = Object.freeze(compatibilityParams);\n\nexport { viewerCompatibilityParams };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport \"../external/webL10n/l10n.js\";\n\nconst webL10n = document.webL10n;\n\nclass GenericL10n {\n  constructor(lang) {\n    this._lang = lang;\n    this._ready = new Promise((resolve, reject) => {\n      webL10n.setLanguage(lang, () => {\n        resolve(webL10n);\n      });\n    });\n  }\n\n  async getLanguage() {\n    const l10n = await this._ready;\n    return l10n.getLanguage();\n  }\n\n  async getDirection() {\n    const l10n = await this._ready;\n    return l10n.getDirection();\n  }\n\n  async get(property, args, fallback) {\n    const l10n = await this._ready;\n    return l10n.get(property, args, fallback);\n  }\n\n  async translate(element) {\n    const l10n = await this._ready;\n    return l10n.translate(element);\n  }\n}\n\nexport { GenericL10n };\n","/**\n * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/*\n  Additional modifications for PDF.js project:\n    - Disables language initialization on page loading.\n    - Disables document translation on page loading.\n    - Removes consoleWarn and consoleLog and use console.log/warn directly.\n    - Removes window._ assignment.\n    - Remove compatibility code for OldIE.\n    - Replaces `String.prototype.substr()` with `String.prototype.substring()`.\n    - Removes `fireL10nReadyEvent` since the \"localized\" event it dispatches\n      is unused and may clash with an identically named event in the viewer.\n*/\n\n/*jshint browser: true, devel: true, es5: true, globalstrict: true */\n'use strict';\n\ndocument.webL10n = (function(window, document, undefined) {\n  var gL10nData = {};\n  var gTextData = '';\n  var gTextProp = 'textContent';\n  var gLanguage = '';\n  var gMacros = {};\n  var gReadyState = 'loading';\n\n\n  /**\n   * Synchronously loading l10n resources significantly minimizes flickering\n   * from displaying the app with non-localized strings and then updating the\n   * strings. Although this will block all script execution on this page, we\n   * expect that the l10n resources are available locally on flash-storage.\n   *\n   * As synchronous XHR is generally considered as a bad idea, we're still\n   * loading l10n resources asynchronously -- but we keep this in a setting,\n   * just in case... and applications using this library should hide their\n   * content until the `localized' event happens.\n   */\n\n  var gAsyncResourceLoading = true; // read-only\n\n\n  /**\n   * DOM helpers for the so-called \"HTML API\".\n   *\n   * These functions are written for modern browsers. For old versions of IE,\n   * they're overridden in the 'startup' section at the end of this file.\n   */\n\n  function getL10nResourceLinks() {\n    return document.querySelectorAll('link[type=\"application/l10n\"]');\n  }\n\n  function getL10nDictionary() {\n    var script = document.querySelector('script[type=\"application/l10n\"]');\n    // TODO: support multiple and external JSON dictionaries\n    return script ? JSON.parse(script.innerHTML) : null;\n  }\n\n  function getTranslatableChildren(element) {\n    return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n  }\n\n  function getL10nAttributes(element) {\n    if (!element)\n      return {};\n\n    var l10nId = element.getAttribute('data-l10n-id');\n    var l10nArgs = element.getAttribute('data-l10n-args');\n    var args = {};\n    if (l10nArgs) {\n      try {\n        args = JSON.parse(l10nArgs);\n      } catch (e) {\n        console.warn('could not parse arguments for #' + l10nId);\n      }\n    }\n    return { id: l10nId, args: args };\n  }\n\n  function xhrLoadText(url, onSuccess, onFailure) {\n    onSuccess = onSuccess || function _onSuccess(data) {};\n    onFailure = onFailure || function _onFailure() {};\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, gAsyncResourceLoading);\n    if (xhr.overrideMimeType) {\n      xhr.overrideMimeType('text/plain; charset=utf-8');\n    }\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState == 4) {\n        if (xhr.status == 200 || xhr.status === 0) {\n          onSuccess(xhr.responseText);\n        } else {\n          onFailure();\n        }\n      }\n    };\n    xhr.onerror = onFailure;\n    xhr.ontimeout = onFailure;\n\n    // in Firefox OS with the app:// protocol, trying to XHR a non-existing\n    // URL will raise an exception here -- hence this ugly try...catch.\n    try {\n      xhr.send(null);\n    } catch (e) {\n      onFailure();\n    }\n  }\n\n\n  /**\n   * l10n resource parser:\n   *  - reads (async XHR) the l10n resource matching `lang';\n   *  - imports linked resources (synchronously) when specified;\n   *  - parses the text data (fills `gL10nData' and `gTextData');\n   *  - triggers success/failure callbacks when done.\n   *\n   * @param {string} href\n   *    URL of the l10n resource to parse.\n   *\n   * @param {string} lang\n   *    locale (language) to parse. Must be a lowercase string.\n   *\n   * @param {Function} successCallback\n   *    triggered when the l10n resource has been successfully parsed.\n   *\n   * @param {Function} failureCallback\n   *    triggered when the an error has occurred.\n   *\n   * @return {void}\n   *    uses the following global variables: gL10nData, gTextData, gTextProp.\n   */\n\n  function parseResource(href, lang, successCallback, failureCallback) {\n    var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n    // handle escaped characters (backslashes) in a string\n    function evalString(text) {\n      if (text.lastIndexOf('\\\\') < 0)\n        return text;\n      return text.replace(/\\\\\\\\/g, '\\\\')\n                 .replace(/\\\\n/g, '\\n')\n                 .replace(/\\\\r/g, '\\r')\n                 .replace(/\\\\t/g, '\\t')\n                 .replace(/\\\\b/g, '\\b')\n                 .replace(/\\\\f/g, '\\f')\n                 .replace(/\\\\{/g, '{')\n                 .replace(/\\\\}/g, '}')\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/\\\\'/g, \"'\");\n    }\n\n    // parse *.properties text data into an l10n dictionary\n    // If gAsyncResourceLoading is false, then the callback will be called\n    // synchronously. Otherwise it is called asynchronously.\n    function parseProperties(text, parsedPropertiesCallback) {\n      var dictionary = {};\n\n      // token expressions\n      var reBlank = /^\\s*|\\s*$/;\n      var reComment = /^\\s*#|^\\s*$/;\n      var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n      var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n      var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/; // TODO: escape EOLs with '\\'\n\n      // parse the *.properties file into an associative array\n      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n        var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n        var currentLang = '*';\n        var genericLang = lang.split('-', 1)[0];\n        var skipLang = false;\n        var match = '';\n\n        function nextEntry() {\n          // Use infinite loop instead of recursion to avoid reaching the\n          // maximum recursion limit for content with many lines.\n          while (true) {\n            if (!entries.length) {\n              parsedRawLinesCallback();\n              return;\n            }\n            var line = entries.shift();\n\n            // comment or blank line?\n            if (reComment.test(line))\n              continue;\n\n            // the extended syntax supports [lang] sections and @import rules\n            if (extendedSyntax) {\n              match = reSection.exec(line);\n              if (match) { // section start?\n                // RFC 4646, section 4.4, \"All comparisons MUST be performed\n                // in a case-insensitive manner.\"\n\n                currentLang = match[1].toLowerCase();\n                skipLang = (currentLang !== '*') &&\n                    (currentLang !== lang) && (currentLang !== genericLang);\n                continue;\n              } else if (skipLang) {\n                continue;\n              }\n              match = reImport.exec(line);\n              if (match) { // @import rule?\n                loadImport(baseURL + match[1], nextEntry);\n                return;\n              }\n            }\n\n            // key-value pair\n            var tmp = line.match(reSplit);\n            if (tmp && tmp.length == 3) {\n              dictionary[tmp[1]] = evalString(tmp[2]);\n            }\n          }\n        }\n        nextEntry();\n      }\n\n      // import another *.properties file\n      function loadImport(url, callback) {\n        xhrLoadText(url, function(content) {\n          parseRawLines(content, false, callback); // don't allow recursive imports\n        }, function () {\n          console.warn(url + ' not found.');\n          callback();\n        });\n      }\n\n      // fill the dictionary\n      parseRawLines(text, true, function() {\n        parsedPropertiesCallback(dictionary);\n      });\n    }\n\n    // load and parse l10n data (warning: global variables are used here)\n    xhrLoadText(href, function(response) {\n      gTextData += response; // mostly for debug\n\n      // parse *.properties text data into an l10n dictionary\n      parseProperties(response, function(data) {\n\n        // find attribute descriptions, if any\n        for (var key in data) {\n          var id, prop, index = key.lastIndexOf('.');\n          if (index > 0) { // an attribute has been specified\n            id = key.substring(0, index);\n            prop = key.substring(index + 1);\n          } else { // no attribute: assuming text content by default\n            id = key;\n            prop = gTextProp;\n          }\n          if (!gL10nData[id]) {\n            gL10nData[id] = {};\n          }\n          gL10nData[id][prop] = data[key];\n        }\n\n        // trigger callback\n        if (successCallback) {\n          successCallback();\n        }\n      });\n    }, failureCallback);\n  }\n\n  // load and parse all resources for the specified locale\n  function loadLocale(lang, callback) {\n    // RFC 4646, section 2.1 states that language tags have to be treated as\n    // case-insensitive. Convert to lowercase for case-insensitive comparisons.\n    if (lang) {\n      lang = lang.toLowerCase();\n    }\n\n    callback = callback || function _callback() {};\n\n    clear();\n    gLanguage = lang;\n\n    // check all <link type=\"application/l10n\" href=\"...\" /> nodes\n    // and load the resource files\n    var langLinks = getL10nResourceLinks();\n    var langCount = langLinks.length;\n    if (langCount === 0) {\n      // we might have a pre-compiled dictionary instead\n      var dict = getL10nDictionary();\n      if (dict && dict.locales && dict.default_locale) {\n        console.log('using the embedded JSON directory, early way out');\n        gL10nData = dict.locales[lang];\n        if (!gL10nData) {\n          var defaultLocale = dict.default_locale.toLowerCase();\n          for (var anyCaseLang in dict.locales) {\n            anyCaseLang = anyCaseLang.toLowerCase();\n            if (anyCaseLang === lang) {\n              gL10nData = dict.locales[lang];\n              break;\n            } else if (anyCaseLang === defaultLocale) {\n              gL10nData = dict.locales[defaultLocale];\n            }\n          }\n        }\n        callback();\n      } else {\n        console.log('no resource to load, early way out');\n      }\n      // early way out\n      gReadyState = 'complete';\n      return;\n    }\n\n    // start the callback when all resources are loaded\n    var onResourceLoaded = null;\n    var gResourceCount = 0;\n    onResourceLoaded = function() {\n      gResourceCount++;\n      if (gResourceCount >= langCount) {\n        callback();\n        gReadyState = 'complete';\n      }\n    };\n\n    // load all resource files\n    function L10nResourceLink(link) {\n      var href = link.href;\n      // Note: If |gAsyncResourceLoading| is false, then the following callbacks\n      // are synchronously called.\n      this.load = function(lang, callback) {\n        parseResource(href, lang, callback, function() {\n          console.warn(href + ' not found.');\n          // lang not found, used default resource instead\n          console.warn('\"' + lang + '\" resource not found');\n          gLanguage = '';\n          // Resource not loaded, but we still need to call the callback.\n          callback();\n        });\n      };\n    }\n\n    for (var i = 0; i < langCount; i++) {\n      var resource = new L10nResourceLink(langLinks[i]);\n      resource.load(lang, onResourceLoaded);\n    }\n  }\n\n  // clear all l10n data\n  function clear() {\n    gL10nData = {};\n    gTextData = '';\n    gLanguage = '';\n    // TODO: clear all non predefined macros.\n    // There's no such macro /yet/ but we're planning to have some...\n  }\n\n\n  /**\n   * Get rules for plural forms (shared with JetPack), see:\n   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\n   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p\n   *\n   * @param {string} lang\n   *    locale (language) used.\n   *\n   * @return {Function}\n   *    returns a function that gives the plural form name for a given integer:\n   *       var fun = getPluralRules('en');\n   *       fun(1)    -> 'one'\n   *       fun(0)    -> 'other'\n   *       fun(1000) -> 'other'.\n   */\n\n  function getPluralRules(lang) {\n    var locales2rules = {\n      'af': 3,\n      'ak': 4,\n      'am': 4,\n      'ar': 1,\n      'asa': 3,\n      'az': 0,\n      'be': 11,\n      'bem': 3,\n      'bez': 3,\n      'bg': 3,\n      'bh': 4,\n      'bm': 0,\n      'bn': 3,\n      'bo': 0,\n      'br': 20,\n      'brx': 3,\n      'bs': 11,\n      'ca': 3,\n      'cgg': 3,\n      'chr': 3,\n      'cs': 12,\n      'cy': 17,\n      'da': 3,\n      'de': 3,\n      'dv': 3,\n      'dz': 0,\n      'ee': 3,\n      'el': 3,\n      'en': 3,\n      'eo': 3,\n      'es': 3,\n      'et': 3,\n      'eu': 3,\n      'fa': 0,\n      'ff': 5,\n      'fi': 3,\n      'fil': 4,\n      'fo': 3,\n      'fr': 5,\n      'fur': 3,\n      'fy': 3,\n      'ga': 8,\n      'gd': 24,\n      'gl': 3,\n      'gsw': 3,\n      'gu': 3,\n      'guw': 4,\n      'gv': 23,\n      'ha': 3,\n      'haw': 3,\n      'he': 2,\n      'hi': 4,\n      'hr': 11,\n      'hu': 0,\n      'id': 0,\n      'ig': 0,\n      'ii': 0,\n      'is': 3,\n      'it': 3,\n      'iu': 7,\n      'ja': 0,\n      'jmc': 3,\n      'jv': 0,\n      'ka': 0,\n      'kab': 5,\n      'kaj': 3,\n      'kcg': 3,\n      'kde': 0,\n      'kea': 0,\n      'kk': 3,\n      'kl': 3,\n      'km': 0,\n      'kn': 0,\n      'ko': 0,\n      'ksb': 3,\n      'ksh': 21,\n      'ku': 3,\n      'kw': 7,\n      'lag': 18,\n      'lb': 3,\n      'lg': 3,\n      'ln': 4,\n      'lo': 0,\n      'lt': 10,\n      'lv': 6,\n      'mas': 3,\n      'mg': 4,\n      'mk': 16,\n      'ml': 3,\n      'mn': 3,\n      'mo': 9,\n      'mr': 3,\n      'ms': 0,\n      'mt': 15,\n      'my': 0,\n      'nah': 3,\n      'naq': 7,\n      'nb': 3,\n      'nd': 3,\n      'ne': 3,\n      'nl': 3,\n      'nn': 3,\n      'no': 3,\n      'nr': 3,\n      'nso': 4,\n      'ny': 3,\n      'nyn': 3,\n      'om': 3,\n      'or': 3,\n      'pa': 3,\n      'pap': 3,\n      'pl': 13,\n      'ps': 3,\n      'pt': 3,\n      'rm': 3,\n      'ro': 9,\n      'rof': 3,\n      'ru': 11,\n      'rwk': 3,\n      'sah': 0,\n      'saq': 3,\n      'se': 7,\n      'seh': 3,\n      'ses': 0,\n      'sg': 0,\n      'sh': 11,\n      'shi': 19,\n      'sk': 12,\n      'sl': 14,\n      'sma': 7,\n      'smi': 7,\n      'smj': 7,\n      'smn': 7,\n      'sms': 7,\n      'sn': 3,\n      'so': 3,\n      'sq': 3,\n      'sr': 11,\n      'ss': 3,\n      'ssy': 3,\n      'st': 3,\n      'sv': 3,\n      'sw': 3,\n      'syr': 3,\n      'ta': 3,\n      'te': 3,\n      'teo': 3,\n      'th': 0,\n      'ti': 4,\n      'tig': 3,\n      'tk': 3,\n      'tl': 4,\n      'tn': 3,\n      'to': 0,\n      'tr': 0,\n      'ts': 3,\n      'tzm': 22,\n      'uk': 11,\n      'ur': 3,\n      've': 3,\n      'vi': 0,\n      'vun': 3,\n      'wa': 4,\n      'wae': 3,\n      'wo': 0,\n      'xh': 3,\n      'xog': 3,\n      'yo': 0,\n      'zh': 0,\n      'zu': 3\n    };\n\n    // utility functions for plural rules methods\n    function isIn(n, list) {\n      return list.indexOf(n) !== -1;\n    }\n    function isBetween(n, start, end) {\n      return start <= n && n <= end;\n    }\n\n    // list of all plural rules methods:\n    // map an integer to the plural form name to use\n    var pluralRules = {\n      '0': function(n) {\n        return 'other';\n      },\n      '1': function(n) {\n        if ((isBetween((n % 100), 3, 10)))\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if ((isBetween((n % 100), 11, 99)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '2': function(n) {\n        if (n !== 0 && (n % 10) === 0)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '3': function(n) {\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '4': function(n) {\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '5': function(n) {\n        if ((isBetween(n, 0, 2)) && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '6': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '7': function(n) {\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '8': function(n) {\n        if ((isBetween(n, 3, 6)))\n          return 'few';\n        if ((isBetween(n, 7, 10)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '9': function(n) {\n        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '10': function(n) {\n        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))\n          return 'few';\n        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))\n          return 'one';\n        return 'other';\n      },\n      '11': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if ((n % 10) === 0 ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 11, 14)))\n          return 'many';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '12': function(n) {\n        if ((isBetween(n, 2, 4)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '13': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if (n != 1 && (isBetween((n % 10), 0, 1)) ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 12, 14)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '14': function(n) {\n        if ((isBetween((n % 100), 3, 4)))\n          return 'few';\n        if ((n % 100) == 2)\n          return 'two';\n        if ((n % 100) == 1)\n          return 'one';\n        return 'other';\n      },\n      '15': function(n) {\n        if (n === 0 || (isBetween((n % 100), 2, 10)))\n          return 'few';\n        if ((isBetween((n % 100), 11, 19)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '16': function(n) {\n        if ((n % 10) == 1 && n != 11)\n          return 'one';\n        return 'other';\n      },\n      '17': function(n) {\n        if (n == 3)\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if (n == 6)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '18': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '19': function(n) {\n        if ((isBetween(n, 2, 10)))\n          return 'few';\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '20': function(n) {\n        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(\n            isBetween((n % 100), 10, 19) ||\n            isBetween((n % 100), 70, 79) ||\n            isBetween((n % 100), 90, 99)\n            ))\n          return 'few';\n        if ((n % 1000000) === 0 && n !== 0)\n          return 'many';\n        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))\n          return 'two';\n        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))\n          return 'one';\n        return 'other';\n      },\n      '21': function(n) {\n        if (n === 0)\n          return 'zero';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '22': function(n) {\n        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))\n          return 'one';\n        return 'other';\n      },\n      '23': function(n) {\n        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)\n          return 'one';\n        return 'other';\n      },\n      '24': function(n) {\n        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))\n          return 'few';\n        if (isIn(n, [2, 12]))\n          return 'two';\n        if (isIn(n, [1, 11]))\n          return 'one';\n        return 'other';\n      }\n    };\n\n    // return a function that gives the plural form name for a given integer\n    var index = locales2rules[lang.replace(/-.*$/, '')];\n    if (!(index in pluralRules)) {\n      console.warn('plural form unknown for [' + lang + ']');\n      return function() { return 'other'; };\n    }\n    return pluralRules[index];\n  }\n\n  // pre-defined 'plural' macro\n  gMacros.plural = function(str, param, key, prop) {\n    var n = parseFloat(param);\n    if (isNaN(n))\n      return str;\n\n    // TODO: support other properties (l20n still doesn't...)\n    if (prop != gTextProp)\n      return str;\n\n    // initialize _pluralRules\n    if (!gMacros._pluralRules) {\n      gMacros._pluralRules = getPluralRules(gLanguage);\n    }\n    var index = '[' + gMacros._pluralRules(n) + ']';\n\n    // try to find a [zero|one|two] key if it's defined\n    if (n === 0 && (key + '[zero]') in gL10nData) {\n      str = gL10nData[key + '[zero]'][prop];\n    } else if (n == 1 && (key + '[one]') in gL10nData) {\n      str = gL10nData[key + '[one]'][prop];\n    } else if (n == 2 && (key + '[two]') in gL10nData) {\n      str = gL10nData[key + '[two]'][prop];\n    } else if ((key + index) in gL10nData) {\n      str = gL10nData[key + index][prop];\n    } else if ((key + '[other]') in gL10nData) {\n      str = gL10nData[key + '[other]'][prop];\n    }\n\n    return str;\n  };\n\n\n  /**\n   * l10n dictionary functions\n   */\n\n  // fetch an l10n object, warn if not found, apply `args' if possible\n  function getL10nData(key, args, fallback) {\n    var data = gL10nData[key];\n    if (!data) {\n      console.warn('#' + key + ' is undefined.');\n      if (!fallback) {\n        return null;\n      }\n      data = fallback;\n    }\n\n    /** This is where l10n expressions should be processed.\n      * The plan is to support C-style expressions from the l20n project;\n      * until then, only two kinds of simple expressions are supported:\n      *   {[ index ]} and {{ arguments }}.\n      */\n    var rv = {};\n    for (var prop in data) {\n      var str = data[prop];\n      str = substIndexes(str, args, key, prop);\n      str = substArguments(str, args, key);\n      rv[prop] = str;\n    }\n    return rv;\n  }\n\n  // replace {[macros]} with their values\n  function substIndexes(str, args, key, prop) {\n    var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n    var reMatch = reIndex.exec(str);\n    if (!reMatch || !reMatch.length)\n      return str;\n\n    // an index/macro has been found\n    // Note: at the moment, only one parameter is supported\n    var macroName = reMatch[1];\n    var paramName = reMatch[2];\n    var param;\n    if (args && paramName in args) {\n      param = args[paramName];\n    } else if (paramName in gL10nData) {\n      param = gL10nData[paramName];\n    }\n\n    // there's no macro parser yet: it has to be defined in gMacros\n    if (macroName in gMacros) {\n      var macro = gMacros[macroName];\n      str = macro(str, param, key, prop);\n    }\n    return str;\n  }\n\n  // replace {{arguments}} with their values\n  function substArguments(str, args, key) {\n    var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n    return str.replace(reArgs, function(matched_text, arg) {\n      if (args && arg in args) {\n        return args[arg];\n      }\n      if (arg in gL10nData) {\n        return gL10nData[arg];\n      }\n      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n      return matched_text;\n    });\n  }\n\n  // translate an HTML element\n  function translateElement(element) {\n    var l10n = getL10nAttributes(element);\n    if (!l10n.id)\n      return;\n\n    // get the related l10n object\n    var data = getL10nData(l10n.id, l10n.args);\n    if (!data) {\n      console.warn('#' + l10n.id + ' is undefined.');\n      return;\n    }\n\n    // translate element (TODO: security checks?)\n    if (data[gTextProp]) { // XXX\n      if (getChildElementCount(element) === 0) {\n        element[gTextProp] = data[gTextProp];\n      } else {\n        // this element has element children: replace the content of the first\n        // (non-empty) child textNode and clear other child textNodes\n        var children = element.childNodes;\n        var found = false;\n        for (var i = 0, l = children.length; i < l; i++) {\n          if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n            if (found) {\n              children[i].nodeValue = '';\n            } else {\n              children[i].nodeValue = data[gTextProp];\n              found = true;\n            }\n          }\n        }\n        // if no (non-empty) textNode is found, insert a textNode before the\n        // first element child.\n        if (!found) {\n          var textNode = document.createTextNode(data[gTextProp]);\n          element.insertBefore(textNode, element.firstChild);\n        }\n      }\n      delete data[gTextProp];\n    }\n\n    for (var k in data) {\n      element[k] = data[k];\n    }\n  }\n\n  // webkit browsers don't currently support 'children' on SVG elements...\n  function getChildElementCount(element) {\n    if (element.children) {\n      return element.children.length;\n    }\n    if (typeof element.childElementCount !== 'undefined') {\n      return element.childElementCount;\n    }\n    var count = 0;\n    for (var i = 0; i < element.childNodes.length; i++) {\n      count += element.nodeType === 1 ? 1 : 0;\n    }\n    return count;\n  }\n\n  // translate an HTML subtree\n  function translateFragment(element) {\n    element = element || document.documentElement;\n\n    // check all translatable children (= w/ a `data-l10n-id' attribute)\n    var children = getTranslatableChildren(element);\n    var elementCount = children.length;\n    for (var i = 0; i < elementCount; i++) {\n      translateElement(children[i]);\n    }\n\n    // translate element itself if necessary\n    translateElement(element);\n  }\n\n  return {\n    // get a localized string\n    get: function(key, args, fallbackString) {\n      var index = key.lastIndexOf('.');\n      var prop = gTextProp;\n      if (index > 0) { // An attribute has been specified\n        prop = key.substring(index + 1);\n        key = key.substring(0, index);\n      }\n      var fallback;\n      if (fallbackString) {\n        fallback = {};\n        fallback[prop] = fallbackString;\n      }\n      var data = getL10nData(key, args, fallback);\n      if (data && prop in data) {\n        return data[prop];\n      }\n      return '{{' + key + '}}';\n    },\n\n    // debug\n    getData: function() { return gL10nData; },\n    getText: function() { return gTextData; },\n\n    // get|set the document language\n    getLanguage: function() { return gLanguage; },\n    setLanguage: function(lang, callback) {\n      loadLocale(lang, function() {\n        if (callback)\n          callback();\n      });\n    },\n\n    // get the direction (ltr|rtl) of the current language\n    getDirection: function() {\n      // http://www.w3.org/International/questions/qa-scripts\n      // Arabic, Hebrew, Farsi, Pashto, Urdu\n      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n      var shortCode = gLanguage.split('-', 1)[0];\n      return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';\n    },\n\n    // translate an element or document fragment\n    translate: translateFragment,\n\n    // this can be used to prevent race conditions\n    getReadyState: function() { return gReadyState; },\n    ready: function(callback) {\n      if (!callback) {\n        return;\n      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n        window.setTimeout(function() {\n          callback();\n        });\n      } else if (document.addEventListener) {\n        document.addEventListener('localized', function once() {\n          document.removeEventListener('localized', once);\n          callback();\n        });\n      }\n    }\n  };\n}) (window, document);\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability } from \"pdfjs-lib\";\nimport { getCharacterType } from \"./pdf_find_utils.js\";\nimport { scrollIntoView } from \"./ui_utils.js\";\n\nconst FindState = {\n  FOUND: 0,\n  NOT_FOUND: 1,\n  WRAPPED: 2,\n  PENDING: 3,\n};\n\nconst FIND_TIMEOUT = 250; // ms\nconst MATCH_SCROLL_OFFSET_TOP = -50; // px\nconst MATCH_SCROLL_OFFSET_LEFT = -400; // px\n\nconst CHARACTERS_TO_NORMALIZE = {\n  \"\\u2018\": \"'\", // Left single quotation mark\n  \"\\u2019\": \"'\", // Right single quotation mark\n  \"\\u201A\": \"'\", // Single low-9 quotation mark\n  \"\\u201B\": \"'\", // Single high-reversed-9 quotation mark\n  \"\\u201C\": '\"', // Left double quotation mark\n  \"\\u201D\": '\"', // Right double quotation mark\n  \"\\u201E\": '\"', // Double low-9 quotation mark\n  \"\\u201F\": '\"', // Double high-reversed-9 quotation mark\n  \"\\u00BC\": \"1/4\", // Vulgar fraction one quarter\n  \"\\u00BD\": \"1/2\", // Vulgar fraction one half\n  \"\\u00BE\": \"3/4\", // Vulgar fraction three quarters\n};\n\nlet normalizationRegex = null;\nfunction normalize(text) {\n  if (!normalizationRegex) {\n    // Compile the regular expression for text normalization once.\n    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(\"\");\n    normalizationRegex = new RegExp(`[${replace}]`, \"g\");\n  }\n  return text.replace(normalizationRegex, function (ch) {\n    return CHARACTERS_TO_NORMALIZE[ch];\n  });\n}\n\n/**\n * @typedef {Object} PDFFindControllerOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * Provides search functionality to find a given string in a PDF document.\n */\nclass PDFFindController {\n  /**\n   * @param {PDFFindControllerOptions} options\n   */\n  constructor({ linkService, eventBus }) {\n    this._linkService = linkService;\n    this._eventBus = eventBus;\n\n    this._reset();\n    eventBus._on(\"findbarclose\", this._onFindBarClose.bind(this));\n  }\n\n  get highlightMatches() {\n    return this._highlightMatches;\n  }\n\n  get pageMatches() {\n    return this._pageMatches;\n  }\n\n  get pageMatchesLength() {\n    return this._pageMatchesLength;\n  }\n\n  get selected() {\n    return this._selected;\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  /**\n   * Set a reference to the PDF document in order to search it.\n   * Note that searching is not possible if this method is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - The PDF document to search.\n   */\n  setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      this._reset();\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this._pdfDocument = pdfDocument;\n    this._firstPageCapability.resolve();\n  }\n\n  executeCommand(cmd, state) {\n    if (!state) {\n      return;\n    }\n    const pdfDocument = this._pdfDocument;\n\n    if (this._state === null || this._shouldDirtyMatch(cmd, state)) {\n      this._dirtyMatch = true;\n    }\n    this._state = state;\n    if (cmd !== \"findhighlightallchange\") {\n      this._updateUIState(FindState.PENDING);\n    }\n\n    this._firstPageCapability.promise.then(() => {\n      // If the document was closed before searching began, or if the search\n      // operation was relevant for a previously opened document, do nothing.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      this._extractText();\n\n      const findbarClosed = !this._highlightMatches;\n      const pendingTimeout = !!this._findTimeout;\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      if (cmd === \"find\") {\n        // Trigger the find action with a small delay to avoid starting the\n        // search when the user is still typing (saving resources).\n        this._findTimeout = setTimeout(() => {\n          this._nextMatch();\n          this._findTimeout = null;\n        }, FIND_TIMEOUT);\n      } else if (this._dirtyMatch) {\n        // Immediately trigger searching for non-'find' operations, when the\n        // current state needs to be reset and matches re-calculated.\n        this._nextMatch();\n      } else if (cmd === \"findagain\") {\n        this._nextMatch();\n\n        // When the findbar was previously closed, and `highlightAll` is set,\n        // ensure that the matches on all active pages are highlighted again.\n        if (findbarClosed && this._state.highlightAll) {\n          this._updateAllPages();\n        }\n      } else if (cmd === \"findhighlightallchange\") {\n        // If there was a pending search operation, synchronously trigger a new\n        // search *first* to ensure that the correct matches are highlighted.\n        if (pendingTimeout) {\n          this._nextMatch();\n        } else {\n          this._highlightMatches = true;\n        }\n        this._updateAllPages(); // Update the highlighting on all active pages.\n      } else {\n        this._nextMatch();\n      }\n    });\n  }\n\n  scrollMatchIntoView({ element = null, pageIndex = -1, matchIndex = -1 }) {\n    if (!this._scrollMatches || !element) {\n      return;\n    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n      return;\n    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n      return;\n    }\n    this._scrollMatches = false; // Ensure that scrolling only happens once.\n\n    const spot = {\n      top: MATCH_SCROLL_OFFSET_TOP,\n      left: MATCH_SCROLL_OFFSET_LEFT,\n    };\n    scrollIntoView(element, spot, /* skipOverflowHiddenElements = */ true);\n  }\n\n  _reset() {\n    this._highlightMatches = false;\n    this._scrollMatches = false;\n    this._pdfDocument = null;\n    this._pageMatches = [];\n    this._pageMatchesLength = [];\n    this._state = null;\n    // Currently selected match.\n    this._selected = {\n      pageIdx: -1,\n      matchIdx: -1,\n    };\n    // Where the find algorithm currently is in the document.\n    this._offset = {\n      pageIdx: null,\n      matchIdx: null,\n      wrapped: false,\n    };\n    this._extractTextPromises = [];\n    this._pageContents = []; // Stores the normalized text for each page.\n    this._matchesCountTotal = 0;\n    this._pagesToSearch = null;\n    this._pendingFindMatches = Object.create(null);\n    this._resumePageIdx = null;\n    this._dirtyMatch = false;\n    clearTimeout(this._findTimeout);\n    this._findTimeout = null;\n\n    this._firstPageCapability = createPromiseCapability();\n  }\n\n  /**\n   * @type {string} The (current) normalized search query.\n   */\n  get _query() {\n    if (this._state.query !== this._rawQuery) {\n      this._rawQuery = this._state.query;\n      this._normalizedQuery = normalize(this._state.query);\n    }\n    return this._normalizedQuery;\n  }\n\n  _shouldDirtyMatch(cmd, state) {\n    // When the search query changes, regardless of the actual search command\n    // used, always re-calculate matches to avoid errors (fixes bug 1030622).\n    if (state.query !== this._state.query) {\n      return true;\n    }\n    switch (cmd) {\n      case \"findagain\":\n        const pageNumber = this._selected.pageIdx + 1;\n        const linkService = this._linkService;\n        // Only treat a 'findagain' event as a new search operation when it's\n        // *absolutely* certain that the currently selected match is no longer\n        // visible, e.g. as a result of the user scrolling in the document.\n        //\n        // NOTE: If only a simple `this._linkService.page` check was used here,\n        // there's a risk that consecutive 'findagain' operations could \"skip\"\n        // over matches at the top/bottom of pages thus making them completely\n        // inaccessible when there's multiple pages visible in the viewer.\n        if (\n          pageNumber >= 1 &&\n          pageNumber <= linkService.pagesCount &&\n          pageNumber !== linkService.page &&\n          !linkService.isPageVisible(pageNumber)\n        ) {\n          return true;\n        }\n        return false;\n      case \"findhighlightallchange\":\n        return false;\n    }\n    return true;\n  }\n\n  /**\n   * Helper for multi-term search that fills the `matchesWithLength` array\n   * and handles cases where one search term includes another search term (for\n   * example, \"tamed tame\" or \"this is\"). It looks for intersecting terms in\n   * the `matches` and keeps elements with a longer match length.\n   */\n  _prepareMatches(matchesWithLength, matches, matchesLength) {\n    function isSubTerm(currentIndex) {\n      const currentElem = matchesWithLength[currentIndex];\n      const nextElem = matchesWithLength[currentIndex + 1];\n\n      // Check for cases like \"TAMEd TAME\".\n      if (\n        currentIndex < matchesWithLength.length - 1 &&\n        currentElem.match === nextElem.match\n      ) {\n        currentElem.skipped = true;\n        return true;\n      }\n\n      // Check for cases like \"thIS IS\".\n      for (let i = currentIndex - 1; i >= 0; i--) {\n        const prevElem = matchesWithLength[i];\n        if (prevElem.skipped) {\n          continue;\n        }\n        if (prevElem.match + prevElem.matchLength < currentElem.match) {\n          break;\n        }\n        if (\n          prevElem.match + prevElem.matchLength >=\n          currentElem.match + currentElem.matchLength\n        ) {\n          currentElem.skipped = true;\n          return true;\n        }\n      }\n      return false;\n    }\n\n    // Sort the array of `{ match: <match>, matchLength: <matchLength> }`\n    // objects on increasing index first and on the length otherwise.\n    matchesWithLength.sort(function (a, b) {\n      return a.match === b.match\n        ? a.matchLength - b.matchLength\n        : a.match - b.match;\n    });\n    for (let i = 0, len = matchesWithLength.length; i < len; i++) {\n      if (isSubTerm(i)) {\n        continue;\n      }\n      matches.push(matchesWithLength[i].match);\n      matchesLength.push(matchesWithLength[i].matchLength);\n    }\n  }\n\n  /**\n   * Determine if the search query constitutes a \"whole word\", by comparing the\n   * first/last character type with the preceding/following character type.\n   */\n  _isEntireWord(content, startIdx, length) {\n    if (startIdx > 0) {\n      const first = content.charCodeAt(startIdx);\n      const limit = content.charCodeAt(startIdx - 1);\n      if (getCharacterType(first) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n    const endIdx = startIdx + length - 1;\n    if (endIdx < content.length - 1) {\n      const last = content.charCodeAt(endIdx);\n      const limit = content.charCodeAt(endIdx + 1);\n      if (getCharacterType(last) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {\n    const matches = [];\n    const queryLen = query.length;\n\n    let matchIdx = -queryLen;\n    while (true) {\n      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n      if (matchIdx === -1) {\n        break;\n      }\n      if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {\n        continue;\n      }\n      matches.push(matchIdx);\n    }\n    this._pageMatches[pageIndex] = matches;\n  }\n\n  _calculateWordMatch(query, pageIndex, pageContent, entireWord) {\n    const matchesWithLength = [];\n\n    // Divide the query into pieces and search for text in each piece.\n    const queryArray = query.match(/\\S+/g);\n    for (let i = 0, len = queryArray.length; i < len; i++) {\n      const subquery = queryArray[i];\n      const subqueryLen = subquery.length;\n\n      let matchIdx = -subqueryLen;\n      while (true) {\n        matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n        if (matchIdx === -1) {\n          break;\n        }\n        if (\n          entireWord &&\n          !this._isEntireWord(pageContent, matchIdx, subqueryLen)\n        ) {\n          continue;\n        }\n        // Other searches do not, so we store the length.\n        matchesWithLength.push({\n          match: matchIdx,\n          matchLength: subqueryLen,\n          skipped: false,\n        });\n      }\n    }\n\n    // Prepare arrays for storing the matches.\n    this._pageMatchesLength[pageIndex] = [];\n    this._pageMatches[pageIndex] = [];\n\n    // Sort `matchesWithLength`, remove intersecting terms and put the result\n    // into the two arrays.\n    this._prepareMatches(\n      matchesWithLength,\n      this._pageMatches[pageIndex],\n      this._pageMatchesLength[pageIndex]\n    );\n  }\n\n  _calculateMatch(pageIndex) {\n    let pageContent = this._pageContents[pageIndex];\n    let query = this._query;\n    const { caseSensitive, entireWord, phraseSearch } = this._state;\n\n    if (query.length === 0) {\n      // Do nothing: the matches should be wiped out already.\n      return;\n    }\n\n    if (!caseSensitive) {\n      pageContent = pageContent.toLowerCase();\n      query = query.toLowerCase();\n    }\n\n    if (phraseSearch) {\n      this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);\n    } else {\n      this._calculateWordMatch(query, pageIndex, pageContent, entireWord);\n    }\n\n    // When `highlightAll` is set, ensure that the matches on previously\n    // rendered (and still active) pages are correctly highlighted.\n    if (this._state.highlightAll) {\n      this._updatePage(pageIndex);\n    }\n    if (this._resumePageIdx === pageIndex) {\n      this._resumePageIdx = null;\n      this._nextPageMatch();\n    }\n\n    // Update the match count.\n    const pageMatchesCount = this._pageMatches[pageIndex].length;\n    if (pageMatchesCount > 0) {\n      this._matchesCountTotal += pageMatchesCount;\n      this._updateUIResultsCount();\n    }\n  }\n\n  _extractText() {\n    // Perform text extraction once if this method is called multiple times.\n    if (this._extractTextPromises.length > 0) {\n      return;\n    }\n\n    let promise = Promise.resolve();\n    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n      const extractTextCapability = createPromiseCapability();\n      this._extractTextPromises[i] = extractTextCapability.promise;\n\n      promise = promise.then(() => {\n        return this._pdfDocument\n          .getPage(i + 1)\n          .then(pdfPage => {\n            return pdfPage.getTextContent({\n              normalizeWhitespace: true,\n            });\n          })\n          .then(\n            textContent => {\n              const textItems = textContent.items;\n              const strBuf = [];\n\n              for (let j = 0, jj = textItems.length; j < jj; j++) {\n                strBuf.push(textItems[j].str);\n              }\n\n              // Store the normalized page content (text items) as one string.\n              this._pageContents[i] = normalize(strBuf.join(\"\"));\n              extractTextCapability.resolve(i);\n            },\n            reason => {\n              console.error(\n                `Unable to get text content for page ${i + 1}`,\n                reason\n              );\n              // Page error -- assuming no text content.\n              this._pageContents[i] = \"\";\n              extractTextCapability.resolve(i);\n            }\n          );\n      });\n    }\n  }\n\n  _updatePage(index) {\n    if (this._scrollMatches && this._selected.pageIdx === index) {\n      // If the page is selected, scroll the page into view, which triggers\n      // rendering the page, which adds the text layer. Once the text layer\n      // is built, it will attempt to scroll the selected match into view.\n      this._linkService.page = index + 1;\n    }\n\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: index,\n    });\n  }\n\n  _updateAllPages() {\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: -1,\n    });\n  }\n\n  _nextMatch() {\n    const previous = this._state.findPrevious;\n    const currentPageIndex = this._linkService.page - 1;\n    const numPages = this._linkService.pagesCount;\n\n    this._highlightMatches = true;\n\n    if (this._dirtyMatch) {\n      // Need to recalculate the matches, reset everything.\n      this._dirtyMatch = false;\n      this._selected.pageIdx = this._selected.matchIdx = -1;\n      this._offset.pageIdx = currentPageIndex;\n      this._offset.matchIdx = null;\n      this._offset.wrapped = false;\n      this._resumePageIdx = null;\n      this._pageMatches.length = 0;\n      this._pageMatchesLength.length = 0;\n      this._matchesCountTotal = 0;\n\n      this._updateAllPages(); // Wipe out any previously highlighted matches.\n\n      for (let i = 0; i < numPages; i++) {\n        // Start finding the matches as soon as the text is extracted.\n        if (this._pendingFindMatches[i] === true) {\n          continue;\n        }\n        this._pendingFindMatches[i] = true;\n        this._extractTextPromises[i].then(pageIdx => {\n          delete this._pendingFindMatches[pageIdx];\n          this._calculateMatch(pageIdx);\n        });\n      }\n    }\n\n    // If there's no query there's no point in searching.\n    if (this._query === \"\") {\n      this._updateUIState(FindState.FOUND);\n      return;\n    }\n    // If we're waiting on a page, we return since we can't do anything else.\n    if (this._resumePageIdx) {\n      return;\n    }\n\n    const offset = this._offset;\n    // Keep track of how many pages we should maximally iterate through.\n    this._pagesToSearch = numPages;\n    // If there's already a `matchIdx` that means we are iterating through a\n    // page's matches.\n    if (offset.matchIdx !== null) {\n      const numPageMatches = this._pageMatches[offset.pageIdx].length;\n      if (\n        (!previous && offset.matchIdx + 1 < numPageMatches) ||\n        (previous && offset.matchIdx > 0)\n      ) {\n        // The simple case; we just have advance the matchIdx to select\n        // the next match on the page.\n        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n        this._updateMatch(/* found = */ true);\n        return;\n      }\n      // We went beyond the current page's matches, so we advance to\n      // the next page.\n      this._advanceOffsetPage(previous);\n    }\n    // Start searching through the page.\n    this._nextPageMatch();\n  }\n\n  _matchesReady(matches) {\n    const offset = this._offset;\n    const numMatches = matches.length;\n    const previous = this._state.findPrevious;\n\n    if (numMatches) {\n      // There were matches for the page, so initialize `matchIdx`.\n      offset.matchIdx = previous ? numMatches - 1 : 0;\n      this._updateMatch(/* found = */ true);\n      return true;\n    }\n    // No matches, so attempt to search the next page.\n    this._advanceOffsetPage(previous);\n    if (offset.wrapped) {\n      offset.matchIdx = null;\n      if (this._pagesToSearch < 0) {\n        // No point in wrapping again, there were no matches.\n        this._updateMatch(/* found = */ false);\n        // While matches were not found, searching for a page\n        // with matches should nevertheless halt.\n        return true;\n      }\n    }\n    // Matches were not found (and searching is not done).\n    return false;\n  }\n\n  _nextPageMatch() {\n    if (this._resumePageIdx !== null) {\n      console.error(\"There can only be one pending page.\");\n    }\n\n    let matches = null;\n    do {\n      const pageIdx = this._offset.pageIdx;\n      matches = this._pageMatches[pageIdx];\n      if (!matches) {\n        // The matches don't exist yet for processing by `_matchesReady`,\n        // so set a resume point for when they do exist.\n        this._resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this._matchesReady(matches));\n  }\n\n  _advanceOffsetPage(previous) {\n    const offset = this._offset;\n    const numPages = this._linkService.pagesCount;\n    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n    offset.matchIdx = null;\n\n    this._pagesToSearch--;\n\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = previous ? numPages - 1 : 0;\n      offset.wrapped = true;\n    }\n  }\n\n  _updateMatch(found = false) {\n    let state = FindState.NOT_FOUND;\n    const wrapped = this._offset.wrapped;\n    this._offset.wrapped = false;\n\n    if (found) {\n      const previousPage = this._selected.pageIdx;\n      this._selected.pageIdx = this._offset.pageIdx;\n      this._selected.matchIdx = this._offset.matchIdx;\n      state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n      // Update the currently selected page to wipe out any selected matches.\n      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n        this._updatePage(previousPage);\n      }\n    }\n\n    this._updateUIState(state, this._state.findPrevious);\n    if (this._selected.pageIdx !== -1) {\n      // Ensure that the match will be scrolled into view.\n      this._scrollMatches = true;\n\n      this._updatePage(this._selected.pageIdx);\n    }\n  }\n\n  _onFindBarClose(evt) {\n    const pdfDocument = this._pdfDocument;\n    // Since searching is asynchronous, ensure that the removal of highlighted\n    // matches (from the UI) is async too such that the 'updatetextlayermatches'\n    // events will always be dispatched in the expected order.\n    this._firstPageCapability.promise.then(() => {\n      // Only update the UI if the document is open, and is the current one.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      // Ensure that a pending, not yet started, search operation is aborted.\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      // Abort any long running searches, to avoid a match being scrolled into\n      // view *after* the findbar has been closed. In this case `this._offset`\n      // will most likely differ from `this._selected`, hence we also ensure\n      // that any new search operation will always start with a clean slate.\n      if (this._resumePageIdx) {\n        this._resumePageIdx = null;\n        this._dirtyMatch = true;\n      }\n      // Avoid the UI being in a pending state when the findbar is re-opened.\n      this._updateUIState(FindState.FOUND);\n\n      this._highlightMatches = false;\n      this._updateAllPages(); // Wipe out any previously highlighted matches.\n    });\n  }\n\n  _requestMatchesCount() {\n    const { pageIdx, matchIdx } = this._selected;\n    let current = 0,\n      total = this._matchesCountTotal;\n    if (matchIdx !== -1) {\n      for (let i = 0; i < pageIdx; i++) {\n        current += (this._pageMatches[i] && this._pageMatches[i].length) || 0;\n      }\n      current += matchIdx + 1;\n    }\n    // When searching starts, this method may be called before the `pageMatches`\n    // have been counted (in `_calculateMatch`). Ensure that the UI won't show\n    // temporarily broken state when the active find result doesn't make sense.\n    if (current < 1 || current > total) {\n      current = total = 0;\n    }\n    return { current, total };\n  }\n\n  _updateUIResultsCount() {\n    this._eventBus.dispatch(\"updatefindmatchescount\", {\n      source: this,\n      matchesCount: this._requestMatchesCount(),\n    });\n  }\n\n  _updateUIState(state, previous) {\n    this._eventBus.dispatch(\"updatefindcontrolstate\", {\n      source: this,\n      state,\n      previous,\n      matchesCount: this._requestMatchesCount(),\n      rawQuery: this._state ? this._state.query : null,\n    });\n  }\n}\n\nexport { FindState, PDFFindController };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CharacterType = {\n  SPACE: 0,\n  ALPHA_LETTER: 1,\n  PUNCT: 2,\n  HAN_LETTER: 3,\n  KATAKANA_LETTER: 4,\n  HIRAGANA_LETTER: 5,\n  HALFWIDTH_KATAKANA_LETTER: 6,\n  THAI_LETTER: 7,\n};\n\nfunction isAlphabeticalScript(charCode) {\n  return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n  return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n  return (\n    (charCode >= /* a = */ 0x61 && charCode <= /* z = */ 0x7a) ||\n    (charCode >= /* A = */ 0x41 && charCode <= /* Z = */ 0x5a)\n  );\n}\n\nfunction isAsciiDigit(charCode) {\n  return charCode >= /* 0 = */ 0x30 && charCode <= /* 9 = */ 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n  return (\n    charCode === /* SPACE = */ 0x20 ||\n    charCode === /* TAB = */ 0x09 ||\n    charCode === /* CR = */ 0x0d ||\n    charCode === /* LF = */ 0x0a\n  );\n}\n\nfunction isHan(charCode) {\n  return (\n    (charCode >= 0x3400 && charCode <= 0x9fff) ||\n    (charCode >= 0xf900 && charCode <= 0xfaff)\n  );\n}\n\nfunction isKatakana(charCode) {\n  return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n  return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n  return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n  return (charCode & 0xff80) === 0x0e00;\n}\n\n/**\n * This function is based on the word-break detection implemented in:\n * https://hg.mozilla.org/mozilla-central/file/tip/intl/lwbrk/WordBreaker.cpp\n */\nfunction getCharacterType(charCode) {\n  if (isAlphabeticalScript(charCode)) {\n    if (isAscii(charCode)) {\n      if (isAsciiSpace(charCode)) {\n        return CharacterType.SPACE;\n      } else if (\n        isAsciiAlpha(charCode) ||\n        isAsciiDigit(charCode) ||\n        charCode === /* UNDERSCORE = */ 0x5f\n      ) {\n        return CharacterType.ALPHA_LETTER;\n      }\n      return CharacterType.PUNCT;\n    } else if (isThai(charCode)) {\n      return CharacterType.THAI_LETTER;\n    } else if (charCode === /* NBSP = */ 0xa0) {\n      return CharacterType.SPACE;\n    }\n    return CharacterType.ALPHA_LETTER;\n  }\n\n  if (isHan(charCode)) {\n    return CharacterType.HAN_LETTER;\n  } else if (isKatakana(charCode)) {\n    return CharacterType.KATAKANA_LETTER;\n  } else if (isHiragana(charCode)) {\n    return CharacterType.HIRAGANA_LETTER;\n  } else if (isHalfwidthKatakana(charCode)) {\n    return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n  }\n  return CharacterType.ALPHA_LETTER;\n}\n\nexport { CharacterType, getCharacterType };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  isValidRotation,\n  parseQueryString,\n  waitOnEventOrTimeout,\n} from \"./ui_utils.js\";\n\n// Heuristic value used when force-resetting `this._blockHashChange`.\nconst HASH_CHANGE_TIMEOUT = 1000; // milliseconds\n// Heuristic value used when adding the current position to the browser history.\nconst POSITION_UPDATED_THRESHOLD = 50;\n// Heuristic value used when adding a temporary position to the browser history.\nconst UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds\n\n/**\n * @typedef {Object} PDFHistoryOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} InitializeParameters\n * @property {string} fingerprint - The PDF document's unique fingerprint.\n * @property {boolean} [resetHistory] - Reset the browsing history.\n * @property {boolean} [updateUrl] - Attempt to update the document URL, with\n *   the current hash, when pushing/replacing browser history entries.\n */\n\n/**\n * @typedef {Object} PushParameters\n * @property {string} [namedDest] - The named destination. If absent, a\n *   stringified version of `explicitDest` is used.\n * @property {Array} explicitDest - The explicit destination array.\n * @property {number} pageNumber - The page to which the destination points.\n */\n\nfunction getCurrentHash() {\n  return document.location.hash;\n}\n\nclass PDFHistory {\n  /**\n   * @param {PDFHistoryOptions} options\n   */\n  constructor({ linkService, eventBus }) {\n    this.linkService = linkService;\n    this.eventBus = eventBus;\n\n    this._initialized = false;\n    this._fingerprint = \"\";\n    this.reset();\n\n    this._boundEvents = null;\n    this._isViewerInPresentationMode = false;\n    // Ensure that we don't miss either a 'presentationmodechanged' or a\n    // 'pagesinit' event, by registering the listeners immediately.\n    this.eventBus._on(\"presentationmodechanged\", evt => {\n      this._isViewerInPresentationMode = evt.active || evt.switchInProgress;\n    });\n    this.eventBus._on(\"pagesinit\", () => {\n      this._isPagesLoaded = false;\n\n      const onPagesLoaded = evt => {\n        this.eventBus._off(\"pagesloaded\", onPagesLoaded);\n        this._isPagesLoaded = !!evt.pagesCount;\n      };\n      this.eventBus._on(\"pagesloaded\", onPagesLoaded);\n    });\n  }\n\n  /**\n   * Initialize the history for the PDF document, using either the current\n   * browser history entry or the document hash, whichever is present.\n   * @param {InitializeParameters} params\n   */\n  initialize({ fingerprint, resetHistory = false, updateUrl = false }) {\n    if (!fingerprint || typeof fingerprint !== \"string\") {\n      console.error(\n        'PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.'\n      );\n      return;\n    }\n    // Ensure that any old state is always reset upon initialization.\n    if (this._initialized) {\n      this.reset();\n    }\n    const reInitialized =\n      this._fingerprint !== \"\" && this._fingerprint !== fingerprint;\n    this._fingerprint = fingerprint;\n    this._updateUrl = updateUrl === true;\n\n    this._initialized = true;\n    this._bindEvents();\n    const state = window.history.state;\n\n    this._popStateInProgress = false;\n    this._blockHashChange = 0;\n    this._currentHash = getCurrentHash();\n    this._numPositionUpdates = 0;\n\n    this._uid = this._maxUid = 0;\n    this._destination = null;\n    this._position = null;\n\n    if (!this._isValidState(state, /* checkReload = */ true) || resetHistory) {\n      const { hash, page, rotation } = this._parseCurrentHash(\n        /* checkNameddest = */ true\n      );\n\n      if (!hash || reInitialized || resetHistory) {\n        // Ensure that the browser history is reset on PDF document load.\n        this._pushOrReplaceState(null, /* forceReplace = */ true);\n        return;\n      }\n      // Ensure that the browser history is initialized correctly when\n      // the document hash is present on PDF document load.\n      this._pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n\n    // The browser history contains a valid entry, ensure that the history is\n    // initialized correctly on PDF document load.\n    const destination = state.destination;\n    this._updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n    if (this._uid > this._maxUid) {\n      this._maxUid = this._uid;\n    }\n\n    if (destination.rotation !== undefined) {\n      this._initialRotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this._initialBookmark = JSON.stringify(destination.dest);\n\n      // If the history is updated, e.g. through the user changing the hash,\n      // before the initial destination has become visible, then we do *not*\n      // want to potentially add `this._position` to the browser history.\n      this._destination.page = null;\n    } else if (destination.hash) {\n      this._initialBookmark = destination.hash;\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this._initialBookmark = `page=${destination.page}`;\n    }\n  }\n\n  /**\n   * Reset the current `PDFHistory` instance, and consequently prevent any\n   * further updates and/or navigation of the browser history.\n   */\n  reset() {\n    if (this._initialized) {\n      this._pageHide(); // Simulate a 'pagehide' event when resetting.\n\n      this._initialized = false;\n      this._unbindEvents();\n    }\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    this._initialBookmark = null;\n    this._initialRotation = null;\n  }\n\n  /**\n   * Push an internal destination to the browser history.\n   * @param {PushParameters}\n   */\n  push({ namedDest = null, explicitDest, pageNumber }) {\n    if (!this._initialized) {\n      return;\n    }\n    if (namedDest && typeof namedDest !== \"string\") {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${namedDest}\" is not a valid namedDest parameter.`\n      );\n      return;\n    } else if (!Array.isArray(explicitDest)) {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${explicitDest}\" is not a valid explicitDest parameter.`\n      );\n      return;\n    } else if (\n      !(\n        Number.isInteger(pageNumber) &&\n        pageNumber > 0 &&\n        pageNumber <= this.linkService.pagesCount\n      )\n    ) {\n      // Allow an unset `pageNumber` if and only if the history is still empty;\n      // please refer to the `this._destination.page = null;` comment above.\n      if (pageNumber !== null || this._destination) {\n        console.error(\n          \"PDFHistory.push: \" +\n            `\"${pageNumber}\" is not a valid pageNumber parameter.`\n        );\n        return;\n      }\n    }\n\n    const hash = namedDest || JSON.stringify(explicitDest);\n    if (!hash) {\n      // The hash *should* never be undefined, but if that were to occur,\n      // avoid any possible issues by not updating the browser history.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination &&\n      (isDestHashesEqual(this._destination.hash, hash) ||\n        isDestArraysEqual(this._destination.dest, explicitDest))\n    ) {\n      // When the new destination is identical to `this._destination`, and\n      // its `page` is undefined, replace the current browser history entry.\n      // NOTE: This can only occur if `this._destination` was set either:\n      //  - through the document hash being specified on load.\n      //  - through the user changing the hash of the document.\n      if (this._destination.page) {\n        return;\n      }\n      forceReplace = true;\n    }\n    if (this._popStateInProgress && !forceReplace) {\n      return;\n    }\n\n    this._pushOrReplaceState(\n      {\n        dest: explicitDest,\n        hash,\n        page: pageNumber,\n        rotation: this.linkService.rotation,\n      },\n      forceReplace\n    );\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new destination is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occuring when the new destination is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push the current position to the browser history.\n   */\n  pushCurrentPosition() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    this._tryPushCurrentPosition();\n  }\n\n  /**\n   * Go back one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  back() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this._isValidState(state) && state.uid > 0) {\n      window.history.back();\n    }\n  }\n\n  /**\n   * Go forward one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  forward() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this._isValidState(state) && state.uid < this._maxUid) {\n      window.history.forward();\n    }\n  }\n\n  /**\n   * @type {boolean} Indicating if the user is currently moving through the\n   *   browser history, useful e.g. for skipping the next 'hashchange' event.\n   */\n  get popStateInProgress() {\n    return (\n      this._initialized &&\n      (this._popStateInProgress || this._blockHashChange > 0)\n    );\n  }\n\n  get initialBookmark() {\n    return this._initialized ? this._initialBookmark : null;\n  }\n\n  get initialRotation() {\n    return this._initialized ? this._initialRotation : null;\n  }\n\n  /**\n   * @private\n   */\n  _pushOrReplaceState(destination, forceReplace = false) {\n    const shouldReplace = forceReplace || !this._destination;\n    const newState = {\n      fingerprint: this._fingerprint,\n      uid: shouldReplace ? this._uid : this._uid + 1,\n      destination,\n    };\n\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"CHROME\") &&\n      window.history.state &&\n      window.history.state.chromecomState\n    ) {\n      // history.state.chromecomState is managed by chromecom.js.\n      newState.chromecomState = window.history.state.chromecomState;\n    }\n    this._updateInternalState(destination, newState.uid);\n\n    let newUrl;\n    if (this._updateUrl && destination && destination.hash) {\n      const baseUrl = document.location.href.split(\"#\")[0];\n      // Prevent errors in Firefox.\n      if (!baseUrl.startsWith(\"file://\")) {\n        newUrl = `${baseUrl}#${destination.hash}`;\n      }\n    }\n    if (shouldReplace) {\n      window.history.replaceState(newState, \"\", newUrl);\n    } else {\n      this._maxUid = this._uid;\n      window.history.pushState(newState, \"\", newUrl);\n    }\n\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"CHROME\") &&\n      top === window\n    ) {\n      // eslint-disable-next-line no-undef\n      chrome.runtime.sendMessage(\"showPageAction\");\n    }\n  }\n\n  /**\n   * @private\n   */\n  _tryPushCurrentPosition(temporary = false) {\n    if (!this._position) {\n      return;\n    }\n    let position = this._position;\n    if (temporary) {\n      position = Object.assign(Object.create(null), this._position);\n      position.temporary = true;\n    }\n\n    if (!this._destination) {\n      this._pushOrReplaceState(position);\n      return;\n    }\n    if (this._destination.temporary) {\n      // Always replace a previous *temporary* position.\n      this._pushOrReplaceState(position, /* forceReplace = */ true);\n      return;\n    }\n    if (this._destination.hash === position.hash) {\n      return; // The current document position has not changed.\n    }\n    if (\n      !this._destination.page &&\n      (POSITION_UPDATED_THRESHOLD <= 0 ||\n        this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)\n    ) {\n      // `this._destination` was set through the user changing the hash of\n      // the document. Do not add `this._position` to the browser history,\n      // to avoid \"flooding\" it with lots of (nearly) identical entries,\n      // since we cannot ensure that the document position has changed.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination.page >= position.first &&\n      this._destination.page <= position.page\n    ) {\n      // When the `page` of `this._destination` is still visible, do not\n      // update the browsing history when `this._destination` either:\n      //  - contains an internal destination, since in this case we\n      //    cannot ensure that the document position has actually changed.\n      //  - was set through the user changing the hash of the document.\n      if (this._destination.dest || !this._destination.first) {\n        return;\n      }\n      // To avoid \"flooding\" the browser history, replace the current entry.\n      forceReplace = true;\n    }\n    this._pushOrReplaceState(position, forceReplace);\n  }\n\n  /**\n   * @private\n   */\n  _isValidState(state, checkReload = false) {\n    if (!state) {\n      return false;\n    }\n    if (state.fingerprint !== this._fingerprint) {\n      if (checkReload) {\n        // Potentially accept the history entry, even if the fingerprints don't\n        // match, when the viewer was reloaded (see issue 6847).\n        if (\n          typeof state.fingerprint !== \"string\" ||\n          state.fingerprint.length !== this._fingerprint.length\n        ) {\n          return false;\n        }\n        const [perfEntry] = performance.getEntriesByType(\"navigation\");\n        if (!perfEntry || perfEntry.type !== \"reload\") {\n          return false;\n        }\n      } else {\n        // This should only occur in viewers with support for opening more than\n        // one PDF document, e.g. the GENERIC viewer.\n        return false;\n      }\n    }\n    if (!Number.isInteger(state.uid) || state.uid < 0) {\n      return false;\n    }\n    if (state.destination === null || typeof state.destination !== \"object\") {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _updateInternalState(destination, uid, removeTemporary = false) {\n    if (this._updateViewareaTimeout) {\n      // When updating `this._destination`, make sure that we always wait for\n      // the next 'updateviewarea' event before (potentially) attempting to\n      // push the current position to the browser history.\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    if (removeTemporary && destination && destination.temporary) {\n      // When the `destination` comes from the browser history,\n      // we no longer treat it as a *temporary* position.\n      delete destination.temporary;\n    }\n    this._destination = destination;\n    this._uid = uid;\n    // This should always be reset when `this._destination` is updated.\n    this._numPositionUpdates = 0;\n  }\n\n  /**\n   * @private\n   */\n  _parseCurrentHash(checkNameddest = false) {\n    const hash = unescape(getCurrentHash()).substring(1);\n    const params = parseQueryString(hash);\n\n    const nameddest = params.nameddest || \"\";\n    let page = params.page | 0;\n\n    if (\n      !(\n        Number.isInteger(page) &&\n        page > 0 &&\n        page <= this.linkService.pagesCount\n      ) ||\n      (checkNameddest && nameddest.length > 0)\n    ) {\n      page = null;\n    }\n    return { hash, page, rotation: this.linkService.rotation };\n  }\n\n  /**\n   * @private\n   */\n  _updateViewarea({ location }) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._position = {\n      hash: this._isViewerInPresentationMode\n        ? `page=${location.pageNumber}`\n        : location.pdfOpenParams.substring(1),\n      page: this.linkService.page,\n      first: location.pageNumber,\n      rotation: location.rotation,\n    };\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    if (\n      POSITION_UPDATED_THRESHOLD > 0 &&\n      this._isPagesLoaded &&\n      this._destination &&\n      !this._destination.page\n    ) {\n      // If the current destination was set through the user changing the hash\n      // of the document, we will usually not try to push the current position\n      // to the browser history; see `this._tryPushCurrentPosition()`.\n      //\n      // To prevent `this._tryPushCurrentPosition()` from effectively being\n      // reduced to a no-op in this case, we will assume that the position\n      // *did* in fact change if the 'updateviewarea' event was dispatched\n      // more than `POSITION_UPDATED_THRESHOLD` times.\n      this._numPositionUpdates++;\n    }\n\n    if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n      // When closing the browser, a 'pagehide' event will be dispatched which\n      // *should* allow us to push the current position to the browser history.\n      // In practice, it seems that the event is arriving too late in order for\n      // the session history to be successfully updated.\n      // (For additional details, please refer to the discussion in\n      //  https://bugzilla.mozilla.org/show_bug.cgi?id=1153393.)\n      //\n      // To workaround this we attempt to *temporarily* add the current position\n      // to the browser history only when the viewer is *idle*,\n      // i.e. when scrolling and/or zooming does not occur.\n      //\n      // PLEASE NOTE: It's absolutely imperative that the browser history is\n      // *not* updated too often, since that would render the viewer more or\n      // less unusable. Hence the use of a timeout to delay the update until\n      // the viewer has been idle for `UPDATE_VIEWAREA_TIMEOUT` milliseconds.\n      this._updateViewareaTimeout = setTimeout(() => {\n        if (!this._popStateInProgress) {\n          this._tryPushCurrentPosition(/* temporary = */ true);\n        }\n        this._updateViewareaTimeout = null;\n      }, UPDATE_VIEWAREA_TIMEOUT);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _popState({ state }) {\n    const newHash = getCurrentHash(),\n      hashChanged = this._currentHash !== newHash;\n    this._currentHash = newHash;\n\n    if (\n      (typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"CHROME\") &&\n        state &&\n        state.chromecomState &&\n        !this._isValidState(state)) ||\n      !state\n    ) {\n      // This case corresponds to the user changing the hash of the document.\n      this._uid++;\n\n      const { hash, page, rotation } = this._parseCurrentHash();\n      this._pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n    if (!this._isValidState(state)) {\n      // This should only occur in viewers with support for opening more than\n      // one PDF document, e.g. the GENERIC viewer.\n      return;\n    }\n\n    // Prevent the browser history from updating until the new destination,\n    // as stored in the browser history, has been scrolled into view.\n    this._popStateInProgress = true;\n\n    if (hashChanged) {\n      // When the hash changed, implying that the 'popstate' event will be\n      // followed by a 'hashchange' event, then we do *not* want to update the\n      // browser history when handling the 'hashchange' event (in web/app.js)\n      // since that would *overwrite* the new destination navigated to below.\n      //\n      // To avoid accidentally disabling all future user-initiated hash changes,\n      // if there's e.g. another 'hashchange' listener that stops the event\n      // propagation, we make sure to always force-reset `this._blockHashChange`\n      // after `HASH_CHANGE_TIMEOUT` milliseconds have passed.\n      this._blockHashChange++;\n      waitOnEventOrTimeout({\n        target: window,\n        name: \"hashchange\",\n        delay: HASH_CHANGE_TIMEOUT,\n      }).then(() => {\n        this._blockHashChange--;\n      });\n    }\n\n    // Navigate to the new destination.\n    const destination = state.destination;\n    this._updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n    if (this._uid > this._maxUid) {\n      this._maxUid = this._uid;\n    }\n\n    if (isValidRotation(destination.rotation)) {\n      this.linkService.rotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this.linkService.navigateTo(destination.dest);\n    } else if (destination.hash) {\n      this.linkService.setHash(destination.hash);\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this.linkService.page = destination.page;\n    }\n\n    // Since `PDFLinkService.navigateTo` is asynchronous, we thus defer the\n    // resetting of `this._popStateInProgress` slightly.\n    Promise.resolve().then(() => {\n      this._popStateInProgress = false;\n    });\n  }\n\n  /**\n   * @private\n   */\n  _pageHide() {\n    // Attempt to push the `this._position` into the browser history when\n    // navigating away from the document. This is *only* done if the history\n    // is empty/temporary, since otherwise an existing browser history entry\n    // will end up being overwritten (given that new entries cannot be pushed\n    // into the browser history when the 'unload' event has already fired).\n    if (!this._destination || this._destination.temporary) {\n      this._tryPushCurrentPosition();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _bindEvents() {\n    if (this._boundEvents) {\n      return; // The event listeners were already added.\n    }\n    this._boundEvents = {\n      updateViewarea: this._updateViewarea.bind(this),\n      popState: this._popState.bind(this),\n      pageHide: this._pageHide.bind(this),\n    };\n\n    this.eventBus._on(\"updateviewarea\", this._boundEvents.updateViewarea);\n    window.addEventListener(\"popstate\", this._boundEvents.popState);\n    window.addEventListener(\"pagehide\", this._boundEvents.pageHide);\n  }\n\n  /**\n   * @private\n   */\n  _unbindEvents() {\n    if (!this._boundEvents) {\n      return; // The event listeners were already removed.\n    }\n    this.eventBus._off(\"updateviewarea\", this._boundEvents.updateViewarea);\n    window.removeEventListener(\"popstate\", this._boundEvents.popState);\n    window.removeEventListener(\"pagehide\", this._boundEvents.pageHide);\n\n    this._boundEvents = null;\n  }\n}\n\nfunction isDestHashesEqual(destHash, pushHash) {\n  if (typeof destHash !== \"string\" || typeof pushHash !== \"string\") {\n    return false;\n  }\n  if (destHash === pushHash) {\n    return true;\n  }\n  const { nameddest } = parseQueryString(destHash);\n  if (nameddest === pushHash) {\n    return true;\n  }\n  return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n  function isEntryEqual(first, second) {\n    if (typeof first !== typeof second) {\n      return false;\n    }\n    if (Array.isArray(first) || Array.isArray(second)) {\n      return false;\n    }\n    if (first !== null && typeof first === \"object\" && second !== null) {\n      if (Object.keys(first).length !== Object.keys(second).length) {\n        return false;\n      }\n      for (const key in first) {\n        if (!isEntryEqual(first[key], second[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return first === second || (Number.isNaN(first) && Number.isNaN(second));\n  }\n\n  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n    return false;\n  }\n  if (firstDest.length !== secondDest.length) {\n    return false;\n  }\n  for (let i = 0, ii = firstDest.length; i < ii; i++) {\n    if (!isEntryEqual(firstDest[i], secondDest[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport { PDFHistory, isDestHashesEqual, isDestArraysEqual };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  approximateFraction,\n  CSS_UNITS,\n  DEFAULT_SCALE,\n  getOutputScale,\n  NullL10n,\n  RendererType,\n  roundToDivide,\n  TextLayerMode,\n} from \"./ui_utils.js\";\nimport {\n  createPromiseCapability,\n  RenderingCancelledException,\n  SVGGraphics,\n} from \"pdfjs-lib\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} scale - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {AnnotationStorage} [annotationStorage] - Storage for annotation\n *   data in forms. The default value is `null`.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that is resolved with an {@link OptionalContentConfig} instance.\n *   The default value is `null`.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IPDFTextLayerFactory} textLayerFactory\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created, and if the improved text selection\n *   behaviour is enabled. The constants from {TextLayerMode} should be used.\n *   The default value is `TextLayerMode.ENABLE`.\n * @property {IPDFAnnotationLayerFactory} annotationLayerFactory\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms - Turns on rendering of\n *   interactive form elements. The default value is `true`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} [enableWebGL] - Enables WebGL accelerated rendering for\n *   some operations. The default value is `false`.\n * @property {boolean} [useOnlyCssZoom] - Enables CSS only zooming. The default\n *   value is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use -1 for no limit. The default value\n *   is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n */\n\nconst MAX_CANVAS_PIXELS = viewerCompatibilityParams.maxCanvasPixels || 16777216;\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFPageView {\n  /**\n   * @param {PDFPageViewOptions} options\n   */\n  constructor(options) {\n    const container = options.container;\n    const defaultViewport = options.defaultViewport;\n\n    this.id = options.id;\n    this.renderingId = \"page\" + this.id;\n\n    this.pdfPage = null;\n    this.pageLabel = null;\n    this.rotation = 0;\n    this.scale = options.scale || DEFAULT_SCALE;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._annotationStorage = options.annotationStorage || null;\n    this._optionalContentConfigPromise =\n      options.optionalContentConfigPromise || null;\n    this.hasRestrictedScaling = false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode)\n      ? options.textLayerMode\n      : TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.renderInteractiveForms =\n      typeof options.renderInteractiveForms === \"boolean\"\n        ? options.renderInteractiveForms\n        : true;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;\n\n    this.eventBus = options.eventBus;\n    this.renderingQueue = options.renderingQueue;\n    this.textLayerFactory = options.textLayerFactory;\n    this.annotationLayerFactory = options.annotationLayerFactory;\n    this.renderer = options.renderer || RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.l10n = options.l10n || NullL10n;\n\n    this.paintTask = null;\n    this.paintedViewportMap = new WeakMap();\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n    this.error = null;\n\n    this.annotationLayer = null;\n    this.textLayer = null;\n    this.zoomLayer = null;\n\n    const div = document.createElement(\"div\");\n    div.className = \"page\";\n    div.style.width = Math.floor(this.viewport.width) + \"px\";\n    div.style.height = Math.floor(this.viewport.height) + \"px\";\n    div.setAttribute(\"data-page-number\", this.id);\n    this.div = div;\n\n    container.appendChild(div);\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({\n      scale: this.scale * CSS_UNITS,\n      rotation: totalRotation,\n    });\n    this.stats = pdfPage.stats;\n    this.reset();\n  }\n\n  destroy() {\n    this.reset();\n    if (this.pdfPage) {\n      this.pdfPage.cleanup();\n    }\n  }\n\n  /**\n   * @private\n   */\n  async _renderAnnotationLayer() {\n    let error = null;\n    try {\n      await this.annotationLayer.render(this.viewport, \"display\");\n    } catch (ex) {\n      error = ex;\n    } finally {\n      this.eventBus.dispatch(\"annotationlayerrendered\", {\n        source: this,\n        pageNumber: this.id,\n        error,\n      });\n    }\n  }\n\n  /**\n   * @private\n   */\n  _resetZoomLayer(removeFromDOM = false) {\n    if (!this.zoomLayer) {\n      return;\n    }\n    const zoomLayerCanvas = this.zoomLayer.firstChild;\n    this.paintedViewportMap.delete(zoomLayerCanvas);\n    // Zeroing the width and height causes Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    zoomLayerCanvas.width = 0;\n    zoomLayerCanvas.height = 0;\n\n    if (removeFromDOM) {\n      // Note: `ChildNode.remove` doesn't throw if the parent node is undefined.\n      this.zoomLayer.remove();\n    }\n    this.zoomLayer = null;\n  }\n\n  reset(keepZoomLayer = false, keepAnnotations = false) {\n    this.cancelRendering(keepAnnotations);\n    this.renderingState = RenderingStates.INITIAL;\n\n    const div = this.div;\n    div.style.width = Math.floor(this.viewport.width) + \"px\";\n    div.style.height = Math.floor(this.viewport.height) + \"px\";\n\n    const childNodes = div.childNodes;\n    const currentZoomLayerNode = (keepZoomLayer && this.zoomLayer) || null;\n    const currentAnnotationNode =\n      (keepAnnotations && this.annotationLayer && this.annotationLayer.div) ||\n      null;\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      const node = childNodes[i];\n      if (currentZoomLayerNode === node || currentAnnotationNode === node) {\n        continue;\n      }\n      div.removeChild(node);\n    }\n    div.removeAttribute(\"data-loaded\");\n\n    if (currentAnnotationNode) {\n      // Hide the annotation layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.annotationLayer.hide();\n    } else if (this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n\n    if (!currentZoomLayerNode) {\n      if (this.canvas) {\n        this.paintedViewportMap.delete(this.canvas);\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n        delete this.canvas;\n      }\n      this._resetZoomLayer();\n    }\n    if (this.svg) {\n      this.paintedViewportMap.delete(this.svg);\n      delete this.svg;\n    }\n\n    this.loadingIconDiv = document.createElement(\"div\");\n    this.loadingIconDiv.className = \"loadingIcon\";\n    div.appendChild(this.loadingIconDiv);\n  }\n\n  update(scale, rotation, optionalContentConfigPromise = null) {\n    this.scale = scale || this.scale;\n    // The rotation may be zero.\n    if (typeof rotation !== \"undefined\") {\n      this.rotation = rotation;\n    }\n    if (optionalContentConfigPromise instanceof Promise) {\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n    }\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * CSS_UNITS,\n      rotation: totalRotation,\n    });\n\n    if (this.svg) {\n      this.cssTransform(this.svg, true);\n\n      this.eventBus.dispatch(\"pagerendered\", {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: true,\n        timestamp: performance.now(),\n      });\n      return;\n    }\n\n    let isScalingRestricted = false;\n    if (this.canvas && this.maxCanvasPixels > 0) {\n      const outputScale = this.outputScale;\n      if (\n        ((Math.floor(this.viewport.width) * outputScale.sx) | 0) *\n          ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >\n        this.maxCanvasPixels\n      ) {\n        isScalingRestricted = true;\n      }\n    }\n\n    if (this.canvas) {\n      if (\n        this.useOnlyCssZoom ||\n        (this.hasRestrictedScaling && isScalingRestricted)\n      ) {\n        this.cssTransform(this.canvas, true);\n\n        this.eventBus.dispatch(\"pagerendered\", {\n          source: this,\n          pageNumber: this.id,\n          cssTransform: true,\n          timestamp: performance.now(),\n        });\n        return;\n      }\n      if (!this.zoomLayer && !this.canvas.hasAttribute(\"hidden\")) {\n        this.zoomLayer = this.canvas.parentNode;\n        this.zoomLayer.style.position = \"absolute\";\n      }\n    }\n    if (this.zoomLayer) {\n      this.cssTransform(this.zoomLayer.firstChild);\n    }\n    this.reset(/* keepZoomLayer = */ true, /* keepAnnotations = */ true);\n  }\n\n  /**\n   * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n   *              rather than calling this one directly.\n   */\n  cancelRendering(keepAnnotations = false) {\n    if (this.paintTask) {\n      this.paintTask.cancel();\n      this.paintTask = null;\n    }\n    this.resume = null;\n\n    if (this.textLayer) {\n      this.textLayer.cancel();\n      this.textLayer = null;\n    }\n    if (!keepAnnotations && this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n  }\n\n  cssTransform(target, redrawAnnotations = false) {\n    // Scale target (canvas or svg), its wrapper and page container.\n    const width = this.viewport.width;\n    const height = this.viewport.height;\n    const div = this.div;\n    target.style.width = target.parentNode.style.width = div.style.width =\n      Math.floor(width) + \"px\";\n    target.style.height = target.parentNode.style.height = div.style.height =\n      Math.floor(height) + \"px\";\n    // The canvas may have been originally rotated; rotate relative to that.\n    const relativeRotation =\n      this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n    const absRotation = Math.abs(relativeRotation);\n    let scaleX = 1,\n      scaleY = 1;\n    if (absRotation === 90 || absRotation === 270) {\n      // Scale x and y because of the rotation.\n      scaleX = height / width;\n      scaleY = width / height;\n    }\n    const cssTransform =\n      \"rotate(\" +\n      relativeRotation +\n      \"deg) \" +\n      \"scale(\" +\n      scaleX +\n      \",\" +\n      scaleY +\n      \")\";\n    target.style.transform = cssTransform;\n\n    if (this.textLayer) {\n      // Rotating the text layer is more complicated since the divs inside the\n      // the text layer are rotated.\n      // TODO: This could probably be simplified by drawing the text layer in\n      // one orientation and then rotating overall.\n      const textLayerViewport = this.textLayer.viewport;\n      const textRelativeRotation =\n        this.viewport.rotation - textLayerViewport.rotation;\n      const textAbsRotation = Math.abs(textRelativeRotation);\n      let scale = width / textLayerViewport.width;\n      if (textAbsRotation === 90 || textAbsRotation === 270) {\n        scale = width / textLayerViewport.height;\n      }\n      const textLayerDiv = this.textLayer.textLayerDiv;\n      let transX, transY;\n      switch (textAbsRotation) {\n        case 0:\n          transX = transY = 0;\n          break;\n        case 90:\n          transX = 0;\n          transY = \"-\" + textLayerDiv.style.height;\n          break;\n        case 180:\n          transX = \"-\" + textLayerDiv.style.width;\n          transY = \"-\" + textLayerDiv.style.height;\n          break;\n        case 270:\n          transX = \"-\" + textLayerDiv.style.width;\n          transY = 0;\n          break;\n        default:\n          console.error(\"Bad rotation value.\");\n          break;\n      }\n\n      textLayerDiv.style.transform =\n        \"rotate(\" +\n        textAbsRotation +\n        \"deg) \" +\n        \"scale(\" +\n        scale +\n        \", \" +\n        scale +\n        \") \" +\n        \"translate(\" +\n        transX +\n        \", \" +\n        transY +\n        \")\";\n      textLayerDiv.style.transformOrigin = \"0% 0%\";\n    }\n\n    if (redrawAnnotations && this.annotationLayer) {\n      this._renderAnnotationLayer();\n    }\n  }\n\n  get width() {\n    return this.viewport.width;\n  }\n\n  get height() {\n    return this.viewport.height;\n  }\n\n  getPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  }\n\n  draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      this.reset(); // Ensure that we reset all state to prevent issues.\n    }\n    const { div, pdfPage } = this;\n\n    if (!pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n\n      if (this.loadingIconDiv) {\n        div.removeChild(this.loadingIconDiv);\n        delete this.loadingIconDiv;\n      }\n      return Promise.reject(new Error(\"pdfPage is not loaded\"));\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    // Wrap the canvas so that if it has a CSS transform for high DPI the\n    // overflow will be hidden in Firefox.\n    const canvasWrapper = document.createElement(\"div\");\n    canvasWrapper.style.width = div.style.width;\n    canvasWrapper.style.height = div.style.height;\n    canvasWrapper.classList.add(\"canvasWrapper\");\n\n    if (this.annotationLayer && this.annotationLayer.div) {\n      // The annotation layer needs to stay on top.\n      div.insertBefore(canvasWrapper, this.annotationLayer.div);\n    } else {\n      div.appendChild(canvasWrapper);\n    }\n\n    let textLayer = null;\n    if (this.textLayerMode !== TextLayerMode.DISABLE && this.textLayerFactory) {\n      const textLayerDiv = document.createElement(\"div\");\n      textLayerDiv.className = \"textLayer\";\n      textLayerDiv.style.width = canvasWrapper.style.width;\n      textLayerDiv.style.height = canvasWrapper.style.height;\n      if (this.annotationLayer && this.annotationLayer.div) {\n        // The annotation layer needs to stay on top.\n        div.insertBefore(textLayerDiv, this.annotationLayer.div);\n      } else {\n        div.appendChild(textLayerDiv);\n      }\n\n      textLayer = this.textLayerFactory.createTextLayerBuilder(\n        textLayerDiv,\n        this.id - 1,\n        this.viewport,\n        this.textLayerMode === TextLayerMode.ENABLE_ENHANCE,\n        this.eventBus\n      );\n    }\n    this.textLayer = textLayer;\n\n    let renderContinueCallback = null;\n    if (this.renderingQueue) {\n      renderContinueCallback = cont => {\n        if (!this.renderingQueue.isHighestPriority(this)) {\n          this.renderingState = RenderingStates.PAUSED;\n          this.resume = () => {\n            this.renderingState = RenderingStates.RUNNING;\n            cont();\n          };\n          return;\n        }\n        cont();\n      };\n    }\n\n    const finishPaintTask = async error => {\n      // The paintTask may have been replaced by a new one, so only remove\n      // the reference to the paintTask if it matches the one that is\n      // triggering this callback.\n      if (paintTask === this.paintTask) {\n        this.paintTask = null;\n      }\n\n      if (error instanceof RenderingCancelledException) {\n        this.error = null;\n        return;\n      }\n\n      this.renderingState = RenderingStates.FINISHED;\n\n      if (this.loadingIconDiv) {\n        div.removeChild(this.loadingIconDiv);\n        delete this.loadingIconDiv;\n      }\n      this._resetZoomLayer(/* removeFromDOM = */ true);\n\n      this.error = error;\n      this.stats = pdfPage.stats;\n\n      this.eventBus.dispatch(\"pagerendered\", {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: false,\n        timestamp: performance.now(),\n      });\n\n      if (error) {\n        throw error;\n      }\n    };\n\n    const paintTask =\n      this.renderer === RendererType.SVG\n        ? this.paintOnSvg(canvasWrapper)\n        : this.paintOnCanvas(canvasWrapper);\n    paintTask.onRenderContinue = renderContinueCallback;\n    this.paintTask = paintTask;\n\n    const resultPromise = paintTask.promise.then(\n      function () {\n        return finishPaintTask(null).then(function () {\n          if (textLayer) {\n            const readableStream = pdfPage.streamTextContent({\n              normalizeWhitespace: true,\n            });\n            textLayer.setTextContentStream(readableStream);\n            textLayer.render();\n          }\n        });\n      },\n      function (reason) {\n        return finishPaintTask(reason);\n      }\n    );\n\n    if (this.annotationLayerFactory) {\n      if (!this.annotationLayer) {\n        this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(\n          div,\n          pdfPage,\n          this._annotationStorage,\n          this.imageResourcesPath,\n          this.renderInteractiveForms,\n          this.l10n\n        );\n      }\n      this._renderAnnotationLayer();\n    }\n    div.setAttribute(\"data-loaded\", true);\n\n    this.eventBus.dispatch(\"pagerender\", {\n      source: this,\n      pageNumber: this.id,\n    });\n    return resultPromise;\n  }\n\n  paintOnCanvas(canvasWrapper) {\n    const renderCapability = createPromiseCapability();\n    const result = {\n      promise: renderCapability.promise,\n      onRenderContinue(cont) {\n        cont();\n      },\n      cancel() {\n        renderTask.cancel();\n      },\n    };\n\n    const viewport = this.viewport;\n    const canvas = document.createElement(\"canvas\");\n    this.l10n\n      .get(\"page_canvas\", { page: this.id }, \"Page {{page}}\")\n      .then(msg => {\n        canvas.setAttribute(\"aria-label\", msg);\n      });\n\n    // Keep the canvas hidden until the first draw callback, or until drawing\n    // is complete when `!this.renderingQueue`, to prevent black flickering.\n    canvas.setAttribute(\"hidden\", \"hidden\");\n    let isCanvasHidden = true;\n    const showCanvas = function () {\n      if (isCanvasHidden) {\n        canvas.removeAttribute(\"hidden\");\n        isCanvasHidden = false;\n      }\n    };\n\n    canvasWrapper.appendChild(canvas);\n    this.canvas = canvas;\n\n    if (\n      typeof PDFJSDev === \"undefined\" ||\n      PDFJSDev.test(\"MOZCENTRAL || GENERIC\")\n    ) {\n      canvas.mozOpaque = true;\n    }\n\n    const ctx = canvas.getContext(\"2d\", { alpha: false });\n    const outputScale = getOutputScale(ctx);\n    this.outputScale = outputScale;\n\n    if (this.useOnlyCssZoom) {\n      const actualSizeViewport = viewport.clone({ scale: CSS_UNITS });\n      // Use a scale that makes the canvas have the originally intended size\n      // of the page.\n      outputScale.sx *= actualSizeViewport.width / viewport.width;\n      outputScale.sy *= actualSizeViewport.height / viewport.height;\n      outputScale.scaled = true;\n    }\n\n    if (this.maxCanvasPixels > 0) {\n      const pixelsInViewport = viewport.width * viewport.height;\n      const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n      if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n        outputScale.sx = maxScale;\n        outputScale.sy = maxScale;\n        outputScale.scaled = true;\n        this.hasRestrictedScaling = true;\n      } else {\n        this.hasRestrictedScaling = false;\n      }\n    }\n\n    const sfx = approximateFraction(outputScale.sx);\n    const sfy = approximateFraction(outputScale.sy);\n    canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n    canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n    canvas.style.width = roundToDivide(viewport.width, sfx[1]) + \"px\";\n    canvas.style.height = roundToDivide(viewport.height, sfy[1]) + \"px\";\n    // Add the viewport so it's known what it was originally drawn with.\n    this.paintedViewportMap.set(canvas, viewport);\n\n    // Rendering area\n    const transform = !outputScale.scaled\n      ? null\n      : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n    const renderContext = {\n      canvasContext: ctx,\n      transform,\n      viewport: this.viewport,\n      enableWebGL: this.enableWebGL,\n      renderInteractiveForms: this.renderInteractiveForms,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n    };\n    const renderTask = this.pdfPage.render(renderContext);\n    renderTask.onContinue = function (cont) {\n      showCanvas();\n      if (result.onRenderContinue) {\n        result.onRenderContinue(cont);\n      } else {\n        cont();\n      }\n    };\n\n    renderTask.promise.then(\n      function () {\n        showCanvas();\n        renderCapability.resolve(undefined);\n      },\n      function (error) {\n        showCanvas();\n        renderCapability.reject(error);\n      }\n    );\n    return result;\n  }\n\n  paintOnSvg(wrapper) {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"MOZCENTRAL || CHROME\")\n    ) {\n      // Return a mock object, to prevent errors such as e.g.\n      // \"TypeError: paintTask.promise is undefined\".\n      return {\n        promise: Promise.reject(new Error(\"SVG rendering is not supported.\")),\n        onRenderContinue(cont) {},\n        cancel() {},\n      };\n    }\n\n    let cancelled = false;\n    const ensureNotCancelled = () => {\n      if (cancelled) {\n        throw new RenderingCancelledException(\n          `Rendering cancelled, page ${this.id}`,\n          \"svg\"\n        );\n      }\n    };\n\n    const pdfPage = this.pdfPage;\n    const actualSizeViewport = this.viewport.clone({ scale: CSS_UNITS });\n    const promise = pdfPage.getOperatorList().then(opList => {\n      ensureNotCancelled();\n      const svgGfx = new SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\n      return svgGfx.getSVG(opList, actualSizeViewport).then(svg => {\n        ensureNotCancelled();\n        this.svg = svg;\n        this.paintedViewportMap.set(svg, actualSizeViewport);\n\n        svg.style.width = wrapper.style.width;\n        svg.style.height = wrapper.style.height;\n        this.renderingState = RenderingStates.FINISHED;\n        wrapper.appendChild(svg);\n      });\n    });\n\n    return {\n      promise,\n      onRenderContinue(cont) {\n        cont();\n      },\n      cancel() {\n        cancelled = true;\n      },\n    };\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n\n    if (this.pageLabel !== null) {\n      this.div.setAttribute(\"data-page-label\", this.pageLabel);\n    } else {\n      this.div.removeAttribute(\"data-page-label\");\n    }\n  }\n}\n\nexport { PDFPageView };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CLEANUP_TIMEOUT = 30000;\n\nconst RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3,\n};\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n */\nclass PDFRenderingQueue {\n  constructor() {\n    this.pdfViewer = null;\n    this.pdfThumbnailViewer = null;\n    this.onIdle = null;\n    this.highestPriorityPage = null;\n    this.idleTimeout = null;\n    this.printing = false;\n    this.isThumbnailViewEnabled = false;\n  }\n\n  /**\n   * @param {PDFViewer} pdfViewer\n   */\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  /**\n   * @param {PDFThumbnailViewer} pdfThumbnailViewer\n   */\n  setThumbnailViewer(pdfThumbnailViewer) {\n    this.pdfThumbnailViewer = pdfThumbnailViewer;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isHighestPriority(view) {\n    return this.highestPriorityPage === view.renderingId;\n  }\n\n  /**\n   * @param {Object} currentlyVisiblePages\n   */\n  renderHighestPriority(currentlyVisiblePages) {\n    if (this.idleTimeout) {\n      clearTimeout(this.idleTimeout);\n      this.idleTimeout = null;\n    }\n\n    // Pages have a higher priority than thumbnails, so check them first.\n    if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n      return;\n    }\n    // No pages needed rendering, so check thumbnails.\n    if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n      if (this.pdfThumbnailViewer.forceRendering()) {\n        return;\n      }\n    }\n\n    if (this.printing) {\n      // If printing is currently ongoing do not reschedule cleanup.\n      return;\n    }\n\n    if (this.onIdle) {\n      this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n    }\n  }\n\n  /**\n   * @param {Object} visible\n   * @param {Array} views\n   * @param {boolean} scrolledDown\n   */\n  getHighestPriority(visible, views, scrolledDown) {\n    /**\n     * The state has changed. Figure out which page has the highest priority to\n     * render next (if any).\n     *\n     * Priority:\n     * 1. visible pages\n     * 2. if last scrolled down, the page after the visible pages, or\n     *    if last scrolled up, the page before the visible pages\n     */\n    const visibleViews = visible.views;\n\n    const numVisible = visibleViews.length;\n    if (numVisible === 0) {\n      return null;\n    }\n    for (let i = 0; i < numVisible; ++i) {\n      const view = visibleViews[i].view;\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n\n    // All the visible views have rendered; try to render next/previous pages.\n    if (scrolledDown) {\n      const nextPageIndex = visible.last.id;\n      // IDs start at 1, so no need to add 1.\n      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n        return views[nextPageIndex];\n      }\n    } else {\n      const previousPageIndex = visible.first.id - 2;\n      if (\n        views[previousPageIndex] &&\n        !this.isViewFinished(views[previousPageIndex])\n      ) {\n        return views[previousPageIndex];\n      }\n    }\n    // Everything that needs to be rendered has been.\n    return null;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  }\n\n  /**\n   * Render a page or thumbnail view. This calls the appropriate function\n   * based on the views state. If the view is already rendered it will return\n   * `false`.\n   *\n   * @param {IRenderableView} view\n   */\n  renderView(view) {\n    switch (view.renderingState) {\n      case RenderingStates.FINISHED:\n        return false;\n      case RenderingStates.PAUSED:\n        this.highestPriorityPage = view.renderingId;\n        view.resume();\n        break;\n      case RenderingStates.RUNNING:\n        this.highestPriorityPage = view.renderingId;\n        break;\n      case RenderingStates.INITIAL:\n        this.highestPriorityPage = view.renderingId;\n        view\n          .draw()\n          .finally(() => {\n            this.renderHighestPriority();\n          })\n          .catch(reason => {\n            console.error(`renderView: \"${reason}\"`);\n          });\n        break;\n    }\n    return true;\n  }\n}\n\nexport { RenderingStates, PDFRenderingQueue };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseViewer } from \"./base_viewer.js\";\nimport { shadow } from \"pdfjs-lib\";\n\nclass PDFSinglePageViewer extends BaseViewer {\n  constructor(options) {\n    super(options);\n\n    this.eventBus._on(\"pagesinit\", evt => {\n      // Since the pages are placed in a `DocumentFragment`, make sure that\n      // the current page becomes visible upon loading of the document.\n      this._ensurePageViewVisible();\n    });\n  }\n\n  get _viewerElement() {\n    // Since we only want to display *one* page at a time when using the\n    // `PDFSinglePageViewer`, we cannot append them to the `viewer` DOM element.\n    // Instead, they are placed in a `DocumentFragment`, and only the current\n    // page is displayed in the viewer (refer to `this._ensurePageViewVisible`).\n    return shadow(this, \"_viewerElement\", this._shadowViewer);\n  }\n\n  _resetView() {\n    super._resetView();\n    this._previousPageNumber = 1;\n    this._shadowViewer = document.createDocumentFragment();\n    this._updateScrollDown = null;\n  }\n\n  _ensurePageViewVisible() {\n    const pageView = this._pages[this._currentPageNumber - 1];\n    const previousPageView = this._pages[this._previousPageNumber - 1];\n\n    const viewerNodes = this.viewer.childNodes;\n    switch (viewerNodes.length) {\n      case 0: // Should *only* occur on initial loading.\n        this.viewer.appendChild(pageView.div);\n        break;\n      case 1: // The normal page-switching case.\n        if (viewerNodes[0] !== previousPageView.div) {\n          throw new Error(\n            \"_ensurePageViewVisible: Unexpected previously visible page.\"\n          );\n        }\n        if (pageView === previousPageView) {\n          break; // The correct page is already visible.\n        }\n        // Switch visible pages, and reset the viewerContainer scroll position.\n        this._shadowViewer.appendChild(previousPageView.div);\n        this.viewer.appendChild(pageView.div);\n\n        this.container.scrollTop = 0;\n        break;\n      default:\n        throw new Error(\n          \"_ensurePageViewVisible: Only one page should be visible at a time.\"\n        );\n    }\n    this._previousPageNumber = this._currentPageNumber;\n  }\n\n  _scrollUpdate() {\n    if (this._updateScrollDown) {\n      this._updateScrollDown();\n    }\n    super._scrollUpdate();\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n    if (pageNumber) {\n      // Ensure that `this._currentPageNumber` is correct.\n      this._setCurrentPageNumber(pageNumber);\n    }\n    const scrolledDown = this._currentPageNumber >= this._previousPageNumber;\n\n    this._ensurePageViewVisible();\n    // Ensure that rendering always occurs, to avoid showing a blank page,\n    // even if the current position doesn't change when the page is scrolled.\n    this.update();\n\n    super._scrollIntoView({ pageDiv, pageSpot, pageNumber });\n\n    // Since scrolling is tracked using `requestAnimationFrame`, update the\n    // scroll direction during the next `this._scrollUpdate` invocation.\n    this._updateScrollDown = () => {\n      this.scroll.down = scrolledDown;\n      this._updateScrollDown = null;\n    };\n  }\n\n  _getVisiblePages() {\n    return this._getCurrentVisiblePage();\n  }\n\n  _updateHelper(visiblePages) {}\n\n  get _isScrollModeHorizontal() {\n    // The Scroll/Spread modes are never used in `PDFSinglePageViewer`.\n    return shadow(this, \"_isScrollModeHorizontal\", false);\n  }\n\n  _updateScrollMode() {}\n\n  _updateSpreadMode() {}\n}\n\nexport { PDFSinglePageViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  CSS_UNITS,\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_VALUE,\n  getVisibleElements,\n  isPortraitOrientation,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  MAX_AUTO_SCALE,\n  moveToEndOfArray,\n  NullL10n,\n  PresentationModeState,\n  RendererType,\n  SCROLLBAR_PADDING,\n  scrollIntoView,\n  ScrollMode,\n  SpreadMode,\n  TextLayerMode,\n  UNKNOWN_SCALE,\n  VERTICAL_PADDING,\n  watchScroll,\n} from \"./ui_utils.js\";\nimport { PDFRenderingQueue, RenderingStates } from \"./pdf_rendering_queue.js\";\nimport { AnnotationLayerBuilder } from \"./annotation_layer_builder.js\";\nimport { createPromiseCapability } from \"pdfjs-lib\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\nimport { TextLayerBuilder } from \"./text_layer_builder.js\";\n\nconst DEFAULT_CACHE_SIZE = 10;\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} [viewer] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {DownloadManager} [downloadManager] - The download manager\n *   component.\n * @property {PDFFindController} [findController] - The find controller\n *   component.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {boolean} [removePageBorders] - Removes the border shadow around\n *   the pages. The default value is `false`.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created, and if the improved text selection\n *   behaviour is enabled. The constants from {TextLayerMode} should be used.\n *   The default value is `TextLayerMode.ENABLE`.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} [renderInteractiveForms] - Enables rendering of\n *   interactive form elements. The default value is `true`.\n * @property {boolean} [enablePrintAutoRotate] - Enables automatic rotation of\n *   landscape pages upon printing. The default is `false`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} [enableWebGL] - Enables WebGL accelerated rendering for\n *   some operations. The default value is `false`.\n * @property {boolean} [useOnlyCssZoom] - Enables CSS only zooming. The default\n *   value is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use -1 for no limit. The default value\n *   is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n */\n\nfunction PDFPageViewBuffer(size) {\n  const data = [];\n  this.push = function (view) {\n    const i = data.indexOf(view);\n    if (i >= 0) {\n      data.splice(i, 1);\n    }\n    data.push(view);\n    if (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n  /**\n   * After calling resize, the size of the buffer will be newSize. The optional\n   * parameter pagesToKeep is, if present, an array of pages to push to the back\n   * of the buffer, delaying their destruction. The size of pagesToKeep has no\n   * impact on the final size of the buffer; if pagesToKeep has length larger\n   * than newSize, some of those pages will be destroyed anyway.\n   */\n  this.resize = function (newSize, pagesToKeep) {\n    size = newSize;\n    if (pagesToKeep) {\n      const pageIdsToKeep = new Set();\n      for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {\n        pageIdsToKeep.add(pagesToKeep[i].id);\n      }\n      moveToEndOfArray(data, function (page) {\n        return pageIdsToKeep.has(page.id);\n      });\n    }\n    while (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n}\n\nfunction isSameScale(oldScale, newScale) {\n  if (newScale === oldScale) {\n    return true;\n  }\n  if (Math.abs(newScale - oldScale) < 1e-15) {\n    // Prevent unnecessary re-rendering of all pages when the scale\n    // changes only because of limited numerical precision.\n    return true;\n  }\n  return false;\n}\n\n/**\n * Simple viewer control to display PDF content/pages.\n * @implements {IRenderableView}\n */\nclass BaseViewer {\n  /**\n   * @param {PDFViewerOptions} options\n   */\n  constructor(options) {\n    if (this.constructor === BaseViewer) {\n      throw new Error(\"Cannot initialize BaseViewer.\");\n    }\n    this._name = this.constructor.name;\n\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n\n    if (\n      (typeof PDFJSDev === \"undefined\" ||\n        PDFJSDev.test(\"!PRODUCTION || GENERIC\")) &&\n      !(\n        this.container instanceof HTMLDivElement &&\n        this.viewer instanceof HTMLDivElement\n      )\n    ) {\n      throw new Error(\"Invalid `container` and/or `viewer` option.\");\n    }\n    this.eventBus = options.eventBus;\n    this.linkService = options.linkService || new SimpleLinkService();\n    this.downloadManager = options.downloadManager || null;\n    this.findController = options.findController || null;\n    this.removePageBorders = options.removePageBorders || false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode)\n      ? options.textLayerMode\n      : TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.renderInteractiveForms =\n      typeof options.renderInteractiveForms === \"boolean\"\n        ? options.renderInteractiveForms\n        : true;\n    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n    this.renderer = options.renderer || RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels;\n    this.l10n = options.l10n || NullL10n;\n\n    this.defaultRenderingQueue = !options.renderingQueue;\n    if (this.defaultRenderingQueue) {\n      // Custom rendering queue is not specified, using default one\n      this.renderingQueue = new PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));\n    this.presentationModeState = PresentationModeState.UNKNOWN;\n    this._onBeforeDraw = this._onAfterDraw = null;\n    this._resetView();\n\n    if (this.removePageBorders) {\n      this.viewer.classList.add(\"removePageBorders\");\n    }\n    // Defer the dispatching of this event, to give other viewer components\n    // time to initialize *and* register 'baseviewerinit' event listeners.\n    Promise.resolve().then(() => {\n      this.eventBus.dispatch(\"baseviewerinit\", { source: this });\n    });\n  }\n\n  get pagesCount() {\n    return this._pages.length;\n  }\n\n  getPageView(index) {\n    return this._pages[index];\n  }\n\n  /**\n   * @type {boolean} - True if all {PDFPageView} objects are initialized.\n   */\n  get pageViewsReady() {\n    if (!this._pagesCapability.settled) {\n      return false;\n    }\n    // Prevent printing errors when 'disableAutoFetch' is set, by ensuring\n    // that *all* pages have in fact been completely loaded.\n    return this._pages.every(function (pageView) {\n      return pageView && pageView.pdfPage;\n    });\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentPageNumber() {\n    return this._currentPageNumber;\n  }\n\n  /**\n   * @param {number} val - The page number.\n   */\n  set currentPageNumber(val) {\n    if (!Number.isInteger(val)) {\n      throw new Error(\"Invalid page number.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(val, /* resetCurrentPageView = */ true)) {\n      console.error(\n        `${this._name}.currentPageNumber: \"${val}\" is not a valid page.`\n      );\n    }\n  }\n\n  /**\n   * @returns {boolean} Whether the pageNumber is valid (within bounds).\n   * @private\n   */\n  _setCurrentPageNumber(val, resetCurrentPageView = false) {\n    if (this._currentPageNumber === val) {\n      if (resetCurrentPageView) {\n        this._resetCurrentPageView();\n      }\n      return true;\n    }\n\n    if (!(0 < val && val <= this.pagesCount)) {\n      return false;\n    }\n    this._currentPageNumber = val;\n\n    this.eventBus.dispatch(\"pagechanging\", {\n      source: this,\n      pageNumber: val,\n      pageLabel: this._pageLabels && this._pageLabels[val - 1],\n    });\n\n    if (resetCurrentPageView) {\n      this._resetCurrentPageView();\n    }\n    return true;\n  }\n\n  /**\n   * @type {string|null} Returns the current page label, or `null` if no page\n   *   labels exist.\n   */\n  get currentPageLabel() {\n    return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\n  }\n\n  /**\n   * @param {string} val - The page label.\n   */\n  set currentPageLabel(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let page = val | 0; // Fallback page number.\n    if (this._pageLabels) {\n      const i = this._pageLabels.indexOf(val);\n      if (i >= 0) {\n        page = i + 1;\n      }\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(page, /* resetCurrentPageView = */ true)) {\n      console.error(\n        `${this._name}.currentPageLabel: \"${val}\" is not a valid page.`\n      );\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentScale() {\n    return this._currentScale !== UNKNOWN_SCALE\n      ? this._currentScale\n      : DEFAULT_SCALE;\n  }\n\n  /**\n   * @param {number} val - Scale of the pages in percents.\n   */\n  set currentScale(val) {\n    if (isNaN(val)) {\n      throw new Error(\"Invalid numeric scale.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    this._setScale(val, false);\n  }\n\n  /**\n   * @type {string}\n   */\n  get currentScaleValue() {\n    return this._currentScaleValue;\n  }\n\n  /**\n   * @param val - The scale of the pages (in percent or predefined value).\n   */\n  set currentScaleValue(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    this._setScale(val, false);\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  /**\n   * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n   */\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error(\"Invalid pages rotation angle.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this._pagesRotation = rotation;\n\n    const pageNumber = this._currentPageNumber;\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      const pageView = this._pages[i];\n      pageView.update(pageView.scale, rotation);\n    }\n    // Prevent errors in case the rotation changes *before* the scale has been\n    // set to a non-default value.\n    if (this._currentScaleValue) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    this.eventBus.dispatch(\"rotationchanging\", {\n      source: this,\n      pagesRotation: rotation,\n      pageNumber,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get firstPagePromise() {\n    return this.pdfDocument ? this._firstPageCapability.promise : null;\n  }\n\n  get onePageRendered() {\n    return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n  }\n\n  get pagesPromise() {\n    return this.pdfDocument ? this._pagesCapability.promise : null;\n  }\n\n  /**\n   * @private\n   */\n  get _viewerElement() {\n    // In most viewers, e.g. `PDFViewer`, this should return `this.viewer`.\n    throw new Error(\"Not implemented: _viewerElement\");\n  }\n\n  /**\n   * @private\n   */\n  _onePageRenderedOrForceFetch() {\n    // Unless the viewer *and* its pages are visible, rendering won't start and\n    // `this._onePageRenderedCapability` thus won't be resolved.\n    // To ensure that automatic printing, on document load, still works even in\n    // those cases we force-allow fetching of all pages when:\n    //  - The viewer is hidden in the DOM, e.g. in a `display: none` <iframe>\n    //    element; fixes bug 1618621.\n    //  - The viewer is visible, but none of the pages are (e.g. if the\n    //    viewer is very small); fixes bug 1618955.\n    if (\n      !this.container.offsetParent ||\n      this._getVisiblePages().views.length === 0\n    ) {\n      return Promise.resolve();\n    }\n    return this._onePageRenderedCapability.promise;\n  }\n\n  /**\n   * @param pdfDocument {PDFDocument}\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this._cancelRendering();\n      this._resetView();\n\n      if (this.findController) {\n        this.findController.setDocument(null);\n      }\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n    const pagesCount = pdfDocument.numPages;\n    const firstPagePromise = pdfDocument.getPage(1);\n\n    const annotationStorage = pdfDocument.annotationStorage;\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n\n    this._pagesCapability.promise.then(() => {\n      this.eventBus.dispatch(\"pagesloaded\", {\n        source: this,\n        pagesCount,\n      });\n    });\n\n    this._onBeforeDraw = evt => {\n      const pageView = this._pages[evt.pageNumber - 1];\n      if (!pageView) {\n        return;\n      }\n      // Add the page to the buffer at the start of drawing. That way it can be\n      // evicted from the buffer and destroyed even if we pause its rendering.\n      this._buffer.push(pageView);\n    };\n    this.eventBus._on(\"pagerender\", this._onBeforeDraw);\n\n    this._onAfterDraw = evt => {\n      if (evt.cssTransform || this._onePageRenderedCapability.settled) {\n        return;\n      }\n      this._onePageRenderedCapability.resolve();\n\n      this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n      this._onAfterDraw = null;\n    };\n    this.eventBus._on(\"pagerendered\", this._onAfterDraw);\n\n    // Fetch a single page so we can get a viewport that will be the default\n    // viewport for all pages\n    firstPagePromise\n      .then(firstPdfPage => {\n        this._firstPageCapability.resolve(firstPdfPage);\n        this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n        const scale = this.currentScale;\n        const viewport = firstPdfPage.getViewport({ scale: scale * CSS_UNITS });\n        const textLayerFactory =\n          this.textLayerMode !== TextLayerMode.DISABLE ? this : null;\n\n        for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          const pageView = new PDFPageView({\n            container: this._viewerElement,\n            eventBus: this.eventBus,\n            id: pageNum,\n            scale,\n            defaultViewport: viewport.clone(),\n            annotationStorage,\n            optionalContentConfigPromise,\n            renderingQueue: this.renderingQueue,\n            textLayerFactory,\n            textLayerMode: this.textLayerMode,\n            annotationLayerFactory: this,\n            imageResourcesPath: this.imageResourcesPath,\n            renderInteractiveForms: this.renderInteractiveForms,\n            renderer: this.renderer,\n            enableWebGL: this.enableWebGL,\n            useOnlyCssZoom: this.useOnlyCssZoom,\n            maxCanvasPixels: this.maxCanvasPixels,\n            l10n: this.l10n,\n          });\n          this._pages.push(pageView);\n        }\n        // Set the first `pdfPage` immediately, since it's already loaded,\n        // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n        // the `this._ensurePdfPageLoaded` method before rendering can start.\n        const firstPageView = this._pages[0];\n        if (firstPageView) {\n          firstPageView.setPdfPage(firstPdfPage);\n          this.linkService.cachePageRef(1, firstPdfPage.ref);\n        }\n        if (this._spreadMode !== SpreadMode.NONE) {\n          this._updateSpreadMode();\n        }\n\n        // Fetch all the pages since the viewport is needed before printing\n        // starts to create the correct size canvas. Wait until one page is\n        // rendered so we don't tie up too many resources early on.\n        this._onePageRenderedOrForceFetch().then(() => {\n          if (this.findController) {\n            this.findController.setDocument(pdfDocument); // Enable searching.\n          }\n\n          // In addition to 'disableAutoFetch' being set, also attempt to reduce\n          // resource usage when loading *very* long/large documents.\n          if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {\n            // XXX: Printing is semi-broken with auto fetch disabled.\n            this._pagesCapability.resolve();\n            return;\n          }\n          let getPagesLeft = pagesCount - 1; // The first page was already loaded.\n\n          if (getPagesLeft <= 0) {\n            this._pagesCapability.resolve();\n            return;\n          }\n          for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {\n            pdfDocument.getPage(pageNum).then(\n              pdfPage => {\n                const pageView = this._pages[pageNum - 1];\n                if (!pageView.pdfPage) {\n                  pageView.setPdfPage(pdfPage);\n                }\n                this.linkService.cachePageRef(pageNum, pdfPage.ref);\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              },\n              reason => {\n                console.error(\n                  `Unable to get page ${pageNum} to initialize viewer`,\n                  reason\n                );\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              }\n            );\n          }\n        });\n\n        this.eventBus.dispatch(\"pagesinit\", { source: this });\n\n        if (this.defaultRenderingQueue) {\n          this.update();\n        }\n      })\n      .catch(reason => {\n        console.error(\"Unable to initialize viewer\", reason);\n      });\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (\n      !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n    ) {\n      this._pageLabels = null;\n      console.error(`${this._name}.setPageLabels: Invalid page labels.`);\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFPageView` instances.\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      const pageView = this._pages[i];\n      const label = this._pageLabels && this._pageLabels[i];\n      pageView.setPageLabel(label);\n    }\n  }\n\n  _resetView() {\n    this._pages = [];\n    this._currentPageNumber = 1;\n    this._currentScale = UNKNOWN_SCALE;\n    this._currentScaleValue = null;\n    this._pageLabels = null;\n    this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n    this._location = null;\n    this._pagesRotation = 0;\n    this._optionalContentConfigPromise = null;\n    this._pagesRequests = new WeakMap();\n    this._firstPageCapability = createPromiseCapability();\n    this._onePageRenderedCapability = createPromiseCapability();\n    this._pagesCapability = createPromiseCapability();\n    this._scrollMode = ScrollMode.VERTICAL;\n    this._spreadMode = SpreadMode.NONE;\n\n    if (this._onBeforeDraw) {\n      this.eventBus._off(\"pagerender\", this._onBeforeDraw);\n      this._onBeforeDraw = null;\n    }\n    if (this._onAfterDraw) {\n      this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n      this._onAfterDraw = null;\n    }\n    // Remove the pages from the DOM...\n    this.viewer.textContent = \"\";\n    // ... and reset the Scroll mode CSS class(es) afterwards.\n    this._updateScrollMode();\n  }\n\n  _scrollUpdate() {\n    if (this.pagesCount === 0) {\n      return;\n    }\n    this.update();\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n    scrollIntoView(pageDiv, pageSpot);\n  }\n\n  _setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {\n    this._currentScaleValue = newValue.toString();\n\n    if (isSameScale(this._currentScale, newScale)) {\n      if (preset) {\n        this.eventBus.dispatch(\"scalechanging\", {\n          source: this,\n          scale: newScale,\n          presetValue: newValue,\n        });\n      }\n      return;\n    }\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].update(newScale);\n    }\n    this._currentScale = newScale;\n\n    if (!noScroll) {\n      let page = this._currentPageNumber,\n        dest;\n      if (\n        this._location &&\n        !(this.isInPresentationMode || this.isChangingPresentationMode)\n      ) {\n        page = this._location.pageNumber;\n        dest = [\n          null,\n          { name: \"XYZ\" },\n          this._location.left,\n          this._location.top,\n          null,\n        ];\n      }\n      this.scrollPageIntoView({\n        pageNumber: page,\n        destArray: dest,\n        allowNegativeOffset: true,\n      });\n    }\n\n    this.eventBus.dispatch(\"scalechanging\", {\n      source: this,\n      scale: newScale,\n      presetValue: preset ? newValue : undefined,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  _setScale(value, noScroll = false) {\n    let scale = parseFloat(value);\n\n    if (scale > 0) {\n      this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ false);\n    } else {\n      const currentPage = this._pages[this._currentPageNumber - 1];\n      if (!currentPage) {\n        return;\n      }\n      const noPadding = this.isInPresentationMode || this.removePageBorders;\n      let hPadding = noPadding ? 0 : SCROLLBAR_PADDING;\n      let vPadding = noPadding ? 0 : VERTICAL_PADDING;\n\n      if (!noPadding && this._isScrollModeHorizontal) {\n        [hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.\n      }\n      const pageWidthScale =\n        ((this.container.clientWidth - hPadding) / currentPage.width) *\n        currentPage.scale;\n      const pageHeightScale =\n        ((this.container.clientHeight - vPadding) / currentPage.height) *\n        currentPage.scale;\n      switch (value) {\n        case \"page-actual\":\n          scale = 1;\n          break;\n        case \"page-width\":\n          scale = pageWidthScale;\n          break;\n        case \"page-height\":\n          scale = pageHeightScale;\n          break;\n        case \"page-fit\":\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n        case \"auto\":\n          // For pages in landscape mode, fit the page height to the viewer\n          // *unless* the page would thus become too wide to fit horizontally.\n          const horizontalScale = isPortraitOrientation(currentPage)\n            ? pageWidthScale\n            : Math.min(pageHeightScale, pageWidthScale);\n          scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n          break;\n        default:\n          console.error(\n            `${this._name}._setScale: \"${value}\" is an unknown zoom value.`\n          );\n          return;\n      }\n      this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ true);\n    }\n  }\n\n  /**\n   * Refreshes page view: scrolls to the current page and updates the scale.\n   * @private\n   */\n  _resetCurrentPageView() {\n    if (this.isInPresentationMode) {\n      // Fixes the case when PDF has different page sizes.\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    const pageView = this._pages[this._currentPageNumber - 1];\n    this._scrollIntoView({ pageDiv: pageView.div });\n  }\n\n  /**\n   * @typedef ScrollPageIntoViewParameters\n   * @property {number} pageNumber - The page number.\n   * @property {Array} [destArray] - The original PDF destination array, in the\n   *   format: <page-ref> </XYZ|/FitXXX> <args..>\n   * @property {boolean} [allowNegativeOffset] - Allow negative page offsets.\n   *   The default value is `false`.\n   * @property {boolean} [ignoreDestinationZoom] - Ignore the zoom argument in\n   *   the destination array. The default value is `false`.\n   */\n\n  /**\n   * Scrolls page into view.\n   * @param {ScrollPageIntoViewParameters} params\n   */\n  scrollPageIntoView({\n    pageNumber,\n    destArray = null,\n    allowNegativeOffset = false,\n    ignoreDestinationZoom = false,\n  }) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pageView =\n      Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n    if (!pageView) {\n      console.error(\n        `${this._name}.scrollPageIntoView: ` +\n          `\"${pageNumber}\" is not a valid pageNumber parameter.`\n      );\n      return;\n    }\n\n    if (this.isInPresentationMode || !destArray) {\n      this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n      return;\n    }\n    let x = 0,\n      y = 0;\n    let width = 0,\n      height = 0,\n      widthScale,\n      heightScale;\n    const changeOrientation = pageView.rotation % 180 !== 0;\n    const pageWidth =\n      (changeOrientation ? pageView.height : pageView.width) /\n      pageView.scale /\n      CSS_UNITS;\n    const pageHeight =\n      (changeOrientation ? pageView.width : pageView.height) /\n      pageView.scale /\n      CSS_UNITS;\n    let scale = 0;\n    switch (destArray[1].name) {\n      case \"XYZ\":\n        x = destArray[2];\n        y = destArray[3];\n        scale = destArray[4];\n        // If x and/or y coordinates are not supplied, default to\n        // _top_ left of the page (not the obvious bottom left,\n        // since aligning the bottom of the intended page with the\n        // top of the window is rarely helpful).\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n      case \"Fit\":\n      case \"FitB\":\n        scale = \"page-fit\";\n        break;\n      case \"FitH\":\n      case \"FitBH\":\n        y = destArray[2];\n        scale = \"page-width\";\n        // According to the PDF spec, section 12.3.2.2, a `null` value in the\n        // parameter should maintain the position relative to the new page.\n        if (y === null && this._location) {\n          x = this._location.left;\n          y = this._location.top;\n        }\n        break;\n      case \"FitV\":\n      case \"FitBV\":\n        x = destArray[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = \"page-height\";\n        break;\n      case \"FitR\":\n        x = destArray[2];\n        y = destArray[3];\n        width = destArray[4] - x;\n        height = destArray[5] - y;\n        const hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING;\n        const vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING;\n\n        widthScale =\n          (this.container.clientWidth - hPadding) / width / CSS_UNITS;\n        heightScale =\n          (this.container.clientHeight - vPadding) / height / CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n      default:\n        console.error(\n          `${this._name}.scrollPageIntoView: ` +\n            `\"${destArray[1].name}\" is not a valid destination type.`\n        );\n        return;\n    }\n\n    if (!ignoreDestinationZoom) {\n      if (scale && scale !== this._currentScale) {\n        this.currentScaleValue = scale;\n      } else if (this._currentScale === UNKNOWN_SCALE) {\n        this.currentScaleValue = DEFAULT_SCALE_VALUE;\n      }\n    }\n\n    if (scale === \"page-fit\" && !destArray[4]) {\n      this._scrollIntoView({\n        pageDiv: pageView.div,\n        pageNumber,\n      });\n      return;\n    }\n\n    const boundingRect = [\n      pageView.viewport.convertToViewportPoint(x, y),\n      pageView.viewport.convertToViewportPoint(x + width, y + height),\n    ];\n    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    if (!allowNegativeOffset) {\n      // Some bad PDF generators will create destinations with e.g. top values\n      // that exceeds the page height. Ensure that offsets are not negative,\n      // to prevent a previous page from becoming visible (fixes bug 874482).\n      left = Math.max(left, 0);\n      top = Math.max(top, 0);\n    }\n    this._scrollIntoView({\n      pageDiv: pageView.div,\n      pageSpot: { left, top },\n      pageNumber,\n    });\n  }\n\n  _updateLocation(firstPage) {\n    const currentScale = this._currentScale;\n    const currentScaleValue = this._currentScaleValue;\n    const normalizedScaleValue =\n      parseFloat(currentScaleValue) === currentScale\n        ? Math.round(currentScale * 10000) / 100\n        : currentScaleValue;\n\n    const pageNumber = firstPage.id;\n    let pdfOpenParams = \"#page=\" + pageNumber;\n    pdfOpenParams += \"&zoom=\" + normalizedScaleValue;\n    const currentPageView = this._pages[pageNumber - 1];\n    const container = this.container;\n    const topLeft = currentPageView.getPagePoint(\n      container.scrollLeft - firstPage.x,\n      container.scrollTop - firstPage.y\n    );\n    const intLeft = Math.round(topLeft[0]);\n    const intTop = Math.round(topLeft[1]);\n    pdfOpenParams += \",\" + intLeft + \",\" + intTop;\n\n    this._location = {\n      pageNumber,\n      scale: normalizedScaleValue,\n      top: intTop,\n      left: intLeft,\n      rotation: this._pagesRotation,\n      pdfOpenParams,\n    };\n  }\n\n  _updateHelper(visiblePages) {\n    throw new Error(\"Not implemented: _updateHelper\");\n  }\n\n  update() {\n    const visible = this._getVisiblePages();\n    const visiblePages = visible.views,\n      numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n    const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n    this._buffer.resize(newCacheSize, visiblePages);\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    this._updateHelper(visiblePages); // Run any class-specific update code.\n\n    this._updateLocation(visible.first);\n    this.eventBus.dispatch(\"updateviewarea\", {\n      source: this,\n      location: this._location,\n    });\n  }\n\n  containsElement(element) {\n    return this.container.contains(element);\n  }\n\n  focus() {\n    this.container.focus();\n  }\n\n  get _isScrollModeHorizontal() {\n    // Used to ensure that pre-rendering of the next/previous page works\n    // correctly, since Scroll/Spread modes are ignored in Presentation Mode.\n    return this.isInPresentationMode\n      ? false\n      : this._scrollMode === ScrollMode.HORIZONTAL;\n  }\n\n  get isInPresentationMode() {\n    return this.presentationModeState === PresentationModeState.FULLSCREEN;\n  }\n\n  get isChangingPresentationMode() {\n    return this.presentationModeState === PresentationModeState.CHANGING;\n  }\n\n  get isHorizontalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollWidth > this.container.clientWidth;\n  }\n\n  get isVerticalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollHeight > this.container.clientHeight;\n  }\n\n  /**\n   * Helper method for `this._getVisiblePages`. Should only ever be used when\n   * the viewer can only display a single page at a time, for example in:\n   *  - `PDFSinglePageViewer`.\n   *  - `PDFViewer` with Presentation Mode active.\n   */\n  _getCurrentVisiblePage() {\n    if (!this.pagesCount) {\n      return { views: [] };\n    }\n    const pageView = this._pages[this._currentPageNumber - 1];\n    // NOTE: Compute the `x` and `y` properties of the current view,\n    // since `this._updateLocation` depends of them being available.\n    const element = pageView.div;\n\n    const view = {\n      id: pageView.id,\n      x: element.offsetLeft + element.clientLeft,\n      y: element.offsetTop + element.clientTop,\n      view: pageView,\n    };\n    return { first: view, last: view, views: [view] };\n  }\n\n  _getVisiblePages() {\n    return getVisibleElements(\n      this.container,\n      this._pages,\n      true,\n      this._isScrollModeHorizontal\n    );\n  }\n\n  /**\n   * @param {number} pageNumber\n   */\n  isPageVisible(pageNumber) {\n    if (!this.pdfDocument) {\n      return false;\n    }\n    if (pageNumber < 1 || pageNumber > this.pagesCount) {\n      console.error(\n        `${this._name}.isPageVisible: \"${pageNumber}\" is out of bounds.`\n      );\n      return false;\n    }\n    return this._getVisiblePages().views.some(function (view) {\n      return view.id === pageNumber;\n    });\n  }\n\n  cleanup() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (\n        this._pages[i] &&\n        this._pages[i].renderingState !== RenderingStates.FINISHED\n      ) {\n        this._pages[i].reset();\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _cancelRendering() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (this._pages[i]) {\n        this._pages[i].cancelRendering();\n      }\n    }\n  }\n\n  /**\n   * @param {PDFPageView} pageView\n   * @returns {Promise} Returns a promise containing a {PDFPageProxy} object.\n   * @private\n   */\n  _ensurePdfPageLoaded(pageView) {\n    if (pageView.pdfPage) {\n      return Promise.resolve(pageView.pdfPage);\n    }\n    if (this._pagesRequests.has(pageView)) {\n      return this._pagesRequests.get(pageView);\n    }\n    const promise = this.pdfDocument\n      .getPage(pageView.id)\n      .then(pdfPage => {\n        if (!pageView.pdfPage) {\n          pageView.setPdfPage(pdfPage);\n        }\n        this._pagesRequests.delete(pageView);\n        return pdfPage;\n      })\n      .catch(reason => {\n        console.error(\"Unable to get page for page view\", reason);\n        // Page error -- there is nothing that can be done.\n        this._pagesRequests.delete(pageView);\n      });\n    this._pagesRequests.set(pageView, promise);\n    return promise;\n  }\n\n  forceRendering(currentlyVisiblePages) {\n    const visiblePages = currentlyVisiblePages || this._getVisiblePages();\n    const scrollAhead = this._isScrollModeHorizontal\n      ? this.scroll.right\n      : this.scroll.down;\n    const pageView = this.renderingQueue.getHighestPriority(\n      visiblePages,\n      this._pages,\n      scrollAhead\n    );\n    if (pageView) {\n      this._ensurePdfPageLoaded(pageView).then(() => {\n        this.renderingQueue.renderView(pageView);\n      });\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @param {HTMLDivElement} textLayerDiv\n   * @param {number} pageIndex\n   * @param {PageViewport} viewport\n   * @param {boolean} enhanceTextSelection\n   * @param {EventBus} eventBus\n   * @returns {TextLayerBuilder}\n   */\n  createTextLayerBuilder(\n    textLayerDiv,\n    pageIndex,\n    viewport,\n    enhanceTextSelection = false,\n    eventBus\n  ) {\n    return new TextLayerBuilder({\n      textLayerDiv,\n      eventBus,\n      pageIndex,\n      viewport,\n      findController: this.isInPresentationMode ? null : this.findController,\n      enhanceTextSelection: this.isInPresentationMode\n        ? false\n        : enhanceTextSelection,\n    });\n  }\n\n  /**\n   * @param {HTMLDivElement} pageDiv\n   * @param {PDFPage} pdfPage\n   * @param {string} [imageResourcesPath] - Path for image resources, mainly\n   *   for annotation icons. Include trailing slash.\n   * @param {boolean} renderInteractiveForms\n   * @param {IL10n} l10n\n   * @returns {AnnotationLayerBuilder}\n   */\n  createAnnotationLayerBuilder(\n    pageDiv,\n    pdfPage,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderInteractiveForms = false,\n    l10n = NullL10n\n  ) {\n    return new AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      annotationStorage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: this.linkService,\n      downloadManager: this.downloadManager,\n      l10n,\n    });\n  }\n\n  /**\n   * @type {boolean} Whether all pages of the PDF document have identical\n   *   widths and heights.\n   */\n  get hasEqualPageSizes() {\n    const firstPageView = this._pages[0];\n    for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n      const pageView = this._pages[i];\n      if (\n        pageView.width !== firstPageView.width ||\n        pageView.height !== firstPageView.height\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Returns sizes of the pages.\n   * @returns {Array} Array of objects with width/height/rotation fields.\n   */\n  getPagesOverview() {\n    const pagesOverview = this._pages.map(function (pageView) {\n      const viewport = pageView.pdfPage.getViewport({ scale: 1 });\n      return {\n        width: viewport.width,\n        height: viewport.height,\n        rotation: viewport.rotation,\n      };\n    });\n    if (!this.enablePrintAutoRotate) {\n      return pagesOverview;\n    }\n    return pagesOverview.map(function (size) {\n      if (isPortraitOrientation(size)) {\n        return size;\n      }\n      return {\n        width: size.height,\n        height: size.width,\n        rotation: (size.rotation + 90) % 360,\n      };\n    });\n  }\n\n  /**\n   * @type {Promise<OptionalContentConfig | null>}\n   */\n  get optionalContentConfigPromise() {\n    if (!this.pdfDocument) {\n      return Promise.resolve(null);\n    }\n    if (!this._optionalContentConfigPromise) {\n      // Prevent issues if the getter is accessed *before* the `onePageRendered`\n      // promise has resolved; won't (normally) happen in the default viewer.\n      return this.pdfDocument.getOptionalContentConfig();\n    }\n    return this._optionalContentConfigPromise;\n  }\n\n  /**\n   * @param {Promise<OptionalContentConfig>} promise - A promise that is\n   *   resolved with an {@link OptionalContentConfig} instance.\n   */\n  set optionalContentConfigPromise(promise) {\n    if (!(promise instanceof Promise)) {\n      throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!this._optionalContentConfigPromise) {\n      // Ignore the setter *before* the `onePageRendered` promise has resolved,\n      // since it'll be overwritten anyway; won't happen in the default viewer.\n      return;\n    }\n    this._optionalContentConfigPromise = promise;\n\n    for (const pageView of this._pages) {\n      pageView.update(pageView.scale, pageView.rotation, promise);\n    }\n    this.update();\n\n    this.eventBus.dispatch(\"optionalcontentconfigchanged\", {\n      source: this,\n      promise,\n    });\n  }\n\n  /**\n   * @type {number} One of the values in {ScrollMode}.\n   */\n  get scrollMode() {\n    return this._scrollMode;\n  }\n\n  /**\n   * @param {number} mode - The direction in which the document pages should be\n   *   laid out within the scrolling container.\n   *   The constants from {ScrollMode} should be used.\n   */\n  set scrollMode(mode) {\n    if (this._scrollMode === mode) {\n      return; // The Scroll mode didn't change.\n    }\n    if (!isValidScrollMode(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n    this._scrollMode = mode;\n    this.eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n\n    this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode,\n      viewer = this.viewer;\n\n    viewer.classList.toggle(\n      \"scrollHorizontal\",\n      scrollMode === ScrollMode.HORIZONTAL\n    );\n    viewer.classList.toggle(\"scrollWrapped\", scrollMode === ScrollMode.WRAPPED);\n\n    if (!this.pdfDocument || !pageNumber) {\n      return;\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this._setScale(this._currentScaleValue, true);\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n\n  /**\n   * @type {number} One of the values in {SpreadMode}.\n   */\n  get spreadMode() {\n    return this._spreadMode;\n  }\n\n  /**\n   * @param {number} mode - Group the pages in spreads, starting with odd- or\n   *   even-number pages (unless `SpreadMode.NONE` is used).\n   *   The constants from {SpreadMode} should be used.\n   */\n  set spreadMode(mode) {\n    if (this._spreadMode === mode) {\n      return; // The Spread mode didn't change.\n    }\n    if (!isValidSpreadMode(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n    this._spreadMode = mode;\n    this.eventBus.dispatch(\"spreadmodechanged\", { source: this, mode });\n\n    this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const viewer = this.viewer,\n      pages = this._pages;\n    // Temporarily remove all the pages from the DOM.\n    viewer.textContent = \"\";\n\n    if (this._spreadMode === SpreadMode.NONE) {\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        viewer.appendChild(pages[i].div);\n      }\n    } else {\n      const parity = this._spreadMode - 1;\n      let spread = null;\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        if (spread === null) {\n          spread = document.createElement(\"div\");\n          spread.className = \"spread\";\n          viewer.appendChild(spread);\n        } else if (i % 2 === parity) {\n          spread = spread.cloneNode(false);\n          viewer.appendChild(spread);\n        }\n        spread.appendChild(pages[i].div);\n      }\n    }\n\n    if (!pageNumber) {\n      return;\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n}\n\nexport { BaseViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseViewer } from \"./base_viewer.js\";\nimport { shadow } from \"pdfjs-lib\";\n\nclass PDFViewer extends BaseViewer {\n  get _viewerElement() {\n    return shadow(this, \"_viewerElement\", this.viewer);\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n    if (!pageSpot && !this.isInPresentationMode) {\n      const left = pageDiv.offsetLeft + pageDiv.clientLeft;\n      const right = left + pageDiv.clientWidth;\n      const { scrollLeft, clientWidth } = this.container;\n      if (\n        this._isScrollModeHorizontal ||\n        left < scrollLeft ||\n        right > scrollLeft + clientWidth\n      ) {\n        pageSpot = { left: 0, top: 0 };\n      }\n    }\n    super._scrollIntoView({ pageDiv, pageSpot, pageNumber });\n  }\n\n  _getVisiblePages() {\n    if (this.isInPresentationMode) {\n      // The algorithm in `getVisibleElements` doesn't work in all browsers and\n      // configurations (e.g. Chrome) when Presentation Mode is active.\n      return this._getCurrentVisiblePage();\n    }\n    return super._getVisiblePages();\n  }\n\n  _updateHelper(visiblePages) {\n    if (this.isInPresentationMode) {\n      return;\n    }\n    let currentId = this._currentPageNumber;\n    let stillFullyVisible = false;\n\n    for (const page of visiblePages) {\n      if (page.percent < 100) {\n        break;\n      }\n      if (page.id === currentId) {\n        stillFullyVisible = true;\n        break;\n      }\n    }\n    if (!stillFullyVisible) {\n      currentId = visiblePages[0].id;\n    }\n    this._setCurrentPageNumber(currentId);\n  }\n}\n\nexport { PDFViewer };\n"],"sourceRoot":""}