From 07bf260574b7c8432c17857083e15c179f0af97d Mon Sep 17 00:00:00 2001
From: sabrina0822 <90227881+sabrina0822@users.noreply.github.com>
Date: Thu, 23 Jun 2022 16:10:17 -0400
Subject: [PATCH] =?UTF-8?q?Revert=20"=F0=9F=8E=A8=20Integrated=20the=20ima?=
=?UTF-8?q?gezipper=20job=20into=20pixel=20and=20tested=20successfully"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
LICENSE.md | 22 --
__init__.py | 3 +-
requirements.txt | 2 -
resource_types.yaml | 6 -
source/js/plugins/pixel-wrapper.js | 169 ++++++++----
source/js/plugins/pixel-wrapper.test.js | 6 +-
source/js/plugins/pixel.js | 2 +-
static/js/diva.js | 49 +---
static/js/diva.js.map | 2 +-
static/js/download.js | 2 +-
static/js/manipulation.js | 2 +-
static/js/pixel.js | 2 +-
webpack.config.js | 2 +-
wrapper.py | 339 ++++++++++++------------
14 files changed, 302 insertions(+), 306 deletions(-)
delete mode 100644 LICENSE.md
delete mode 100644 requirements.txt
diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644
index aae0d71..0000000
--- a/LICENSE.md
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
-
-Copyright (c) 2017-2021 Eric Han Liu, Zeyad Saleh, Alex Daigle, Ké Zhang,
-Juliette Regimbal, Gabriel Vigliensoni, Néstor Nápoles López
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/__init__.py b/__init__.py
index d44bc33..0d61b8e 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,5 +1,6 @@
import rodan
-__version__ = "1.1.1"
+__version__ = "1.1.0"
+
import logging
logger = logging.getLogger('rodan')
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 850ad31..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-numpy==1.16.6
-opencv-python==4.2.0.32
diff --git a/resource_types.yaml b/resource_types.yaml
index 7d86c3a..a9eb605 100644
--- a/resource_types.yaml
+++ b/resource_types.yaml
@@ -1,9 +1,3 @@
- mimetype: text/plain
description: Plain text
extension: txt
-- mimetype: image/rgba+png
- description: rgba png image
- extension: png
-- mimetype: application/zip
- description: zip file
- extension: zip
diff --git a/source/js/plugins/pixel-wrapper.js b/source/js/plugins/pixel-wrapper.js
index 4259b2b..2f2a47a 100644
--- a/source/js/plugins/pixel-wrapper.js
+++ b/source/js/plugins/pixel-wrapper.js
@@ -68,7 +68,7 @@ export class PixelWrapper
// string instead of textNode so newlines can be used
tooltipText = "
While in the Select Region Layer, use the " +
"rectangle tool to select the regions of the page that you will classify.
" +
- "Once you select these regions, select another layer and begin classifying! " +
+ "
Once you select these regions, select another layer and begin classifying! " +
"Keep in mind that classification outside these regions will not be utilized.
" +
"You can select the entire page by pressing SHIFT + A.
" +
"You can deselect the entire page by pressing ESC. This will destroy all selection regions " +
@@ -84,7 +84,7 @@ export class PixelWrapper
}
- createButtons ()
+ createButtons ()
{
let rodanExportButton = document.createElement("button"),
rodanExportText = document.createTextNode("Submit To Rodan");
@@ -95,7 +95,7 @@ export class PixelWrapper
rodanExportButton.appendChild(rodanExportText);
rodanExportButton.addEventListener("click", this.exportToRodan);
- document.body.insertBefore(rodanExportButton, document.getElementById('imageLoader'));
+ document.body.insertBefore(rodanExportButton, document.getElementById('imageLoader'));
}
destroyButtons ()
@@ -107,7 +107,7 @@ export class PixelWrapper
/**
* Creates the number of required layers based on the number of input ports in the Rodan job.
- * The variable numberInputLayers is actually defined in the outermost index.html
+ * The variable numberInputLayers is actually defined in the outermost index.html
*/
createLayers ()
{
@@ -115,15 +115,15 @@ export class PixelWrapper
this.pixelInstance.tools.currentTool = "rectangle";
// Only create default layers once
- if (this.layers.length !== 1)
+ if (this.layers.length !== 1)
return;
- let numLayers = numberInputLayers;
+ let numLayers = numberInputLayers;
// Ask user how many layers to create if there's no input
- if (numberInputLayers === 0)
+ if (numberInputLayers === 0)
{
- while (numLayers <= 0 || numLayers > 7)
+ while (numLayers <= 0 || numLayers > 7)
{
numLayers = parseInt(prompt("How many layers will you classify?\n" +
"This must be two (2) less than the total number of output ports.", 3));
@@ -133,12 +133,12 @@ export class PixelWrapper
this.selectRegionLayer = new Layer(-1, new Colour(240, 232, 227, 1), "Select Region", this.pixelInstance, 0.3);
this.layers.unshift(this.selectRegionLayer);
- // There is 1 active layer already created by default in PixelPlugin with layerId = 1,
+ // There is 1 active layer already created by default in PixelPlugin with layerId = 1,
// so start at 2, and ignore one input layer which gets assigned to layer 1. Max 7 input
- for (var i = 2; i < numLayers + 1; i++)
- {
+ for (var i = 2; i < numLayers + 1; i++)
+ {
let colour;
- switch (i)
+ switch (i)
{
case 2:
colour = new Colour(255, 51, 102, 1);
@@ -165,7 +165,7 @@ export class PixelWrapper
this.pixelInstance.layerIdCounter = this.layers.length;
- // Refresh UI
+ // Refresh UI
this.uiManager.destroyPluginElements(this.layers, this.pixelInstance.background);
this.uiManager.createPluginElements(this.layers);
}
@@ -179,56 +179,45 @@ export class PixelWrapper
let count = this.layers.length;
let urlList = [];
- this.layers.forEach((layer) =>
- {
+ this.layers.forEach((layer) =>
+ {
console.log(layer.layerId + " " + layer.layerName);
let dataURL = layer.getCanvas().toDataURL();
- urlList.push(dataURL);
+ urlList.push(dataURL);
count -= 1;
if (count === 0)
{
console.log(urlList);
console.log("done");
- $.ajax({
- url: '',
- type: 'POST',
- data: JSON.stringify({'user_input': urlList}),
- contentType: 'application/json',
- success: () => {
- setTimeout(function(){ alert("Submission successful! Click OK to exit Pixel.js."); }, 1000);
- setTimeout(function(){ window.close(); }, 1200);
- },
- error: (jqXHR, textStatus, errorThrown) => {
- console.log(jqXHR);
- console.log(textStatus);
- console.log(errorThrown);
- alert("An error occurred: " + errorThrown);
- }
- });
+ $.ajax({url: '', type: 'POST', data: JSON.stringify({'user_input': urlList}), contentType: 'application/json'});
}
});
+
+ // Alert and close Pixel after submitting
+ setTimeout(function(){ alert("Submission successful! Click OK to exit Pixel.js."); }, 1000);
+ setTimeout(function(){ window.close(); }, 1200);
}
/**
* Generates a background layer by iterating over all the pixel data for each layer within the
- * selection regions, and subtracting it from the background layer if the data is
+ * selection regions, and subtracting it from the background layer if the data is
* non-transparent (alpha != 0). Uses the uiManager progress bar and exports to Rodan when done
*/
- createBackgroundLayer ()
+ createBackgroundLayer ()
{
// Don't export selectRegionLayer to Rodan
this.layers.shift();
this.layersCount = this.layers.length;
- // NOTE: this backgroundLayer and the original background (image) both have layerId 0, but
+ // NOTE: this backgroundLayer and the original background (image) both have layerId 0, but
// this backgroundLayer is only created upon submitting (so no conflicts)
- let backgroundLayer = new Layer(0, new Colour(242, 0, 242, 1), "Background Layer",
+ let backgroundLayer = new Layer(0, new Colour(242, 0, 242, 1), "Background Layer",
this.pixelInstance, 0.5, this.pixelInstance.actions);
// Add select regions to backgroundLayer
- this.selectRegionLayer.shapes.forEach((shape) =>
+ this.selectRegionLayer.shapes.forEach((shape) =>
{
// Get shape dimensions
let x = shape.origin.getCoordsInPage(this.maxZoom).x,
@@ -237,7 +226,7 @@ export class PixelWrapper
rectHeight = shape.relativeRectHeight * Math.pow(2, this.maxZoom),
rect = new Rectangle(new Point(x, y, this.pageIndex), rectWidth, rectHeight, "add");
- if (shape.blendMode === "subtract") {
+ if (shape.blendMode === "subtract") {
rect.changeBlendModeTo("subtract");
}
@@ -246,7 +235,7 @@ export class PixelWrapper
backgroundLayer.drawLayer(this.maxZoom, backgroundLayer.getCanvas());
// Alert and return if user hasn't created a selection region
- if (this.selectRegionLayer.shapes.length === 0)
+ if (this.selectRegionLayer.shapes.length === 0)
{
alert("You haven't created any select regions!");
this.layers.unshift(this.selectRegionLayer);
@@ -254,14 +243,9 @@ export class PixelWrapper
}
// Instantiate progress bar
- // this.uiManager.createExportElements(this);
- // Draw select region layer on bg layer
- this.selectRegionLayer.drawLayerInPageCoords(this.maxZoom, backgroundLayer.getCanvas(), this.pageIndex);
- let ctx = backgroundLayer.getCtx();
- // Remove parts of user-defined layers from bg
- ctx.globalCompositeOperation = "destination-out";
+ this.uiManager.createExportElements(this);
- this.layers.forEach((layer) =>
+ this.layers.forEach((layer) =>
{
// Create layer canvas and draw (so pixel data can be accessed)
let layerCanvas = document.createElement('canvas');
@@ -270,18 +254,95 @@ export class PixelWrapper
layerCanvas.setAttribute("style", "position: absolute; top: 0; left: 0;");
layerCanvas.width = this.maxWidth;
layerCanvas.height = this.maxHeight;
- layer.drawLayerInPageCoords(this.maxZoom, layerCanvas, this.pageIndex);
+ layer.drawLayerInPageCoords(this.maxZoom, layerCanvas, this.pageIndex);
- if (layer.layerId !== 0) {
- ctx.drawImage(layerCanvas, 0, 0);
- }
+ this.subtractLayerFromBackground(backgroundLayer, layerCanvas, this.maxWidth, this.maxHeight);
});
- this.layers.unshift(backgroundLayer);
- this.exportLayersToRodan();
+ }
+
+ subtractLayerFromBackground (backgroundLayer, layerCanvas, width, height)
+ {
+ var chunkSize = width,
+ chunkNum = 0,
+ row = 0,
+ col = 0,
+ pixelCtx = layerCanvas.getContext('2d');
+
+ let doChunk = () =>
+ {
+ var cnt = chunkSize;
+ chunkNum++;
+ while (cnt--)
+ {
+ if (row >= height)
+ break;
+ if (col < width)
+ {
+ let data = pixelCtx.getImageData(col, row, 1, 1).data;
+ // data is RGBA for one pixel, data[3] is alpha
+ if (data[3] !== 0)
+ {
+ let currentPixel = new Rectangle(new Point(col, row, this.pageIndex), 1, 1, "subtract");
+ backgroundLayer.addShapeToLayer(currentPixel);
+ }
+ col++;
+ }
+ else // Reached end of row, jump to next
+ {
+ row++;
+ col = 0;
+ }
+ }
+ if (this.progress(row, chunkSize, chunkNum, height, backgroundLayer).needsRecall) // recall function
+ {
+ setTimeout(doChunk, 1);
+ }
+ };
+ doChunk();
+ }
+
+ progress (row, chunkSize, chunkNum, height, backgroundLayer)
+ {
+ if (row === height || this.exportInterrupted)
+ {
+ this.layersCount -= 1;
+ }
+ if (row < height && !this.exportInterrupted)
+ {
+ let percentage = (chunkNum * chunkSize) * 100 / (height * chunkSize),
+ roundedPercentage = (percentage > 100) ? 100 : Math.round(percentage * 10) / 10;
+ this.pixelInstance.uiManager.updateProgress(roundedPercentage);
+ return {
+ needsRecall: true
+ };
+ }
+ else
+ {
+ if (this.exportInterrupted && (this.layersCount === 0))
+ {
+ this.exportInterrupted = false;
+ this.uiManager.destroyExportElements();
+ this.layers.unshift(this.selectRegionLayer);
+ }
+ else if (this.exportInterrupted)
+ {
+ // Do nothing and wait until last layer has finished processing to cancel
+ }
+ else if (this.layersCount === 0)
+ { // Done generating background layer
+ backgroundLayer.drawLayer(0, backgroundLayer.getCanvas());
+ this.layers.unshift(backgroundLayer);
+ this.uiManager.destroyExportElements();
+ this.exportLayersToRodan();
+ }
+ }
+ return {
+ needsRecall: false
+ };
}
/**
- * Handles the Rodan input layers and draws them on each layer in Pixel
+ * Handles the Rodan input layers and draws them on each layer in Pixel
*/
rodanImagesToCanvas ()
{
@@ -314,4 +375,4 @@ export class PixelWrapper
}
});
}
-}
+}
\ No newline at end of file
diff --git a/source/js/plugins/pixel-wrapper.test.js b/source/js/plugins/pixel-wrapper.test.js
index 8d3edcb..f07e658 100644
--- a/source/js/plugins/pixel-wrapper.test.js
+++ b/source/js/plugins/pixel-wrapper.test.js
@@ -128,7 +128,7 @@ describe('Checking Functionality', () => {
expect(await alert.getText()).toBe("You haven't created any select regions!");
await alert.accept();
});
- test.skip('drawing select region then submit to rodan creates progress bar', async () => {
+ test('drawing select region then submit to rodan creates progress bar', async () => {
let canvas = await browser.findElement(By.id('layer--1-canvas'));
const actions = browser.actions();
// select rectangle tool and draw one
@@ -141,7 +141,7 @@ describe('Checking Functionality', () => {
let progressBar = await browser.findElement(By.id('pbar-inner-div'));
expect(await progressBar.isDisplayed()).toBeTruthy();
});
- test.skip('cancel progress bar button removes the progress div', async () => {
+ test('cancel progress bar button removes the progress div', async () => {
let cancelButton = await browser.findElement(By.id('cancel-export-div'));
const actions = browser.actions();
await actions.click(cancelButton).perform();
@@ -159,4 +159,4 @@ describe('Checking Functionality', () => {
expect(await layer1Toggle.getAttribute('class')).toBe('layer-deactivated');
});
-});
+});
\ No newline at end of file
diff --git a/source/js/plugins/pixel.js b/source/js/plugins/pixel.js
index 1d9cc33..d4d4bfb 160000
--- a/source/js/plugins/pixel.js
+++ b/source/js/plugins/pixel.js
@@ -1 +1 @@
-Subproject commit 1d9cc3349eccbdd06a6cfdadce33a746552f56c8
+Subproject commit d4d4bfb9dc3f04caedcac811ff1486b24ce3b7d9
diff --git a/static/js/diva.js b/static/js/diva.js
index 617d12d..4c78dc0 100644
--- a/static/js/diva.js
+++ b/static/js/diva.js
@@ -182,7 +182,7 @@ exports.storage = 'undefined' != typeof chrome && 'undefined' != typeof chrome.s
* Colors.
*/
-exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
+exports.colors = ['lightseagreen', 'forestgreen', 'goldenrod', 'dodgerblue', 'darkorchid', 'crimson'];
/**
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
@@ -200,11 +200,6 @@ function useColors() {
return true;
}
- // Internet Explorer and Edge do not support colors.
- if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
- return false;
- }
-
// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance ||
@@ -364,11 +359,6 @@ exports.enable = enable;
exports.enabled = enabled;
exports.humanize = __webpack_require__(/*! ms */ "./node_modules/ms/index.js");
-/**
- * Active `debug` instances.
- */
-exports.instances = [];
-
/**
* The currently active debug mode names, and names to skip.
*/
@@ -384,6 +374,12 @@ exports.skips = [];
exports.formatters = {};
+/**
+ * Previous log timestamp.
+ */
+
+var prevTime;
+
/**
* Select a color.
* @param {String} namespace
@@ -413,8 +409,6 @@ function selectColor(namespace) {
function createDebug(namespace) {
- var prevTime;
-
function debug() {
// disabled?
if (!debug.enabled) return;
@@ -471,28 +465,15 @@ function createDebug(namespace) {
debug.enabled = exports.enabled(namespace);
debug.useColors = exports.useColors();
debug.color = selectColor(namespace);
- debug.destroy = destroy;
// env-specific initialization logic for debug instances
if ('function' === typeof exports.init) {
exports.init(debug);
}
- exports.instances.push(debug);
-
return debug;
}
-function destroy() {
- var index = exports.instances.indexOf(this);
- if (index !== -1) {
- exports.instances.splice(index, 1);
- return true;
- } else {
- return false;
- }
-}
-
/**
* Enables a debug mode by namespaces. This can include modes
* separated by a colon and wildcards.
@@ -507,11 +488,10 @@ function enable(namespaces) {
exports.names = [];
exports.skips = [];
- var i;
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
var len = split.length;
- for (i = 0; i < len; i++) {
+ for (var i = 0; i < len; i++) {
if (!split[i]) continue; // ignore empty strings
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
@@ -520,11 +500,6 @@ function enable(namespaces) {
exports.names.push(new RegExp('^' + namespaces + '$'));
}
}
-
- for (i = 0; i < exports.instances.length; i++) {
- var instance = exports.instances[i];
- instance.enabled = exports.enabled(instance.namespace);
- }
}
/**
@@ -546,9 +521,6 @@ function disable() {
*/
function enabled(name) {
- if (name[name.length - 1] === '*') {
- return true;
- }
var i, len;
for (i = 0, len = exports.skips.length; i < len; i++) {
if (exports.skips[i].test(name)) {
@@ -8616,11 +8588,6 @@ var TileCoverageMap = function () {
value: function set(row, col, value) {
this._map[row][col] = value;
}
- }, {
- key: "get",
- value: function get() {
- console.log("JSHint: Requires a getter when setter is set, otherwise lint tests will fail.");
- }
}]);
return TileCoverageMap;
diff --git a/static/js/diva.js.map b/static/js/diva.js.map
index 3e9a748..1192196 100644
--- a/static/js/diva.js.map
+++ b/static/js/diva.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/array.prototype.fill/index.js","webpack:///./node_modules/debug/src/browser.js","webpack:///./node_modules/debug/src/debug.js","webpack:///./node_modules/lodash.maxby/index.js","webpack:///./node_modules/ms/index.js","webpack:///./node_modules/process/browser.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/module.js","webpack:///./node_modules/whatwg-fetch/fetch.js","webpack:///./source/js/composite-image.js","webpack:///./source/js/diva-global.js","webpack:///./source/js/diva.js","webpack:///./source/js/document-handler.js","webpack:///./source/js/document-layout.js","webpack:///./source/js/exceptions.js","webpack:///./source/js/gesture-events.js","webpack:///./source/js/grid-handler.js","webpack:///./source/js/iiif-source-adapter.js","webpack:///./source/js/image-cache.js","webpack:///./source/js/image-manifest.js","webpack:///./source/js/image-request-handler.js","webpack:///./source/js/interpolate-animation.js","webpack:///./source/js/page-layouts/book-layout.js","webpack:///./source/js/page-layouts/grid-layout.js","webpack:///./source/js/page-layouts/index.js","webpack:///./source/js/page-layouts/page-dimensions.js","webpack:///./source/js/page-layouts/singles-layout.js","webpack:///./source/js/page-overlay-manager.js","webpack:///./source/js/page-tools-overlay.js","webpack:///./source/js/parse-iiif-manifest.js","webpack:///./source/js/renderer.js","webpack:///./source/js/settings-view.js","webpack:///./source/js/tile-coverage-map.js","webpack:///./source/js/toolbar.js","webpack:///./source/js/utils/dragscroll.js","webpack:///./source/js/utils/elt.js","webpack:///./source/js/utils/events.js","webpack:///./source/js/utils/get-scrollbar-width.js","webpack:///./source/js/utils/hash-params.js","webpack:///./source/js/utils/vanilla.kinetic.js","webpack:///./source/js/validation-runner.js","webpack:///./source/js/viewer-core.js","webpack:///./source/js/viewport.js"],"names":["Array","prototype","fill","value","TypeError","O","Object","len","length","start","arguments","relativeStart","k","Math","max","min","end","relativeEnd","undefined","last","defineProperty","configurable","enumerable","writable","e","exports","module","require","log","formatArgs","save","load","useColors","storage","chrome","local","localstorage","colors","window","process","type","navigator","userAgent","toLowerCase","match","document","documentElement","style","WebkitAppearance","console","firebug","exception","table","parseInt","RegExp","$1","formatters","j","v","JSON","stringify","err","message","args","namespace","humanize","diff","c","color","splice","index","lastC","replace","Function","apply","call","namespaces","removeItem","debug","r","env","DEBUG","enable","localStorage","createDebug","coerce","disable","enabled","instances","names","skips","selectColor","hash","i","charCodeAt","abs","prevTime","self","curr","Date","ms","prev","unshift","format","formatter","val","logFn","bind","destroy","init","push","indexOf","split","substr","instance","name","test","Error","stack","LARGE_ARRAY_SIZE","FUNC_ERROR_TEXT","HASH_UNDEFINED","UNORDERED_COMPARE_FLAG","PARTIAL_COMPARE_FLAG","INFINITY","MAX_SAFE_INTEGER","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reRegExpChar","reEscapeChar","reIsHostCtor","reIsUint","typedArrayTags","freeGlobal","global","freeSelf","root","freeExports","nodeType","freeModule","moduleExports","freeProcess","nodeUtil","binding","nodeIsTypedArray","isTypedArray","arraySome","array","predicate","baseProperty","key","object","baseTimes","n","iteratee","result","baseUnary","func","getValue","isHostObject","toString","mapToArray","map","size","forEach","overArg","transform","arg","setToArray","set","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","uid","exec","keys","IE_PROTO","funcToString","hasOwnProperty","objectToString","reIsNative","Symbol","Uint8Array","propertyIsEnumerable","nativeKeys","DataView","getNative","Map","Promise","Set","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","Hash","entries","clear","entry","hashClear","__data__","hashDelete","has","hashGet","data","hashHas","hashSet","get","ListCache","listCacheClear","listCacheDelete","assocIndexOf","lastIndex","pop","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","values","add","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","cache","pairs","arrayLikeKeys","inherited","isArray","isArguments","String","skipIndexes","isIndex","eq","baseExtremum","comparator","current","computed","isSymbol","baseGet","path","isKey","castPath","toKey","baseGetTag","baseGt","other","baseHasIn","baseIsEqual","customizer","bitmask","isObject","isObjectLike","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","othTag","getTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsMatch","source","matchData","noCustomizer","objValue","srcValue","baseIsNative","isMasked","pattern","isFunction","baseIsTypedArray","isLength","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","getMatchData","matchesStrictComparable","isStrictComparable","hasIn","basePropertyDeep","baseToString","stringToPath","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","tag","byteLength","byteOffset","buffer","convert","objProps","objLength","othProps","skipCtor","objCtor","constructor","othCtor","isKeyable","ArrayBuffer","resolve","Ctor","ctorString","hasPath","hasFunc","proto","memoize","string","number","quote","resolver","memoized","Cache","isArrayLikeObject","isArrayLike","defaultValue","maxBy","s","m","h","d","y","options","parse","isNaN","long","fmtLong","fmtShort","str","parseFloat","round","plural","floor","ceil","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","setTimeout","clearTimeout","runTimeout","fun","runClearTimeout","marker","queue","draining","currentQueue","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","run","nextTick","Item","title","browser","argv","version","versions","noop","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","cwd","chdir","dir","umask","g","eval","webpackPolyfill","deprecate","paths","children","l","fetch","support","searchParams","iterable","blob","Blob","formData","arrayBuffer","viewClasses","isDataView","obj","isPrototypeOf","isArrayBufferView","isView","normalizeName","normalizeValue","iteratorFor","items","iterator","next","shift","done","Headers","headers","append","header","getOwnPropertyNames","oldValue","callback","thisArg","consumed","body","bodyUsed","reject","fileReaderReady","reader","onload","onerror","error","readBlobAsArrayBuffer","FileReader","promise","readAsArrayBuffer","readBlobAsText","readAsText","readArrayBufferAsText","buf","view","chars","fromCharCode","join","bufferClone","slice","Body","_initBody","_bodyInit","_bodyText","_bodyBlob","FormData","_bodyFormData","URLSearchParams","_bodyArrayBuffer","rejected","then","text","decode","json","methods","normalizeMethod","method","upcased","toUpperCase","Request","input","url","credentials","mode","referrer","clone","form","trim","bytes","decodeURIComponent","parseHeaders","rawHeaders","preProcessedHeaders","line","parts","Response","bodyInit","status","ok","statusText","response","redirectStatuses","redirect","RangeError","location","request","xhr","XMLHttpRequest","getAllResponseHeaders","responseURL","responseText","ontimeout","open","withCredentials","responseType","setRequestHeader","send","polyfill","CompositeImage","levels","_levels","urlsToTiles","_urlsToTiles","level","tiles","tile","zoomLevel","row","col","loadedByLevel","_loadedByLevel","TileCoverageMap","rows","cols","baseZoomLevel","toRenderByLevel","highestZoomLevel","covered","bestLevelIndex","ceilLevel","findIndex","levelsByPreference","reverse","loaded","additionalTiles","filter","isLoaded","scaleRatio","pow","isNeeded","highResRow","highResCol","byLevel","urls","diva","Events","Diva","element","HTMLElement","getElementById","DivaParentElementNotFoundException","objectData","ObjectDataNotSuppliedException","assign","adaptivePadding","arrowScrollAmount","blockMobileMove","enableAutoTitle","enableFilename","enableFullscreen","enableGotoPage","enableGotoSuggestions","enableGridIcon","enableGridControls","enableImageTitles","enableKeyScroll","enableLinkIcon","enableNonPagedVisibilityIcon","enableSpaceScroll","enableToolbar","enableZoomControls","fillParentHeight","fixedPadding","fixedHeightGrid","goDirectlyTo","hashParamSuffix","iipServerURL","inFullscreen","inBookLayout","inGrid","imageDir","maxPagesPerRow","maxZoomLevel","minPagesPerRow","minZoomLevel","onGotoSubmit","pageAliases","pageAliasFunction","pageLoadTimeout","pagesPerRow","showNonPagedPages","throbberTimeout","tileHeight","tileWidth","toolbarParentObject","verticallyOriented","viewportMargin","wrapperElement","class","appendChild","viewerCore","ViewerCore","viewerState","getInternalState","settings","getSettings","toolbar","Toolbar","id","ID","divaState","render","hashState","_getHashParamState","_loadOrFetchObjectData","_loadObjectData","pendingManifestRequest","_ajaxError","setPendingManifestRequest","showError","errorMessage","dataHasAbsolutePath","lastIndexOf","jsonHost","hostname","href","target","_showError","responseData","manifest","NotAnIIIFManifestException","publish","ImageManifest","fromIIIF","loadOptions","_getLoadOptionsForState","setManifest","state","param","HashParams","f","_getViewState","z","pageIndex","_getPageIndexForManifest","pages","p","horizontalOffset","x","verticalOffset","filename","np","layout","getCurrentLayout","pageOffset","getPageToViewportCenterOffset","currentPageIndex","viewport","hashParams","_getState","hashStringBuilder","encodeURIComponent","warn","_reloadViewer","getYOffset","getXOffset","destinationView","xAnchor","yAnchor","pidx","_isPageIndexValid","xOffset","yOffset","renderer","goto","isPageValid","pageX","pageY","outerOffset","outerElement","getBoundingClientRect","outerTop","top","outerLeft","left","outerBottom","bottom","outerRight","right","getElementsByClassName","curPageIdx","curPage","curOffset","getAttribute","newOptions","reload","protocol","host","pathname","search","_getURLHash","isActiveDiva","_changeView","closePopups","disableScrollable","enableScrollable","_toggleFullscreen","_getCurrentURL","itemTitle","canvas","getPageDimensionsAtCurrentZoomLevel","getPageOffset","pg","selector","pageIdx","_checkLoaded","numPages","otherImages","getPageDimensions","pgAtZoom","width","w","height","getPageImageURL","_getPageIndexForPageXYValues","region","getPageRegion","_gotoPageByIndex","label","llc","_getPageIndex","uri","isPageVisible","leftOffset","topOffset","offset","intersectsRegion","toggleFullscreen","isValidOption","zoom","_togglePageLayoutOrientation","position","zoomDifference","setZoomLevel","DocumentHandler","_viewerCore","_viewerState","_overlays","getPageTools","overlay","PageToolsOverlay","addPageOverlay","event","coords","newZoomLevel","ctrlKey","getPagePositionAtViewportOffset","startDistance","endDistance","centerOffset","anchorPage","_handleZoomLevelChange","fileName","getPageName","renderedPages","targetPage","currentPage","getCentermostPage","getViewport","setCurrentPage","oldZoomLevel","removePageOverlay","centerY","centerX","centerPage","dims","imageOffset","excludePadding","midX","midY","dx","dy","DocumentLayout","config","computedLayout","getComputedLayout","dimensions","pageGroups","_pageLookup","getPageLookup","getPageRegionFromPageInfo","pageInfo","padding","group","scrollLeft","elementWidth","scrollTop","elementHeight","page","groupOffset","pageLookup","scaledLayouts","pageLayouts","getScaledPageLayouts","documentSecondaryExtent","getExtentAlongSecondaryAxis","primaryDocPosition","pagePadding","scaleDimensions","secondaryDim","secondaryPadding","docPadding","reduce","maxDim","onDoubleClick","onPinch","onDoubleTap","DOUBLE_CLICK_TIMEOUT","DOUBLE_TAP_DISTANCE_THRESHOLD","DOUBLE_TAP_TIMEOUT","elem","addEventListener","getRelativeOffset","currentTarget","tracker","createDoubleEventTracker","preventDefault","isTriggered","reset","trigger","originalEvent","touches","distance","clientX","clientY","moveDistance","zoomDelta","touchCenter","firstTap","secondTap","changedTouches","tapDistance","x1","y1","x2","y2","sqrt","timeoutDuration","triggered","timeoutId","resetTimeout","pageCoords","bounds","GridHandler","pageToViewportCenterOffset","groups","getPageInfo","chosenGroup","getCentermostGroup","hasCurrentPage","some","viewportMiddle","groupMiddle","IIIFSourceAdapter","dimens","quality","api","encodeURI","params","rowCount","tileDimensions","colCount","maxZoom","xoffset","yoffset","DEFAULT_MAX_KEYS","ImageCache","maxKeys","_held","_urls","_lru","record","img","_promote","_tryEvict","extraCapacity","allowedEntryCount","evictionIndex","count","urlAdapter","pgs","max_zoom","maxRatio","max_ratio","minRatio","min_ratio","item_title","paged","_maxWidths","max_w","_maxHeights","max_h","_averageWidths","a_wid","_averageHeights","a_hei","_totalHeights","t_hei","_totalWidths","t_wid","_urlAdapter","maxDims","getScaleRatio","isFinite","getTileImageURL","iiifManifest","getMaxWidth","zoomedPropertyGetter","getMaxHeight","getAverageWidth","getAverageHeight","getTotalWidth","getTotalHeight","privateName","sourceZoomLevel","targetZoomLevel","ImageRequestHandler","_url","_callback","_errorCallback","timeoutTime","_aborted","_complete","_image","Image","crossOrigin","_handleLoad","_handleError","src","animate","easing","linear","linearEasing","cubic","inOutCubicEasing","now","performance","durationMs","duration","parameters","onUpdate","onEnd","tweenFns","paramKeys","interpolate","from","to","requestId","requestAnimationFrame","update","cancel","cancelAnimationFrame","handleAnimationCompletion","interrupted","elapsed","updateValues","info","t","getBookLayoutGroups","viewerConfig","groupings","getGroupings","getGroupLayoutsFromPageGrouping","grouping","pagesByGroup","leftPage","nonPagedPages","_addNonPagedPages","nlen","pageRecord","facingPages","getFacingPageGroup","pageDims","shouldBeHorizontallyAdjusted","rightPage","leftDims","rightDims","firstLeftOffset","secondLeftOffset","midWidth","getGridLayoutGroups","viewportWidth","horizontalPadding","pageWidth","gridPageWidth","rowHeight","currentPages","getGridPageDimensions","pageDimenData","pageData","heightToWidthRatio","pageHeight","rowDimensions","pageDimens","getPageLayouts","pluck","out","getMaxPageDimensions","getSinglesLayoutGroups","PageOverlayManager","_pages","_renderedPages","_renderedPageMap","overlaysByPage","mount","overlayIndex","unmount","previouslyRendered","newRenderedMap","_invokeOnOverlays","refresh","overlays","o","_innerElement","innerElement","_pageToolsElem","_buttons","_initializePageToolButtons","publicInstance","getPublicInstance","plugin","button","pageToolsIcon","cloneNode","handleClick","removeChild","pos","incorporateViewport","parseIIIFManifest","getMaxZoomLevel","largestDimension","incorporateZoom","imageDimension","getOtherImageData","lowestMaxZoom","itm","parseImageInfo","il","sequence","sequences","canvases","numCanvases","thisCanvas","thisResource","thisImage","context","imageAPIVersion","imageLabel","zoomDimensions","widthAtCurrentZoomLevel","heightAtCurrentZoomLevel","mz","ratio","totalWidths","totalHeights","maxWidths","maxHeights","images","resource","default","item","service","viewingHint","averageWidths","averageHeights","a","fragmentRegex","xywh","stripURL","urlArray","imageInfo","debugPaints","REQUEST_DEBOUNCE_INTERVAL","Renderer","hooks","_viewport","_outerElement","_documentElement","_hooks","_canvas","_ctx","getContext","_sourceResolver","_config","_zoomLevel","_compositeImages","_renderedTiles","_animation","_cache","_pendingRequests","viewportPosition","sourceResolver","_clearAnimation","onViewWillLoad","_setLayoutToZoomLevel","parentNode","insertBefore","firstChild","onViewDidLoad","_goto","setInnerDimensions","_render","onViewDidUpdate","newRenderedPages","visiblePages","clearRect","_paintOutline","zoomLevels","getAllZoomLevelsForPage","composite","updateFromCache","_initiateTileRequests","changes","findChanges","removed","_paint","onPageWillLoad","added","renderedTiles","getTiles","scaled","getScaledTileRecord","_isTileVisible","_drawTile","acquire","release","_getImageOffset","viewportPaddingX","viewportPaddingY","viewportOffsetX","viewportOffsetY","destXOffset","destYOffset","canvasX","canvasY","destWidth","destHeight","strokeStyle","strokeRect","newPendingRequests","initiateRequest","put","updateWithLoadedUrls","_isTileForSourceVisible","getBestZoomLevelForPage","abort","scaledTile","tileOffset","_getTileToDocumentOffset","sourceXOffset","sourceYOffset","sourceWidth","sourceHeight","drawImage","tileSource","desiredVerticalCenter","desiredHorizontalCenter","getPosition","onViewDidTransition","InterpolateAnimation","_setViewportPosition","onZoomLevelWillChange","req","handler","HTMLCanvasElement","scaleFactor","oldArray","newArray","oldEntry","newEntry","createSettingsView","sources","registerMixin","mixin","_rows","_cols","_map","viewer","ident","base","attrs","subscribe","icon","innerName","innerValue","zoomOutIcon","_createZoomOutIcon","zoomInIcon","_createZoomInIcon","zoomButtons","createButton","createLabel","zoomHandler","labelEl","textContent","_subscribe","gridMoreIcon","_createGridMoreIcon","gridFewerIcon","_createGridFewerIcon","gridButtons","setGridPagesPerRow","gridChangeHandler","viewOptionsList","_elemAttrs","gridViewIcon","_createGridViewIcon","bookViewIcon","_createBookViewIcon","pageViewIcon","_createPageViewIcon","viewOptionsToggle","display","changeViewButton","selectView","changeView","updateViewMenu","viewIconClasses","className","viewOptions","createDocumentFragment","fullscreenIcon","_createFullscreenIcon","toggleFullscreenMode","toggleZoomGridControls","leftTools","createZoomButtons","createGridControls","rightTools","createViewMenu","createFullscreenButton","tools","createElementNS","setAttributeNS","glyph","pEl","_createToolbarIcon","factory","define","_window","_document","mousemove","mouseup","mousedown","EventListener","removeEventListener","newScrollX","newScrollY","dragged","el","container","md","mu","mm","lastClientX","lastClientY","pushed","scroller","cont","hasAttribute","elementFromPoint","readyState","elt","setAttributes","setDOMAttributes","createElement","handleEltConstructorArg","createTextNode","Node","childCount","attributes","prop","setStyle","setAttribute","cssText","cssProp","DivaEvents","topic","scope","thisTopic","thisTopicGlobal","globalCount","getInstanceId","instanceID","thisTopicInstance","scopedCount","handle","completely","topicArray","topics","getScrollbarWidth","inner","outer","visibility","overflow","w1","offsetWidth","w2","clientWidth","getHashParam","updateHashParam","startIndex","endIndex","substring","originalValue","startThing","_raf","_isTouch","_extend","VanillaKinetic","DEFAULTS","ACTIVE_CLASS","_initElements","_VanillaKinetic","cursor","decelerate","triggerHardware","threshold","slowdown","maxvelocity","throttleFPS","invert","movingClass","up","down","deceleratingClass","velocity","velocityY","_move","stop","stopped","detach","_detachListeners","classList","remove","attach","contains","_attachListeners","xpos","prevXPos","ypos","prevYPos","mouseDown","throttleTimeout","lastMove","elementFocused","that","documentResetHandler","_resetMouse","html","_initEvents","prefixes","styles","prefix","events","touchStart","touch","_useTarget","_threshold","_start","stopPropagation","touchMove","_inputmove","inputDown","nodeName","inputEnd","_end","inputMove","scroll","moved","inputClick","dragStart","selectStart","getTime","movedX","movedY","blur","focus","_calculateVelocities","_setMoveClasses","_capVelocity","filterTarget","_decelerateVelocity","newVelocity","classes","_getScroller","scrollWidth","scrollHeight","moving","ValidationRunner","whitelistedKeys","additionalProperties","validations","validationIndex","validation","dummyChanges","proxier","createSettingsProxier","_runValidation","_validateOptions","cloned","settingsProxier","_applyValidations","corrected","warningSuppressed","emitWarning","suppressWarning","outputValue","validate","proxy","runner","lookup","lookupValue","properties","whitelisted","additional","currentKey","defineProperties","original","extension","generateId","counter","optionsValidations","parentObject","initialKeyScroll","initialSpaceScroll","innerObject","isScrollable","isZooming","mobileWebkit","outerObject","pageOverlays","pageTools","pluginInstances","resizeTimer","scrollbarWidth","throbberTimeoutID","verticalPadding","viewHandler","viewportElement","viewportObject","zoomDuration","idNumber","panelHeight","panelWidth","optionsValidator","orientation","innerElem","elemAttrs","viewportElem","outerElem","Viewport","intersectionTolerance","boundScrollFunction","scrollFunction","boundEscapeListener","escapeListener","initPlugins","handleEvents","showThrobber","isValid","attribute","keyCode","reloadViewer","queuedEvents","getValidatedOptions","hasChangedOption","prepareModeChange","clearViewer","updateViewHandlerAndRendering","rendererConfig","getPadding","sourceProvider","getCurrentSourceProvider","serialized","changeClass","storedHeight","storedWidth","invalidate","newHeight","newWidth","Handler","initializeRenderer","compatErrors","getCompatibilityErrors","updatePageOverlays","gridSourceProvider","getPageImageTiles","levelCount","topPadding","leftPadding","docVPadding","docHPadding","updateOverlays","getRenderedPages","focalPoint","currentRegion","pageRegion","focalXToCenter","focalYToCenter","getPositionForZoomLevel","initZoom","zoomRatio","initialZoomLevel","endPosition","transitionViewportPosition","anchor","getPageData","updateOffsets","gestureEvents","updatePanelSize","previousTopScroll","previousLeftScroll","direction","newScrollTop","newScrollLeft","adjust","primaryScroll","bindMouseEvents","upArrowKey","downArrowKey","leftArrowKey","rightArrowKey","spaceKey","pageUpKey","pageDownKey","homeKey","endKey","shiftKey","metaKey","Infinity","onResize","plugins","isPageTool","hideThrobber","thb","errorElement","querySelector","innerHTML","needsXCoord","needsYCoord","anchoredVertically","anchoredHorizontally","minWidth","minHeight","addOverlay","removeOverlay","docOffset","docCoords","pageCount","handleZoom","hasClass","dblclick","contextmenu","removeClass","parent","empty","removeData","removeAttr","unsubscribeAll","maxExtent","_top","_left","_width","_height","_innerDimensions","hasHorizontalOverlap","hasVerticalOverlap","fallsBetween","clampMax","clientHeight","clamp","getCoordinateDescriptor","getDimensionDescriptor","coord","associatedDimension","privateProp","charAt","newValue","normalized","maxAllowed","clampMin","dimen","point"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;kBA78BqBqN,O;;;;;;;;;;;;;;ACHrB;;;;;;;AAOC,WAAU/e,IAAV,EAAgB+mC,OAAhB,EACD;AACI,QAAI,IAAJ,EACA;AACIC,QAAA,iCAAO,CAAC,OAAD,CAAP,oCAAoBD,OAApB;AAAA;AAAA;AAAA;AACH,KAHD,MAIK,EAOJ;AACJ,CAdA,aAcO,UAAU3vC,OAAV,EACR;AACI,QAAI6vC,UAAUhvC,MAAd;AACA,QAAIivC,YAAY1uC,QAAhB;AACA,QAAI2uC,YAAY,WAAhB;AACA,QAAIC,UAAU,SAAd;AACA,QAAIC,YAAY,WAAhB;AACA,QAAIC,gBAAgB,eAApB;AACA,QAAIjb,mBAAmB,QAAQib,aAA/B;AACA,QAAIC,sBAAsB,WAAWD,aAArC;AACA,QAAIE,UAAJ,EAAgBC,UAAhB,CAT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","file":"diva.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_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, __webpack_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__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_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__webpack_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__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_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__webpack_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) __webpack_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__webpack_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__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","(function () {\n if (Array.prototype.fill) return;\n\n var fill = function (value) {\n // Steps 1-2.\n if (this == null) {\n throw new TypeError(\"this is null or not defined\");\n }\n\n var O = Object(this);\n\n // Steps 3-5.\n var len = O.length >>> 0;\n\n // Steps 6-7.\n var start = arguments[1];\n var relativeStart = start >> 0;\n\n // Step 8.\n var k = relativeStart < 0 ?\n Math.max(len + relativeStart, 0) :\n Math.min(relativeStart, len);\n\n // Steps 9-10.\n var end = arguments[2];\n var relativeEnd = end === undefined ?\n len : end >> 0;\n\n // Step 11.\n var last = relativeEnd < 0 ?\n Math.max(len + relativeEnd, 0) :\n Math.min(relativeEnd, len);\n\n // Step 12.\n while (k < last) {\n O[k] = value;\n k++;\n }\n\n // Step 13.\n return O;\n };\n\n if (Object.defineProperty) {\n try {\n Object.defineProperty(Array.prototype, 'fill', {\n value: fill,\n configurable: true,\n enumerable: false,\n writable: true\n });\n } catch(e) {}\n }\n\n if (!Array.prototype.fill) {\n Array.prototype.fill = fill;\n }\n})(this);\n","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // Internet Explorer and Edge do not support colors.\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n var prevTime;\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n debug.destroy = destroy;\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n exports.instances.push(debug);\n\n return debug;\n}\n\nfunction destroy () {\n var index = exports.instances.indexOf(this);\n if (index !== -1) {\n exports.instances.splice(index, 1);\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var i;\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n\n for (i = 0; i < exports.instances.length; i++) {\n var instance = exports.instances[i];\n instance.enabled = exports.enabled(instance.namespace);\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n if (name[name.length - 1] === '*') {\n return true;\n }\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n PARTIAL_COMPARE_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n * The bitmask may be composed of the following flags:\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = getTag(object);\n objTag = objTag == argsTag ? objectTag : objTag;\n }\n if (!othIsArr) {\n othTag = getTag(other);\n othTag = othTag == argsTag ? objectTag : othTag;\n }\n var objIsObj = objTag == objectTag && !isHostObject(object),\n othIsObj = othTag == objectTag && !isHostObject(other),\n isSameTag = objTag == othTag;\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n }\n if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!seen.has(othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n return seen.add(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, customizer, bitmask, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= UNORDERED_COMPARE_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var result,\n index = -1,\n length = path.length;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result) {\n return result;\n }\n var length = object ? object.length : 0;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\n/**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\nfunction maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)\n : undefined;\n}\n\nmodule.exports = maxBy;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n","import TileCoverageMap from \"./tile-coverage-map\";\n\n/**\n * @class CompositeImage\n * @private\n *\n * Utility class to composite tiles into a complete image\n * and track the rendered state of an image as new tiles\n * load.\n */\n\n/**\n * @param levels {Array.>}\n * @constructor\n */\nexport default class CompositeImage\n{\n constructor(levels)\n {\n this._levels = levels; // Assume levels sorted high-res first\n const urlsToTiles = this._urlsToTiles = {};\n\n levels.forEach(level =>\n {\n level.tiles.forEach(tile =>\n {\n urlsToTiles[tile.url] = {\n zoomLevel: level.zoomLevel,\n row: tile.row,\n col: tile.col\n };\n });\n });\n\n this.clear();\n }\n\n clear ()\n {\n const loadedByLevel = this._loadedByLevel = {};\n\n this._levels.forEach(level => {\n loadedByLevel[level.zoomLevel] = new TileCoverageMap(level.rows, level.cols);\n });\n }\n\n getTiles (baseZoomLevel)\n {\n const toRenderByLevel = [];\n const highestZoomLevel = this._levels[0].zoomLevel;\n const covered = new TileCoverageMap(this._levels[0].rows, this._levels[0].cols);\n\n let bestLevelIndex;\n\n // Default to the lowest zoom level\n if (baseZoomLevel === null)\n {\n bestLevelIndex = 0;\n }\n else\n {\n const ceilLevel = Math.ceil(baseZoomLevel);\n bestLevelIndex = findIndex(this._levels, level => level.zoomLevel <= ceilLevel);\n // bestLevelIndex = this._levels.findIndex((level) => level.zoomLevel <= ceilLevel);\n }\n\n\n // The best level, followed by higher-res levels in ascending order of resolution,\n // followed by lower-res levels in descending order of resolution\n const levelsByPreference = this._levels.slice(0, bestLevelIndex + 1).reverse()\n .concat(this._levels.slice(bestLevelIndex + 1));\n\n levelsByPreference.forEach( (level) =>\n {\n const loaded = this._loadedByLevel[level.zoomLevel];\n\n let additionalTiles = level.tiles.filter(tile => loaded.isLoaded(tile.row, tile.col));\n\n // Filter out entirely covered tiles\n\n // FIXME: Is it better to draw all of a partially covered tile,\n // with some of it ultimately covered, or to pick out the region\n // which needs to be drawn?\n // See https://github.com/DDMAL/diva.js/issues/358\n const scaleRatio = Math.pow(2, highestZoomLevel - level.zoomLevel);\n\n additionalTiles = additionalTiles.filter(tile => {\n let isNeeded = false;\n\n const highResRow = tile.row * scaleRatio;\n const highResCol = tile.col * scaleRatio;\n\n for (let i=0; i < scaleRatio; i++)\n {\n for (let j=0; j < scaleRatio; j++)\n {\n if (!covered.isLoaded(highResRow + i, highResCol + j))\n {\n isNeeded = true;\n covered.set(highResRow + i, highResCol + j, true);\n }\n }\n }\n\n return isNeeded;\n });\n\n toRenderByLevel.push(additionalTiles);\n }, this);\n\n // Less-preferred tiles should come first\n toRenderByLevel.reverse();\n\n const tiles = [];\n\n toRenderByLevel.forEach(byLevel => {\n tiles.push.apply(tiles, byLevel);\n });\n\n return tiles;\n }\n\n /**\n * Update the composite image to take into account all the URLs\n * loaded in an image cache.\n *\n * @param cache {ImageCache}\n */\n updateFromCache (cache)\n {\n this.clear();\n\n this._levels.forEach( (level) =>\n {\n const loaded = this._loadedByLevel[level.zoomLevel];\n\n level.tiles.forEach(tile => {\n if (cache.has(tile.url))\n loaded.set(tile.row, tile.col, true);\n });\n }, this);\n }\n\n updateWithLoadedUrls (urls)\n {\n urls.forEach( (url) =>\n {\n const entry = this._urlsToTiles[url];\n this._loadedByLevel[entry.zoomLevel].set(entry.row, entry.col, true);\n }, this);\n }\n}\n\n// function fill (count, value)\n// {\n// const arr = new Array(count);\n//\n// for (let i=0; i < count; i++)\n// arr[i] = value;\n//\n// return arr;\n// }\n\nfunction findIndex (array, predicate)\n{\n const length = array.length;\n for (let i = 0; i < length; i++)\n {\n if (predicate(array[i], i))\n return i;\n }\n\n return -1;\n}\n","import { Events } from './utils/events';\n// import PluginRegistry from './plugin-registry';\n\nconst diva = {\n Events: Events,\n\n // registerPlugin: function (plugin)\n // {\n // PluginRegistry.register(plugin);\n // },\n\n /**\n * Create a new Diva instance at the given element\n *\n * @param element {Element}\n * @param options {Object}\n * @returns {Diva}\n */\n // create: function (element, options)\n // {\n // if (diva.find(element))\n // throw new Error('Diva is already initialized on ' + reprElem(element));\n //\n // const $elem = $(element);\n // $elem.diva(options);\n //\n // return $elem.data('diva');\n // },\n\n /**\n * Return the Diva instance attached to the\n * element, if any.\n *\n * @param element\n * @returns {Diva|null}\n */\n // find: function (element)\n // {\n // return $(element).data('diva') || null;\n // }\n};\n\nexport default diva;\n\n// function reprElem(elem)\n// {\n// const id = elem.id ? '#' + elem.id : elem.id;\n// const classes = elem.className ? '.' + elem.className.split(/\\s+/g).join('.') : '';\n//\n// return (id ? id : elem.tagName.toLowerCase()) + classes;\n// }\n","import './utils/vanilla.kinetic';\nimport './utils/dragscroll';\nimport { elt } from \"./utils/elt\";\nimport {\n DivaParentElementNotFoundException,\n NotAnIIIFManifestException,\n ObjectDataNotSuppliedException\n} from \"./exceptions\";\nimport diva from \"./diva-global\";\nimport ViewerCore from \"./viewer-core\";\nimport ImageManifest from \"./image-manifest\";\nimport Toolbar from \"./toolbar\";\nimport HashParams from \"./utils/hash-params\";\n\n\n/**\n * The top-level class for Diva objects. This is instantiated by passing in an HTML element\n * ID or HTML Element node and an object containing a list of options, of which the 'objectData'\n * option is required and which must point to a IIIF Presentation API Manifest:\n *\n * var diva = new Diva('element-id', {\n * objectData: \"http://example.com/iiif-manifest.json\"\n * });\n *\n * This class also serves as the entry point for the Events system, in which applications can subscribe\n * to notifications sent from Diva instances:\n *\n * Diva.Events.subscribe('VisiblePageDidChange', function () { console.log(\"Visible Page Changed\"); });\n *\n *\n *\n **/\nclass Diva\n{\n constructor (element, options)\n {\n /*\n * If a string is passed in, convert that to an element.\n * */\n if (!(element instanceof HTMLElement))\n {\n this.element = document.getElementById(element);\n\n if (this.element === null)\n {\n throw new DivaParentElementNotFoundException();\n }\n }\n\n if (!options.objectData)\n {\n throw new ObjectDataNotSuppliedException('You must supply either a URL or a literal object to the `objectData` key.');\n }\n\n this.options = Object.assign({\n adaptivePadding: 0.05, // The ratio of padding to the page dimension\n arrowScrollAmount: 40, // The amount (in pixels) to scroll by when using arrow keys\n blockMobileMove: false, // Prevent moving or scrolling the page on mobile devices\n objectData: '', // A IIIF Manifest or a JSON file generated by process.py that provides the object dimension data, or a URL pointing to such data - *REQUIRED*\n enableAutoTitle: true, // Shows the title within a div of id diva-title\n enableFilename: true, // Uses filenames and not page numbers for links (i=bm_001.tif, not p=1)\n enableFullscreen: true, // Enable or disable fullscreen icon (mode still available)\n enableGotoPage: true, // A \"go to page\" jump box\n enableGotoSuggestions: true, // Controls whether suggestions are shown under the input field when the user is typing in the 'go to page' form\n enableGridIcon: true, // A grid view of all the pages\n enableGridControls: 'buttons', // Specify control of pages per grid row in Grid view. Possible values: 'buttons' (+/-), 'slider'. Any other value disables the controls.\n enableImageTitles: true, // Adds \"Page {n}\" title to page images if true\n enableKeyScroll: true, // Captures scrolling using the arrow and page up/down keys regardless of page focus. When off, defers to default browser scrolling behavior.\n enableLinkIcon: true, // Controls the visibility of the link icon\n enableNonPagedVisibilityIcon: true, // Controls the visibility of the icon to toggle the visibility of non-paged pages. (Automatically hidden if no 'non-paged' pages).\n enableSpaceScroll: false, // Scrolling down by pressing the space key\n enableToolbar: true, // Enables the toolbar. Note that disabling this means you have to handle all controls yourself.\n enableZoomControls: 'buttons', // Specify controls for zooming in and out. Possible values: 'buttons' (+/-), 'slider'. Any other value disables the controls.\n fillParentHeight: true, // Use a flexbox layout to allow Diva to fill its parent's height\n fixedPadding: 10, // Fallback if adaptive padding is set to 0\n fixedHeightGrid: true, // So each page in grid view has the same height (only widths differ)\n goDirectlyTo: 0, // Default initial page to show (0-indexed)\n hashParamSuffix: null, // Used when there are multiple document viewers on a page\n iipServerURL: '', // The URL to the IIPImage installation, including the `?FIF=` - *REQUIRED*, unless using IIIF\n inFullscreen: false, // Set to true to load fullscreen mode initially\n inBookLayout: false, // Set to true to view the document with facing pages in document mode\n inGrid: false, // Set to true to load grid view initially\n imageDir: '', // Image directory, either absolute path or relative to IIP's FILESYSTEM_PREFIX - *REQUIRED*, unless using IIIF\n maxPagesPerRow: 8, // Maximum number of pages per row in grid view\n maxZoomLevel: -1, // Optional; defaults to the max zoom returned in the JSON response\n minPagesPerRow: 2, // Minimum pages per row in grid view. Recommended default.\n minZoomLevel: 0, // Defaults to 0 (the minimum zoom)\n onGotoSubmit: null, // When set to a function that takes a string and returns a page index, this will override the default behaviour of the 'go to page' form submission\n pageAliases: {}, // An object mapping specific page indices to aliases (has priority over 'pageAliasFunction'\n pageAliasFunction: function(){return false;}, // A function mapping page indices to an alias. If false is returned, default page number is displayed\n pageLoadTimeout: 200, // Number of milliseconds to wait before loading pages\n pagesPerRow: 5, // The default number of pages per row in grid view\n showNonPagedPages: false, // Whether pages tagged as 'non-paged' (in IIIF manifests only) should be visible after initial load\n throbberTimeout: 100, // Number of milliseconds to wait before showing throbber\n tileHeight: 256, // The height of each tile, in pixels; usually 256\n tileWidth: 256, // The width of each tile, in pixels; usually 256\n toolbarParentObject: null, // The toolbar parent object.\n verticallyOriented: true, // Determines vertical vs. horizontal orientation\n viewportMargin: 200, // Pretend tiles +/- 200px away from viewport are in\n zoomLevel: 2 // The initial zoom level (used to store the current zoom level)\n }, options);\n\n // In order to fill the height, use a wrapper div displayed using a flexbox layout\n const wrapperElement = elt('div', {\n class: `diva-wrapper${this.options.fillParentHeight ? \" diva-wrapper-flexbox\" : \"\"}`\n });\n\n this.element.appendChild(wrapperElement);\n\n this.options.toolbarParentObject = this.options.toolbarParentObject || wrapperElement;\n\n const viewerCore = new ViewerCore(wrapperElement, this.options, this);\n\n this.viewerState = viewerCore.getInternalState();\n this.settings = viewerCore.getSettings();\n this.toolbar = new Toolbar(this);\n\n wrapperElement.id = this.settings.ID + 'wrapper';\n\n this.divaState = {\n viewerCore: viewerCore,\n toolbar: this.settings.enableToolbar ? this.toolbar : null\n };\n\n this.toolbar.render();\n this.hashState = this._getHashParamState();\n\n this._loadOrFetchObjectData();\n }\n\n /**\n * @private\n **/\n _loadOrFetchObjectData ()\n {\n if (typeof this.settings.objectData === 'object')\n {\n \tlet self = this;\n // Defer execution until initialization has completed\n setTimeout(function ()\n {\n self._loadObjectData(self.settings.objectData, self.hashState);\n }, 0);\n }\n else\n {\n const pendingManifestRequest = fetch(this.settings.objectData, {\n headers: {\n \"Accept\": \"application/json\"\n }\n }).then( (response) =>\n {\n if (!response.ok)\n {\n this._ajaxError(response);\n\n let error = new Error(response.statusText);\n error.response = response;\n throw error;\n }\n return response.json();\n\n }).then( (data) =>\n {\n this._loadObjectData(data, this.hashState);\n });\n\n // Store the pending request so that it can be cancelled in the event that Diva needs to be destroyed\n this.divaState.viewerCore.setPendingManifestRequest(pendingManifestRequest);\n }\n }\n\n /**\n * @private\n **/\n _showError (message)\n {\n this.divaState.viewerCore.showError(message);\n }\n\n /**\n * @private\n * */\n _ajaxError (response)\n {\n // Show a basic error message within the document viewer pane\n const errorMessage = ['Invalid objectData setting. Error code: ' + response.status + ' ' + response.statusText];\n\n // Detect and handle CORS errors\n const dataHasAbsolutePath = this.settings.objectData.lastIndexOf('http', 0) === 0;\n\n if (dataHasAbsolutePath)\n {\n const jsonHost = this.settings.objectData.replace(/https?:\\/\\//i, \"\").split(/[/?#]/)[0];\n\n if (window.location.hostname !== jsonHost)\n {\n errorMessage.push(\n elt('p', 'Attempted to access cross-origin data without CORS.'),\n elt('p',\n 'You may need to update your server configuration to support CORS. For help, see the ',\n elt('a', {\n href: 'https://github.com/DDMAL/diva.js/wiki/Installation#a-note-about-cross-site-requests',\n target: '_blank'\n }, 'cross-site request documentation.')\n )\n );\n }\n }\n\n this._showError(errorMessage);\n }\n\n /**\n * @private\n **/\n _loadObjectData (responseData, hashState)\n {\n let manifest;\n\n // TODO improve IIIF detection method\n if (!responseData.hasOwnProperty('@context') && (responseData['@context'].indexOf('iiif') === -1 || responseData['@context'].indexOf('shared-canvas') === -1))\n {\n throw new NotAnIIIFManifestException('This does not appear to be a IIIF Manifest.');\n }\n\n // trigger ManifestDidLoad event\n // FIXME: Why is this triggered before the manifest is parsed? See https://github.com/DDMAL/diva.js/issues/357\n diva.Events.publish('ManifestDidLoad', [responseData], this);\n\n manifest = ImageManifest.fromIIIF(responseData);\n const loadOptions = hashState ? this._getLoadOptionsForState(hashState, manifest) : {};\n\n this.divaState.viewerCore.setManifest(manifest, loadOptions);\n }\n\n /**\n * Parse the hash parameters into the format used by getState and setState\n *\n * @private\n **/\n _getHashParamState ()\n {\n const state = {};\n\n ['f', 'v', 'z', 'n', 'i', 'p', 'y', 'x'].forEach( (param) =>\n {\n const value = HashParams.get(param + this.settings.hashParamSuffix);\n\n // `false` is returned if the value is missing\n if (value !== false)\n state[param] = value;\n });\n\n // Do some awkward special-casing, since this format is kind of weird.\n\n // For inFullscreen (f), true and false strings should be interpreted\n // as booleans.\n if (state.f === 'true')\n state.f = true;\n else if (state.f === 'false')\n state.f = false;\n\n // Convert numerical values to integers, if provided\n ['z', 'n', 'p', 'x', 'y'].forEach( (param) =>\n {\n if (param in state)\n state[param] = parseInt(state[param], 10);\n });\n\n return state;\n }\n\n /**\n * @private\n **/\n _getLoadOptionsForState (state, manifest)\n {\n manifest = manifest || this.settings.manifest;\n\n const options = ('v' in state) ? this._getViewState(state.v) : {};\n\n if ('f' in state)\n options.inFullscreen = state.f;\n\n if ('z' in state)\n options.zoomLevel = state.z;\n\n if ('n' in state)\n options.pagesPerRow = state.n;\n\n // Only change specify the page if state.i or state.p is valid\n let pageIndex = this._getPageIndexForManifest(manifest, state.i);\n\n if (!(pageIndex >= 0 && pageIndex < manifest.pages.length))\n {\n pageIndex = state.p - 1;\n\n // Possibly NaN\n if (!(pageIndex >= 0 && pageIndex < manifest.pages.length))\n pageIndex = null;\n }\n\n if (pageIndex !== null)\n {\n const horizontalOffset = parseInt(state.x, 10);\n const verticalOffset = parseInt(state.y, 10);\n\n options.goDirectlyTo = pageIndex;\n options.horizontalOffset = horizontalOffset;\n options.verticalOffset = verticalOffset;\n }\n\n return options;\n }\n\n /**\n * @private\n * */\n _getViewState (view)\n {\n switch (view)\n {\n case 'd':\n return {\n inGrid: false,\n inBookLayout: false\n };\n\n case 'b':\n return {\n inGrid: false,\n inBookLayout: true\n };\n\n case 'g':\n return {\n inGrid: true,\n inBookLayout: false\n };\n\n default:\n return null;\n }\n }\n\n /**\n * @private\n * */\n _getPageIndexForManifest (manifest, filename)\n {\n let i;\n const np = manifest.pages.length;\n\n for (i = 0; i < np; i++)\n {\n if (manifest.pages[i].f === filename)\n {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * @private\n * */\n _getState ()\n {\n let view;\n\n if (this.settings.inGrid)\n {\n view = 'g';\n }\n else if (this.settings.inBookLayout)\n {\n view = 'b';\n }\n else\n {\n view = 'd';\n }\n\n const layout = this.divaState.viewerCore.getCurrentLayout();\n const pageOffset = layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n return {\n 'f': this.settings.inFullscreen,\n 'v': view,\n 'z': this.settings.zoomLevel,\n 'n': this.settings.pagesPerRow,\n 'i': this.settings.enableFilename ? this.settings.manifest.pages[this.settings.currentPageIndex].f : false,\n 'p': this.settings.enableFilename ? false : this.settings.currentPageIndex + 1,\n 'y': pageOffset ? pageOffset.y : false,\n 'x': pageOffset ? pageOffset.x : false\n };\n }\n\n /**\n * @private\n **/\n _getURLHash ()\n {\n const hashParams = this._getState();\n const hashStringBuilder = [];\n let param;\n\n for (param in hashParams)\n {\n if (hashParams[param] !== false)\n hashStringBuilder.push(param + this.settings.hashParamSuffix + '=' + encodeURIComponent(hashParams[param]));\n }\n\n return hashStringBuilder.join('&');\n }\n\n /**\n * Returns the page index associated with the given filename; must called after setting settings.manifest\n *\n * @private\n **/\n _getPageIndex (filename)\n {\n return this._getPageIndexForManifest(this.settings.manifest, filename);\n }\n\n /**\n * @private\n * */\n _checkLoaded ()\n {\n if (!this.viewerState.loaded)\n {\n console.warn(\"The viewer is not completely initialized. This is likely because it is still downloading data. To fix this, only call this function if the isReady() method returns true.\");\n return false;\n }\n return true;\n }\n\n /**\n * Called when the fullscreen icon is clicked\n *\n * @private\n **/\n _toggleFullscreen ()\n {\n this._reloadViewer({\n inFullscreen: !this.settings.inFullscreen\n });\n }\n\n /**\n * Toggles between orientations\n *\n * @private\n * */\n _togglePageLayoutOrientation ()\n {\n const verticallyOriented = !this.settings.verticallyOriented;\n\n //if in grid, switch out of grid\n this._reloadViewer({\n inGrid: false,\n verticallyOriented: verticallyOriented,\n goDirectlyTo: this.settings.currentPageIndex,\n verticalOffset: this.divaState.viewerCore.getYOffset(),\n horizontalOffset: this.divaState.viewerCore.getXOffset()\n });\n\n return verticallyOriented;\n }\n\n /**\n * Called when the change view icon is clicked\n *\n * @private\n **/\n _changeView (destinationView)\n {\n switch (destinationView)\n {\n case 'document':\n return this._reloadViewer({\n inGrid: false,\n inBookLayout: false\n });\n\n case 'book':\n return this._reloadViewer({\n inGrid: false,\n inBookLayout: true\n });\n\n case 'grid':\n return this._reloadViewer({\n inGrid: true\n });\n\n default:\n return false;\n }\n }\n\n /**\n * @private\n *\n * @param {Number} pageIndex - 0-based page index.\n * @param {Number} xAnchor - x coordinate to jump to on resulting page.\n * @param {Number} yAnchor - y coordinate to jump to on resulting page.\n * @returns {Boolean} - Whether the jump was successful.\n **/\n _gotoPageByIndex (pageIndex, xAnchor, yAnchor)\n {\n let pidx = parseInt(pageIndex, 10);\n\n if (this._isPageIndexValid(pidx))\n {\n const xOffset = this.divaState.viewerCore.getXOffset(pidx, xAnchor);\n const yOffset = this.divaState.viewerCore.getYOffset(pidx, yAnchor);\n\n this.viewerState.renderer.goto(pidx, yOffset, xOffset);\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if a page index is valid\n *\n * @private\n * @param {Number} pageIndex - Numeric (0-based) page index\n * @return {Boolean} whether the page index is valid or not.\n */\n _isPageIndexValid (pageIndex)\n {\n return this.settings.manifest.isPageValid(pageIndex, this.settings.showNonPagedPages);\n }\n\n /**\n * Given a pageX and pageY value, returns either the page visible at that (x,y)\n * position or -1 if no page is.\n *\n * @private\n */\n _getPageIndexForPageXYValues (pageX, pageY)\n {\n //get the four edges of the outer element\n const outerOffset = this.viewerState.outerElement.getBoundingClientRect();\n const outerTop = outerOffset.top;\n const outerLeft = outerOffset.left;\n const outerBottom = outerOffset.bottom;\n const outerRight = outerOffset.right;\n\n //if the clicked position was outside the diva-outer object, it was not on a visible portion of a page\n if (pageX < outerLeft || pageX > outerRight)\n return -1;\n\n if (pageY < outerTop || pageY > outerBottom)\n return -1;\n\n //navigate through all diva page objects\n const pages = document.getElementsByClassName('diva-page');\n let curPageIdx = pages.length;\n while (curPageIdx--)\n {\n //get the offset for each page\n const curPage = pages[curPageIdx];\n const curOffset = curPage.getBoundingClientRect();\n\n //if this point is outside the horizontal boundaries of the page, continue\n if (pageX < curOffset.left || pageX > curOffset.right)\n continue;\n\n //same with vertical boundaries\n if (pageY < curOffset.top || pageY > curOffset.bottom)\n continue;\n\n //if we made it through the above two, we found the page we're looking for\n return curPage.getAttribute('data-index');\n }\n\n //if we made it through that entire while loop, we didn't click on a page\n return -1;\n }\n\n /**\n * @private\n **/\n _reloadViewer (newOptions)\n {\n return this.divaState.viewerCore.reload(newOptions);\n }\n\n /**\n * @private\n */\n _getCurrentURL ()\n {\n return location.protocol + '//' + location.host + location.pathname + location.search + '#' + this._getURLHash();\n }\n\n /**\n * ===============================================\n * PUBLIC FUNCTIONS\n * ===============================================\n **/\n\n /**\n * Activate this instance of diva via the active Diva controller.\n *\n * @public\n */\n activate ()\n {\n this.viewerState.isActiveDiva = true;\n }\n\n /**\n * Change the object (objectData) parameter currently being rendered by Diva.\n *\n * @public\n * @params {object} objectData - An IIIF Manifest object OR a URL to a IIIF manifest.\n */\n changeObject (objectData)\n {\n this.viewerState.loaded = false;\n this.divaState.viewerCore.clear();\n\n if (this.viewerState.renderer)\n this.viewerState.renderer.destroy();\n\n this.viewerState.options.objectData = objectData;\n\n this._loadOrFetchObjectData();\n }\n\n /**\n * Change views. Takes 'document', 'book', or 'grid' to specify which view to switch into\n *\n * @public\n * @params {string} destinationView - the destination view to change to.\n */\n changeView (destinationView)\n {\n this._changeView(destinationView);\n }\n\n /**\n * Close all popups on the toolbar.\n *\n * @public\n **/\n closePopups ()\n {\n this.divaState.toolbar.closePopups();\n }\n\n /**\n * Deactivate this diva instance through the active Diva controller.\n *\n * @public\n **/\n deactivate ()\n {\n this.viewerState.isActiveDiva = false;\n }\n\n /**\n * Destroys this instance, tells plugins to do the same\n *\n * @public\n **/\n destroy ()\n {\n this.divaState.viewerCore.destroy();\n }\n\n /**\n * Disables document dragging, scrolling (by keyboard if set), and zooming by double-clicking\n *\n * @public\n **/\n disableScrollable ()\n {\n this.divaState.viewerCore.disableScrollable();\n }\n\n /**\n * Re-enables document dragging, scrolling (by keyboard if set), and zooming by double-clicking\n *\n * @public\n **/\n enableScrollable ()\n {\n this.divaState.viewerCore.enableScrollable();\n }\n\n /**\n * Enter fullscreen mode if currently not in fullscreen mode. If currently in fullscreen\n * mode this will have no effect.\n *\n * This function will work even if enableFullscreen is set to false in the options.\n *\n * @public\n * @returns {boolean} - Whether the switch to fullscreen was successful or not.\n **/\n enterFullscreenMode ()\n {\n if (!this.settings.inFullscreen)\n {\n this._toggleFullscreen();\n return true;\n }\n\n return false;\n }\n\n /**\n * Enter grid view if currently not in grid view. If currently in grid view mode\n * this will have no effect.\n *\n * @public\n * @returns {boolean} - Whether the switch to grid view was successful or not.\n **/\n enterGridView ()\n {\n if (!this.settings.inGrid)\n {\n this._changeView('grid');\n return true;\n }\n\n return false;\n }\n\n /**\n * Return the current URL for the viewer, including the hash parameters reflecting\n * the current state of the viewer.\n *\n * @public\n * @returns {string} - The URL for the current view state.\n * */\n getCurrentURL ()\n {\n return this._getCurrentURL();\n }\n\n /**\n * Returns the title of the document, based on the label in the IIIF manifest.\n *\n * @public\n * @returns {string} - The current title of the object from the label key in the IIIF Manifest.\n **/\n getItemTitle ()\n {\n return this.settings.manifest.itemTitle;\n }\n\n /**\n * Get the canvas identifier for the currently visible page.\n *\n * @public\n * @returns {string} - The URI of the currently visible canvas.\n **/\n getCurrentCanvas ()\n {\n return this.settings.manifest.pages[this.settings.currentPageIndex].canvas;\n }\n\n /**\n * Returns the dimensions of the current page at the current zoom level. Also works in\n * grid view.\n *\n * @public\n * @returns {object} - An object containing the current page dimensions at the current zoom level.\n **/\n getCurrentPageDimensionsAtCurrentZoomLevel ()\n {\n return this.getPageDimensionsAtCurrentZoomLevel(this.settings.currentPageIndex);\n }\n\n /**\n * Returns the current filename (deprecated). Returns the URI for current page.\n *\n * @public\n * @deprecated\n * @returns {string} - The URI for the current page image.\n **/\n getCurrentPageFilename ()\n {\n console.warn('This method will be deprecated in the next version of Diva. Please use getCurrentPageURI instead.');\n return this.settings.manifest.pages[this.settings.currentPageIndex].f;\n }\n\n /**\n * Returns the current URI for the visible page.\n *\n * @public\n * @returns {string} - The URI for the current page image.\n **/\n getCurrentPageURI ()\n {\n return this.settings.manifest.pages[this.settings.currentPageIndex].f;\n }\n\n /**\n * Returns the 0-based index for the current page.\n *\n * @public\n * @returns {number} - The 0-based index for the currently visible page.\n **/\n getCurrentPageIndex ()\n {\n return this.settings.currentPageIndex;\n }\n\n /**\n * Shortcut to getPageOffset for current page.\n *\n * @public\n * @returns {} -\n * */\n getCurrentPageOffset ()\n {\n return this.getPageOffset(this.settings.currentPageIndex);\n }\n\n /**\n * Returns an array of all filenames in the document. Deprecated.\n *\n * @public\n * @deprecated\n * @returns {Array} - An array of all the URIs in the document.\n * */\n getFilenames ()\n {\n console.warn('This will be removed in the next version of Diva. Use getAllPageURIs instead.');\n\n return this.settings.manifest.pages.map( (pg) =>\n {\n return pg.f;\n });\n }\n\n /**\n * Returns an array of all page image URIs in the document.\n *\n * @public\n * @returns {Array} - An array of all the URIs in the document.\n * */\n getAllPageURIs ()\n {\n return this.settings.manifest.pages.map( (pg) =>\n {\n return pg.f;\n });\n }\n\n /**\n * Get the number of grid pages per row.\n *\n * @public\n * @returns {number} - The number of grid pages per row.\n **/\n getGridPagesPerRow ()\n {\n // TODO(wabain): Add test case\n return this.settings.pagesPerRow;\n }\n\n /**\n * Get the instance ID number.\n *\n * @public\n * @returns {number} - The instance ID.\n * */\n //\n getInstanceId ()\n {\n return this.settings.ID;\n }\n\n /**\n * Get the instance selector for this instance. This is the selector for the parent\n * div.\n *\n * @public\n * @returns {string} - The viewport selector.\n * */\n getInstanceSelector ()\n {\n console.log(this);\n return this.divaState.viewerCore.selector;\n }\n\n /**\n * Gets the maximum zoom level for the entire document.\n *\n * @public\n * @returns {number} - The maximum zoom level for the document\n * */\n getMaxZoomLevel ()\n {\n return this.settings.maxZoomLevel;\n }\n\n /**\n * Gets the max zoom level for a given page.\n *\n * @public\n * @param {number} pageIdx - The 0-based index number for the page.\n * @returns {number} - The maximum zoom level for that page.\n * */\n getMaxZoomLevelForPage (pageIdx)\n {\n if (!this._checkLoaded())\n return false;\n\n return this.settings.manifest.pages[pageIdx].m;\n }\n\n /**\n * Gets the minimum zoom level for the entire document.\n *\n * @public\n * @returns {number} - The minimum zoom level for the document\n * */\n getMinZoomLevel ()\n {\n return this.settings.minZoomLevel;\n }\n\n /**\n * Gets the number of pages in the document.\n *\n * @public\n * @returns {number} - The number of pages in the document.\n * */\n getNumberOfPages ()\n {\n if (!this._checkLoaded())\n return false;\n\n return this.settings.numPages;\n }\n\n /**\n * If a canvas has multiple images defined, returns the non-primary image.\n *\n * @public\n * @params {number} pageIndex - The page index for which to return the other images.\n * @returns {object} An object containing the other images.\n **/\n getOtherImages (pageIndex)\n {\n return this.settings.manifest.pages[pageIndex].otherImages;\n }\n\n /**\n * Get page dimensions in the current view and zoom level\n *\n * @public\n * @params {number} pageIndex - A valid 0-based page index\n * @returns {object} - An object containing the dimensions of the page\n * */\n getPageDimensions (pageIndex)\n {\n if (!this._checkLoaded())\n return null;\n\n return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(pageIndex);\n }\n\n /**\n * Get page dimensions at a given zoom level\n *\n * @public\n * @params {number} pageIdx - A valid 0-based page index\n * @params {number} zoomLevel - A candidate zoom level.\n * @returns {object} - An object containing the dimensions of the page at the given zoom level.\n **/\n getPageDimensionsAtZoomLevel (pageIdx, zoomLevel)\n {\n if (!this._checkLoaded())\n return false;\n\n if (zoomLevel > this.settings.maxZoomLevel)\n zoomLevel = this.settings.maxZoomLevel;\n\n const pg = this.settings.manifest.pages[parseInt(pageIdx, 10)];\n const pgAtZoom = pg.d[parseInt(zoomLevel, 10)];\n\n return {\n width: pgAtZoom.w,\n height: pgAtZoom.h\n };\n }\n\n /**\n * Returns the dimensions of a given page at the current zoom level.\n * Also works in Grid view\n *\n * @public\n * @param {number} pageIndex - The 0-based page index\n * @returns {object} - An object containing the page dimensions at the current zoom level.\n * */\n getPageDimensionsAtCurrentZoomLevel (pageIndex)\n {\n let pidx = parseInt(pageIndex, 10);\n\n if (!this._isPageIndexValid(pidx))\n throw new Error('Invalid Page Index');\n\n return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(pidx);\n }\n\n /**\n * Returns a URL for the image of the page at the given index. The\n * optional size parameter supports setting the image width or height\n * (default is full-sized).\n *\n * @public\n * @params {number} pageIndex - 0-based page index\n * @params {?object} size - an object containing width and height information\n * @returns {string} - The IIIF URL for a given page at an optional size\n */\n getPageImageURL (pageIndex, size)\n {\n return this.settings.manifest.getPageImageURL(pageIndex, size);\n }\n\n /**\n * Given a set of co-ordinates (e.g., from a mouse click), return the 0-based page index\n * for which it matches.\n *\n * @public\n * @params {number} pageX - The x co-ordinate\n * @params {number} pageY - The y co-ordinate\n * @returns {number} - The page index matching the co-ordinates.\n * */\n getPageIndexForPageXYValues (pageX, pageY)\n {\n return this._getPageIndexForPageXYValues(pageX, pageY);\n }\n\n /**\n * Returns distance between the northwest corners of diva-inner and page index.\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @params {?options} options - A set of options to pass in.\n * @returns {object} - The offset between the upper left corner and the page.\n *\n * */\n getPageOffset (pageIndex, options)\n {\n const region = this.divaState.viewerCore.getPageRegion(pageIndex, options);\n\n return {\n top: region.top,\n left: region.left\n };\n }\n\n /**\n * Get the instance settings.\n *\n * @public\n * @returns {object} - The current instance settings.\n * */\n getSettings ()\n {\n return this.settings;\n }\n\n /**\n * Get an object representing the complete state of the viewer.\n *\n * @public\n * @returns {object} - The current instance state.\n * */\n getState ()\n {\n return this._getState();\n }\n\n /**\n * Get the current zoom level.\n *\n * @public\n * @returns {number} - The current zoom level.\n * */\n getZoomLevel ()\n {\n return this.settings.zoomLevel;\n }\n\n /**\n * Go to a particular page (with indexing starting at 0).\n * The (xAnchor) side of the page will be anchored to the (xAnchor) side of the diva-outer element\n *\n * @public\n * @params {number} pageIndex - 0-based page index.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"; same process as xAnchor.\n * @returns {boolean} - True if the page index is valid; false if it is not.\n * */\n gotoPageByIndex (pageIndex, xAnchor, yAnchor)\n {\n this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Given a canvas label, attempt to go to that page. If no label was found.\n * the label will be attempted to match against the page index.\n *\n * @public\n * @params {string} label - The label to search on.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} - True if the page index is valid; false if it is not.\n * */\n gotoPageByLabel (label, xAnchor, yAnchor)\n {\n const pages = this.settings.manifest.pages;\n let llc = label.toLowerCase();\n\n for (let i = 0, len = pages.length; i < len; i++)\n {\n if (pages[i].l.toLowerCase().indexOf(llc) > -1)\n return this._gotoPageByIndex(i, xAnchor, yAnchor);\n }\n\n const pageIndex = parseInt(label, 10) - 1;\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Jump to a page based on its filename. Deprecated. Use gotoPageByURI instead.\n *\n * @public\n * @params {string} filename - The filename of the image to jump to.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} true if successful and false if the filename is not found.\n */\n gotoPageByName (filename, xAnchor, yAnchor)\n {\n console.warn('This method will be removed in the next version of Diva.js. Use gotoPageByURI instead.');\n const pageIndex = this._getPageIndex(filename);\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Jump to a page based on its URI.\n *\n * @public\n * @params {string} uri - The URI of the image to jump to.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} true if successful and false if the URI is not found.\n */\n gotoPageByURI (uri, xAnchor, yAnchor)\n {\n const pageIndex = this._getPageIndex(uri);\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Whether the page has other images to display.\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @returns {boolean} Whether the page has other images to display.\n **/\n hasOtherImages (pageIndex)\n {\n return this.settings.manifest.pages[pageIndex].otherImages === true;\n }\n\n /**\n * Hides the pages that are marked \"non-paged\" in the IIIF manifest.\n *\n * @public\n **/\n hideNonPagedPages ()\n {\n this._reloadViewer({ showNonPagedPages: false });\n }\n\n /**\n * Is the viewer currently in full-screen mode?\n *\n * @public\n * @returns {boolean} - Whether the viewer is in fullscreen mode.\n **/\n isInFullscreen ()\n {\n return this.settings.inFullscreen;\n }\n\n /**\n * Check if a page index is within the range of the document\n *\n * @public\n * @returns {boolean} - Whether the page index is valid.\n **/\n isPageIndexValid (pageIndex)\n {\n return this._isPageIndexValid(pageIndex);\n }\n\n /**\n * Determines if a page is currently in the viewport\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @returns {boolean} - Whether the page is currently in the viewport.\n **/\n isPageInViewport (pageIndex)\n {\n return this.viewerState.renderer.isPageVisible(pageIndex);\n }\n\n /**\n * Whether the Diva viewer has been fully initialized.\n *\n * @public\n * @returns {boolean} - True if the viewer is initialized; false otherwise.\n **/\n isReady ()\n {\n return this.viewerState.loaded;\n }\n\n /**\n * Check if something (e.g. a highlight box on a particular page) is visible\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @params {number} leftOffset - The distance of the region from the left of the viewport\n * @params {number} topOffset - The distance of the region from the top of the viewport\n * @params {number} width - The width of the region\n * @params {number} height - The height of the region\n * @returns {boolean} - Whether the region is in the viewport.\n **/\n isRegionInViewport (pageIndex, leftOffset, topOffset, width, height)\n {\n const layout = this.divaState.viewerCore.getCurrentLayout();\n\n if (!layout)\n return false;\n\n const offset = layout.getPageOffset(pageIndex);\n\n const top = offset.top + topOffset;\n const left = offset.left + leftOffset;\n\n return this.viewerState.viewport.intersectsRegion({\n top: top,\n bottom: top + height,\n left: left,\n right: left + width\n });\n }\n\n /**\n * Whether the page layout is vertically or horizontally oriented.\n *\n * @public\n * @returns {boolean} - True if vertical; false if horizontal.\n **/\n isVerticallyOriented ()\n {\n return this.settings.verticallyOriented;\n }\n\n /**\n * Leave fullscreen mode if currently in fullscreen mode.\n *\n * @public\n * @returns {boolean} - true if in fullscreen mode intitially, false otherwise\n **/\n leaveFullscreenMode ()\n {\n if (this.settings.inFullscreen)\n {\n this.toggleFullscreen();\n return true;\n }\n\n return false;\n }\n\n /**\n * Leave grid view if currently in grid view.\n *\n * @public\n * @returns {boolean} - true if in grid view initially, false otherwise\n **/\n leaveGridView ()\n {\n if (this.settings.inGrid)\n {\n this._reloadViewer({ inGrid: false });\n return true;\n }\n\n return false;\n }\n\n /**\n * Set the number of grid pages per row.\n *\n * @public\n * @params {number} pagesPerRow - The number of pages per row\n * @returns {boolean} - True if the operation was successful.\n **/\n setGridPagesPerRow (pagesPerRow)\n {\n // TODO(wabain): Add test case\n if (!this.divaState.viewerCore.isValidOption('pagesPerRow', pagesPerRow))\n return false;\n\n return this._reloadViewer({\n inGrid: true,\n pagesPerRow: pagesPerRow\n });\n }\n\n /**\n * Align this diva instance with a state object (as returned by getState)\n *\n * @public\n * @params {object} state - A Diva state object.\n * @returns {boolean} - True if the operation was successful.\n **/\n setState (state)\n {\n this._reloadViewer(this._getLoadOptionsForState(state));\n }\n\n /**\n * Show non-paged pages.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n showNonPagedPages ()\n {\n this._reloadViewer({ showNonPagedPages: true });\n }\n\n /**\n * Sets the zoom level.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n setZoomLevel (zoomLevel)\n {\n if (this.settings.inGrid)\n {\n this._reloadViewer({\n inGrid: false\n });\n }\n\n return this.divaState.viewerCore.zoom(zoomLevel);\n }\n\n /**\n * Toggle fullscreen mode.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n toggleFullscreenMode ()\n {\n this._toggleFullscreen();\n }\n\n /**\n * Show/Hide non-paged pages\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n toggleNonPagedPagesVisibility ()\n {\n this._reloadViewer({\n showNonPagedPages: !this.settings.showNonPagedPages\n });\n }\n\n //Changes between horizontal layout and vertical layout. Returns true if document is now vertically oriented, false otherwise.\n toggleOrientation ()\n {\n return this._togglePageLayoutOrientation();\n }\n\n /**\n * Translates a measurement from the zoom level on the largest size\n * to one on the current zoom level.\n *\n * For example, a point 1000 on an image that is on zoom level 2 of 5\n * translates to a position of 111.111... (1000 / (5 - 2)^2).\n *\n * Works for a single pixel co-ordinate or a dimension (e.g., translates a box\n * that is 1000 pixels wide on the original to one that is 111.111 pixels wide\n * on the current zoom level).\n *\n * @public\n * @params {number} position - A point on the max zoom level\n * @returns {number} - The same point on the current zoom level.\n */\n translateFromMaxZoomLevel (position)\n {\n const zoomDifference = this.settings.maxZoomLevel - this.settings.zoomLevel;\n return position / Math.pow(2, zoomDifference);\n }\n\n /**\n * Translates a measurement from the current zoom level to the position on the\n * largest zoom level.\n *\n * Works for a single pixel co-ordinate or a dimension (e.g., translates a box\n * that is 111.111 pixels wide on the current image to one that is 1000 pixels wide\n * on the current zoom level).\n *\n * @public\n * @params {number} position - A point on the current zoom level\n * @returns {number} - The same point on the max zoom level.\n */\n translateToMaxZoomLevel (position)\n {\n const zoomDifference = this.settings.maxZoomLevel - this.settings.zoomLevel;\n\n // if there is no difference, it's a box on the max zoom level and\n // we can just return the position.\n if (zoomDifference === 0)\n return position;\n\n return position * Math.pow(2, zoomDifference);\n }\n\n /**\n * Zoom in.\n *\n * @public\n * @returns {boolean} - false if it's at the maximum zoom\n **/\n zoomIn ()\n {\n return this.setZoomLevel(this.settings.zoomLevel + 1);\n }\n\n /**\n * Zoom out.\n * @returns {boolean} - false if it's at the minimum zoom\n **/\n zoomOut ()\n {\n return this.setZoomLevel(this.settings.zoomLevel - 1);\n }\n}\n\nexport default Diva;\n\n/**\n * Make `Diva` available in the global context.\n * */\n(function (global)\n{\n global.Diva = global.Diva || Diva;\n global.Diva.Events = diva.Events;\n})(window);\n","import maxBy from 'lodash.maxby';\nimport PageToolsOverlay from './page-tools-overlay';\n\n\nexport default class DocumentHandler\n{\n constructor (viewerCore)\n {\n this._viewerCore = viewerCore;\n this._viewerState = viewerCore.getInternalState();\n this._overlays = [];\n\n if (this._viewerCore.getPageTools().length)\n {\n const numPages = viewerCore.getSettings().numPages;\n\n for (let i = 0; i < numPages; i++)\n {\n const overlay = new PageToolsOverlay(i, viewerCore);\n this._overlays.push(overlay);\n this._viewerCore.addPageOverlay(overlay);\n }\n }\n }\n\n // USER EVENTS\n onDoubleClick (event, coords)\n {\n const settings = this._viewerCore.getSettings();\n const newZoomLevel = event.ctrlKey ? settings.zoomLevel - 1 : settings.zoomLevel + 1;\n\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n this._viewerCore.zoom(newZoomLevel, position);\n }\n\n onPinch (event, coords, startDistance, endDistance)\n {\n // FIXME: Do this check in a way which is less spaghetti code-y\n const viewerState = this._viewerCore.getInternalState();\n const settings = this._viewerCore.getSettings();\n\n let newZoomLevel = Math.log(Math.pow(2, settings.zoomLevel) * endDistance / (startDistance * Math.log(2))) / Math.log(2);\n newZoomLevel = Math.max(settings.minZoomLevel, newZoomLevel);\n newZoomLevel = Math.min(settings.maxZoomLevel, newZoomLevel);\n\n if (newZoomLevel === settings.zoomLevel)\n {\n return;\n }\n\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n\n const layout = this._viewerCore.getCurrentLayout();\n const centerOffset = layout.getPageToViewportCenterOffset(position.anchorPage, viewerState.viewport);\n const scaleRatio = 1 / Math.pow(2, settings.zoomLevel - newZoomLevel);\n\n this._viewerCore.reload({\n zoomLevel: newZoomLevel,\n goDirectlyTo: position.anchorPage,\n horizontalOffset: (centerOffset.x - position.offset.left) + position.offset.left * scaleRatio,\n verticalOffset: (centerOffset.y - position.offset.top) + position.offset.top * scaleRatio\n });\n }\n\n // VIEW EVENTS\n onViewWillLoad ()\n {\n this._viewerCore.publish('DocumentWillLoad', this._viewerCore.getSettings());\n }\n\n onViewDidLoad ()\n {\n // TODO: Should only be necessary to handle changes on view update, not\n // initial load\n this._handleZoomLevelChange();\n\n const currentPageIndex = this._viewerCore.getSettings().currentPageIndex;\n const fileName = this._viewerCore.getPageName(currentPageIndex);\n this._viewerCore.publish(\"DocumentDidLoad\", currentPageIndex, fileName);\n }\n\n onViewDidUpdate (renderedPages, targetPage)\n {\n const currentPage = (targetPage !== null) ?\n targetPage :\n getCentermostPage(renderedPages, this._viewerCore.getCurrentLayout(), this._viewerCore.getViewport());\n\n // Don't change the current page if there is no page in the viewport\n // FIXME: Would be better to fall back to the page closest to the viewport\n if (currentPage !== null)\n {\n this._viewerCore.setCurrentPage(currentPage);\n }\n\n if (targetPage !== null)\n {\n this._viewerCore.publish(\"ViewerDidJump\", targetPage);\n }\n\n this._handleZoomLevelChange();\n }\n\n _handleZoomLevelChange ()\n {\n const viewerState = this._viewerState;\n const zoomLevel = viewerState.options.zoomLevel;\n\n // If this is not the initial load, trigger the zoom events\n if (viewerState.oldZoomLevel !== zoomLevel && viewerState.oldZoomLevel >= 0)\n {\n if (viewerState.oldZoomLevel < zoomLevel)\n {\n this._viewerCore.publish(\"ViewerDidZoomIn\", zoomLevel);\n }\n else\n {\n this._viewerCore.publish(\"ViewerDidZoomOut\", zoomLevel);\n }\n\n this._viewerCore.publish(\"ViewerDidZoom\", zoomLevel);\n }\n\n viewerState.oldZoomLevel = zoomLevel;\n }\n\n destroy ()\n {\n this._overlays.forEach((overlay) =>\n {\n this._viewerCore.removePageOverlay(overlay);\n }, this);\n }\n}\n\nfunction getCentermostPage (renderedPages, layout, viewport)\n{\n const centerY = viewport.top + (viewport.height / 2);\n const centerX = viewport.left + (viewport.width / 2);\n\n // Find the minimum distance from the viewport center to a page.\n // Compute minus the squared distance from viewport center to the page's border.\n // http://gamedev.stackexchange.com/questions/44483/how-do-i-calculate-distance-between-a-point-and-an-axis-aligned-rectangle\n const centerPage = maxBy(renderedPages, pageIndex =>\n {\n const dims = layout.getPageDimensions(pageIndex);\n const imageOffset = layout.getPageOffset(pageIndex, {excludePadding: false});\n\n const midX = imageOffset.left + (dims.height / 2);\n const midY = imageOffset.top + (dims.width / 2);\n\n const dx = Math.max(Math.abs(centerX - midX) - (dims.width / 2), 0);\n const dy = Math.max(Math.abs(centerY - midY) - (dims.height / 2), 0);\n\n return -(dx * dx + dy * dy);\n });\n\n return centerPage != null ? centerPage : null;\n}\n","/**\n * Translate page layouts, as generated by page-layouts, into an\n * object which computes layout information for the document as\n * a whole.\n */\nexport default class DocumentLayout\n{\n constructor (config, zoomLevel)\n {\n const computedLayout = getComputedLayout(config, zoomLevel);\n\n this.dimensions = computedLayout.dimensions;\n this.pageGroups = computedLayout.pageGroups;\n this._pageLookup = getPageLookup(computedLayout.pageGroups);\n }\n\n /**\n * @typedef {Object} PageInfo\n * @property {number} index\n * @property {{index, dimensions, pages, region, padding}} group\n * @property {{height: number, width: number}} dimensions\n * @property {{top: number, left: number}} groupOffset\n */\n\n /**\n * @param pageIndex\n * @returns {PageInfo|null}\n */\n getPageInfo (pageIndex)\n {\n return this._pageLookup[pageIndex] || null;\n }\n\n /**\n * Get the dimensions of a page\n *\n * @param pageIndex\n * @returns {{height: number, width: number}}\n */\n getPageDimensions (pageIndex)\n {\n if (!this._pageLookup || !this._pageLookup[pageIndex])\n return null;\n\n const region = getPageRegionFromPageInfo(this._pageLookup[pageIndex]);\n\n return {\n height: region.bottom - region.top,\n width: region.right - region.left\n };\n }\n\n // TODO(wabain): Get rid of this; it's a subset of the page region, so\n // give that instead\n /**\n * Get the top-left coordinates of a page, including*** padding\n *\n * @param pageIndex\n * @param options\n * @returns {{top: number, left: number} | null}\n */\n getPageOffset (pageIndex, options)\n {\n const region = this.getPageRegion(pageIndex, options);\n\n if (!region)\n return null;\n\n return {\n top: region.top,\n left: region.left\n };\n }\n\n getPageRegion (pageIndex, options)\n {\n const pageInfo = this._pageLookup[pageIndex];\n\n if (!pageInfo)\n return null;\n\n const region = getPageRegionFromPageInfo(pageInfo);\n\n if (options && options.excludePadding)\n {\n // FIXME?\n const padding = pageInfo.group.padding;\n\n return {\n top: region.top + padding.top,\n left: region.left + padding.left,\n bottom: region.bottom,\n right: region.right\n };\n }\n\n return region;\n }\n\n /**\n * Get the distance from the top-right of the page to the center of the\n * specified viewport region\n *\n * @param pageIndex\n * @param viewport {{top: number, left: number, bottom: number, right: number}}\n * @returns {{x: number, y: number}}\n */\n getPageToViewportCenterOffset (pageIndex, viewport)\n {\n const scrollLeft = viewport.left;\n const elementWidth = viewport.right - viewport.left;\n\n const offset = this.getPageOffset(pageIndex);\n\n const x = scrollLeft - offset.left + parseInt(elementWidth / 2, 10);\n\n const scrollTop = viewport.top;\n const elementHeight = viewport.bottom - viewport.top;\n\n const y = scrollTop - offset.top + parseInt(elementHeight / 2, 10);\n\n return {\n x: x,\n y: y\n };\n }\n}\n\nfunction getPageRegionFromPageInfo (page)\n{\n const top = page.groupOffset.top + page.group.region.top;\n const bottom = top + page.dimensions.height;\n const left = page.groupOffset.left + page.group.region.left;\n const right = left + page.dimensions.width;\n\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right\n };\n}\n\nfunction getPageLookup (pageGroups)\n{\n const pageLookup = {};\n\n pageGroups.forEach(group => {\n group.pages.forEach(page => {\n pageLookup[page.index] = {\n index: page.index,\n group: group,\n dimensions: page.dimensions,\n groupOffset: page.groupOffset\n };\n });\n });\n\n return pageLookup;\n}\n\nfunction getComputedLayout (config, zoomLevel)\n{\n const scaledLayouts = zoomLevel === null ? config.pageLayouts : getScaledPageLayouts(config, zoomLevel);\n\n const documentSecondaryExtent = getExtentAlongSecondaryAxis(config, scaledLayouts);\n\n // The current position in the document along the primary axis\n let primaryDocPosition = config.verticallyOriented ?\n config.padding.document.top :\n config.padding.document.left;\n\n const pageGroups = [];\n\n // TODO: Use bottom, right as well\n const pagePadding = {\n top: config.padding.page.top,\n left: config.padding.page.left\n };\n\n scaledLayouts.forEach((layout, index) => {\n let top, left;\n\n if (config.verticallyOriented)\n {\n top = primaryDocPosition;\n left = (documentSecondaryExtent - layout.dimensions.width) / 2;\n }\n else\n {\n top = (documentSecondaryExtent - layout.dimensions.height) / 2;\n left = primaryDocPosition;\n }\n\n const region = {\n top: top,\n bottom: top + pagePadding.top + layout.dimensions.height,\n left: left,\n right: left + pagePadding.left + layout.dimensions.width\n };\n\n pageGroups.push({\n index: index,\n dimensions: layout.dimensions,\n pages: layout.pages,\n region: region,\n padding: pagePadding\n });\n\n primaryDocPosition = config.verticallyOriented ? region.bottom : region.right;\n });\n\n let height, width;\n\n if (config.verticallyOriented)\n {\n height = primaryDocPosition + pagePadding.top;\n width = documentSecondaryExtent;\n }\n else\n {\n height = documentSecondaryExtent;\n width = primaryDocPosition + pagePadding.left;\n }\n\n return {\n dimensions: {\n height: height,\n width: width\n },\n pageGroups: pageGroups\n };\n}\n\nfunction getScaledPageLayouts (config, zoomLevel)\n{\n const scaleRatio = Math.pow(2, zoomLevel - config.maxZoomLevel);\n\n return config.pageLayouts.map(group => ({\n dimensions: scaleDimensions(group.dimensions, scaleRatio),\n\n pages: group.pages.map(page => ({\n index: page.index,\n\n groupOffset: {\n top: Math.floor(page.groupOffset.top * scaleRatio),\n left: Math.floor(page.groupOffset.left * scaleRatio)\n },\n\n dimensions: scaleDimensions(page.dimensions, scaleRatio)\n }))\n }));\n}\n\nfunction scaleDimensions (dimensions, scaleRatio)\n{\n return {\n height: Math.floor(dimensions.height * scaleRatio),\n width: Math.floor(dimensions.width * scaleRatio)\n };\n}\n\nfunction getExtentAlongSecondaryAxis (config, scaledLayouts)\n{\n // Get the extent of the document along the secondary axis\n let secondaryDim, secondaryPadding;\n const docPadding = config.padding.document;\n\n if (config.verticallyOriented)\n {\n secondaryDim = 'width';\n secondaryPadding = docPadding.left + docPadding.right;\n }\n else\n {\n secondaryDim = 'height';\n secondaryPadding = docPadding.top + docPadding.bottom;\n }\n\n return secondaryPadding + scaledLayouts.reduce((maxDim, layout) => Math.max(layout.dimensions[secondaryDim], maxDim), 0);\n}\n","export function DivaParentElementNotFoundException (message)\n{\n this.name = \"DivaParentElementNotFoundException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nDivaParentElementNotFoundException.prototype = new Error();\n\nexport function NotAnIIIFManifestException (message)\n{\n this.name = \"NotAnIIIFManifestException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nNotAnIIIFManifestException.prototype = new Error();\n\nexport function ObjectDataNotSuppliedException (message)\n{\n this.name = \"ObjectDataNotSuppliedException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nObjectDataNotSuppliedException.prototype = new Error();\n","export default {\n onDoubleClick,\n onPinch,\n onDoubleTap\n};\n\nconst DOUBLE_CLICK_TIMEOUT = 500;\nconst DOUBLE_TAP_DISTANCE_THRESHOLD = 50;\nconst DOUBLE_TAP_TIMEOUT = 250;\n\nfunction onDoubleClick(elem, callback)\n{\n elem.addEventListener('dblclick', function (event)\n {\n if (!event.ctrlKey)\n {\n callback(event, getRelativeOffset(event.currentTarget, event));\n }\n });\n\n // Handle the control key for macs (in conjunction with double-clicking)\n // FIXME: Does a click get handled with ctrl pressed on non-Macs?\n const tracker = createDoubleEventTracker(DOUBLE_CLICK_TIMEOUT);\n\n elem.addEventListener('contextmenu', function (event)\n {\n event.preventDefault();\n\n if (event.ctrlKey)\n {\n if (tracker.isTriggered())\n {\n tracker.reset();\n callback(event, getRelativeOffset(event.currentTarget, event));\n }\n else\n {\n tracker.trigger();\n }\n }\n });\n}\n\nfunction onPinch(elem, callback)\n{\n let startDistance = 0;\n\n elem.addEventListener('touchstart', function (event)\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (event.originalEvent.touches.length === 2)\n {\n startDistance = distance(\n event.originalEvent.touches[0].clientX,\n event.originalEvent.touches[0].clientY,\n event.originalEvent.touches[1].clientX,\n event.originalEvent.touches[1].clientY\n );\n }\n });\n\n elem.addEventListener('touchmove', function(event)\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (event.originalEvent.touches.length === 2)\n {\n const touches = event.originalEvent.touches;\n\n const moveDistance = distance(\n touches[0].clientX,\n touches[0].clientY,\n touches[1].clientX,\n touches[1].clientY\n );\n\n const zoomDelta = moveDistance - startDistance;\n\n if (Math.abs(zoomDelta) > 0)\n {\n const touchCenter = {\n pageX: (touches[0].clientX + touches[1].clientX) / 2,\n pageY: (touches[0].clientY + touches[1].clientY) / 2\n };\n\n callback(event, getRelativeOffset(event.currentTarget, touchCenter), startDistance, moveDistance);\n }\n }\n });\n}\n\nfunction onDoubleTap(elem, callback)\n{\n const tracker = createDoubleEventTracker(DOUBLE_TAP_TIMEOUT);\n let firstTap = null;\n\n elem.addEventListener('touchend', (event) =>\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (tracker.isTriggered())\n {\n tracker.reset();\n\n // Doubletap has occurred\n const secondTap = {\n pageX: event.originalEvent.changedTouches[0].clientX,\n pageY: event.originalEvent.changedTouches[0].clientY\n };\n\n // If first tap is close to second tap (prevents interference with scale event)\n const tapDistance = distance(firstTap.pageX, firstTap.pageY, secondTap.pageX, secondTap.pageY);\n\n // TODO: Could give something higher-level than secondTap to callback\n if (tapDistance < DOUBLE_TAP_DISTANCE_THRESHOLD)\n callback(event, getRelativeOffset(event.currentTarget, secondTap));\n\n firstTap = null;\n }\n else\n {\n firstTap = {\n pageX: event.originalEvent.changedTouches[0].clientX,\n pageY: event.originalEvent.changedTouches[0].clientY\n };\n\n tracker.trigger();\n }\n });\n}\n\n// Pythagorean theorem to get the distance between two points (used for\n// calculating finger distance for double-tap and pinch-zoom)\nfunction distance(x1, y1, x2, y2)\n{\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n}\n\n// Utility to keep track of whether an event has been triggered twice\n// during a a given duration\nfunction createDoubleEventTracker(timeoutDuration)\n{\n let triggered = false;\n let timeoutId = null;\n\n return {\n trigger()\n {\n triggered = true;\n resetTimeout();\n timeoutId = setTimeout(function ()\n {\n triggered = false;\n timeoutId = null;\n }, timeoutDuration);\n },\n isTriggered()\n {\n return triggered;\n },\n reset()\n {\n triggered = false;\n resetTimeout();\n }\n };\n\n function resetTimeout()\n {\n if (timeoutId !== null)\n {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n}\n\nfunction getRelativeOffset(elem, pageCoords)\n{\n const bounds = elem.getBoundingClientRect();\n\n return {\n left: pageCoords.pageX - bounds.left,\n top: pageCoords.pageY - bounds.top\n };\n}\n","import maxBy from 'lodash.maxby';\n\nexport default class GridHandler\n{\n constructor (viewerCore)\n {\n this._viewerCore = viewerCore;\n }\n\n // USER EVENTS\n onDoubleClick (event, coords)\n {\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n\n const layout = this._viewerCore.getCurrentLayout();\n const viewport = this._viewerCore.getViewport();\n const pageToViewportCenterOffset = layout.getPageToViewportCenterOffset(position.anchorPage, viewport);\n\n this._viewerCore.reload({\n inGrid: false,\n goDirectlyTo: position.anchorPage,\n horizontalOffset: pageToViewportCenterOffset.x + position.offset.left,\n verticalOffset: pageToViewportCenterOffset.y + position.offset.top\n });\n }\n\n onPinch ()\n {\n this._viewerCore.reload({inGrid: false});\n }\n\n // VIEW EVENTS\n onViewWillLoad ()\n {\n // FIXME(wabain): Should something happen here?\n /* No-op */\n }\n\n onViewDidLoad ()\n {\n // FIXME(wabain): Should something happen here?\n /* No-op */\n }\n\n onViewDidUpdate (renderedPages, targetPage)\n {\n // return early if there are no rendered pages in view.\n if (renderedPages.length === 0) return;\n\n if (targetPage !== null)\n {\n this._viewerCore.setCurrentPage(targetPage);\n return;\n }\n\n // Select the current page from the first row if it is fully visible, or from\n // the second row if it is fully visible, or from the centermost row otherwise.\n // If the current page is in that group then don't change it. Otherwise, set\n // the current page to the group's first page.\n\n const layout = this._viewerCore.getCurrentLayout();\n const groups = [];\n\n renderedPages.forEach(pageIndex =>\n {\n const group = layout.getPageInfo(pageIndex).group;\n if (groups.length === 0 || group !== groups[groups.length - 1])\n {\n groups.push(group);\n }\n });\n\n const viewport = this._viewerCore.getViewport();\n let chosenGroup;\n\n if (groups.length === 1 || groups[0].region.top >= viewport.top)\n {\n chosenGroup = groups[0];\n }\n else if (groups[1].region.bottom <= viewport.bottom)\n {\n chosenGroup = groups[1];\n }\n else\n {\n chosenGroup = getCentermostGroup(groups, viewport);\n }\n\n const currentPage = this._viewerCore.getSettings().currentPageIndex;\n\n const hasCurrentPage = chosenGroup.pages.some(page => page.index === currentPage);\n\n if (!hasCurrentPage)\n {\n this._viewerCore.setCurrentPage(chosenGroup.pages[0].index);\n }\n }\n\n destroy ()\n {\n // No-op\n }\n}\n\nfunction getCentermostGroup (groups, viewport)\n{\n const viewportMiddle = viewport.top + viewport.height / 2;\n\n return maxBy(groups, group =>\n {\n const groupMiddle = group.region.top + group.dimensions.height / 2;\n return -Math.abs(viewportMiddle - groupMiddle);\n });\n}\n","export default class IIIFSourceAdapter\n{\n getPageImageURL (manifest, pageIndex, size)\n {\n let dimens;\n\n if (!size || (size.width == null && size.height == null))\n {\n dimens = 'full';\n }\n else\n {\n dimens = (size.width == null ? '' : size.width) + ',' + (size.height == null ? '' : size.height);\n }\n\n const page = manifest.pages[pageIndex];\n const quality = (page.api > 1.1) ? 'default' : 'native';\n\n return encodeURI(page.url + 'full/' + dimens + '/0/' + quality + '.jpg');\n }\n\n getTileImageURL (manifest, pageIndex, params)\n {\n const page = manifest.pages[pageIndex];\n\n let height, width;\n\n if (params.row === params.rowCount - 1)\n {\n height = page.d[params.zoomLevel].h - (params.rowCount - 1) * params.tileDimensions.height;\n }\n else\n {\n height = params.tileDimensions.height;\n }\n\n if (params.col === params.colCount - 1)\n {\n width = page.d[params.zoomLevel].w - (params.colCount - 1) * params.tileDimensions.width;\n }\n else\n {\n width = params.tileDimensions.width;\n }\n\n const zoomDifference = Math.pow(2, manifest.maxZoom - params.zoomLevel);\n\n let x = params.col * params.tileDimensions.width * zoomDifference;\n let y = params.row * params.tileDimensions.height * zoomDifference;\n\n if (page.hasOwnProperty('xoffset'))\n {\n x += page.xoffset;\n y += page.yoffset;\n }\n\n const region = [x, y, width * zoomDifference, height * zoomDifference].join(',');\n\n const quality = (page.api > 1.1) ? 'default' : 'native';\n\n return encodeURI(page.url + region + '/' + width + ',' + height + '/0/' + quality + '.jpg');\n }\n}\n","const debug = require('debug')('diva:ImageCache');\n\n/* FIXME(wabain): The caching strategy here is completely\n * arbitrary and the implementation isn't especially efficient.\n */\nconst DEFAULT_MAX_KEYS = 100;\n\nexport default class ImageCache\n{\n constructor (options)\n {\n options = options || { maxKeys: DEFAULT_MAX_KEYS };\n this.maxKeys = options.maxKeys || DEFAULT_MAX_KEYS;\n\n this._held = {};\n this._urls = {};\n this._lru = [];\n }\n\n get (url)\n {\n const record = this._urls[url];\n return record ? record.img : null;\n }\n\n has (url)\n {\n return !!this._urls[url];\n }\n\n put (url, img)\n {\n let record = this._urls[url];\n if (record)\n {\n // FIXME: Does this make sense for this use case?\n record.img = img;\n this._promote(record);\n }\n else\n {\n record = {\n img: img,\n url: url\n };\n\n this._urls[url] = record;\n this._tryEvict(1);\n this._lru.unshift(record);\n }\n }\n\n _promote (record)\n {\n const index = this._lru.indexOf(record);\n this._lru.splice(index, 1);\n this._lru.unshift(record);\n }\n\n _tryEvict (extraCapacity)\n {\n const allowedEntryCount = this.maxKeys - extraCapacity;\n\n if (this._lru.length <= allowedEntryCount)\n return;\n\n let evictionIndex = this._lru.length - 1;\n\n for (;;)\n {\n const target = this._lru[evictionIndex];\n\n if (!this._held[target.url])\n {\n debug('Evicting image %s', target.url);\n this._lru.splice(evictionIndex, 1);\n delete this._urls[target.url];\n\n if (this._lru.length <= allowedEntryCount)\n break;\n }\n\n if (evictionIndex === 0)\n {\n /* istanbul ignore next */\n debug.enabled && debug('Cache overfull by %s (all entries are being held)',\n this._lru.length - allowedEntryCount);\n\n break;\n }\n\n evictionIndex--;\n }\n }\n\n acquire (url)\n {\n this._held[url] = (this._held[url] || 0) + 1;\n this._promote(this._urls[url]);\n }\n\n release (url)\n {\n const count = this._held[url];\n\n if (count > 1)\n this._held[url]--;\n else\n delete this._held[url];\n\n this._tryEvict(0);\n }\n}\n","import parseIIIFManifest from './parse-iiif-manifest';\nimport IIIFSourceAdapter from \"./iiif-source-adapter\";\n\n\nexport default class ImageManifest\n{\n constructor (data, urlAdapter)\n {\n // Save all the data we need\n this.pages = data.pgs;\n this.maxZoom = data.max_zoom;\n this.maxRatio = data.dims.max_ratio;\n this.minRatio = data.dims.min_ratio;\n this.itemTitle = data.item_title;\n\n // Only given for IIIF manifests\n this.paged = !!data.paged;\n\n // These are arrays, the index corresponding to the zoom level\n this._maxWidths = data.dims.max_w;\n this._maxHeights = data.dims.max_h;\n this._averageWidths = data.dims.a_wid;\n this._averageHeights = data.dims.a_hei;\n this._totalHeights = data.dims.t_hei;\n this._totalWidths = data.dims.t_wid;\n\n this._urlAdapter = urlAdapter;\n }\n\n static fromIIIF (iiifManifest)\n {\n const data = parseIIIFManifest(iiifManifest);\n return new ImageManifest(data, new IIIFSourceAdapter());\n }\n\n isPageValid (pageIndex, showNonPagedPages)\n {\n if (!showNonPagedPages && this.paged && !this.pages[pageIndex].paged)\n {\n return false;\n }\n\n return pageIndex >= 0 && pageIndex < this.pages.length;\n }\n\n getMaxPageDimensions (pageIndex)\n {\n const maxDims = this.pages[pageIndex].d[this.maxZoom];\n\n return {\n height: maxDims.h,\n width: maxDims.w\n };\n }\n\n getPageDimensionsAtZoomLevel (pageIndex, zoomLevel)\n {\n const maxDims = this.pages[pageIndex].d[this.maxZoom];\n\n const scaleRatio = getScaleRatio(this.maxZoom, zoomLevel);\n\n return {\n height: maxDims.h * scaleRatio,\n width: maxDims.w * scaleRatio\n };\n }\n\n /**\n * Returns a URL for the image of the given page. The optional size\n * parameter supports setting the image width or height (default is\n * full-sized).\n */\n getPageImageURL (pageIndex, size)\n {\n return this._urlAdapter.getPageImageURL(this, pageIndex, size);\n }\n\n /**\n * Return an array of tile objects for the specified page and integer zoom level\n */\n getPageImageTiles (pageIndex, zoomLevel, tileDimensions)\n {\n const page = this.pages[pageIndex];\n\n if (!isFinite(zoomLevel) || zoomLevel % 1 !== 0)\n {\n throw new TypeError('Zoom level must be an integer: ' + zoomLevel);\n }\n\n const rows = Math.ceil(page.d[zoomLevel].h / tileDimensions.height);\n const cols = Math.ceil(page.d[zoomLevel].w / tileDimensions.width);\n\n const tiles = [];\n\n let row, col, url;\n\n for (row = 0; row < rows; row++)\n {\n for (col = 0; col < cols; col++)\n {\n url = this._urlAdapter.getTileImageURL(this, pageIndex, {\n row: row,\n col: col,\n rowCount: rows,\n colCount: cols,\n zoomLevel: zoomLevel,\n tileDimensions: tileDimensions\n });\n\n // FIXME: Dimensions should account for partial tiles (e.g. the\n // last row and column in a tiled image)\n tiles.push({\n row: row,\n col: col,\n zoomLevel: zoomLevel,\n dimensions: {\n height: tileDimensions.height,\n width: tileDimensions.width\n },\n offset: {\n top: row * tileDimensions.height,\n left: col * tileDimensions.width\n },\n url: url\n });\n }\n }\n\n return {\n zoomLevel: zoomLevel,\n rows: rows,\n cols: cols,\n tiles: tiles\n };\n }\n}\n\nImageManifest.prototype.getMaxWidth = zoomedPropertyGetter('_maxWidths');\nImageManifest.prototype.getMaxHeight = zoomedPropertyGetter('_maxHeights');\nImageManifest.prototype.getAverageWidth = zoomedPropertyGetter('_averageWidths');\nImageManifest.prototype.getAverageHeight = zoomedPropertyGetter('_averageHeights');\nImageManifest.prototype.getTotalWidth = zoomedPropertyGetter('_totalWidths');\nImageManifest.prototype.getTotalHeight = zoomedPropertyGetter('_totalHeights');\n\nfunction zoomedPropertyGetter (privateName)\n{\n return function (zoomLevel)\n {\n return this[privateName][zoomLevel];\n };\n}\n\nfunction getScaleRatio (sourceZoomLevel, targetZoomLevel)\n{\n return 1 / Math.pow(2, sourceZoomLevel - targetZoomLevel);\n}\n","const debug = require('debug')('diva:ImageRequestHandler');\n/**\n * Handler for the request for an image tile\n *\n * @param url\n * @param callback\n * @constructor\n */\nexport default class ImageRequestHandler\n{\n constructor (options)\n {\n this._url = options.url;\n this._callback = options.load;\n this._errorCallback = options.error;\n this.timeoutTime = options.timeoutTime || 0;\n this._aborted = this._complete = false;\n\n //Use a timeout to allow the requests to be debounced (as they are in renderer)\n this.timeout = setTimeout(() => {\n // Initiate the request\n this._image = new Image();\n this._image.crossOrigin = \"anonymous\";\n this._image.onload = this._handleLoad.bind(this);\n this._image.onerror = this._handleError.bind(this);\n this._image.src = options.url;\n\n debug('Requesting image %s', options.url);\n }, this.timeoutTime);\n }\n\n abort ()\n {\n debug('Aborting request to %s', this._url);\n\n clearTimeout(this.timeout);\n\n // FIXME\n // People on the Internet say that doing this {{should/should not}} abort the request. I believe\n // it corresponds to what the WHATWG HTML spec says should happen when the UA\n // updates the image data if selected source is null.\n //\n // Sources:\n //\n // https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element\n // http://stackoverflow.com/questions/7390888/does-changing-the-src-attribute-of-an-image-stop-the-image-from-downloading\n if (this._image)\n {\n this._image.onload = this._image.onerror = null;\n\n this._image.src = '';\n }\n\n this._aborted = true;\n }\n\n _handleLoad ()\n {\n if (this._aborted)\n {\n console.error('ImageRequestHandler invoked on cancelled request for ' + this._url);\n return;\n }\n\n if (this._complete)\n {\n console.error('ImageRequestHandler invoked on completed request for ' + this._url);\n return;\n }\n\n this._complete = true;\n\n debug('Received image %s', this._url);\n this._callback(this._image);\n }\n\n _handleError ()\n {\n debug('Failed to load image %s', this._url);\n this._errorCallback(this._image);\n }\n}\n","// TODO: requestAnimationFrame fallback\n\nexport default {\n animate,\n easing: {\n linear: linearEasing,\n cubic: inOutCubicEasing\n }\n};\n\nlet now;\n\nif (typeof performance !== 'undefined' && performance.now)\n{\n now = () => { return performance.now(); };\n}\nelse\n{\n now = () => { return Date.now(); };\n}\n\n\nfunction animate (options)\n{\n const durationMs = options.duration;\n const parameters = options.parameters;\n const onUpdate = options.onUpdate;\n const onEnd = options.onEnd;\n\n // Setup\n // Times are in milliseconds from a basically arbitrary start\n const start = now(); \n const end = start + durationMs;\n\n const tweenFns = {};\n const values = {};\n const paramKeys = Object.keys(parameters);\n\n paramKeys.forEach(key => {\n const config = parameters[key];\n tweenFns[key] = interpolate(config.from, config.to, config.easing || inOutCubicEasing);\n });\n\n // Run it!\n let requestId = requestAnimationFrame(update);\n\n return {\n cancel()\n {\n if (requestId !== null)\n {\n cancelAnimationFrame(requestId);\n handleAnimationCompletion({\n interrupted: true\n });\n }\n }\n };\n\n function update()\n {\n const current = now(); \n const elapsed = Math.min((current - start) / durationMs, 1);\n\n updateValues(elapsed);\n onUpdate(values);\n\n if (current < end)\n {\n requestId = requestAnimationFrame(update);\n }\n else\n {\n handleAnimationCompletion({\n interrupted: false\n });\n }\n }\n\n function updateValues(elapsed)\n {\n paramKeys.forEach(key => {\n values[key] = tweenFns[key](elapsed);\n });\n }\n\n function handleAnimationCompletion(info)\n {\n requestId = null;\n\n if (onEnd)\n onEnd(info);\n }\n}\n\nfunction interpolate(start, end, easing)\n{\n return (elapsed) => { return start + (end - start) * easing(elapsed); };\n}\n\n/**\n * Easing functions. inOutCubicEasing is the default, but\n * others are given for convenience.\n *\n **/\nfunction linearEasing(e)\n{\n return e;\n}\n\nfunction inOutCubicEasing (t)\n{\n return t < 0.5 ? 4 * t * t * t : ( t - 1 ) * ( 2 * t - 2 ) * ( 2 * t - 2 ) + 1;\n}\n","import getPageDimensions from './page-dimensions';\n\nexport default function getBookLayoutGroups (viewerConfig)\n{\n const groupings = getGroupings(viewerConfig);\n\n return groupings.map(grouping => getGroupLayoutsFromPageGrouping(viewerConfig, grouping));\n}\n\nfunction getGroupings(viewerConfig)\n{\n const manifest = viewerConfig.manifest;\n\n const pagesByGroup = [];\n let leftPage = null;\n let nonPagedPages = []; // Pages to display below the current group\n\n const _addNonPagedPages = () =>\n {\n for (let i = 0, nlen = nonPagedPages.length; i < nlen; i++)\n {\n pagesByGroup.push([ nonPagedPages[i] ]);\n }\n nonPagedPages = [];\n };\n\n manifest.pages.forEach( (page, index) =>\n {\n const pageRecord = {\n index: index,\n dimensions: getPageDimensions(index, manifest),\n paged: (!manifest.paged || page.paged)\n };\n\n // Only display non-paged pages if specified in the settings\n if (!viewerConfig.showNonPagedPages && !pageRecord.paged)\n return;\n\n if (!pageRecord.paged)\n {\n nonPagedPages.push(pageRecord);\n }\n else if (index === 0 || page.facingPages)\n {\n // The first page is placed on its own\n pagesByGroup.push([pageRecord]);\n _addNonPagedPages();\n }\n else if (leftPage === null)\n {\n leftPage = pageRecord;\n }\n else\n {\n pagesByGroup.push([leftPage, pageRecord]);\n leftPage = null;\n _addNonPagedPages();\n }\n });\n\n // Flush a final left page\n if (leftPage !== null)\n {\n pagesByGroup.push([leftPage]);\n _addNonPagedPages();\n }\n\n return pagesByGroup;\n}\n\nfunction getGroupLayoutsFromPageGrouping(viewerConfig, grouping)\n{\n const verticallyOriented = viewerConfig.verticallyOriented;\n\n if (grouping.length === 2)\n return getFacingPageGroup(grouping[0], grouping[1], verticallyOriented);\n\n const page = grouping[0];\n const pageDims = page.dimensions;\n\n // The first page is placed on its own to the right in vertical orientation.\n // NB that this needs to be the page with index 0; if the first page is excluded\n // from the layout then this special case shouldn't apply.\n // If the page is tagged as 'non-paged', center it horizontally\n let leftOffset;\n if (page.paged)\n leftOffset = (page.index === 0 && verticallyOriented) ? pageDims.width : 0;\n else\n leftOffset = (verticallyOriented) ? pageDims.width / 2 : 0;\n\n const shouldBeHorizontallyAdjusted =\n verticallyOriented && !viewerConfig.manifest.pages[page.index].facingPages;\n\n // We need to left-align the page in vertical orientation, so we double\n // the group width\n return {\n dimensions: {\n height: pageDims.height,\n width: shouldBeHorizontallyAdjusted ? pageDims.width * 2 : pageDims.width\n },\n pages: [{\n index: page.index,\n groupOffset: {\n top: 0,\n left: leftOffset\n },\n dimensions: pageDims\n }]\n };\n}\n\nfunction getFacingPageGroup(leftPage, rightPage, verticallyOriented)\n{\n const leftDims = leftPage.dimensions;\n const rightDims = rightPage.dimensions;\n\n const height = Math.max(leftDims.height, rightDims.height);\n\n let width, firstLeftOffset, secondLeftOffset;\n\n if (verticallyOriented)\n {\n const midWidth = Math.max(leftDims.width, rightDims.width);\n\n width = midWidth * 2;\n\n firstLeftOffset = midWidth - leftDims.width;\n secondLeftOffset = midWidth;\n }\n else\n {\n width = leftDims.width + rightDims.width;\n firstLeftOffset = 0;\n secondLeftOffset = leftDims.width;\n }\n\n return {\n dimensions: {\n height: height,\n width: width\n },\n pages: [\n {\n index: leftPage.index,\n dimensions: leftDims,\n groupOffset: {\n top: 0,\n left: firstLeftOffset\n }\n },\n {\n index: rightPage.index,\n dimensions: rightDims,\n groupOffset: {\n top: 0,\n left: secondLeftOffset\n }\n }\n ]\n };\n}\n","\nexport default function getGridLayoutGroups (viewerConfig)\n{\n const viewportWidth = viewerConfig.viewport.width;\n const manifest = viewerConfig.manifest;\n const pagesPerRow = viewerConfig.pagesPerRow;\n const fixedHeightGrid = viewerConfig.fixedHeightGrid;\n const fixedPadding = viewerConfig.fixedPadding;\n const showNonPagedPages = viewerConfig.showNonPagedPages;\n\n const horizontalPadding = fixedPadding * (pagesPerRow + 1);\n const pageWidth = (viewportWidth - horizontalPadding) / pagesPerRow;\n const gridPageWidth = pageWidth;\n\n // Calculate the row height depending on whether we want to fix the width or the height\n const rowHeight = (fixedHeightGrid) ? fixedPadding + manifest.minRatio * pageWidth : fixedPadding + manifest.maxRatio * pageWidth;\n\n const groups = [];\n let currentPages = [];\n\n const getGridPageDimensions = pageData =>\n {\n // Calculate the width, height and horizontal placement of this page\n // Get dimensions at max zoom level, although any level should be fine\n const pageDimenData = pageData.d[pageData.d.length - 1];\n const heightToWidthRatio = pageDimenData.h / pageDimenData.w;\n\n let pageWidth, pageHeight;\n\n if (fixedHeightGrid)\n {\n pageWidth = (rowHeight - fixedPadding) / heightToWidthRatio;\n pageHeight = rowHeight - fixedPadding;\n }\n else\n {\n pageWidth = gridPageWidth;\n pageHeight = pageWidth * heightToWidthRatio;\n }\n\n return {\n width: Math.round(pageWidth),\n height: Math.round(pageHeight)\n };\n };\n\n const rowDimensions = {\n height: rowHeight,\n width: viewportWidth\n };\n\n manifest.pages.forEach( (page, pageIndex) =>\n {\n if (!showNonPagedPages && manifest.paged && !page.paged)\n return;\n\n // Calculate the width, height and horizontal placement of this page\n const pageDimens = getGridPageDimensions(page);\n let leftOffset = Math.floor(currentPages.length * (fixedPadding + gridPageWidth) + fixedPadding);\n\n // Center the page if the height is fixed (otherwise, there is no horizontal padding)\n if (fixedHeightGrid)\n {\n leftOffset += (gridPageWidth - pageDimens.width) / 2;\n }\n\n // TODO: Precompute page dimensions everywhere\n currentPages.push({\n index: pageIndex,\n dimensions: pageDimens,\n groupOffset: {\n top: 0,\n left: leftOffset\n }\n });\n\n if (currentPages.length === pagesPerRow)\n {\n groups.push({\n dimensions: rowDimensions,\n pages: currentPages\n });\n\n currentPages = [];\n }\n });\n\n if (currentPages.length > 0)\n {\n groups.push({\n dimensions: rowDimensions,\n pages: currentPages\n });\n }\n\n return groups;\n}\n","import getBookLayoutGroups from './book-layout';\nimport getSinglesLayoutGroups from './singles-layout';\nimport getGridLayoutGroups from './grid-layout';\n\n/** Get the relative positioning of pages for the current view */\nexport default function getPageLayouts (settings)\n{\n if (settings.inGrid)\n {\n return getGridLayoutGroups(pluck(settings, [\n 'manifest',\n 'viewport',\n 'pagesPerRow',\n 'fixedHeightGrid',\n 'fixedPadding',\n 'showNonPagedPages'\n ]));\n }\n else\n {\n const config = pluck(settings, ['manifest', 'verticallyOriented', 'showNonPagedPages']);\n\n if (settings.inBookLayout)\n return getBookLayoutGroups(config);\n else\n return getSinglesLayoutGroups(config);\n }\n}\n\nfunction pluck (obj, keys)\n{\n const out = {};\n keys.forEach(function (key)\n {\n out[key] = obj[key];\n });\n return out;\n}\n","export default function getPageDimensions (pageIndex, manifest)\n{\n const dims = manifest.getMaxPageDimensions(pageIndex);\n\n return {\n width: Math.floor(dims.width),\n height: Math.floor(dims.height)\n };\n}\n","import getPageDimensions from './page-dimensions';\n\nexport default function getSinglesLayoutGroups (viewerConfig)\n{\n const manifest = viewerConfig.manifest;\n\n // Render each page alone in a group\n const pages = [];\n manifest.pages.forEach( (page, index) =>\n {\n if (!viewerConfig.showNonPagedPages && manifest.paged && !page.paged)\n return;\n\n const pageDims = getPageDimensions(index, manifest);\n\n pages.push({\n dimensions: pageDims,\n pages: [{\n index: index,\n groupOffset: { top: 0, left: 0 },\n dimensions: pageDims\n }]\n });\n });\n\n return pages;\n}\n","/**\n * Manages a collection of page overlays, which implement a low-level\n * API for synchronizing HTML pages to the canvas. Each overlay needs\n * to implement the following protocol:\n *\n * mount(): Called when a page is first rendered\n * refresh(): Called when a page is moved\n * unmount(): Called when a previously rendered page has stopped being rendered\n *\n * @class\n */\n\nexport default class PageOverlayManager\n{\n constructor ()\n {\n this._pages = {};\n this._renderedPages = [];\n this._renderedPageMap = {};\n }\n\n addOverlay (overlay)\n {\n const overlaysByPage = this._pages[overlay.page] || (this._pages[overlay.page] = []);\n\n overlaysByPage.push(overlay);\n\n if (this._renderedPageMap[overlay.page])\n overlay.mount();\n }\n\n removeOverlay (overlay)\n {\n const page = overlay.page;\n const overlaysByPage = this._pages[page];\n\n if (!overlaysByPage)\n return;\n\n const overlayIndex = overlaysByPage.indexOf(overlay);\n\n if (overlayIndex === -1)\n return;\n\n if (this._renderedPageMap[page])\n overlaysByPage[overlayIndex].unmount();\n\n overlaysByPage.splice(overlayIndex, 1);\n\n if (overlaysByPage.length === 0)\n delete this._pages[page];\n }\n\n updateOverlays (renderedPages)\n {\n const previouslyRendered = this._renderedPages;\n const newRenderedMap = {};\n\n renderedPages.map( (pageIndex) =>\n {\n newRenderedMap[pageIndex] = true;\n\n if (!this._renderedPageMap[pageIndex])\n {\n this._renderedPageMap[pageIndex] = true;\n\n this._invokeOnOverlays(pageIndex, overlay =>\n {\n overlay.mount();\n });\n }\n });\n\n previouslyRendered.map( (pageIndex) =>\n {\n if (newRenderedMap[pageIndex])\n {\n this._invokeOnOverlays(pageIndex, (overlay) =>\n {\n overlay.refresh();\n });\n }\n else\n {\n delete this._renderedPageMap[pageIndex];\n this._invokeOnOverlays(pageIndex, overlay =>\n {\n overlay.unmount();\n });\n }\n });\n\n this._renderedPages = renderedPages;\n }\n\n _invokeOnOverlays (pageIndex, func)\n {\n const overlays = this._pages[pageIndex];\n if (overlays)\n overlays.map( (o) => func(o) );\n }\n}\n","import { elt } from './utils/elt';\n/**\n*\n*\n**/\nexport default class PageToolsOverlay\n{\n constructor (pageIndex, viewerCore)\n {\n this.page = pageIndex;\n\n this._viewerCore = viewerCore;\n\n this._innerElement = this._viewerCore.getSettings().innerElement;\n this._pageToolsElem = null;\n //\n // this._buttons = null;\n }\n\n mount ()\n {\n if (this._pageToolsElem === null)\n {\n this._buttons = this._initializePageToolButtons();\n\n this._pageToolsElem = elt('div', { class: 'diva-page-tools-wrapper' },\n elt('div', { class: 'diva-page-tools' }, this._buttons)\n );\n }\n\n this.refresh();\n this._innerElement.appendChild(this._pageToolsElem);\n }\n\n _initializePageToolButtons ()\n {\n // Callback parameters\n const settings = this._viewerCore.getSettings();\n const publicInstance = this._viewerCore.getPublicInstance();\n const pageIndex = this.page;\n\n return this._viewerCore.getPageTools().map( (plugin) =>\n {\n // !!! The node needs to be cloned otherwise it is detached from\n // one and reattached to the other.\n const button = plugin.pageToolsIcon.cloneNode(true);\n\n // ensure the plugin instance is handed as the first argument to call;\n // this will set the context (i.e., `this`) of the handleClick call to the plugin instance\n // itself.\n button.addEventListener('click', (event) =>\n {\n plugin.handleClick.call(plugin, event, settings, publicInstance, pageIndex);\n }, false);\n\n button.addEventListener('touchend', (event) =>\n {\n // Prevent firing of emulated mouse events\n event.preventDefault();\n\n plugin.handleClick.call(plugin, event, settings, publicInstance, pageIndex);\n }, false);\n\n return button;\n\n });\n }\n\n unmount ()\n {\n this._innerElement.removeChild(this._pageToolsElem);\n }\n\n refresh ()\n {\n const pos = this._viewerCore.getPageRegion(this.page, {\n excludePadding: true,\n incorporateViewport: true\n });\n\n this._pageToolsElem.style.top = pos.top + 'px';\n this._pageToolsElem.style.left = pos.left + 'px';\n }\n}\n","const getMaxZoomLevel = (width, height) =>\n{\n const largestDimension = Math.max(width, height);\n return Math.ceil(Math.log((largestDimension + 1) / (256 + 1)) / Math.log(2));\n};\n\nconst incorporateZoom = (imageDimension, zoomDifference) => imageDimension / (Math.pow(2, zoomDifference));\n\nconst getOtherImageData = (otherImages, lowestMaxZoom) =>\n{\n return otherImages.map( (itm) =>\n {\n const w = itm.width;\n const h = itm.height;\n const info = parseImageInfo(itm);\n const url = info.url.slice(-1) !== '/' ? info.url + '/' : info.url; // append trailing slash to url if it's not there.\n\n const dims = new Array(lowestMaxZoom + 1);\n for (let j = 0; j < lowestMaxZoom + 1; j++)\n {\n dims[j] = {\n h: Math.floor(incorporateZoom(h, lowestMaxZoom - j)),\n w: Math.floor(incorporateZoom(w, lowestMaxZoom - j))\n };\n }\n\n return {\n f: info.url,\n url: url,\n il: itm.label || \"\",\n d: dims\n };\n });\n};\n\n/**\n * Parses an IIIF Presentation API Manifest and converts it into a Diva.js-format object\n * (See https://github.com/DDMAL/diva.js/wiki/Development-notes#data-received-through-ajax-request)\n *\n * @param {Object} manifest - an object that represents a valid IIIF manifest\n * @returns {Object} divaServiceBlock - the data needed by Diva to show a view of a single document\n */\nexport default function parseIIIFManifest (manifest)\n{\n const sequence = manifest.sequences[0];\n const canvases = sequence.canvases;\n const numCanvases = canvases.length;\n\n const pages = new Array(canvases.length);\n\n let thisCanvas, thisResource, thisImage, otherImages, context, url, info, imageAPIVersion, width, height, maxZoom, canvas, label, imageLabel, zoomDimensions, widthAtCurrentZoomLevel, heightAtCurrentZoomLevel;\n\n let lowestMaxZoom = 100;\n let maxRatio = 0;\n let minRatio = 100;\n\n // quickly determine the lowest possible max zoom level (i.e., the upper bound for images) across all canvases.\n // while we're here, compute the global ratios as well.\n for (let z = 0; z < numCanvases; z++)\n {\n const c = canvases[z];\n const w = c.width;\n const h = c.height;\n const mz = getMaxZoomLevel(w, h);\n const ratio = h / w;\n maxRatio = Math.max(ratio, maxRatio);\n minRatio = Math.min(ratio, minRatio);\n\n lowestMaxZoom = Math.min(lowestMaxZoom, mz);\n }\n\n /*\n These arrays need to be pre-initialized since we will do arithmetic and value checking on them\n */\n const totalWidths = new Array(lowestMaxZoom + 1).fill(0);\n const totalHeights = new Array(lowestMaxZoom + 1).fill(0);\n const maxWidths = new Array(lowestMaxZoom + 1).fill(0);\n const maxHeights = new Array(lowestMaxZoom + 1).fill(0);\n\n for (let i = 0; i < numCanvases; i++)\n {\n thisCanvas = canvases[i];\n canvas = thisCanvas['@id'];\n label = thisCanvas.label;\n thisResource = thisCanvas.images[0].resource;\n\n /*\n * If a canvas has multiple images it will be encoded\n * with a resource type of \"oa:Choice\". The primary image will be available\n * on the 'default' key, with other images available under 'item.'\n * */\n if (thisResource['@type'] === \"oa:Choice\")\n {\n thisImage = thisResource.default;\n }\n else\n {\n thisImage = thisResource;\n }\n\n // Prioritize the canvas height / width first, since images may not have h/w\n width = thisCanvas.width || thisImage.width;\n height = thisCanvas.height || thisImage.height;\n if (width <= 0 || height <= 0)\n {\n console.warn('Invalid width or height for canvas ' + label + '. Skipping');\n continue;\n }\n\n maxZoom = getMaxZoomLevel(width, height);\n\n if (thisResource.item)\n {\n otherImages = getOtherImageData(thisResource.item, lowestMaxZoom);\n }\n else\n {\n otherImages = [];\n }\n\n imageLabel = thisImage.label || null;\n\n info = parseImageInfo(thisImage);\n url = info.url.slice(-1) !== '/' ? info.url + '/' : info.url; // append trailing slash to url if it's not there.\n\n context = thisImage.service['@context'];\n\n if (context === 'http://iiif.io/api/image/2/context.json')\n {\n imageAPIVersion = 2;\n }\n else if (context === 'http://library.stanford.edu/iiif/image-api/1.1/context.json')\n {\n imageAPIVersion = 1.1;\n }\n else\n {\n imageAPIVersion = 1.0;\n }\n\n zoomDimensions = new Array(lowestMaxZoom + 1);\n\n for (let k = 0; k < lowestMaxZoom + 1; k++)\n {\n widthAtCurrentZoomLevel = Math.floor(incorporateZoom(width, lowestMaxZoom - k));\n heightAtCurrentZoomLevel = Math.floor(incorporateZoom(height, lowestMaxZoom - k));\n zoomDimensions[k] = {\n h: heightAtCurrentZoomLevel,\n w: widthAtCurrentZoomLevel\n };\n\n totalWidths[k] += widthAtCurrentZoomLevel;\n totalHeights[k] += heightAtCurrentZoomLevel;\n maxWidths[k] = Math.max(widthAtCurrentZoomLevel, maxWidths[k]);\n maxHeights[k] = Math.max(heightAtCurrentZoomLevel, maxHeights[k]);\n }\n\n pages[i] = {\n d: zoomDimensions,\n m: maxZoom,\n l: label, // canvas label ('page 1, page 2', etc.)\n il: imageLabel, // default image label ('primary image', 'UV light', etc.)\n f: info.url,\n url: url,\n api: imageAPIVersion,\n paged: thisCanvas.viewingHint !== 'non-paged',\n facingPages: thisCanvas.viewingHint === 'facing-pages',\n canvas: canvas,\n otherImages: otherImages,\n xoffset: info.x || null,\n yoffset: info.y || null\n };\n }\n\n const averageWidths = new Array(lowestMaxZoom + 1);\n const averageHeights = new Array(lowestMaxZoom + 1);\n\n for (let a = 0; a < lowestMaxZoom + 1; a++)\n {\n averageWidths[a] = totalWidths[a] / numCanvases;\n averageHeights[a] = totalHeights[a] / numCanvases;\n }\n\n const dims = {\n a_wid: averageWidths,\n a_hei: averageHeights,\n max_w: maxWidths,\n max_h: maxHeights,\n max_ratio: maxRatio,\n min_ratio: minRatio,\n t_hei: totalHeights,\n t_wid: totalWidths\n };\n\n return {\n item_title: manifest.label,\n dims: dims,\n max_zoom: lowestMaxZoom,\n pgs: pages,\n paged: manifest.viewingHint === 'paged' || sequence.viewingHint === 'paged'\n };\n}\n\n/**\n * Takes in a resource block from a canvas and outputs the following information associated with that resource:\n * - Image URL\n * - Image region to be displayed\n *\n * @param {Object} resource - an object representing the resource block of a canvas section in a IIIF manifest\n * @returns {Object} imageInfo - an object containing image URL and region\n */\nfunction parseImageInfo (resource)\n{\n let url = resource['@id'];\n const fragmentRegex = /#xywh=([0-9]+,[0-9]+,[0-9]+,[0-9]+)/;\n let xywh = '';\n let stripURL = true;\n\n if (/\\/([0-9]+,[0-9]+,[0-9]+,[0-9]+)\\//.test(url))\n {\n // if resource in image API format, extract region x,y,w,h from URL (after 4th slash from last)\n // matches coordinates in URLs of the form http://www.example.org/iiif/book1-page1/40,50,1200,1800/full/0/default.jpg\n const urlArray = url.split('/');\n xywh = urlArray[urlArray.length - 4];\n }\n else if (fragmentRegex.test(url))\n {\n // matches coordinates of the style http://www.example.org/iiif/book1/canvas/p1#xywh=50,50,320,240\n const result = fragmentRegex.exec(url);\n xywh = result[1];\n }\n else if (resource.service && resource.service['@id'])\n {\n // assume canvas size based on image size\n url = resource.service['@id'];\n // this URL excludes region parameters so we don't need to remove them\n stripURL = false;\n }\n\n if (stripURL)\n {\n // extract URL up to identifier (we eliminate the last 5 parameters: /region/size/rotation/quality.format)\n url = url.split('/').slice(0, -4).join('/');\n }\n\n const imageInfo = {\n url: url\n };\n\n if (xywh.length)\n {\n // parse into separate components\n const dimensions = xywh.split(',');\n imageInfo.x = parseInt(dimensions[0], 10);\n imageInfo.y = parseInt(dimensions[1], 10);\n imageInfo.w = parseInt(dimensions[2], 10);\n imageInfo.h = parseInt(dimensions[3], 10);\n }\n\n return imageInfo;\n}\n","const debug = require('debug')('diva:Renderer');\nconst debugPaints = require('debug')('diva:Renderer:paints');\n\nimport { elt, setAttributes } from './utils/elt';\nimport CompositeImage from './composite-image';\nimport DocumentLayout from './document-layout';\nimport ImageCache from './image-cache';\nimport ImageRequestHandler from './image-request-handler';\nimport InterpolateAnimation from './interpolate-animation';\n\nconst REQUEST_DEBOUNCE_INTERVAL = 250;\n\nexport default class Renderer\n{\n constructor (options, hooks)\n {\n this._viewport = options.viewport;\n this._outerElement = options.outerElement;\n this._documentElement = options.innerElement;\n\n this._hooks = hooks || {};\n\n this._canvas = elt('canvas', { class: 'diva-viewer-canvas' });\n this._ctx = this._canvas.getContext('2d');\n\n this.layout = null;\n\n this._sourceResolver = null;\n this._renderedPages = null;\n this._config = null;\n this._zoomLevel = null;\n this._compositeImages = null;\n this._renderedTiles = null;\n this._animation = null;\n\n // FIXME(wabain): What level should this be maintained at?\n // Diva global?\n this._cache = new ImageCache();\n this._pendingRequests = {};\n }\n\n static getCompatibilityErrors ()\n {\n if (typeof HTMLCanvasElement !== 'undefined')\n {\n return null;\n }\n\n return [\n 'Your browser lacks support for the ', elt('pre', 'canvas'),\n ' element. Please upgrade your browser.'\n ];\n }\n\n load (config, viewportPosition, sourceResolver)\n {\n this._clearAnimation();\n\n if (this._hooks.onViewWillLoad)\n {\n this._hooks.onViewWillLoad();\n }\n\n this._sourceResolver = sourceResolver;\n this._config = config;\n this._compositeImages = {};\n this._setLayoutToZoomLevel(viewportPosition.zoomLevel);\n\n // FIXME(wabain): Remove this when there's more confidence the check shouldn't be needed\n if (!this.layout.getPageInfo(viewportPosition.anchorPage))\n {\n throw new Error('invalid page: ' + viewportPosition.anchorPage);\n }\n\n if (this._canvas.width !== this._viewport.width || this._canvas.height !== this._viewport.height)\n {\n debug('Canvas dimension change: (%s, %s) -> (%s, %s)', this._canvas.width, this._canvas.height,\n this._viewport.width, this._viewport.height);\n\n this._canvas.width = this._viewport.width;\n this._canvas.height = this._viewport.height;\n }\n else\n {\n debug('Reload, no size change');\n }\n\n // FIXME: What hooks should be called here?\n this.goto(viewportPosition.anchorPage, viewportPosition.verticalOffset, viewportPosition.horizontalOffset);\n\n if (this._canvas.parentNode !== this._outerElement)\n {\n this._outerElement.insertBefore(this._canvas, this._outerElement.firstChild);\n }\n\n if (this._hooks.onViewDidLoad)\n {\n this._hooks.onViewDidLoad();\n }\n }\n\n _setViewportPosition (viewportPosition)\n {\n if (viewportPosition.zoomLevel !== this._zoomLevel)\n {\n if (this._zoomLevel === null)\n {\n throw new TypeError('The current view is not zoomable');\n }\n else if (viewportPosition.zoomLevel === null)\n {\n throw new TypeError('The current view requires a zoom level');\n }\n\n this._setLayoutToZoomLevel(viewportPosition.zoomLevel);\n }\n\n this._goto(viewportPosition.anchorPage, viewportPosition.verticalOffset, viewportPosition.horizontalOffset);\n }\n\n _setLayoutToZoomLevel (zoomLevel)\n {\n this.layout = new DocumentLayout(this._config, zoomLevel);\n this._zoomLevel = zoomLevel;\n\n setAttributes(this._documentElement, {\n style: {\n height: this.layout.dimensions.height + 'px',\n width: this.layout.dimensions.width + 'px'\n }\n });\n\n this._viewport.setInnerDimensions(this.layout.dimensions);\n }\n\n adjust ()\n {\n this._clearAnimation();\n\n this._render();\n\n if (this._hooks.onViewDidUpdate)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), null);\n }\n }\n\n _render ()\n {\n const newRenderedPages = [];\n this.layout.pageGroups.forEach((group) =>\n {\n if (!this._viewport.intersectsRegion(group.region))\n {\n return;\n }\n\n const visiblePages = group.pages\n .filter(function (page)\n {\n return this.isPageVisible(page.index);\n }, this)\n .map(page => page.index);\n\n newRenderedPages.push.apply(newRenderedPages, visiblePages);\n }, this);\n\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._paintOutline(newRenderedPages);\n\n newRenderedPages.forEach((pageIndex) =>\n {\n if (!this._compositeImages[pageIndex])\n {\n const page = this.layout.getPageInfo(pageIndex);\n const zoomLevels = this._sourceResolver.getAllZoomLevelsForPage(page);\n const composite = new CompositeImage(zoomLevels);\n composite.updateFromCache(this._cache);\n this._compositeImages[pageIndex] = composite;\n }\n }, this);\n\n this._initiateTileRequests(newRenderedPages);\n\n const changes = findChanges(this._renderedPages || [], newRenderedPages);\n\n changes.removed.forEach((pageIndex) =>\n {\n delete this._compositeImages[pageIndex];\n }, this);\n\n this._renderedPages = newRenderedPages;\n this._paint();\n\n if (this._hooks.onPageWillLoad)\n {\n changes.added.forEach((pageIndex) =>\n {\n this._hooks.onPageWillLoad(pageIndex);\n }, this);\n }\n }\n\n _paint ()\n {\n debug('Repainting');\n\n const renderedTiles = [];\n\n this._renderedPages.forEach(function (pageIndex)\n {\n this._compositeImages[pageIndex].getTiles(this._zoomLevel).forEach((source) =>\n {\n const scaled = getScaledTileRecord(source, this._zoomLevel);\n\n if (this._isTileVisible(pageIndex, scaled))\n {\n renderedTiles.push(source.url);\n this._drawTile(pageIndex, scaled, this._cache.get(source.url));\n }\n }, this);\n }, this);\n\n const cache = this._cache;\n\n const changes = findChanges(this._renderedTiles || [], renderedTiles);\n\n changes.added.forEach(url =>\n {\n cache.acquire(url);\n });\n\n changes.removed.forEach(url =>\n {\n cache.release(url);\n });\n\n if (changes.removed)\n {\n // FIXME: Should only need to update the composite images\n // for which tiles were removed\n this._renderedPages.forEach((pageIndex) =>\n {\n this._compositeImages[pageIndex].updateFromCache(this._cache);\n }, this);\n }\n\n this._renderedTiles = renderedTiles;\n }\n\n // Paint a page outline while the tiles are loading.\n _paintOutline (pages)\n {\n pages.forEach(function (pageIndex)\n {\n const pageInfo = this.layout.getPageInfo(pageIndex);\n const pageOffset = this._getImageOffset(pageIndex);\n\n // Ensure the document is drawn to the center of the viewport\n const viewportPaddingX = Math.max(0, (this._viewport.width - this.layout.dimensions.width) / 2);\n const viewportPaddingY = Math.max(0, (this._viewport.height - this.layout.dimensions.height) / 2);\n\n const viewportOffsetX = pageOffset.left - this._viewport.left + viewportPaddingX;\n const viewportOffsetY = pageOffset.top - this._viewport.top + viewportPaddingY;\n\n const destXOffset = viewportOffsetX < 0 ? -viewportOffsetX : 0;\n const destYOffset = viewportOffsetY < 0 ? -viewportOffsetY : 0;\n\n const canvasX = Math.max(0, viewportOffsetX);\n const canvasY = Math.max(0, viewportOffsetY);\n\n const destWidth = pageInfo.dimensions.width - destXOffset;\n const destHeight = pageInfo.dimensions.height - destYOffset;\n\n this._ctx.strokeStyle = '#AAA';\n // In order to get a 1px wide line using strokes, we need to start at a 'half pixel'\n this._ctx.strokeRect(canvasX + 0.5, canvasY + 0.5, destWidth, destHeight);\n }, this);\n }\n\n // This method should be sent all visible pages at once because it will initiate\n // all image requests and cancel any remaining image requests. In the case that\n // a request is ongoing and the tile is still visible in the viewport, the old request\n // is kept active instead of restarting it. The image requests are given a timeout\n // before loading in order to debounce them and have a small reaction time\n // to cancel them and avoid useless requests.\n _initiateTileRequests (pages)\n {\n // Only requests in this object are kept alive, since all others are not visible in the viewport\n const newPendingRequests = {};\n\n // Used later as a closure to initiate the image requests with the right source and pageIndex\n const initiateRequest = (source, pageIndex) =>\n {\n const composite = this._compositeImages[pageIndex];\n\n newPendingRequests[source.url] = new ImageRequestHandler({\n url: source.url,\n timeoutTime: REQUEST_DEBOUNCE_INTERVAL,\n load: img =>\n {\n delete this._pendingRequests[source.url];\n this._cache.put(source.url, img);\n\n // Awkward way to check for updates\n if (composite === this._compositeImages[pageIndex])\n {\n composite.updateWithLoadedUrls([source.url]);\n\n if (this._isTileForSourceVisible(pageIndex, source))\n {\n this._paint();\n }\n else\n {\n debugPaints('Page %s, tile %s no longer visible on image load', pageIndex, source.url);\n }\n }\n },\n error: () =>\n {\n // TODO: Could make a limited number of retries, etc.\n delete this._pendingRequests[source.url];\n }\n });\n };\n\n for (let i = 0; i < pages.length; i++)\n {\n const pageIndex = pages[i];\n const tiles = this._sourceResolver.getBestZoomLevelForPage(this.layout.getPageInfo(pageIndex)).tiles;\n\n for (let j = 0; j < tiles.length; j++)\n {\n const source = tiles[j];\n if (this._cache.has(source.url) || !this._isTileForSourceVisible(pageIndex, source))\n {\n continue;\n }\n\n // Don't create a new request if the tile is already being loaded\n if (this._pendingRequests[source.url])\n {\n newPendingRequests[source.url] = this._pendingRequests[source.url];\n delete this._pendingRequests[source.url];\n continue;\n }\n\n // Use a closure since the load and error methods are going to be called later and\n // we need to keep the right reference to the source and the page index\n initiateRequest(source, pageIndex);\n }\n }\n\n for (const url in this._pendingRequests)\n {\n this._pendingRequests[url].abort();\n }\n this._pendingRequests = newPendingRequests;\n }\n\n _drawTile (pageIndex, scaledTile, img)\n {\n const tileOffset = this._getTileToDocumentOffset(pageIndex, scaledTile);\n\n // Ensure the document is drawn to the center of the viewport\n const viewportPaddingX = Math.max(0, (this._viewport.width - this.layout.dimensions.width) / 2);\n const viewportPaddingY = Math.max(0, (this._viewport.height - this.layout.dimensions.height) / 2);\n\n const viewportOffsetX = tileOffset.left - this._viewport.left + viewportPaddingX;\n const viewportOffsetY = tileOffset.top - this._viewport.top + viewportPaddingY;\n\n const destXOffset = viewportOffsetX < 0 ? -viewportOffsetX : 0;\n const destYOffset = viewportOffsetY < 0 ? -viewportOffsetY : 0;\n\n const sourceXOffset = destXOffset / scaledTile.scaleRatio;\n const sourceYOffset = destYOffset / scaledTile.scaleRatio;\n\n const canvasX = Math.max(0, viewportOffsetX);\n const canvasY = Math.max(0, viewportOffsetY);\n\n // Ensure that the specified dimensions are no greater than the actual\n // size of the image. Safari won't display the tile if they are.\n const destWidth = Math.min(scaledTile.dimensions.width, img.width * scaledTile.scaleRatio) - destXOffset;\n const destHeight = Math.min(scaledTile.dimensions.height, img.height * scaledTile.scaleRatio) - destYOffset;\n\n const sourceWidth = destWidth / scaledTile.scaleRatio;\n const sourceHeight = destHeight / scaledTile.scaleRatio;\n\n if (debugPaints.enabled)\n {\n debugPaints('Drawing page %s, tile %sx (%s, %s) from %s, %s to viewport at %s, %s, scale %s%%',\n pageIndex,\n scaledTile.sourceZoomLevel, scaledTile.row, scaledTile.col,\n sourceXOffset, sourceYOffset,\n canvasX, canvasY,\n Math.round(scaledTile.scaleRatio * 100));\n }\n\n this._ctx.drawImage(\n img,\n sourceXOffset, sourceYOffset,\n sourceWidth, sourceHeight,\n canvasX, canvasY,\n destWidth, destHeight);\n }\n\n _isTileForSourceVisible (pageIndex, tileSource)\n {\n return this._isTileVisible(pageIndex, getScaledTileRecord(tileSource, this._zoomLevel));\n }\n\n _isTileVisible (pageIndex, scaledTile)\n {\n const tileOffset = this._getTileToDocumentOffset(pageIndex, scaledTile);\n\n // FIXME(wabain): This check is insufficient during a zoom transition\n return this._viewport.intersectsRegion({\n top: tileOffset.top,\n bottom: tileOffset.top + scaledTile.dimensions.height,\n left: tileOffset.left,\n right: tileOffset.left + scaledTile.dimensions.width\n });\n }\n\n _getTileToDocumentOffset (pageIndex, scaledTile)\n {\n const imageOffset = this._getImageOffset(pageIndex);\n\n return {\n top: imageOffset.top + scaledTile.offset.top,\n left: imageOffset.left + scaledTile.offset.left\n };\n }\n\n _getImageOffset (pageIndex)\n {\n return this.layout.getPageOffset(pageIndex, {excludePadding: true});\n }\n\n // TODO: Update signature\n goto (pageIndex, verticalOffset, horizontalOffset)\n {\n this._clearAnimation();\n this._goto(pageIndex, verticalOffset, horizontalOffset);\n if (this._hooks.onViewDidUpdate)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), pageIndex);\n }\n }\n\n _goto (pageIndex, verticalOffset, horizontalOffset)\n {\n // FIXME(wabain): Move this logic to the viewer\n const pageOffset = this.layout.getPageOffset(pageIndex);\n\n const desiredVerticalCenter = pageOffset.top + verticalOffset;\n const top = desiredVerticalCenter - parseInt(this._viewport.height / 2, 10);\n\n const desiredHorizontalCenter = pageOffset.left + horizontalOffset;\n const left = desiredHorizontalCenter - parseInt(this._viewport.width / 2, 10);\n\n this._viewport.top = top;\n this._viewport.left = left;\n\n this._render();\n }\n\n transitionViewportPosition (options)\n {\n this._clearAnimation();\n\n const getPosition = options.getPosition;\n const onViewDidTransition = this._hooks.onViewDidTransition;\n\n this._animation = InterpolateAnimation.animate({\n duration: options.duration,\n parameters: options.parameters,\n onUpdate: (values) =>\n {\n // TODO: Do image preloading, work with that\n this._setViewportPosition(getPosition(values));\n this._hooks.onZoomLevelWillChange(values.zoomLevel);\n\n if (onViewDidTransition)\n {\n onViewDidTransition();\n }\n },\n onEnd: (info) =>\n {\n if (options.onEnd)\n {\n options.onEnd(info);\n }\n\n if (this._hooks.onViewDidUpdate && !info.interrupted)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), null);\n }\n }\n });\n }\n\n _clearAnimation ()\n {\n if (this._animation)\n {\n this._animation.cancel();\n this._animation = null;\n }\n }\n\n preload ()\n {\n // TODO\n }\n\n isPageVisible (pageIndex)\n {\n if (!this.layout)\n {\n return false;\n }\n\n const page = this.layout.getPageInfo(pageIndex);\n\n if (!page)\n {\n return false;\n }\n\n return this._viewport.intersectsRegion(this.layout.getPageRegion(pageIndex));\n }\n\n getRenderedPages ()\n {\n return this._renderedPages.slice();\n }\n\n destroy ()\n {\n this._clearAnimation();\n\n // FIXME(wabain): I don't know if we should actually do this\n Object.keys(this._pendingRequests).forEach((req) =>\n {\n const handler = this._pendingRequests[req];\n delete this._pendingRequests[req];\n\n handler.abort();\n }, this);\n\n this._canvas.parentNode.removeChild(this._canvas);\n }\n}\n\nfunction getScaledTileRecord (source, scaleFactor)\n{\n let scaleRatio;\n\n if (scaleFactor === null)\n {\n scaleRatio = 1;\n }\n else\n {\n scaleRatio = Math.pow(2, scaleFactor - source.zoomLevel);\n }\n\n return {\n sourceZoomLevel: source.zoomLevel,\n scaleRatio: scaleRatio,\n row: source.row,\n col: source.col,\n dimensions: {\n width: source.dimensions.width * scaleRatio,\n height: source.dimensions.height * scaleRatio\n },\n offset: {\n left: source.offset.left * scaleRatio,\n top: source.offset.top * scaleRatio\n },\n url: source.url\n };\n}\n\nfunction findChanges (oldArray, newArray)\n{\n if (oldArray === newArray)\n {\n return {\n added: [],\n removed: []\n };\n }\n\n const removed = oldArray.filter(oldEntry => newArray.indexOf(oldEntry) === -1);\n\n const added = newArray.filter(newEntry => oldArray.indexOf(newEntry) === -1);\n\n return {\n added: added,\n removed: removed\n };\n}\n","\nexport default function createSettingsView(sources)\n{\n const obj = {};\n\n sources.forEach( (source) =>\n {\n registerMixin(obj, source);\n });\n\n return obj;\n}\n\nfunction registerMixin(obj, mixin)\n{\n Object.keys(mixin).forEach( (key) =>\n {\n Object.defineProperty(obj, key, {\n get: () =>\n {\n return mixin[key];\n },\n set: () =>\n {\n // TODO: Make everything strict mode so this isn't needed\n throw new TypeError('Cannot set settings.' + key);\n }\n });\n });\n}\n","export default class TileCoverageMap\n{\n constructor (rows, cols)\n {\n this._rows = rows;\n this._cols = cols;\n this._map = new Array(rows).fill(null).map(() => new Array(cols).fill(false));\n }\n\n isLoaded (row, col)\n {\n // Return true for out of bounds tiles because they\n // don't need to load. (Unfortunately this will also\n // mask logical errors.)\n if (row >= this._rows || col >= this._cols)\n return true;\n\n return this._map[row][col];\n }\n\n set(row, col, value)\n {\n this._map[row][col] = value;\n }\n\n get()\n {\n console.log(\"JSHint: Requires a getter when setter is set, otherwise lint tests will fail.\");\n }\n}","import diva from './diva-global';\nimport { elt } from './utils/elt';\n\nexport default class Toolbar\n{\n constructor (viewer)\n {\n this.viewer = viewer;\n this.settings = viewer.settings;\n }\n\n _elemAttrs (ident, base)\n {\n const attrs = {\n id: this.settings.ID + ident,\n class: 'diva-' + ident\n };\n\n if (base)\n return Object.assign(attrs, base);\n else\n return attrs;\n }\n\n\n /** Convenience function to subscribe to a Diva event */\n _subscribe (event, callback)\n {\n diva.Events.subscribe(event, callback, this.settings.ID);\n }\n\n\n createButton (name, label, callback, icon)\n {\n const button = elt('button', {\n type: 'button',\n id: this.settings.ID + name,\n class: 'diva-' + name + ' diva-button',\n title: label\n });\n\n if (icon)\n button.appendChild(icon);\n\n if (callback)\n button.addEventListener('click', callback);\n\n return button;\n }\n\n createLabel (name, id, label, innerName, innerValue)\n {\n return elt('div', { id: this.settings.ID + id, class: name + ' diva-label'},\n [ label, elt('span', { id: this.settings.ID + innerName }, innerValue)\n ]);\n }\n\n createZoomButtons ()\n {\n let zoomOutIcon = this._createZoomOutIcon();\n let zoomInIcon = this._createZoomInIcon();\n\n let zoomButtons = [\n this.createButton('zoom-out-button', 'Zoom Out', () => {\n this.viewer.setZoomLevel(this.settings.zoomLevel - 1);\n }, zoomOutIcon),\n this.createButton('zoom-in-button', 'Zoom In', () => {\n this.viewer.setZoomLevel(this.settings.zoomLevel + 1);\n }, zoomInIcon),\n this.createLabel('diva-zoom-label', 'zoom-label', 'Zoom level: ', 'zoom-level', this.settings.zoomLevel + 1)\n ];\n\n let zoomHandler = function ()\n {\n let labelEl = document.getElementById(this.settings.ID + 'zoom-level');\n labelEl.textContent = this.settings.zoomLevel + 1;\n };\n\n this._subscribe('ZoomLevelDidChange', zoomHandler);\n this._subscribe('ViewerDidLoad', zoomHandler);\n\n return elt('div', { id: this.settings.ID + \"zoom-controls\", style: \"display: none\"}, zoomButtons);\n }\n\n createGridControls ()\n {\n let gridMoreIcon = this._createGridMoreIcon();\n let gridFewerIcon = this._createGridFewerIcon();\n\n let gridButtons = [\n this.createButton('grid-out-button', 'Fewer', () => {\n this.viewer.setGridPagesPerRow(this.settings.pagesPerRow - 1);\n }, gridFewerIcon),\n this.createButton('grid-in-button', 'More', () => {\n this.viewer.setGridPagesPerRow(this.settings.pagesPerRow + 1);\n }, gridMoreIcon),\n this.createLabel('diva-grid-label', 'grid-label', 'Pages per row: ', 'pages-per-row', this.settings.pagesPerRow)\n ];\n\n let gridChangeHandler = function ()\n {\n let labelEl = document.getElementById(this.settings.ID + 'pages-per-row');\n labelEl.textContent = this.settings.pagesPerRow;\n };\n\n this._subscribe('GridRowNumberDidChange', gridChangeHandler);\n\n return elt('div', {id: this.settings.ID + \"grid-controls\", style: \"display:none\" }, gridButtons);\n }\n\n createViewMenu ()\n {\n const viewOptionsList = elt('div', this._elemAttrs('view-options'));\n const gridViewIcon = this._createGridViewIcon();\n const bookViewIcon = this._createBookViewIcon();\n const pageViewIcon = this._createPageViewIcon();\n\n const viewOptionsToggle = () =>\n {\n viewOptionsList.style.display = viewOptionsList.style.display === \"none\" ? \"block\" : \"none\";\n };\n\n const changeViewButton = this.createButton('view-icon', 'Change view', viewOptionsToggle);\n\n const selectView = (view) =>\n {\n this.viewer.changeView(view);\n\n //hide view menu\n viewOptionsList.style.display = \"none\";\n };\n\n const updateViewMenu = () =>\n {\n const viewIconClasses = ' diva-view-icon diva-button';\n\n\n // display the icon of the mode we're currently in (?)\n if (this.settings.inGrid)\n {\n changeViewButton.appendChild(gridViewIcon);\n changeViewButton.className = 'diva-grid-icon' + viewIconClasses;\n }\n else if (this.settings.inBookLayout)\n {\n changeViewButton.appendChild(bookViewIcon);\n changeViewButton.className = 'diva-book-icon' + viewIconClasses;\n }\n else\n {\n changeViewButton.appendChild(pageViewIcon);\n changeViewButton.className = 'diva-document-icon' + viewIconClasses;\n }\n\n const viewOptions = document.createDocumentFragment();\n\n // then display document, book, and grid buttons in that order, excluding the current view\n if (this.settings.inGrid || this.settings.inBookLayout)\n viewOptions.appendChild(this.createButton('document-icon', 'Document View', selectView.bind(null, 'document'), pageViewIcon));\n\n if (this.settings.inGrid || !this.settings.inBookLayout)\n viewOptions.appendChild(this.createButton('book-icon', 'Book View', selectView.bind(null, 'book'), bookViewIcon));\n\n if (!this.settings.inGrid)\n viewOptions.appendChild(this.createButton('grid-icon', 'Grid View', selectView.bind(null, 'grid'), gridViewIcon));\n\n // remove old menu\n while (viewOptionsList.firstChild)\n {\n viewOptionsList.removeChild(viewOptionsList.firstChild);\n }\n\n // insert new menu\n viewOptionsList.appendChild(viewOptions);\n };\n\n document.addEventListener('mouseup', event =>\n {\n if (viewOptionsList !== event.target)\n {\n viewOptionsList.style.display = 'none';\n }\n });\n\n this._subscribe('ViewDidSwitch', updateViewMenu);\n this._subscribe('ObjectDidLoad', updateViewMenu);\n\n return elt('div', this._elemAttrs('view-menu'),\n changeViewButton,\n viewOptionsList\n );\n }\n\n createFullscreenButton ()\n {\n let fullscreenIcon = this._createFullscreenIcon();\n\n return this.createButton('fullscreen-icon', 'Toggle fullscreen mode', () => {\n this.viewer.toggleFullscreenMode();\n }, fullscreenIcon);\n }\n\n toggleZoomGridControls ()\n {\n if (!this.settings.inGrid)\n {\n document.getElementById(this.settings.ID + \"zoom-controls\").style.display = \"block\";\n document.getElementById(this.settings.ID + \"grid-controls\").style.display = \"none\";\n }\n else\n {\n document.getElementById(this.settings.ID + \"zoom-controls\").style.display = \"none\";\n document.getElementById(this.settings.ID + \"grid-controls\").style.display = \"block\";\n }\n\n }\n\n render ()\n {\n this._subscribe(\"ViewDidSwitch\", this.toggleZoomGridControls);\n this._subscribe(\"ObjectDidLoad\", this.toggleZoomGridControls);\n\n let leftTools = [\n this.createZoomButtons(),\n this.createGridControls()\n ];\n let rightTools = [\n this.createViewMenu(),\n this.createFullscreenButton()\n ];\n\n const tools = elt('div', this._elemAttrs('tools'),\n elt('div', this._elemAttrs('tools-left'), leftTools),\n elt('div', this._elemAttrs('tools-right'), rightTools)\n );\n\n this.settings.toolbarParentObject.insertBefore(\n tools,\n this.settings.toolbarParentObject.firstChild\n );\n }\n\n _createToolbarIcon (paths)\n {\n let icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttributeNS(null, 'viewBox', \"0 0 25 25\");\n icon.setAttributeNS(null, 'x', '0px');\n icon.setAttributeNS(null, 'y', '0px');\n icon.setAttributeNS(null, 'style', \"enable-background:new 0 0 48 48;\");\n\n let glyph = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n glyph.setAttributeNS(null, \"transform\", \"matrix(1, 0, 0, 1, -12, -12)\");\n\n paths.forEach( (path) =>\n {\n let pEl = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n pEl.setAttributeNS(null, \"d\", path);\n glyph.appendChild(pEl);\n });\n\n icon.appendChild(glyph);\n return icon;\n }\n\n _createZoomOutIcon ()\n {\n let paths = [\n \"M19.5,23c-0.275,0-0.5-0.225-0.5-0.5v-1c0-0.275,0.225-0.5,0.5-0.5h7c0.275,0,0.5,0.225,0.5,0.5v1c0,0.275-0.225,0.5-0.5,0.5H19.5z\",\n \"M37.219,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.422,33.722,37.422,34.054,37.219,34.257z M29.568,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.555,28.818,29.568,25.805,29.568,22.099z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n _createZoomInIcon ()\n {\n let paths = [\n \"M37.469,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.672,33.722,37.672,34.054,37.469,34.257z M29.818,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.805,28.818,29.818,25.805,29.818,22.099z M26.5,21H24v-2.5c0-0.275-0.225-0.5-0.5-0.5h-1c-0.275,0-0.5,0.225-0.5,0.5V21h-2.5c-0.275,0-0.5,0.225-0.5,0.5v1c0,0.275,0.225,0.5,0.5,0.5H22v2.5c0,0.275,0.225,0.5,0.5,0.5h1c0.275,0,0.5-0.225,0.5-0.5V23h2.5c0.275,0,0.5-0.225,0.5-0.5v-1C27,21.225,26.775,21,26.5,21z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridMoreIcon ()\n {\n let paths = [\n \"M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridFewerIcon ()\n {\n let paths = [\n \"M25.5,35c-0.275,0-0.5-0.225-0.5-0.5v-9c0-0.275,0.225-0.5,0.5-0.5h9c0.275,0,0.5,0.225,0.5,0.5v9c0,0.275-0.225,0.5-0.5,0.5H25.5z M22.5,35c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z M34.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H34.5z M22.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridViewIcon ()\n {\n let paths = [\n \"M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createBookViewIcon ()\n {\n let paths = [\n \"M35,16.8v-1.323c0,0-2.292-1.328-5.74-1.328c-3.448,0-5.26,1.25-5.26,1.25s-1.813-1.25-5.26-1.25c-3.448,0-5.74,1.328-5.74,1.328V16.8l-1,0.531v0.021v15.687c0,0,4.531-1.578,6.999-1.578c2.468,0,5.001,0.885,5.001,0.885s2.532-0.885,5-0.885c0.306,0,0.643,0.024,1,0.066v4.325l1.531-2.016L33,35.852v-3.72c2,0.43,3,0.906,3,0.906V17.352v-0.021L35,16.8z M23,29.03c-1-0.292-2.584-0.679-3.981-0.679c-2.246,0-3.019,0.404-4.019,0.699V16.634c0,0,1.125-0.699,4.019-0.699c1.694,0,2.981,0.417,3.981,1.126V29.03z M33,29.051c-1-0.295-1.773-0.699-4.02-0.699c-1.396,0-2.981,0.387-3.98,0.679V17.06c1-0.709,2.286-1.126,3.98-1.126c2.895,0,4.02,0.699,4.02,0.699V29.051z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createPageViewIcon ()\n {\n let paths = [\n \"M29.425,29h4.47L29,33.934v-4.47C29,29.19,29.151,29,29.425,29z M34,14.563V28h-5.569C28.157,28,28,28.196,28,28.47V34H14.497C14.223,34,14,33.71,14,33.437V14.563C14,14.29,14.223,14,14.497,14h18.9C33.672,14,34,14.29,34,14.563z M25.497,26.497C25.497,26.223,25.275,26,25,26h-7c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,27.777,17.725,28,18,28h7c0.275,0,0.497-0.223,0.497-0.497V26.497z M30.497,22.497C30.497,22.223,30.275,22,30,22H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,23.777,17.725,24,18,24h12c0.275,0,0.497-0.223,0.497-0.497V22.497z M30.497,18.497C30.497,18.223,30.275,18,30,18H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,19.777,17.725,20,18,20h12c0.275,0,0.497-0.223,0.497-0.497V18.497z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n _createFullscreenIcon ()\n {\n let paths = [\n \"M35,12H13c-0.55,0-1,0.45-1,1v22c0,0.55,0.45,1,1,1h22c0.55,0,1-0.45,1-1V13C36,12.45,35.55,12,35,12z M34,34H14V14h20V34z\",\n \"M17,21.75v-4.5c0-0.138,0.112-0.25,0.25-0.25h4.5c0.138,0,0.17,0.08,0.073,0.177l-1.616,1.616l1.823,1.823c0.097,0.097,0.097,0.256,0,0.354l-1.061,1.06c-0.097,0.097-0.256,0.097-0.354,0l-1.823-1.823l-1.616,1.616C17.08,21.92,17,21.888,17,21.75z M20.97,25.97c-0.097-0.097-0.256-0.097-0.354,0l-1.823,1.823l-1.616-1.616C17.08,26.08,17,26.112,17,26.25v4.5c0,0.138,0.112,0.25,0.25,0.25h4.5c0.138,0,0.17-0.08,0.073-0.177l-1.616-1.616l1.823-1.823c0.097-0.097,0.097-0.256,0-0.354L20.97,25.97z M30.75,17h-4.5c-0.138,0-0.17,0.08-0.073,0.177l1.616,1.616l-1.823,1.823c-0.097,0.097-0.097,0.256,0,0.354l1.061,1.06c0.097,0.097,0.256,0.097,0.354,0l1.823-1.823l1.616,1.616C30.92,21.92,31,21.888,31,21.75v-4.5C31,17.112,30.888,17,30.75,17z M30.823,26.177l-1.616,1.616l-1.823-1.823c-0.097-0.097-0.256-0.097-0.354,0l-1.061,1.06c-0.097,0.097-0.097,0.256,0,0.354l1.823,1.823l-1.616,1.616C26.08,30.92,26.112,31,26.25,31h4.5c0.138,0,0.25-0.112,0.25-0.25v-4.5C31,26.112,30.92,26.08,30.823,26.177z M26,22.5c0-0.275-0.225-0.5-0.5-0.5h-3c-0.275,0-0.5,0.225-0.5,0.5v3c0,0.275,0.225,0.5,0.5,0.5h3c0.275,0,0.5-0.225,0.5-0.5V22.5z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n\n}\n\n\n// export default function createToolbar (viewer)\n// {\n// const settings = viewer.getSettings();\n//\n// // FIXME(wabain): Temporarily copied from within Diva\n// const elemAttrs = (ident, base) => {\n// const attrs = {\n// id: settings.ID + ident,\n// class: 'diva-' + ident\n// };\n//\n// if (base)\n// return Object.assign(attrs, base);\n// else\n// return attrs;\n// };\n//\n// /** Convenience function to subscribe to a Diva event */\n// const subscribe = (event, callback) => {\n// diva.Events.subscribe(event, callback, settings.ID);\n// };\n//\n// // Creates a toolbar button\n// const createButtonElement = (name, label, callback) => {\n// const button = elt('button', {\n// type: 'button',\n// id: settings.ID + name,\n// class: 'diva-' + name + ' diva-button',\n// title: label\n// });\n//\n// if (callback)\n// button.addEventListener('click', callback, false);\n//\n// return button;\n// };\n//\n// // Higher-level function for creators of zoom and grid controls\n// const getResolutionControlCreator = config => () => {\n// let controls;\n//\n// switch (settings[config.controllerSetting])\n// {\n// case 'slider':\n// controls = config.createSlider();\n// break;\n//\n// case 'buttons':\n// controls = config.createButtons();\n// break;\n//\n// default:\n// // Don't display anything\n// return null;\n// }\n//\n// const wrapper = elt('span',\n// controls,\n// config.createLabel()\n// );\n//\n// const updateWrapper = () => {\n// if (settings.inGrid === config.showInGrid)\n// wrapper.style.display = 'inline';\n// else\n// wrapper.style.display = 'none';\n// };\n//\n// subscribe('ViewDidSwitch', updateWrapper);\n// subscribe('ObjectDidLoad', updateWrapper);\n//\n// // Set initial value\n// updateWrapper();\n//\n// return wrapper;\n// };\n//\n// // Zoom controls\n// const createZoomControls = getResolutionControlCreator({\n// controllerSetting: 'enableZoomControls',\n// showInGrid: false,\n//\n// createSlider: function ()\n// {\n// const elem = createSlider('zoom-slider', {\n// step: 0.1,\n// value: settings.zoomLevel,\n// min: settings.minZoomLevel,\n// max: settings.maxZoomLevel\n// });\n//\n// elem.addEventListener('input', () =>\n// {\n// const floatValue = parseFloat(this.value);\n// viewer.setZoomLevel(floatValue);\n// });\n//\n// elem.addEventListener('change', () =>\n// {\n// const floatValue = parseFloat(this.value);\n// if (floatValue !== settings.zoomLevel)\n// viewer.setZoomLevel(floatValue);\n// });\n//\n// const updateSlider = () => {\n// if (settings.zoomLevel !== $elem.val())\n// $elem.val(settings.zoomLevel);\n// };\n//\n// subscribe('ZoomLevelDidChange', updateSlider);\n// subscribe('ViewerDidLoad', () => {\n// elt.setAttributes(elem, {\n// min: settings.minZoomLevel,\n// max: settings.maxZoomLevel\n// });\n//\n// updateSlider();\n// });\n//\n// return elem;\n// },\n//\n// createButtons: function ()\n// {\n// return elt('span',\n// createButtonElement('zoom-out-button', 'Zoom Out', () => {\n// viewer.setZoomLevel(settings.zoomLevel - 1);\n// }),\n// createButtonElement('zoom-in-button', 'Zoom In', () => {\n// viewer.setZoomLevel(settings.zoomLevel + 1);\n// })\n// );\n// },\n//\n// createLabel: function ()\n// {\n// const elem = createLabel('diva-zoom-label', 'zoom-label', 'Zoom level: ', 'zoom-level', settings.zoomLevel);\n// const textSpan = $(elem).find(settings.selector + 'zoom-level')[0];\n//\n// const updateText = () => {\n// textSpan.textContent = settings.zoomLevel.toFixed(2);\n// };\n//\n// subscribe('ZoomLevelDidChange', updateText);\n// subscribe('ViewerDidLoad', updateText);\n//\n// return elem;\n// }\n// });\n//\n// // Grid controls\n// const createGridControls = getResolutionControlCreator({\n// controllerSetting: 'enableGridControls',\n// showInGrid: true,\n//\n// createSlider: function ()\n// {\n// const elem = createSlider('grid-slider', {\n// value: settings.pagesPerRow,\n// min: settings.minPagesPerRow,\n// max: settings.maxPagesPerRow\n// });\n//\n// elem.addEventListener('input', () => {\n// const intValue = parseInt(elem.value, 10);\n// viewer.setGridPagesPerRow(intValue);\n// });\n//\n// elem.addEventListener('change', () => {\n// const intValue = parseInt(elem.value, 10);\n// if (intValue !== settings.pagesPerRow)\n// viewer.setGridPagesPerRow(intValue);\n// });\n//\n// subscribe('GridRowNumberDidChange', () => {\n// // Update the position of the handle within the slider\n// if (settings.pagesPerRow !== $elem.val())\n// $elem.val(settings.pagesPerRow);\n// });\n//\n// return elem;\n// },\n//\n// createButtons: function ()\n// {\n// return elt('span',\n// createButtonElement('grid-out-button', 'Zoom Out', () => {\n// viewer.setGridPagesPerRow(settings.pagesPerRow - 1);\n// }),\n// createButtonElement('grid-in-button', 'Zoom In', () => {\n// viewer.setGridPagesPerRow(settings.pagesPerRow + 1);\n// })\n// );\n// },\n//\n// createLabel: function ()\n// {\n// const elem = createLabel('diva-grid-label', 'grid-label', 'Pages per row: ', 'pages-per-row', settings.pagesPerRow);\n// const textSpan = $(elem).find(settings.selector + 'pages-per-row')[0];\n//\n// subscribe('GridRowNumberDidChange', () => {\n// textSpan.textContent = settings.pagesPerRow;\n// });\n//\n// return elem;\n// }\n// });\n//\n// const createViewMenu = () => {\n// const viewOptionsList = elt('div', elemAttrs('view-options'));\n//\n// const changeViewButton = createButtonElement('view-icon', 'Change view', () => {\n// $(viewOptionsList).toggle();\n// });\n//\n// document.addEventListener('mouseup', event => {\n// const container = $(viewOptionsList);\n//\n// if (!container.is(event.target) && container.has(event.target).length === 0 && event.target.id !== settings.ID + 'view-icon')\n// {\n// container.hide();\n// }\n// });\n//\n// const selectView = view => {\n// viewer.changeView(view);\n//\n// //hide view menu\n// $(viewOptionsList).hide();\n// };\n//\n// const updateViewMenu = () => {\n// const viewIconClasses = ' diva-view-icon diva-button';\n//\n// // display the icon of the mode we're currently in (?)\n// if (settings.inGrid)\n// {\n// changeViewButton.className = 'diva-grid-icon' + viewIconClasses;\n// }\n// else if (settings.inBookLayout)\n// {\n// changeViewButton.className = 'diva-book-icon' + viewIconClasses;\n// }\n// else\n// {\n// changeViewButton.className = 'diva-document-icon' + viewIconClasses;\n// }\n//\n// const viewOptions = document.createDocumentFragment();\n//\n// // then display document, book, and grid buttons in that order, excluding the current view\n// if (settings.inGrid || settings.inBookLayout)\n// viewOptions.appendChild(createButtonElement('document-icon', 'Document View', selectView.bind(null, 'document')));\n//\n// if (settings.inGrid || !settings.inBookLayout)\n// viewOptions.appendChild(createButtonElement('book-icon', 'Book View', selectView.bind(null, 'book')));\n//\n// if (!settings.inGrid)\n// viewOptions.appendChild(createButtonElement('grid-icon', 'Grid View', selectView.bind(null, 'grid')));\n//\n// // remove old menu\n// while (viewOptionsList.firstChild)\n// {\n// viewOptionsList.removeChild(viewOptionsList.firstChild);\n// }\n//\n// // insert new menu\n// viewOptionsList.appendChild(viewOptions);\n// };\n//\n// subscribe('ViewDidSwitch', updateViewMenu);\n// subscribe('ObjectDidLoad', updateViewMenu);\n//\n// return elt('div', elemAttrs('view-menu'),\n// changeViewButton,\n// viewOptionsList\n// );\n// };\n//\n// const createSlider = (name, options) => elt('input', options, {\n// id: settings.ID + name,\n// class: 'diva-' + name + ' diva-slider',\n// type: 'range'\n// });\n//\n// const createLabel = (name, id, label, innerName, innerValue) => elt('div', {\n// id: settings.ID + id,\n// class: name + ' diva-label'\n// },\n// [\n// label,\n// elt('span', {\n// id: settings.ID + innerName\n// }, innerValue)\n// ]);\n//\n// const createPageNavigationControls = () => {\n// // Go to page form\n// const gotoForm = settings.enableGotoPage ? createGotoPageForm() : null;\n//\n// return elt('span', elemAttrs('page-nav'),\n// createPageLabel(), // 'Page x of y' label\n// gotoForm\n// );\n// };\n//\n// const createGotoPageForm = () => {\n// const gotoPageInput = elt('input', {\n// id: settings.ID + 'goto-page-input',\n// class: 'diva-input diva-goto-page-input',\n// autocomplete: 'off',\n// type: 'text'\n// });\n//\n// const gotoPageSubmit = elt('input', {\n// id: settings.ID + 'goto-page-submit',\n// class: 'diva-button diva-button-text',\n// type: 'submit',\n// value: 'Go'\n// });\n//\n// const inputSuggestions = elt('div', {\n// id: settings.ID + 'input-suggestions',\n// class: 'diva-input-suggestions'\n// }\n// );\n//\n// const gotoForm = elt('form', {\n// id: settings.ID + 'goto-page',\n// class: 'diva-goto-form'\n// },\n// gotoPageInput,\n// gotoPageSubmit,\n// inputSuggestions\n// );\n//\n// $(gotoForm).on('submit', () => {\n// const desiredPageLabel = gotoPageInput.value;\n//\n// if (settings.onGotoSubmit && typeof settings.onGotoSubmit === \"function\")\n// {\n// const pageIndex = settings.onGotoSubmit(desiredPageLabel);\n// if (!viewer.gotoPageByIndex(pageIndex))\n// alert(\"No page could be found with that label or page number\");\n//\n// }\n// else // Default if no function is specified in the settings\n// {\n// if (!viewer.gotoPageByLabel(desiredPageLabel))\n// alert(\"No page could be found with that label or page number\");\n// }\n//\n// // Hide the suggestions\n// inputSuggestions.style.display = 'none';\n//\n// // Prevent the default action of reloading the page\n// return false;\n// });\n//\n// $(gotoPageInput).on('input focus', () => {\n// inputSuggestions.innerHTML = ''; // Remove all previous suggestions\n//\n// const value = gotoPageInput.value;\n// let numSuggestions = 0;\n// if (settings.enableGotoSuggestions && value)\n// {\n// const pages = settings.manifest.pages;\n// for (let i = 0, len = pages.length; i < len && numSuggestions < 10; i++)\n// {\n// if (pages[i].l.toLowerCase().indexOf(value.toLowerCase()) > -1)\n// {\n// const newInputSuggestion = elt('div', {\n// class: 'diva-input-suggestion'\n// },\n// pages[i].l\n// );\n//\n// inputSuggestions.appendChild(newInputSuggestion);\n//\n// numSuggestions++;\n// }\n// }\n//\n// // Show label suggestions\n// if (numSuggestions > 0)\n// inputSuggestions.style.display = 'block';\n// }\n// else\n// inputSuggestions.style.display = 'none';\n// });\n//\n// $(gotoPageInput).on('keydown', e => {\n// let el;\n// if (e.keyCode === 13) // 'Enter' key\n// {\n// const active = $('.active', inputSuggestions);\n// if (active.length)\n// gotoPageInput.value = active.text();\n//\n// }\n// if (e.keyCode === 38) // Up arrow key\n// {\n// el = $('.active', inputSuggestions);\n// const prevEl = el.prev();\n// if (prevEl.length)\n// {\n// el.removeClass('active');\n// prevEl.addClass('active');\n// }\n// else\n// {\n// el.removeClass('active');\n// $('.diva-input-suggestion:last', inputSuggestions).addClass('active');\n// }\n// }\n// else if (e.keyCode === 40) // Down arrow key\n// {\n// el = $('.active', inputSuggestions);\n// const nextEl = el.next();\n// if (nextEl.length)\n// {\n// el.removeClass('active');\n// nextEl.addClass('active');\n// }\n// else\n// {\n// el.removeClass('active');\n// $('.diva-input-suggestion:first', inputSuggestions).addClass('active');\n// }\n// }\n// });\n//\n// $(inputSuggestions).on('mousedown', '.diva-input-suggestion', function()\n// {\n// gotoPageInput.value = this.textContent;\n// inputSuggestions.style.display = 'none';\n// $(gotoPageInput).trigger('submit');\n// });\n//\n// $(gotoPageInput).on('blur', () => {\n// // Hide label suggestions\n// inputSuggestions.style.display = 'none';\n// });\n//\n// return gotoForm;\n// };\n//\n// const createPageLabel = () => {\n// // Current page\n// const currentPage = elt('span', {\n// id: settings.ID + 'current-page'\n// });\n//\n// const updateCurrentPage = () => {\n// currentPage.textContent = viewer.getCurrentAliasedPageIndex();\n// };\n//\n// subscribe('VisiblePageDidChange', updateCurrentPage);\n// subscribe('ViewerDidLoad', updateCurrentPage);\n//\n// // Number of pages\n// const numPages = elt('span', {\n// id: settings.ID + 'num-pages'\n// });\n//\n// const updateNumPages = () => {\n// numPages.textContent = settings.numPages;\n// };\n//\n// subscribe('NumberOfPagesDidChange', updateNumPages);\n// subscribe('ObjectDidLoad', updateNumPages);\n//\n// return elt('span', {\n// class: 'diva-page-label diva-label'\n// },\n// 'Page ', currentPage, ' of ', numPages\n// );\n// };\n//\n// const createToolbarButtonGroup = () => {\n// const buttons = [createViewMenu()];\n//\n// if (settings.enableLinkIcon)\n// buttons.push(createLinkIcon());\n//\n// if (settings.enableNonPagedVisibilityIcon)\n// buttons.push(createToggleNonPagedButton());\n//\n// if (settings.enableFullscreen)\n// buttons.push(createFullscreenButton());\n//\n// return elt('span', elemAttrs('toolbar-button-group'), buttons);\n// };\n//\n// const createLinkIcon = () => {\n// const elem = createButtonElement('link-icon', 'Link to this page');\n// const linkIcon = $(elem);\n//\n// linkIcon.on('click', () => {\n// $('body').prepend(\n// elt('div', {\n// id: settings.ID + 'link-popup',\n// class: 'diva-popup diva-link-popup'\n// }, [\n// elt('input', {\n// id: settings.ID + 'link-popup-input',\n// class: 'diva-input',\n// type: 'text',\n// value: viewer.getCurrentURL()\n// })\n// ])\n// );\n//\n// if (settings.inFullscreen)\n// {\n// $(settings.selector + 'link-popup').addClass('in-fullscreen');\n// }\n// else\n// {\n// // Calculate the left and top offsets\n// const leftOffset = linkIcon.offset().left - 222 + linkIcon.outerWidth();\n// const topOffset = linkIcon.offset().top + linkIcon.outerHeight() - 1;\n//\n// $(settings.selector + 'link-popup').css({\n// 'top': topOffset + 'px',\n// 'left': leftOffset + 'px'\n// });\n// }\n//\n// // Catch onmouseup events outside of this div\n// $('body').mouseup(event => {\n// const targetID = event.target.id;\n//\n// if (targetID !== settings.ID + 'link-popup' && targetID !== settings.ID + 'link-popup-input')\n// $(settings.selector + 'link-popup').remove();\n// });\n//\n// // Also delete it upon scroll and page up/down key events\n// // FIXME(wabain): This is aggressive\n// settings.viewportObject.scroll(() => {\n// $(settings.selector + 'link-popup').remove();\n// });\n// $(settings.selector + 'link-popup input').click(function ()\n// {\n// $(this).focus().select();\n// });\n//\n// return false;\n// });\n//\n// return elem;\n// };\n//\n// var createFullscreenButton = () => createButtonElement('fullscreen-icon', 'Toggle fullscreen mode', () => {\n// viewer.toggleFullscreenMode();\n// });\n//\n// var createToggleNonPagedButton = () => {\n// const getClassName = () => 'toggle-nonpaged-icon' + (viewer.getSettings().showNonPagedPages ? '-active' : '');\n//\n// const toggleNonPagedButton = createButtonElement(getClassName(), 'Toggle visibility of non-paged pages', function()\n// {\n// viewer.toggleNonPagedPagesVisibility();\n// const newClassName = 'diva-' + getClassName();\n// this.className = this.className.replace(/diva-toggle-nonpaged-icon(-active)?/, newClassName);\n// });\n//\n// const updateNonPagedButtonVisibility = () => {\n// const pages = settings.manifest.pages;\n// for (let i = 0; i < pages.length; i++)\n// {\n// if (settings.manifest.paged && !pages[i].paged)\n// {\n// // Show the button, there is at least one non-paged page\n// toggleNonPagedButton.style.display = 'inline-block';\n// return;\n// }\n// }\n//\n// // No non-paged pages were found, hide the button\n// toggleNonPagedButton.style.display = 'none';\n// };\n// subscribe('ObjectDidLoad', updateNonPagedButtonVisibility);\n//\n// return toggleNonPagedButton;\n// };\n//\n// // Handles all status updating etc (both fullscreen and not)\n// const init = () => {\n// const leftTools = [createZoomControls(), createGridControls()];\n// const rightTools = [createPageNavigationControls(), createToolbarButtonGroup()];\n//\n// const tools = elt('div', elemAttrs('tools'),\n// elt('div', elemAttrs('tools-left'), leftTools),\n// elt('div', elemAttrs('tools-right'), rightTools)\n// );\n//\n// settings.toolbarParentObject.prepend(tools);\n//\n// // Handle entry to and exit from fullscreen mode\n// const switchMode = () => {\n// const toolsRightElement = document.getElementById(settings.ID + 'tools-right');\n// const pageNavElement = document.getElementById(settings.ID + 'page-nav');\n//\n// if (!settings.inFullscreen)\n// {\n// // Leaving fullscreen\n// $(tools).removeClass('diva-fullscreen-tools');\n//\n// //move ID-page-nav to beginning of tools right\n// toolsRightElement.removeChild(pageNavElement);\n// toolsRightElement.insertBefore(pageNavElement, toolsRightElement.firstChild);\n// }\n// else\n// {\n// // Entering fullscreen\n// $(tools).addClass('diva-fullscreen-tools');\n//\n// //move ID-page-nav to end of tools right\n// toolsRightElement.removeChild(pageNavElement);\n// toolsRightElement.appendChild(pageNavElement);\n// }\n// };\n//\n// subscribe('ModeDidSwitch', switchMode);\n// subscribe('ViewerDidLoad', switchMode);\n//\n// const toolbar = {\n// element: tools,\n// closePopups: function ()\n// {\n// $('.diva-popup').css('display', 'none');\n// }\n// };\n//\n// return toolbar;\n// };\n//\n// return init();\n// }\n","/**\n * @fileoverview dragscroll - scroll area by dragging\n * @version 0.0.8\n *\n * @license MIT, see http://github.com/asvd/dragscroll\n * @copyright 2015 asvd \n */\n(function (root, factory)\n{\n if (typeof define === 'function' && define.amd)\n {\n define(['exports'], factory);\n }\n else if (typeof exports !== 'undefined')\n {\n factory(exports);\n }\n else\n {\n factory((root.dragscroll = {}));\n }\n}(this, function (exports)\n{\n var _window = window;\n var _document = document;\n var mousemove = 'mousemove';\n var mouseup = 'mouseup';\n var mousedown = 'mousedown';\n var EventListener = 'EventListener';\n var addEventListener = 'add' + EventListener;\n var removeEventListener = 'remove' + EventListener;\n var newScrollX, newScrollY; // jshint ignore:line\n\n var dragged = [];\n\n var reset = function (i, el)\n {\n for (i = 0; i < dragged.length;)\n {\n el = dragged[i++];\n el = el.container || el;\n el[removeEventListener](mousedown, el.md, 0);\n _window[removeEventListener](mouseup, el.mu, 0);\n _window[removeEventListener](mousemove, el.mm, 0);\n }\n\n // suppress warning about functions in loops.\n /* jshint ignore:start */\n // cloning into array since HTMLCollection is updated dynamically\n dragged = [].slice.call(_document.getElementsByClassName('dragscroll'));\n for (i = 0; i < dragged.length;)\n {\n (function (el, lastClientX, lastClientY, pushed, scroller, cont)\n {\n (cont = el.container || el)[addEventListener](\n mousedown,\n cont.md = function (e)\n {\n if (!el.hasAttribute('nochilddrag') || _document.elementFromPoint(e.pageX, e.pageY) === cont)\n {\n pushed = 1;\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n\n e.preventDefault();\n }\n }, 0\n );\n\n _window[addEventListener](mouseup, cont.mu = function ()\n {\n pushed = 0;\n }, 0);\n\n _window[addEventListener](mousemove, cont.mm = function (e)\n {\n if (pushed)\n {\n (scroller = el.scroller || el).scrollLeft -=\n newScrollX = (-lastClientX + (lastClientX = e.clientX));\n scroller.scrollTop -=\n newScrollY = (-lastClientY + (lastClientY = e.clientY));\n if (el === _document.body)\n {\n (scroller = _document.documentElement).scrollLeft -= newScrollX;\n scroller.scrollTop -= newScrollY;\n }\n }\n }, 0);\n })(dragged[i++]);\n }\n /* jshint ignore:end */\n };\n\n if (_document.readyState === 'complete')\n {\n reset();\n }\n else\n {\n _window[addEventListener]('load', reset, 0);\n }\n\n exports.reset = reset;\n}));\n","export { setDOMAttributes as setAttributes };\n\n/**\n * Convenience function to create a DOM element, set attributes on it, and\n * append children. All arguments which are not of primitive type, are not\n * arrays, and are not DOM nodes are treated as attribute hashes and are\n * handled as described for setDOMAttributes. Children can either be a DOM\n * node or a primitive value, which is converted to a text node. Arrays are\n * handled recursively. Null and undefined values are ignored.\n *\n * Inspired by the ProseMirror helper of the same name.\n */\nexport function elt (tag)\n{\n const el = document.createElement(tag);\n const args = Array.prototype.slice.call(arguments, 1);\n\n while (args.length)\n {\n const arg = args.shift();\n handleEltConstructorArg(el, arg);\n }\n\n return el;\n}\n\nfunction handleEltConstructorArg (el, arg)\n{\n if (arg == null) // NB: == is correct;\n return;\n\n if (typeof arg !== 'object' && typeof arg !== 'function')\n {\n // Coerce to string\n el.appendChild(document.createTextNode(arg));\n }\n else if (arg instanceof window.Node)\n {\n el.appendChild(arg);\n }\n else if (arg instanceof Array)\n {\n const childCount = arg.length;\n for (let i = 0; i < childCount; i++)\n handleEltConstructorArg(el, arg[i]);\n }\n else\n {\n setDOMAttributes(el, arg);\n }\n}\n\n/**\n * Set attributes of a DOM element. The `style` property is special-cased to\n * accept either a string or an object whose own attributes are assigned to\n * el.style.\n */\nfunction setDOMAttributes (el, attributes)\n{\n for (const prop in attributes)\n {\n if (!attributes.hasOwnProperty(prop))\n continue;\n\n if (prop === 'style')\n {\n setStyle(el, attributes.style);\n }\n else\n {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n}\n\nfunction setStyle (el, style)\n{\n if (!style)\n return;\n\n if (typeof style !== 'object')\n {\n el.style.cssText = style;\n return;\n }\n\n for (const cssProp in style)\n {\n if (!style.hasOwnProperty(cssProp))\n continue;\n\n el.style[cssProp] = style[cssProp];\n }\n}\n","/**\n * Events. Pub/Sub system for Loosely Coupled logic.\n * Based on Peter Higgins' port from Dojo to jQuery\n * https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js\n *\n * Re-adapted to vanilla Javascript\n *\n * @class Events\n */\n\nclass DivaEvents\n{\n constructor()\n {\n this._cache = {};\n }\n\n /**\n * diva.Events.publish\n * e.g.: diva.Events.publish(\"PageDidLoad\", [pageIndex, filename, pageSelector], this);\n *\n * @class Events\n * @method publish\n * @param topic {String}\n * @param args {Array}\n * @param scope {Object=} Optional - Subscribed functions will be executed with the supplied object as `this`.\n * It is necessary to supply this argument with the self variable when within a Diva instance.\n * The scope argument is matched with the instance ID of subscribers to determine whether they\n * should be executed. (See instanceID argument of subscribe.)\n */\n publish(topic, args, scope)\n {\n if (this._cache[topic])\n {\n const thisTopic = this._cache[topic];\n\n if (typeof thisTopic.global !== 'undefined')\n {\n const thisTopicGlobal = thisTopic.global;\n const globalCount = thisTopicGlobal.length;\n\n for (let i=0; i < globalCount; i++)\n {\n thisTopicGlobal[i].apply(scope || null, args || []);\n }\n }\n\n if (scope && typeof scope.getInstanceId !== 'undefined')\n {\n // get publisher instance ID from scope arg, compare, and execute if match\n const instanceID = scope.getInstanceId();\n\n if (this._cache[topic][instanceID])\n {\n const thisTopicInstance = this._cache[topic][instanceID];\n const scopedCount = thisTopicInstance.length;\n\n for (let j=0; j < scopedCount; j++)\n {\n thisTopicInstance[j].apply(scope, args || []);\n }\n }\n }\n }\n }\n\n /**\n * diva.Events.subscribe\n * e.g.: diva.Events.subscribe(\"PageDidLoad\", highlight, settings.ID)\n *\n * @class Events\n * @method subscribe\n * @param {string} topic\n * @param {function} callback\n * @param {string=} instanceID Optional - String representing the ID of a Diva instance; if provided,\n * callback only fires for events published from that instance.\n * @return Event handler {Array}\n */\n subscribe(topic, callback, instanceID)\n {\n if (!this._cache[topic])\n {\n this._cache[topic] = {};\n }\n\n if (typeof instanceID === 'string')\n {\n if (!this._cache[topic][instanceID])\n {\n this._cache[topic][instanceID] = [];\n }\n\n this._cache[topic][instanceID].push(callback);\n }\n else\n {\n if (!this._cache[topic].global)\n {\n this._cache[topic].global = [];\n }\n\n this._cache[topic].global.push(callback);\n }\n\n return instanceID ? [topic, callback, instanceID] : [topic, callback];\n }\n\n /**\n * diva.Events.unsubscribe\n * e.g.: var handle = Events.subscribe(\"PageDidLoad\", highlight);\n * Events.unsubscribe(handle);\n *\n * @class Events\n * @method unsubscribe\n * @param {array} handle\n * @param {boolean=} completely - Unsubscribe all events for a given topic.\n * @return {boolean} success\n */\n unsubscribe(handle, completely)\n {\n const t = handle[0];\n\n if (this._cache[t])\n {\n let topicArray;\n const instanceID = handle.length === 3 ? handle[2] : 'global';\n\n topicArray = this._cache[t][instanceID];\n\n if (!topicArray)\n {\n return false;\n }\n\n if (completely)\n {\n delete this._cache[t][instanceID];\n return topicArray.length > 0;\n }\n\n let i = topicArray.length;\n\n while (i--)\n {\n if (topicArray[i] === handle[1])\n {\n this._cache[t][instanceID].splice(i, 1);\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * diva.Events.unsubscribeAll\n * e.g.: diva.Events.unsubscribeAll('global');\n *\n * @class Events\n * @param {string=} instanceID Optional - instance ID to remove subscribers from or 'global' (if omitted,\n * subscribers in all scopes removed)\n * @method unsubscribeAll\n */\n unsubscribeAll(instanceID)\n {\n if (instanceID)\n {\n const topics = Object.keys(this._cache);\n let i = topics.length;\n let topic;\n\n while (i--)\n {\n topic = topics[i];\n\n if (typeof this._cache[topic][instanceID] !== 'undefined')\n {\n delete this._cache[topic][instanceID];\n }\n }\n }\n else\n {\n this._cache = {};\n }\n }\n}\n\nexport let Events = new DivaEvents();\n","// From http://www.alexandre-gomes.com/?p=115, modified slightly\nexport default function getScrollbarWidth()\n{\n let inner = document.createElement('p');\n inner.style.width = '100%';\n inner.style.height = '200px';\n\n let outer = document.createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '200px';\n outer.style.height = '150px';\n outer.style.overflow = 'hidden';\n outer.appendChild(inner);\n\n document.body.appendChild(outer);\n\n let w1 = inner.offsetWidth;\n outer.style.overflow = 'scroll';\n let w2 = inner.offsetWidth;\n if (w1 === w2) {\n w2 = outer.clientWidth; // for IE i think\n }\n\n document.body.removeChild(outer);\n return w1 - w2;\n}\n","export default {\n get: getHashParam,\n update: updateHashParam\n};\n\n\n// For getting the #key values from the URL. For specifying a page and zoom level\n// Look into caching, because we only need to get this during the initial load\n// Although for the tests I guess we would need to override caching somehow\nfunction getHashParam (key)\n{\n const hash = window.location.hash;\n\n if (hash !== '')\n {\n // Check if there is something that looks like either &key= or #key=\n let startIndex = (hash.indexOf('&' + key + '=') > 0) ? hash.indexOf('&' + key + '=') : hash.indexOf('#' + key + '=');\n\n // If startIndex is still -1, it means it can't find either\n if (startIndex >= 0)\n {\n // Add the length of the key plus the & and =\n startIndex += key.length + 2;\n\n // Either to the next ampersand or to the end of the string\n const endIndex = hash.indexOf('&', startIndex);\n if (endIndex > startIndex)\n {\n return decodeURIComponent(hash.substring(startIndex, endIndex));\n }\n else if (endIndex < 0)\n {\n // This means this hash param is the last one\n return decodeURIComponent(hash.substring(startIndex));\n }\n // If the key doesn't have a value I think\n return '';\n }\n else\n {\n // If it can't find the key\n return false;\n }\n }\n else\n {\n // If there are no hash params just return false\n return false;\n }\n}\n\nfunction updateHashParam (key, value)\n{\n // First make sure that we have to do any work at all\n const originalValue = getHashParam(key);\n const hash = window.location.hash;\n\n if (originalValue !== value)\n {\n // Is the key already in the URL?\n if (typeof originalValue === 'string')\n {\n // Already in the URL. Just get rid of the original value\n const startIndex = (hash.indexOf('&' + key + '=') > 0) ? hash.indexOf('&' + key + '=') : hash.indexOf('#' + key + '=');\n const endIndex = startIndex + key.length + 2 + originalValue.length;\n // # if it's the first, & otherwise\n const startThing = (startIndex === 0) ? '#' : '&';\n window.location.replace(hash.substring(0, startIndex) + startThing + key + '=' + value + hash.substring(endIndex));\n }\n else\n {\n // It's not present - add it\n if (hash.length === 0)\n {\n window.location.replace('#' + key + '=' + value);\n }\n else\n {\n // Append it\n window.location.replace(hash + '&' + key + '=' + value);\n }\n }\n }\n}\n","/*\n The MIT License (MIT)\n Copyright (c) <2011> \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 deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is furnished\n to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n 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, FITNESS\n FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n Port to vanilla Javascript by Jacek Nowacki http://jacek-nowacki.net/\n**/\n\n(function() {\n var _raf = window.requestAnimationFrame;\n\n var _isTouch = 'ontouchend' in document;\n\n // this is simple, no \"deep\" support\n var _extend = function() {\n for (var i=1; i 0 || Math.abs(self.velocityY) > 0) {\n e.preventDefault();\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n },\n dragStart: function(e) {\n if (self._useTarget(e.target, e) && self.elementFocused) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n },\n selectStart: function(e) {\n if (typeof self.settings.selectStart === 'function') {\n return self.settings.selectStart.apply(self, arguments);\n }\n else if (self._useTarget(e.target, e)) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n }\n };\n\n this._attachListeners();\n };\n\n VanillaKinetic.prototype._inputmove = function(clientX, clientY) {\n if (!this.lastMove || new Date() > new Date(this.lastMove.getTime() + this.throttleTimeout)) {\n this.lastMove = new Date();\n\n if (this.mouseDown && (this.xpos || this.ypos)) {\n var movedX = (clientX - this.xpos);\n var movedY = (clientY - this.ypos);\n if (this.settings.invert) {\n movedX *= -1;\n movedY *= -1;\n }\n if (this.threshold>0) {\n var moved = Math.sqrt(movedX*movedX + movedY*movedY);\n if (this.threshold>moved) {\n return;\n }\n else {\n this.threshold = 0;\n }\n }\n if (this.elementFocused) {\n this.elementFocused.blur();\n this.elementFocused = null;\n this.el.focus();\n }\n\n this.settings.decelerate = false;\n this.velocity = this.velocityY = 0;\n\n var scrollLeft = this.scrollLeft();\n var scrollTop = this.scrollTop();\n\n this.scrollLeft(this.settings.x ? scrollLeft - movedX : scrollLeft);\n this.scrollTop(this.settings.y ? scrollTop - movedY : scrollTop);\n\n this.prevXPos = this.xpos;\n this.prevYPos = this.ypos;\n this.xpos = clientX;\n this.ypos = clientY;\n\n this._calculateVelocities();\n this._setMoveClasses(this.settings.movingClass);\n\n if (typeof this.settings.moved === 'function') {\n this.settings.moved.call(this, this.settings);\n }\n }\n }\n };\n\n VanillaKinetic.prototype._calculateVelocities = function() {\n this.velocity = this._capVelocity(this.prevXPos - this.xpos, this.settings.maxvelocity);\n this.velocityY = this._capVelocity(this.prevYPos - this.ypos, this.settings.maxvelocity);\n if (this.settings.invert) {\n this.velocity *= -1;\n this.velocityY *= -1;\n }\n };\n\n VanillaKinetic.prototype._end = function() {\n if (this.xpos && this.prevXPos && this.settings.decelerate === false) {\n this.settings.decelerate = true;\n this._calculateVelocities();\n this.xpos = this.prevXPos = this.mouseDown = false;\n this._move();\n }\n };\n\n VanillaKinetic.prototype._useTarget = function(target, event) {\n if (typeof this.settings.filterTarget === 'function') {\n return this.settings.filterTarget.call(this, target, event) !== false;\n }\n return true;\n\n };\n\n VanillaKinetic.prototype._threshold = function(target, event) {\n if (typeof this.settings.threshold === 'function') {\n return this.settings.threshold.call(this, target, event);\n }\n return this.settings.threshold;\n };\n\n VanillaKinetic.prototype._start = function(clientX, clientY) {\n this.mouseDown = true;\n this.velocity = this.prevXPos = 0;\n this.velocityY = this.prevYPos = 0;\n this.xpos = clientX;\n this.ypos = clientY;\n };\n\n VanillaKinetic.prototype._resetMouse = function() {\n this.xpos = false;\n this.ypos = false;\n this.mouseDown = false;\n };\n\n VanillaKinetic.prototype._decelerateVelocity = function(velocity, slowdown) {\n return Math.floor(Math.abs(velocity)) === 0 ? 0 // is velocity less than 1?\n : velocity * slowdown; // reduce slowdown\n };\n\n VanillaKinetic.prototype._capVelocity = function(velocity, max) {\n var newVelocity = velocity;\n if (velocity > 0){\n if (velocity > max){\n newVelocity = max;\n }\n } else {\n if (velocity < (0 - max)){\n newVelocity = (0 - max);\n }\n }\n return newVelocity;\n };\n\n VanillaKinetic.prototype._setMoveClasses = function(classes) {\n // The fix-me comment below is from original jQuery.kinetic project\n // FIXME: consider if we want to apply PL #44, this should not remove\n // classes we have not defined on the element!\n var settings = this.settings;\n var el = this.el;\n\n el.classList.remove(settings.movingClass.up);\n el.classList.remove(settings.movingClass.down);\n el.classList.remove(settings.movingClass.left);\n el.classList.remove(settings.movingClass.right);\n el.classList.remove(settings.deceleratingClass.up);\n el.classList.remove(settings.deceleratingClass.down);\n el.classList.remove(settings.deceleratingClass.left);\n el.classList.remove(settings.deceleratingClass.right);\n\n if (this.velocity > 0){\n el.classList.add(classes.right);\n }\n if (this.velocity < 0){\n el.classList.add(classes.left);\n }\n if (this.velocityY > 0){\n el.classList.add(classes.down);\n }\n if (this.velocityY < 0){\n el.classList.add(classes.up);\n }\n };\n\n VanillaKinetic.prototype._move = function() {\n var scroller = this._getScroller();\n var self = this;\n var settings = this.settings;\n\n if (settings.x && scroller.scrollWidth > 0) {\n this.scrollLeft(this.scrollLeft() + this.velocity);\n if (Math.abs(this.velocity) > 0) {\n this.velocity = settings.decelerate ?\n self._decelerateVelocity(this.velocity, settings.slowdown) : this.velocity;\n }\n }\n else {\n this.velocity = 0;\n }\n\n if (settings.y && scroller.scrollHeight > 0){\n this.scrollTop(this.scrollTop() + this.velocityY);\n if (Math.abs(this.velocityY) > 0){\n this.velocityY = settings.decelerate ?\n self._decelerateVelocity(this.velocityY, settings.slowdown) : this.velocityY;\n }\n }\n else {\n this.velocityY = 0;\n }\n\n self._setMoveClasses(settings.deceleratingClass);\n\n if (typeof settings.moved === 'function'){\n settings.moved.call(this, settings);\n }\n\n if (Math.abs(this.velocity) > 0 || Math.abs(this.velocityY) > 0){\n if (!this.moving) {\n this.moving = true;\n // tick for next movement\n _raf(function() {\n self.moving = false;\n self._move();\n });\n }\n }\n else {\n self.stop();\n }\n };\n\n VanillaKinetic.prototype._getScroller = function() {\n // FIXME we may want to normalize behaviour across browsers as in original jQuery.kinetic\n // currently this won't work correctly on all brwosers when attached to html or body element\n return this.el;\n };\n\n VanillaKinetic.prototype.scrollLeft = function(left) {\n var scroller = this._getScroller();\n if (typeof left === 'number') {\n scroller.scrollLeft = left;\n this.settings.scrollLeft = left;\n }\n else {\n return scroller.scrollLeft;\n }\n };\n\n VanillaKinetic.prototype.scrollTop = function(top) {\n var scroller = this._getScroller();\n if (typeof top === 'number') {\n scroller.scrollTop = top;\n this.settings.scrollTop = top;\n }\n else {\n return scroller.scrollTop;\n }\n };\n\n VanillaKinetic.prototype._attachListeners = function() {\n var el = this.el;\n var settings = this.settings;\n\n if (_isTouch) {\n el.addEventListener('touchstart', settings.events.touchStart, false);\n el.addEventListener('touchend', settings.events.inputEnd, false);\n el.addEventListener('touchmove', settings.events.touchMove, false);\n }\n\n el.addEventListener('mousedown', settings.events.inputDown, false);\n el.addEventListener('mouseup', settings.events.inputEnd, false);\n el.addEventListener('mousemove', settings.events.inputMove, false);\n\n el.addEventListener('click', settings.events.inputClick, false);\n el.addEventListener('scroll', settings.events.scroll, false);\n el.addEventListener('selectstart', settings.events.selectStart, false);\n el.addEventListener('dragstart', settings.events.dragStart, false);\n };\n\n VanillaKinetic.prototype._detachListeners = function() {\n var el = this.el;\n var settings = this.settings;\n\n if (_isTouch) {\n el.removeEventListener('touchstart', settings.events.touchStart, false);\n el.removeEventListener('touchend', settings.events.inputEnd, false);\n el.removeEventListener('touchmove', settings.events.touchMove, false);\n }\n\n el.removeEventListener('mousedown', settings.events.inputDown, false);\n el.removeEventListener('mouseup', settings.events.inputEnd, false);\n el.removeEventListener('mousemove', settings.events.inputMove, false);\n\n el.removeEventListener('click', settings.events.inputClick, false);\n el.removeEventListener('scroll', settings.events.scroll, false);\n el.removeEventListener('selectstart', settings.events.selectStart, false);\n el.removeEventListener('dragstart', settings.events.dragStart, false);\n };\n\n\n window.VanillaKinetic = VanillaKinetic;\n})();\n","export default class ValidationRunner\n{\n constructor (options)\n {\n this.whitelistedKeys = options.whitelistedKeys || [];\n this.additionalProperties = options.additionalProperties || [];\n this.validations = options.validations;\n }\n\n isValid (key, value, settings)\n {\n // Get the validation index\n let validationIndex = null;\n\n this.validations.some((validation, index) =>\n {\n if (validation.key !== key)\n {\n return false;\n }\n\n validationIndex = index;\n return true;\n });\n\n if (validationIndex === null)\n {\n return true;\n }\n\n // Run the validation\n const dummyChanges = {};\n dummyChanges[key] = value;\n const proxier = createSettingsProxier(settings, dummyChanges, this);\n\n return !this._runValidation(validationIndex, value, proxier);\n }\n\n validate (settings)\n {\n this._validateOptions({}, settings);\n }\n\n getValidatedOptions (settings, options)\n {\n const cloned = Object.assign({}, options);\n this._validateOptions(settings, cloned);\n return cloned;\n }\n\n _validateOptions (settings, options)\n {\n const settingsProxier = createSettingsProxier(settings, options, this);\n this._applyValidations(options, settingsProxier);\n }\n\n _applyValidations (options, proxier)\n {\n this.validations.forEach((validation, index) =>\n {\n if (!options.hasOwnProperty(validation.key))\n {\n return;\n }\n\n const input = options[validation.key];\n const corrected = this._runValidation(index, input, proxier);\n\n if (corrected)\n {\n if (!corrected.warningSuppressed)\n {\n emitWarning(validation.key, input, corrected.value);\n }\n\n options[validation.key] = corrected.value;\n }\n }, this);\n }\n\n _runValidation (index, input, proxier)\n {\n const validation = this.validations[index];\n\n proxier.index = index;\n\n let warningSuppressed = false;\n const config = {\n suppressWarning: () =>\n {\n warningSuppressed = true;\n }\n };\n\n const outputValue = validation.validate(input, proxier.proxy, config);\n\n if (outputValue === undefined || outputValue === input)\n {\n return null;\n }\n\n return {\n value: outputValue,\n warningSuppressed: warningSuppressed\n };\n }\n}\n\n/**\n * The settings proxy wraps the settings object and ensures that\n * only values which have previously been validated are accessed,\n * throwing a TypeError otherwise.\n *\n * FIXME(wabain): Is it worth keeping this? When I wrote it I had\n * multiple validation stages and it was a lot harder to keep track\n * of everything, so this was more valuable.\n */\nfunction createSettingsProxier (settings, options, runner)\n{\n const proxier = {\n proxy: {},\n index: null\n };\n\n const lookup = lookupValue.bind(null, settings, options);\n\n const properties = {};\n\n runner.whitelistedKeys.forEach((whitelisted) =>\n {\n properties[whitelisted] = {\n get: lookup.bind(null, whitelisted)\n };\n });\n\n runner.additionalProperties.forEach((additional) =>\n {\n properties[additional.key] = {\n get: additional.get\n };\n });\n\n runner.validations.forEach( (validation, validationIndex) =>\n {\n properties[validation.key] = {\n get: () =>\n {\n if (validationIndex < proxier.index)\n {\n return lookup(validation.key);\n }\n\n const currentKey = runner.validations[proxier.index].key;\n throw new TypeError('Cannot access setting ' + validation.key + ' while validating ' + currentKey);\n }\n };\n });\n\n Object.defineProperties(proxier.proxy, properties);\n\n return proxier;\n}\n\nfunction emitWarning (key, original, corrected)\n{\n console.warn('Invalid value for ' + key + ': ' + original + '. Using ' + corrected + ' instead.');\n}\n\nfunction lookupValue (base, extension, key)\n{\n if (key in extension)\n {\n return extension[key];\n }\n\n return base[key];\n}\n","import { elt } from './utils/elt';\nimport getScrollbarWidth from './utils/get-scrollbar-width';\nimport gestureEvents from './gesture-events';\nimport diva from './diva-global';\nimport DocumentHandler from './document-handler';\nimport GridHandler from './grid-handler';\nimport PageOverlayManager from './page-overlay-manager';\nimport Renderer from './renderer';\nimport getPageLayouts from './page-layouts';\nimport createSettingsView from './settings-view';\nimport ValidationRunner from './validation-runner';\nimport Viewport from './viewport';\n\nconst debug = require('debug')('diva:ViewerCore');\n\nfunction generateId() {\n return generateId.counter++;\n}\ngenerateId.counter = 1;\n\n\n// Define validations\nconst optionsValidations = [\n {\n key: 'goDirectlyTo',\n validate: (value, settings) =>\n {\n if (value < 0 || value >= settings.manifest.pages.length)\n return 0;\n }\n },\n {\n key: 'minPagesPerRow',\n validate: (value) =>\n {\n return Math.max(2, value);\n }\n },\n {\n key: 'maxPagesPerRow',\n validate: (value, settings) =>\n {\n return Math.max(value, settings.minPagesPerRow);\n }\n },\n {\n key: 'pagesPerRow',\n validate: (value, settings) =>\n {\n // Default to the maximum\n if (value < settings.minPagesPerRow || value > settings.maxPagesPerRow)\n return settings.maxPagesPerRow;\n }\n },\n {\n key: 'maxZoomLevel',\n validate: (value, settings, config) =>\n {\n // Changing this value isn't really an error, it just depends on the\n // source manifest\n config.suppressWarning();\n\n if (value < 0 || value > settings.manifest.maxZoom)\n return settings.manifest.maxZoom;\n }\n },\n {\n key: 'minZoomLevel',\n validate: (value, settings, config) =>\n {\n // Changes based on the manifest value shouldn't trigger a\n // warning\n if (value > settings.manifest.maxZoom)\n {\n config.suppressWarning();\n return 0;\n }\n\n if (value < 0 || value > settings.maxZoomLevel)\n return 0;\n }\n },\n {\n key: 'zoomLevel',\n validate: (value, settings, config) =>\n {\n if (value > settings.manifest.maxZoom)\n {\n config.suppressWarning();\n return 0;\n }\n\n if (value < settings.minZoomLevel || value > settings.maxZoomLevel)\n return settings.minZoomLevel;\n }\n }\n];\n\nexport default class ViewerCore\n{\n constructor (element, options, publicInstance)\n {\n this.parentObject = element;\n this.publicInstance = publicInstance;\n\n // Things that cannot be changed because of the way they are used by the script\n // Many of these are declared with arbitrary values that are changed later on\n this.viewerState = {\n currentPageIndex: 0, // The current page in the viewport (center-most page)\n horizontalOffset: 0, // Distance from the center of the diva element to the top of the current page\n horizontalPadding: 0, // Either the fixed padding or adaptive padding\n ID: null, // The prefix of the IDs of the elements (usually 1-diva-)\n initialKeyScroll: false, // Holds the initial state of enableKeyScroll\n initialSpaceScroll: false, // Holds the initial state of enableSpaceScroll\n innerElement: null, // The native .diva-outer DOM object\n innerObject: {}, // $(settings.ID + 'inner'), for selecting the .diva-inner element\n isActiveDiva: true, // In the case that multiple diva panes exist on the same page, this should have events funneled to it.\n isScrollable: true, // Used in enable/disableScrollable public methods\n isZooming: false, // Flag to keep track of whether zooming is still in progress, for handleZoom\n loaded: false, // A flag for when everything is loaded and ready to go.\n manifest: null,\n mobileWebkit: false, // Checks if the user is on a touch device (iPad/iPod/iPhone/Android)\n numPages: 0, // Number of pages in the array\n oldZoomLevel: -1, // Holds the previous zoom level after zooming in or out\n options: options,\n outerElement: null, // The native .diva-outer DOM object\n outerObject: {}, // $(settings.ID + 'outer'), for selecting the .diva-outer element\n pageOverlays: new PageOverlayManager(),\n pageTools: [], // The plugins which are enabled as page tools\n parentObject: this.parentObject, // JQuery object referencing the parent element\n pendingManifestRequest: null, // Reference to the xhr request retrieving the manifest. Used to cancel the request on destroy()\n pluginInstances: [], // Filled with the enabled plugins from the registry\n renderer: null,\n resizeTimer: -1, // Holds the ID of the timeout used when resizing the window (for clearing)\n scrollbarWidth: 0, // Set to the actual scrollbar width in init()\n selector: '', // Uses the generated ID prefix to easily select elements\n throbberTimeoutID: -1, // Holds the ID of the throbber loading timeout\n toolbar: null, // Holds an object with some toolbar-related functions\n verticalOffset: 0, // Distance from the center of the diva element to the left side of the current page\n verticalPadding: 0, // Either the fixed padding or adaptive padding\n viewHandler: null,\n viewport: null, // Object caching the viewport dimensions\n viewportElement: null,\n viewportObject: null,\n zoomDuration: 600\n };\n\n this.settings = createSettingsView([options, this.viewerState]);\n\n // Generate an ID that can be used as a prefix for all the other IDs\n const idNumber = generateId();\n this.viewerState.ID = 'diva-' + idNumber + '-';\n this.viewerState.selector = this.settings.ID;\n\n // Aliases for compatibility\n Object.defineProperties(this.settings, {\n // Height of the document viewer pane\n panelHeight: {\n get: () =>\n {\n return this.viewerState.viewport.height;\n }\n },\n // Width of the document viewer pane\n panelWidth: {\n get: () =>\n {\n return this.viewerState.viewport.width;\n }\n }\n });\n\n this.optionsValidator = new ValidationRunner({\n additionalProperties: [\n {\n key: 'manifest',\n get: () =>\n {\n return this.viewerState.manifest;\n }\n }\n ],\n\n validations: optionsValidations\n });\n\n this.viewerState.scrollbarWidth = getScrollbarWidth();\n\n // If window.orientation is defined, then it's probably mobileWebkit\n this.viewerState.mobileWebkit = window.orientation !== undefined;\n\n if (options.hashParamSuffix === null)\n {\n // Omit the suffix from the first instance\n if (idNumber === 1)\n options.hashParamSuffix = '';\n else\n options.hashParamSuffix = idNumber + '';\n }\n\n // Create the inner and outer panels\n const innerElem = elt('div', this.elemAttrs('inner', { class: 'diva-inner' }));\n const viewportElem = elt('div', this.elemAttrs('viewport'), innerElem);\n const outerElem = elt('div', this.elemAttrs('outer'),\n viewportElem,\n elt('div', this.elemAttrs('throbber'),\n [\n elt('div', { class: 'cube cube1' }),\n elt('div', { class: 'cube cube2' }),\n elt('div', { class: 'cube cube3' }),\n elt('div', { class: 'cube cube4' }),\n elt('div', { class: 'cube cube5' }),\n elt('div', { class: 'cube cube6' }),\n elt('div', { class: 'cube cube7' }),\n elt('div', { class: 'cube cube8' }),\n elt('div', { class: 'cube cube9' }),\n ]\n ));\n\n this.viewerState.innerElement = innerElem;\n this.viewerState.viewportElement = viewportElem;\n this.viewerState.outerElement = outerElem;\n\n this.viewerState.innerObject = innerElem;\n this.viewerState.viewportObject = viewportElem;\n this.viewerState.outerObject = outerElem;\n\n this.settings.parentObject.append(outerElem);\n\n this.viewerState.viewport = new Viewport(this.viewerState.viewportElement, {\n intersectionTolerance: this.settings.viewportMargin\n });\n\n this.boundScrollFunction = this.scrollFunction.bind(this);\n this.boundEscapeListener = this.escapeListener.bind(this);\n\n // Do all the plugin initialisation\n this.initPlugins();\n this.handleEvents();\n\n // Show the throbber while waiting for the manifest to load\n this.showThrobber();\n }\n\n isValidOption (key, value)\n {\n return this.optionsValidator.isValid(key, value, this.viewerState.options);\n }\n\n elemAttrs (ident, base)\n {\n const attrs = {\n id: this.settings.ID + ident,\n class: 'diva-' + ident\n };\n\n if (base)\n return Object.assign(attrs, base);\n else\n return attrs;\n }\n\n getPageData (pageIndex, attribute)\n {\n return this.settings.manifest.pages[pageIndex].d[this.settings.zoomLevel][attribute];\n }\n\n // Reset some settings and empty the viewport\n clearViewer ()\n {\n this.viewerState.viewport.top = 0;\n\n // Clear all the timeouts to prevent undesired pages from loading\n clearTimeout(this.viewerState.resizeTimer);\n }\n\n hasChangedOption (options, key)\n {\n return key in options && options[key] !== this.settings[key];\n }\n\n //Shortcut for closing fullscreen with the escape key\n escapeListener (e)\n {\n if (e.keyCode === 27)\n {\n this.reloadViewer({\n inFullscreen: !this.settings.inFullscreen\n });\n }\n }\n\n /**\n * Update settings to match the specified options. Load the viewer,\n * fire appropriate events for changed options.\n */\n reloadViewer (newOptions)\n {\n const queuedEvents = [];\n\n newOptions = this.optionsValidator.getValidatedOptions(this.settings, newOptions);\n\n // Set the zoom level if valid and fire a ZoomLevelDidChange event\n if (this.hasChangedOption(newOptions, 'zoomLevel'))\n {\n this.viewerState.oldZoomLevel = this.settings.zoomLevel;\n this.viewerState.options.zoomLevel = newOptions.zoomLevel;\n queuedEvents.push([\"ZoomLevelDidChange\", newOptions.zoomLevel]);\n }\n\n // Set the pages per row if valid and fire an event\n if (this.hasChangedOption(newOptions, 'pagesPerRow'))\n {\n this.viewerState.options.pagesPerRow = newOptions.pagesPerRow;\n queuedEvents.push([\"GridRowNumberDidChange\", newOptions.pagesPerRow]);\n }\n\n // Update verticallyOriented (no event fired)\n if (this.hasChangedOption(newOptions, 'verticallyOriented'))\n this.viewerState.options.verticallyOriented = newOptions.verticallyOriented;\n\n // Show/Hide non-paged pages\n if (this.hasChangedOption(newOptions, 'showNonPagedPages'))\n {\n this.viewerState.options.showNonPagedPages = newOptions.showNonPagedPages;\n }\n\n // Update page position (no event fired here)\n if ('goDirectlyTo' in newOptions)\n {\n this.viewerState.options.goDirectlyTo = newOptions.goDirectlyTo;\n\n if ('verticalOffset' in newOptions)\n this.viewerState.verticalOffset = newOptions.verticalOffset;\n\n if ('horizontalOffset' in newOptions)\n this.viewerState.horizontalOffset = newOptions.horizontalOffset;\n }\n else\n {\n // Otherwise the default is to remain on the current page\n this.viewerState.options.goDirectlyTo = this.settings.currentPageIndex;\n }\n\n if (this.hasChangedOption(newOptions, 'inGrid') || this.hasChangedOption(newOptions, 'inBookLayout'))\n {\n if ('inGrid' in newOptions)\n this.viewerState.options.inGrid = newOptions.inGrid;\n\n if ('inBookLayout' in newOptions)\n this.viewerState.options.inBookLayout = newOptions.inBookLayout;\n\n queuedEvents.push([\"ViewDidSwitch\", this.settings.inGrid]);\n }\n\n // Note: prepareModeChange() depends on inGrid and the vertical/horizontalOffset (for now)\n if (this.hasChangedOption(newOptions, 'inFullscreen'))\n {\n this.viewerState.options.inFullscreen = newOptions.inFullscreen;\n this.prepareModeChange(newOptions);\n queuedEvents.push([\"ModeDidSwitch\", this.settings.inFullscreen]);\n }\n\n this.clearViewer();\n this.updateViewHandlerAndRendering();\n\n if (this.viewerState.renderer)\n {\n // TODO: The usage of padding variables is still really\n // messy and inconsistent\n const rendererConfig = {\n pageLayouts: getPageLayouts(this.settings),\n padding: this.getPadding(),\n maxZoomLevel: this.settings.inGrid ? null : this.viewerState.manifest.maxZoom,\n verticallyOriented: this.settings.verticallyOriented || this.settings.inGrid,\n };\n\n const viewportPosition = {\n zoomLevel: this.settings.inGrid ? null : this.settings.zoomLevel,\n anchorPage: this.settings.goDirectlyTo,\n verticalOffset: this.viewerState.verticalOffset,\n horizontalOffset: this.viewerState.horizontalOffset\n };\n\n const sourceProvider = this.getCurrentSourceProvider();\n\n if (debug.enabled)\n {\n const serialized = Object.keys(rendererConfig)\n .filter(function (key)\n {\n // Too long\n return key !== 'pageLayouts' && key !== 'padding';\n })\n .map(function (key)\n {\n const value = rendererConfig[key];\n return key + ': ' + JSON.stringify(value);\n })\n .join(', ');\n\n debug('reload with %s', serialized);\n }\n\n this.viewerState.renderer.load(rendererConfig, viewportPosition, sourceProvider);\n }\n\n queuedEvents.forEach( (params) =>\n {\n this.publish.apply(this, params);\n });\n\n return true;\n }\n\n // Handles switching in and out of fullscreen mode\n prepareModeChange (options)\n {\n // Toggle the classes\n const changeClass = options.inFullscreen ? 'add' : 'remove';\n this.viewerState.outerObject.classList[changeClass]('diva-fullscreen');\n document.body.classList[changeClass]('diva-hide-scrollbar');\n this.settings.parentObject.classList[changeClass]('diva-full-width');\n\n // Adjust Diva's internal panel size, keeping the old values\n const storedHeight = this.settings.panelHeight;\n const storedWidth = this.settings.panelWidth;\n this.viewerState.viewport.invalidate();\n\n // If this isn't the original load, the offsets matter, and the position isn't being changed...\n if (!this.viewerState.loaded && !this.settings.inGrid && !('verticalOffset' in options))\n {\n //get the updated panel size\n const newHeight = this.settings.panelHeight;\n const newWidth = this.settings.panelWidth;\n\n //and re-center the new panel on the same point\n this.viewerState.verticalOffset += ((storedHeight - newHeight) / 2);\n this.viewerState.horizontalOffset += ((storedWidth - newWidth) / 2);\n }\n\n //turn on/off escape key listener\n if (options.inFullscreen)\n document.addEventListener('keyup', this.boundEscapeListener);\n else\n document.removeEventListener('keyup', this.boundEscapeListener);\n }\n\n // Update the view handler and the view rendering for the current view\n updateViewHandlerAndRendering ()\n {\n const Handler = this.settings.inGrid ? GridHandler : DocumentHandler;\n\n if (this.viewerState.viewHandler && !(this.viewerState.viewHandler instanceof Handler))\n {\n this.viewerState.viewHandler.destroy();\n this.viewerState.viewHandler = null;\n }\n\n if (!this.viewerState.viewHandler)\n this.viewerState.viewHandler = new Handler(this);\n\n if (!this.viewerState.renderer)\n this.initializeRenderer();\n }\n\n // TODO: This could probably be done upon ViewerCore initialization\n initializeRenderer ()\n {\n const compatErrors = Renderer.getCompatibilityErrors();\n\n if (compatErrors)\n {\n this.showError(compatErrors);\n }\n else\n {\n const options = {\n viewport: this.viewerState.viewport,\n outerElement: this.viewerState.outerElement,\n innerElement: this.viewerState.innerElement\n };\n\n const hooks = {\n onViewWillLoad: () =>\n {\n this.viewerState.viewHandler.onViewWillLoad();\n },\n onViewDidLoad: () =>\n {\n this.updatePageOverlays();\n this.viewerState.viewHandler.onViewDidLoad();\n },\n onViewDidUpdate: (pages, targetPage) =>\n {\n this.updatePageOverlays();\n this.viewerState.viewHandler.onViewDidUpdate(pages, targetPage);\n },\n onViewDidTransition: () =>\n {\n this.updatePageOverlays();\n },\n onPageWillLoad: (pageIndex) =>\n {\n this.publish('PageWillLoad', pageIndex);\n },\n onZoomLevelWillChange: (zoomLevel) =>\n {\n this.publish('ZoomLevelWillChange', zoomLevel);\n }\n };\n\n this.viewerState.renderer = new Renderer(options, hooks);\n }\n }\n\n getCurrentSourceProvider ()\n {\n if (this.settings.inGrid)\n {\n const gridSourceProvider = {\n getAllZoomLevelsForPage: (page) =>\n {\n return [gridSourceProvider.getBestZoomLevelForPage(page)];\n },\n getBestZoomLevelForPage: (page) =>\n {\n const url = this.settings.manifest.getPageImageURL(page.index, {\n width: page.dimensions.width\n });\n\n return {\n zoomLevel: 1, // FIXME\n rows: 1,\n cols: 1,\n tiles: [{\n url: url,\n zoomLevel: 1, // FIXME\n row: 0,\n col: 0,\n dimensions: page.dimensions,\n offset: {\n top: 0,\n left: 0\n }\n }]\n };\n }\n };\n\n return gridSourceProvider;\n }\n\n const tileDimensions = {\n width: this.settings.tileWidth,\n height: this.settings.tileHeight\n };\n\n return {\n getBestZoomLevelForPage: (page) =>\n {\n return this.settings.manifest.getPageImageTiles(page.index, Math.ceil(this.settings.zoomLevel), tileDimensions);\n },\n getAllZoomLevelsForPage: (page) =>\n {\n const levels = [];\n const levelCount = this.viewerState.manifest.maxZoom;\n\n for (let level=0; level <= levelCount; level++)\n {\n levels.push(this.settings.manifest.getPageImageTiles(page.index, level, tileDimensions));\n }\n\n levels.reverse();\n\n return levels;\n }\n };\n }\n\n getPadding ()\n {\n let topPadding, leftPadding;\n let docVPadding, docHPadding;\n\n if (this.settings.inGrid)\n {\n docVPadding = this.settings.fixedPadding;\n topPadding = leftPadding = docHPadding = 0;\n }\n else\n {\n topPadding = this.settings.verticallyOriented ? this.viewerState.verticalPadding : 0;\n leftPadding = this.settings.verticallyOriented ? 0 : this.viewerState.horizontalPadding;\n\n docVPadding = this.settings.verticallyOriented ? 0 : this.viewerState.verticalPadding;\n docHPadding = this.settings.verticallyOriented ? this.viewerState.horizontalPadding : 0;\n }\n\n return {\n document: {\n top: docVPadding,\n bottom: docVPadding,\n left: docHPadding,\n right: docHPadding\n },\n page: {\n top: topPadding,\n bottom: 0,\n left: leftPadding,\n right: 0\n }\n };\n }\n\n updatePageOverlays ()\n {\n this.viewerState.pageOverlays.updateOverlays(\n this.viewerState.renderer.getRenderedPages()\n );\n }\n\n // Called to handle any zoom level\n handleZoom (newZoomLevel, focalPoint)\n {\n // If the zoom level provided is invalid, return false\n if (!this.isValidOption('zoomLevel', newZoomLevel))\n return false;\n\n // While zooming, don't update scroll offsets based on the scaled version of diva-inner\n this.viewerState.viewportObject.removeEventListener('scroll', this.boundScrollFunction);\n\n // If no focal point was given, zoom on the center of the viewport\n if (!focalPoint)\n {\n const viewport = this.viewerState.viewport;\n const currentRegion = this.viewerState.renderer.layout.getPageRegion(this.settings.currentPageIndex);\n\n focalPoint = {\n anchorPage: this.settings.currentPageIndex,\n offset: {\n left: (viewport.width / 2) - (currentRegion.left - viewport.left),\n top: (viewport.height / 2) - (currentRegion.top - viewport.top)\n }\n };\n }\n\n const pageRegion = this.viewerState.renderer.layout.getPageRegion(focalPoint.anchorPage);\n\n // calculate distance from cursor coordinates to center of viewport\n const focalXToCenter = (pageRegion.left + focalPoint.offset.left) -\n (this.settings.viewport.left + (this.settings.viewport.width / 2));\n const focalYToCenter = (pageRegion.top + focalPoint.offset.top) -\n (this.settings.viewport.top + (this.settings.viewport.height / 2));\n\n const getPositionForZoomLevel = function (zoomLevel, initZoom)\n {\n const zoomRatio = Math.pow(2, zoomLevel - initZoom);\n\n //TODO(jeromepl): Calculate position from page top left to viewport top left\n // calculate horizontal/verticalOffset: distance from viewport center to page upper left corner\n const horizontalOffset = (focalPoint.offset.left * zoomRatio) - focalXToCenter;\n const verticalOffset = (focalPoint.offset.top * zoomRatio) - focalYToCenter;\n\n return {\n zoomLevel: zoomLevel,\n anchorPage: focalPoint.anchorPage,\n verticalOffset: verticalOffset,\n horizontalOffset: horizontalOffset\n };\n };\n\n this.viewerState.options.zoomLevel = newZoomLevel;\n let initialZoomLevel = this.viewerState.oldZoomLevel;\n this.viewerState.oldZoomLevel = this.settings.zoomLevel;\n const endPosition = getPositionForZoomLevel(newZoomLevel, initialZoomLevel);\n this.viewerState.options.goDirectlyTo = endPosition.anchorPage;\n this.viewerState.verticalOffset = endPosition.verticalOffset;\n this.viewerState.horizontalOffset = endPosition.horizontalOffset;\n\n this.viewerState.renderer.transitionViewportPosition({\n duration: this.settings.zoomDuration,\n parameters: {\n zoomLevel: {\n from: initialZoomLevel,\n to: newZoomLevel\n }\n },\n getPosition: (parameters) =>\n {\n return getPositionForZoomLevel(parameters.zoomLevel, initialZoomLevel);\n },\n onEnd: (info) =>\n {\n this.viewerState.viewportObject.addEventListener('scroll', this.boundScrollFunction);\n\n if (info.interrupted)\n this.viewerState.oldZoomLevel = newZoomLevel;\n }\n });\n\n // Send off the zoom level did change event.\n this.publish(\"ZoomLevelDidChange\", newZoomLevel);\n\n return true;\n }\n\n /*\n Gets the Y-offset for a specific point on a specific page\n Acceptable values for \"anchor\":\n \"top\" (default) - will anchor top of the page to the top of the diva-outer element\n \"bottom\" - top, s/top/bottom\n \"center\" - will center the page on the diva element\n Returned value will be the distance from the center of the diva-outer element to the top of the current page for the specified anchor\n */\n getYOffset (pageIndex, anchor)\n {\n let pidx = (typeof(pageIndex) === \"undefined\" ? this.settings.currentPageIndex : pageIndex);\n\n if (anchor === \"center\" || anchor === \"centre\") //how you can tell an American coded this\n {\n return parseInt(this.getPageData(pidx, \"h\") / 2, 10);\n }\n else if (anchor === \"bottom\")\n {\n return parseInt(this.getPageData(pidx, \"h\") - this.settings.panelHeight / 2, 10);\n }\n else\n {\n return parseInt(this.settings.panelHeight / 2, 10);\n }\n }\n\n //Same as getYOffset with \"left\" and \"right\" as acceptable values instead of \"top\" and \"bottom\"\n getXOffset (pageIndex, anchor)\n {\n let pidx = (typeof(pageIndex) === \"undefined\" ? this.settings.currentPageIndex : pageIndex);\n\n if (anchor === \"left\")\n {\n return parseInt(this.settings.panelWidth / 2, 10);\n }\n else if (anchor === \"right\")\n {\n return parseInt(this.getPageData(pidx, \"w\") - this.settings.panelWidth / 2, 10);\n }\n else\n {\n return parseInt(this.getPageData(pidx, \"w\") / 2, 10);\n }\n }\n\n // updates panelHeight/panelWidth on resize\n updatePanelSize ()\n {\n this.viewerState.viewport.invalidate();\n\n // FIXME(wabain): This should really only be called after initial load\n if (this.viewerState.renderer)\n {\n this.updateOffsets();\n this.viewerState.renderer.goto(this.settings.currentPageIndex, this.viewerState.verticalOffset, this.viewerState.horizontalOffset);\n }\n\n return true;\n }\n\n updateOffsets ()\n {\n const pageOffset = this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n if (pageOffset)\n {\n this.viewerState.horizontalOffset = pageOffset.x;\n this.viewerState.verticalOffset = pageOffset.y;\n }\n }\n\n // Bind mouse events (drag to scroll, double-click)\n bindMouseEvents ()\n {\n // Set drag scroll on the viewport object\n this.viewerState.viewportObject.classList.add('dragscroll');\n\n gestureEvents.onDoubleClick(this.viewerState.viewportObject, (event, coords) =>\n {\n debug('Double click at %s, %s', coords.left, coords.top);\n this.viewerState.viewHandler.onDoubleClick(event, coords);\n });\n }\n\n onResize ()\n {\n this.updatePanelSize();\n // Cancel any previously-set resize timeouts\n clearTimeout(this.viewerState.resizeTimer);\n\n this.viewerState.resizeTimer = setTimeout( () =>\n {\n const pageOffset = this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n if (pageOffset)\n {\n this.reloadViewer({\n goDirectlyTo: this.settings.currentPageIndex,\n verticalOffset: pageOffset.y,\n horizontalOffset: pageOffset.x\n });\n }\n else\n {\n this.reloadViewer({\n goDirectlyTo: this.settings.currentPageIndex\n });\n }\n }, 200);\n }\n\n // Bind touch and orientation change events\n bindTouchEvents ()\n {\n // Block the user from moving the window only if it's not integrated\n if (this.settings.blockMobileMove)\n {\n document.body.addEventListener('touchmove', (event) =>\n {\n const e = event.originalEvent;\n e.preventDefault();\n\n return false;\n });\n }\n\n // Touch events for swiping in the viewport to scroll pages\n // this.viewerState.viewportObject.addEventListener('scroll', this.scrollFunction.bind(this));\n\n gestureEvents.onPinch(this.viewerState.viewportObject, function (event, coords, start, end)\n {\n debug('Pinch %s at %s, %s', end - start, coords.left, coords.top);\n this.viewerState.viewHandler.onPinch(event, coords, start, end);\n });\n\n gestureEvents.onDoubleTap(this.viewerState.viewportObject, function (event, coords)\n {\n debug('Double tap at %s, %s', coords.left, coords.top);\n this.viewerState.viewHandler.onDoubleClick(event, coords);\n });\n }\n\n // Handle the scroll\n scrollFunction ()\n {\n const previousTopScroll = this.viewerState.viewport.top;\n const previousLeftScroll = this.viewerState.viewport.left;\n\n let direction;\n\n this.viewerState.viewport.invalidate();\n\n const newScrollTop = this.viewerState.viewport.top;\n const newScrollLeft = this.viewerState.viewport.left;\n\n if (this.settings.verticallyOriented || this.settings.inGrid)\n direction = newScrollTop - previousTopScroll;\n else\n direction = newScrollLeft - previousLeftScroll;\n\n //give adjust the direction we care about\n this.viewerState.renderer.adjust();\n\n const primaryScroll = (this.settings.verticallyOriented || this.settings.inGrid) ? newScrollTop : newScrollLeft;\n\n this.publish(\"ViewerDidScroll\", primaryScroll);\n\n if (direction > 0)\n {\n this.publish(\"ViewerDidScrollDown\", primaryScroll);\n }\n else if (direction < 0)\n {\n this.publish(\"ViewerDidScrollUp\", primaryScroll);\n }\n\n this.updateOffsets();\n }\n\n // Binds most of the event handlers (some more in createToolbar)\n handleEvents ()\n {\n // Change the cursor for dragging\n this.viewerState.innerObject.addEventListener('mousedown', () =>\n {\n this.viewerState.innerObject.classList.add('diva-grabbing');\n });\n\n this.viewerState.innerObject.addEventListener('mouseup', () =>\n {\n this.viewerState.innerObject.classList.remove('diva-grabbing');\n });\n\n this.bindMouseEvents();\n this.viewerState.viewportObject.addEventListener('scroll', this.boundScrollFunction);\n\n const upArrowKey = 38, downArrowKey = 40, leftArrowKey = 37, rightArrowKey = 39, spaceKey = 32, pageUpKey = 33, pageDownKey = 34, homeKey = 36, endKey = 35;\n\n // Catch the key presses in document\n document.addEventListener('keydown.diva', (event) =>\n {\n if (!this.viewerState.isActiveDiva)\n return true;\n\n // Space or page down - go to the next page\n if ((this.settings.enableSpaceScroll && !event.shiftKey && event.keyCode === spaceKey) || (this.settings.enableKeyScroll && event.keyCode === pageDownKey))\n {\n this.viewerState.viewport.top += this.settings.panelHeight;\n return false;\n }\n else if (!this.settings.enableSpaceScroll && event.keyCode === spaceKey)\n {\n event.preventDefault();\n }\n\n if (this.settings.enableKeyScroll)\n {\n // Don't steal keyboard shortcuts (metaKey = command [OS X], super [Win/Linux])\n if (event.shiftKey || event.ctrlKey || event.metaKey)\n return true;\n\n switch (event.keyCode)\n {\n case pageUpKey:\n // Page up - go to the previous page\n this.viewerState.viewport.top -= this.settings.panelHeight;\n return false;\n\n case upArrowKey:\n // Up arrow - scroll up\n this.viewerState.viewport.top -= this.settings.arrowScrollAmount;\n return false;\n\n case downArrowKey:\n // Down arrow - scroll down\n this.viewerState.viewport.top += this.settings.arrowScrollAmount;\n return false;\n\n case leftArrowKey:\n // Left arrow - scroll left\n this.viewerState.viewport.left -= this.settings.arrowScrollAmount;\n return false;\n\n case rightArrowKey:\n // Right arrow - scroll right\n this.viewerState.viewport.left += this.settings.arrowScrollAmount;\n return false;\n\n case homeKey:\n // Home key - go to the beginning of the document\n this.viewerState.viewport.top = 0;\n return false;\n\n case endKey:\n // End key - go to the end of the document\n // Count on the viewport coordinate value being normalized\n if (this.settings.verticallyOriented)\n this.viewerState.viewport.top = Infinity;\n else\n this.viewerState.viewport.left = Infinity;\n\n return false;\n\n default:\n return true;\n }\n }\n return true;\n });\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n document.removeEventListener('keydown.diva');\n }, this.settings.ID);\n\n // this.bindTouchEvents();\n\n // Handle window resizing events\n window.addEventListener('resize', this.onResize.bind(this), false);\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n window.removeEventListener('resize', this.onResize, false);\n }, this.settings.ID);\n\n // Handle orientation change separately\n if ('onorientationchange' in window)\n {\n window.addEventListener('orientationchange', this.onResize, false);\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n window.removeEventListener('orientationchange', this.onResize, false);\n }, this.settings.ID);\n }\n\n diva.Events.subscribe('PanelSizeDidChange', this.updatePanelSize, this.settings.ID);\n\n // Clear page and resize timeouts when the viewer is destroyed\n diva.Events.subscribe('ViewerDidTerminate', () =>\n {\n if (this.viewerState.renderer)\n this.viewerState.renderer.destroy();\n\n clearTimeout(this.viewerState.resizeTimer);\n }, this.settings.ID);\n }\n\n initPlugins ()\n {\n if (!this.settings.hasOwnProperty('plugins'))\n return null;\n\n this.viewerState.pluginInstances = this.settings.plugins.map( (plugin) =>\n {\n const p = new plugin(this);\n\n if (p.isPageTool)\n this.viewerState.pageTools.push(p);\n\n return p;\n });\n }\n\n showThrobber ()\n {\n this.hideThrobber();\n\n this.viewerState.throbberTimeoutID = setTimeout( () =>\n {\n let thb = document.getElementById(this.settings.selector + 'throbber');\n if (thb) thb.style.display = 'block';\n }, this.settings.throbberTimeout);\n }\n\n hideThrobber ()\n {\n // Clear the timeout, if it hasn't executed yet\n clearTimeout(this.viewerState.throbberTimeoutID);\n\n let thb = document.getElementById(this.settings.selector + 'throbber');\n // Hide the throbber if it has already executed\n if (thb) thb.style.display = 'none';\n }\n\n showError (message)\n {\n const errorElement = elt('div', this.elemAttrs('error'), [\n elt('button', this.elemAttrs('error-close', {'aria-label': 'Close dialog'})),\n elt('p',\n elt('strong', 'Error')\n ),\n elt('div', message)\n ]);\n\n this.viewerState.outerObject.appendChild(errorElement);\n\n //bind dialog close button\n document.querySelector(this.settings.selector + 'error-close').addEventListener('click', () =>\n {\n errorElement.parentNode.removeChild(errorElement);\n });\n }\n\n setManifest (manifest, loadOptions)\n {\n this.viewerState.manifest = manifest;\n\n this.hideThrobber();\n\n // Convenience value\n this.viewerState.numPages = this.settings.manifest.pages.length;\n\n this.optionsValidator.validate(this.viewerState.options);\n\n this.publish('NumberOfPagesDidChange', this.settings.numPages);\n\n if (this.settings.enableAutoTitle)\n {\n let title = document.getElementById(this.settings.selector + 'title');\n\n if (title)\n {\n title.innerHTML(this.settings.manifest.itemTitle);\n }\n else\n {\n this.settings.parentObject.insertBefore(\n elt('div', this.elemAttrs('title'), [this.settings.manifest.itemTitle]),\n this.settings.parentObject.firstChild\n );\n }\n }\n\n // Calculate the horizontal and vertical inter-page padding based on the dimensions of the average zoom level\n if (this.settings.adaptivePadding > 0)\n {\n const z = Math.floor((this.settings.minZoomLevel + this.settings.maxZoomLevel) / 2);\n this.viewerState.horizontalPadding = parseInt(this.settings.manifest.getAverageWidth(z) * this.settings.adaptivePadding, 10);\n this.viewerState.verticalPadding = parseInt(this.settings.manifest.getAverageHeight(z) * this.settings.adaptivePadding, 10);\n }\n else\n {\n // It's less than or equal to 0; use fixedPadding instead\n this.viewerState.horizontalPadding = this.settings.fixedPadding;\n this.viewerState.verticalPadding = this.settings.fixedPadding;\n }\n\n // Make sure the vertical padding is at least 40, if plugin icons are enabled\n if (this.viewerState.pageTools.length)\n {\n this.viewerState.verticalPadding = Math.max(40, this.viewerState.verticalPadding);\n }\n\n // If we detect a viewingHint of 'paged' in the manifest or sequence, enable book view by default\n if (this.settings.manifest.paged)\n {\n this.viewerState.options.inBookLayout = true;\n }\n\n // Plugin setup hooks should be bound to the ObjectDidLoad event\n this.publish('ObjectDidLoad', this.settings);\n\n // Adjust the document panel dimensions\n this.updatePanelSize();\n\n let needsXCoord, needsYCoord;\n\n let anchoredVertically = false;\n let anchoredHorizontally = false;\n\n // NB: `==` here will check both null and undefined\n if (loadOptions.goDirectlyTo == null)\n {\n loadOptions.goDirectlyTo = this.settings.goDirectlyTo;\n needsXCoord = needsYCoord = true;\n }\n else\n {\n needsXCoord = loadOptions.horizontalOffset == null || isNaN(loadOptions.horizontalOffset);\n needsYCoord = loadOptions.verticalOffset == null || isNaN(loadOptions.verticalOffset);\n }\n\n // Set default values for the horizontal and vertical offsets\n if (needsXCoord)\n {\n // FIXME: What if inBookLayout/verticallyOriented is changed by loadOptions?\n if (loadOptions.goDirectlyTo === 0 && this.settings.inBookLayout && this.settings.verticallyOriented)\n {\n // if in book layout, center the first opening by default\n loadOptions.horizontalOffset = this.viewerState.horizontalPadding;\n }\n else\n {\n anchoredHorizontally = true;\n loadOptions.horizontalOffset = this.getXOffset(loadOptions.goDirectlyTo, \"center\");\n }\n }\n\n if (needsYCoord)\n {\n anchoredVertically = true;\n loadOptions.verticalOffset = this.getYOffset(loadOptions.goDirectlyTo, \"top\");\n }\n\n this.reloadViewer(loadOptions);\n\n //prep dimensions one last time now that pages have loaded\n this.updatePanelSize();\n\n // FIXME: This is a hack to ensure that the outerElement scrollbars are taken into account\n if (this.settings.verticallyOriented)\n this.viewerState.innerElement.style.minWidth = this.settings.panelWidth + 'px';\n else\n this.viewerState.innerElement.style.minHeight = this.settings.panelHeight + 'px';\n\n // FIXME: If the page was supposed to be positioned relative to the viewport we need to\n // recalculate it to take into account the scrollbars\n if (anchoredVertically || anchoredHorizontally)\n {\n if (anchoredVertically)\n this.viewerState.verticalOffset = this.getYOffset(this.settings.currentPageIndex, \"top\");\n\n if (anchoredHorizontally)\n this.viewerState.horizontalOffset = this.getXOffset(this.settings.currentPageIndex, \"center\");\n\n this.viewerState.renderer.goto(this.settings.currentPageIndex, this.viewerState.verticalOffset, this.viewerState.horizontalOffset);\n }\n\n // signal that everything should be set up and ready to go.\n this.viewerState.loaded = true;\n\n this.publish(\"ViewerDidLoad\", this.settings);\n }\n\n publish (event)\n {\n const args = Array.prototype.slice.call(arguments, 1);\n diva.Events.publish(event, args, this.publicInstance);\n }\n\n getSettings ()\n {\n return this.settings;\n }\n\n // Temporary accessor for the state of the viewer core\n // TODO: Replace this with a more restricted view of whatever needs\n // be exposed through settings for backwards compat\n getInternalState ()\n {\n return this.viewerState;\n }\n\n getPublicInstance ()\n {\n return this.publicInstance;\n }\n\n getPageTools ()\n {\n return this.viewerState.pageTools;\n }\n\n getCurrentLayout ()\n {\n return this.viewerState.renderer ? this.viewerState.renderer.layout : null;\n }\n\n /** Get a copy of the current viewport dimensions */\n getViewport ()\n {\n const viewport = this.viewerState.viewport;\n\n return {\n top: viewport.top,\n left: viewport.left,\n bottom: viewport.bottom,\n right: viewport.right,\n\n width: viewport.width,\n height: viewport.height\n };\n }\n\n addPageOverlay (overlay)\n {\n this.viewerState.pageOverlays.addOverlay(overlay);\n }\n\n removePageOverlay (overlay)\n {\n this.viewerState.pageOverlays.removeOverlay(overlay);\n }\n\n getPageRegion (pageIndex, options)\n {\n const layout = this.viewerState.renderer.layout;\n const region = layout.getPageRegion(pageIndex, options);\n\n if (options && options.incorporateViewport)\n {\n const secondaryDim = this.settings.verticallyOriented ? 'width' : 'height';\n\n if (this.viewerState.viewport[secondaryDim] > layout.dimensions[secondaryDim])\n {\n const docOffset = (this.viewerState.viewport[secondaryDim] - layout.dimensions[secondaryDim]) / 2;\n\n if (this.settings.verticallyOriented)\n {\n return {\n top: region.top,\n bottom: region.bottom,\n\n left: region.left + docOffset,\n right: region.right + docOffset\n };\n }\n else\n {\n return {\n top: region.top + docOffset,\n bottom: region.bottom + docOffset,\n\n left: region.left,\n right: region.right\n };\n }\n }\n }\n\n return region;\n }\n\n getPagePositionAtViewportOffset (coords)\n {\n const docCoords = {\n left: coords.left + this.viewerState.viewport.left,\n top: coords.top + this.viewerState.viewport.top\n };\n\n const renderedPages = this.viewerState.renderer.getRenderedPages();\n const pageCount = renderedPages.length;\n\n // Find the page on which the coords occur\n for (let i=0; i < pageCount; i++)\n {\n const pageIndex = renderedPages[i];\n const region = this.viewerState.renderer.layout.getPageRegion(pageIndex);\n\n if (region.left <= docCoords.left && region.right >= docCoords.left &&\n region.top <= docCoords.top && region.bottom >= docCoords.top)\n {\n return {\n anchorPage: pageIndex,\n offset: {\n left: docCoords.left - region.left,\n top: docCoords.top - region.top\n }\n };\n }\n }\n\n // Fall back to current page\n // FIXME: Would be better to use the closest page or something\n const currentRegion = this.viewerState.renderer.layout.getPageRegion(this.settings.currentPageIndex);\n\n return {\n anchorPage: this.settings.currentPageIndex,\n offset: {\n left: docCoords.left - currentRegion.left,\n top: docCoords.top - currentRegion.top\n }\n };\n }\n\n // setManifest (manifest, loadOptions)\n // {\n // setManifest(manifest, loadOptions || {});\n // }\n\n /**\n * Set the current page to the given index, firing VisiblePageDidChange\n *\n * @param pageIndex\n */\n setCurrentPage (pageIndex)\n {\n if (this.viewerState.currentPageIndex !== pageIndex)\n {\n this.viewerState.currentPageIndex = pageIndex;\n this.publish(\"VisiblePageDidChange\", pageIndex, this.getPageName(pageIndex));\n\n // Publish an event if the page we're switching to has other images.\n if (this.viewerState.manifest.pages[pageIndex].otherImages.length > 0)\n this.publish('VisiblePageHasAlternateViews', pageIndex);\n }\n }\n\n getPageName (pageIndex)\n {\n return this.viewerState.manifest.pages[pageIndex].f;\n }\n\n reload (newOptions)\n {\n this.reloadViewer(newOptions);\n }\n\n zoom (zoomLevel, focalPoint)\n {\n return this.handleZoom(zoomLevel, focalPoint);\n }\n\n enableScrollable ()\n {\n if (!this.viewerState.isScrollable)\n {\n this.bindMouseEvents();\n this.viewerState.options.enableKeyScroll = this.viewerState.initialKeyScroll;\n this.viewerState.options.enableSpaceScroll = this.viewerState.initialSpaceScroll;\n this.viewerState.viewportElement.style.overflow = 'auto';\n this.viewerState.isScrollable = true;\n }\n }\n\n disableScrollable ()\n {\n if (this.viewerState.isScrollable)\n {\n // block dragging/double-click zooming\n if (this.viewerState.innerObject.hasClass('diva-dragger'))\n this.viewerState.innerObject.mousedown = null;\n\n this.viewerState.outerObject.dblclick = null;\n this.viewerState.outerObject.contextmenu = null;\n\n // disable all other scrolling actions\n this.viewerState.viewportElement.style.overflow = 'hidden';\n\n // block scrolling keys behavior, respecting initial scroll settings\n this.viewerState.initialKeyScroll = this.settings.enableKeyScroll;\n this.viewerState.initialSpaceScroll = this.settings.enableSpaceScroll;\n this.viewerState.options.enableKeyScroll = false;\n this.viewerState.options.enableSpaceScroll = false;\n\n this.viewerState.isScrollable = false;\n }\n }\n\n // isValidOption (key, value)\n // {\n // return isValidOption(key, value);\n // }\n\n // getXOffset (pageIndex, xAnchor)\n // {\n // return getXOffset(pageIndex, xAnchor);\n // }\n\n // getYOffset (pageIndex, yAnchor)\n // {\n // return getYOffset(pageIndex, yAnchor);\n // }\n\n // this.publish = publish;\n\n clear ()\n {\n this.clearViewer();\n }\n\n setPendingManifestRequest (pendingManifestRequest)\n {\n this.viewerState.pendingManifestRequest = pendingManifestRequest;\n }\n\n destroy ()\n {\n // Useful event to access elements in diva before they get destroyed. Used by the highlight plugin.\n this.publish('ViewerWillTerminate', this.settings);\n\n // Cancel any pending request retrieving a manifest\n if (this.settings.pendingManifestRequest)\n this.settings.pendingManifestRequest.abort();\n\n // Removes the hide-scrollbar class from the body\n document.body.removeClass('diva-hide-scrollbar');\n\n // Empty the parent container and remove any diva-related data\n this.settings.parentObject.parent().empty().removeData('diva');\n\n // Remove any additional styling on the parent element\n this.settings.parentObject.parent().removeAttr('style').removeAttr('class');\n\n this.publish('ViewerDidTerminate', this.settings);\n\n // Clear the Events cache\n diva.Events.unsubscribeAll(this.settings.ID);\n }\n}\n","export default class Viewport\n{\n constructor (outer, options)\n {\n options = options || {};\n\n this.intersectionTolerance = options.intersectionTolerance || 0;\n this.maxExtent = options.maxExtent || 2000;\n\n this.outer = outer;\n\n this._top = this._left = this._width = this._height = this._innerDimensions = null;\n\n this.invalidate();\n }\n\n intersectsRegion (region)\n {\n return this.hasHorizontalOverlap(region) && this.hasVerticalOverlap(region);\n }\n\n hasVerticalOverlap (region)\n {\n const top = this.top - this.intersectionTolerance;\n const bottom = this.bottom + this.intersectionTolerance;\n\n return (\n fallsBetween(region.top, top, bottom) ||\n fallsBetween(region.bottom, top, bottom) ||\n (region.top <= top && region.bottom >= bottom)\n );\n }\n\n hasHorizontalOverlap (region)\n {\n const left = this.left - this.intersectionTolerance;\n const right = this.right + this.intersectionTolerance;\n\n return (\n fallsBetween(region.left, left, right) ||\n fallsBetween(region.right, left, right) ||\n (region.left <= left && region.right >= right)\n );\n }\n\n invalidate ()\n {\n // FIXME: Should this check the inner dimensions as well?\n this._width = clampMax(this.outer.clientWidth, this.maxExtent);\n this._height = clampMax(this.outer.clientHeight, this.maxExtent);\n\n this._top = this.outer.scrollTop;\n this._left = this.outer.scrollLeft;\n }\n\n setInnerDimensions (dimensions)\n {\n this._innerDimensions = dimensions;\n\n if (dimensions)\n {\n this._top = clamp(this._top, 0, dimensions.height - this._height);\n this._left = clamp(this._left, 0, dimensions.width - this._width);\n }\n }\n}\n\nObject.defineProperties(Viewport.prototype, {\n top: getCoordinateDescriptor('top', 'height'),\n left: getCoordinateDescriptor('left', 'width'),\n\n width: getDimensionDescriptor('width'),\n height: getDimensionDescriptor('height'),\n\n bottom: {\n get: function ()\n {\n return this._top + this._height;\n }\n },\n right: {\n get: function ()\n {\n return this._left + this._width;\n }\n }\n});\n\nfunction getCoordinateDescriptor (coord, associatedDimension)\n{\n const privateProp = '_' + coord;\n const source = 'scroll' + coord.charAt(0).toUpperCase() + coord.slice(1);\n\n return {\n get: function ()\n {\n return this[privateProp];\n },\n set: function (newValue)\n {\n let normalized;\n\n if (this._innerDimensions)\n {\n const maxAllowed = this._innerDimensions[associatedDimension] - this[associatedDimension];\n normalized = clamp(newValue, 0, maxAllowed);\n }\n else\n {\n normalized = clampMin(newValue, 0);\n }\n\n this[privateProp] = this.outer[source] = normalized;\n }\n };\n}\n\nfunction getDimensionDescriptor (dimen)\n{\n return {\n get: function ()\n {\n return this['_' + dimen];\n }\n };\n}\n\nfunction fallsBetween (point, start, end)\n{\n return point >= start && point <= end;\n}\n\nfunction clamp (value, min, max)\n{\n return clampMin(clampMax(value, max), min);\n}\n\nfunction clampMin (value, min)\n{\n return Math.max(value, min);\n}\n\nfunction clampMax (value, max)\n{\n return Math.min(value, max);\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/array.prototype.fill/index.js","webpack:///./node_modules/debug/src/browser.js","webpack:///./node_modules/debug/src/debug.js","webpack:///./node_modules/lodash.maxby/index.js","webpack:///./node_modules/ms/index.js","webpack:///./node_modules/process/browser.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/module.js","webpack:///./node_modules/whatwg-fetch/fetch.js","webpack:///./source/js/composite-image.js","webpack:///./source/js/diva-global.js","webpack:///./source/js/diva.js","webpack:///./source/js/document-handler.js","webpack:///./source/js/document-layout.js","webpack:///./source/js/exceptions.js","webpack:///./source/js/gesture-events.js","webpack:///./source/js/grid-handler.js","webpack:///./source/js/iiif-source-adapter.js","webpack:///./source/js/image-cache.js","webpack:///./source/js/image-manifest.js","webpack:///./source/js/image-request-handler.js","webpack:///./source/js/interpolate-animation.js","webpack:///./source/js/page-layouts/book-layout.js","webpack:///./source/js/page-layouts/grid-layout.js","webpack:///./source/js/page-layouts/index.js","webpack:///./source/js/page-layouts/page-dimensions.js","webpack:///./source/js/page-layouts/singles-layout.js","webpack:///./source/js/page-overlay-manager.js","webpack:///./source/js/page-tools-overlay.js","webpack:///./source/js/parse-iiif-manifest.js","webpack:///./source/js/renderer.js","webpack:///./source/js/settings-view.js","webpack:///./source/js/tile-coverage-map.js","webpack:///./source/js/toolbar.js","webpack:///./source/js/utils/dragscroll.js","webpack:///./source/js/utils/elt.js","webpack:///./source/js/utils/events.js","webpack:///./source/js/utils/get-scrollbar-width.js","webpack:///./source/js/utils/hash-params.js","webpack:///./source/js/utils/vanilla.kinetic.js","webpack:///./source/js/validation-runner.js","webpack:///./source/js/viewer-core.js","webpack:///./source/js/viewport.js"],"names":["Array","prototype","fill","value","TypeError","O","Object","len","length","start","arguments","relativeStart","k","Math","max","min","end","relativeEnd","undefined","last","defineProperty","configurable","enumerable","writable","e","exports","module","require","log","formatArgs","save","load","useColors","storage","chrome","local","localstorage","colors","window","process","type","document","documentElement","style","WebkitAppearance","console","firebug","exception","table","navigator","userAgent","toLowerCase","match","parseInt","RegExp","$1","formatters","j","v","JSON","stringify","err","message","args","namespace","humanize","diff","c","color","splice","index","lastC","replace","Function","apply","call","namespaces","removeItem","debug","r","env","DEBUG","enable","localStorage","createDebug","coerce","disable","enabled","names","skips","prevTime","selectColor","hash","i","charCodeAt","abs","self","curr","Date","ms","prev","unshift","format","formatter","val","logFn","bind","init","split","push","substr","name","test","Error","stack","LARGE_ARRAY_SIZE","FUNC_ERROR_TEXT","HASH_UNDEFINED","UNORDERED_COMPARE_FLAG","PARTIAL_COMPARE_FLAG","INFINITY","MAX_SAFE_INTEGER","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reRegExpChar","reEscapeChar","reIsHostCtor","reIsUint","typedArrayTags","freeGlobal","global","freeSelf","root","freeExports","nodeType","freeModule","moduleExports","freeProcess","nodeUtil","binding","nodeIsTypedArray","isTypedArray","arraySome","array","predicate","baseProperty","key","object","baseTimes","n","iteratee","result","baseUnary","func","getValue","isHostObject","toString","mapToArray","map","size","forEach","overArg","transform","arg","setToArray","set","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","uid","exec","keys","IE_PROTO","funcToString","hasOwnProperty","objectToString","reIsNative","Symbol","Uint8Array","propertyIsEnumerable","nativeKeys","DataView","getNative","Map","Promise","Set","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","Hash","entries","clear","entry","hashClear","__data__","hashDelete","has","hashGet","data","hashHas","hashSet","get","ListCache","listCacheClear","listCacheDelete","assocIndexOf","lastIndex","pop","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","values","add","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","cache","pairs","arrayLikeKeys","inherited","isArray","isArguments","String","skipIndexes","isIndex","eq","baseExtremum","comparator","current","computed","isSymbol","baseGet","path","isKey","castPath","toKey","baseGetTag","baseGt","other","baseHasIn","baseIsEqual","customizer","bitmask","isObject","isObjectLike","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","othTag","getTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsMatch","source","matchData","noCustomizer","objValue","srcValue","baseIsNative","isMasked","pattern","isFunction","baseIsTypedArray","isLength","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","getMatchData","matchesStrictComparable","isStrictComparable","hasIn","basePropertyDeep","baseToString","stringToPath","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","tag","byteLength","byteOffset","buffer","convert","objProps","objLength","othProps","skipCtor","objCtor","constructor","othCtor","isKeyable","ArrayBuffer","resolve","Ctor","ctorString","hasPath","hasFunc","proto","memoize","string","number","quote","resolver","memoized","Cache","isArrayLikeObject","isArrayLike","defaultValue","maxBy","s","m","h","d","y","options","parse","isNaN","long","fmtLong","fmtShort","str","parseFloat","round","plural","floor","ceil","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","setTimeout","clearTimeout","runTimeout","fun","runClearTimeout","marker","queue","draining","currentQueue","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","run","nextTick","Item","title","browser","argv","version","versions","noop","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","cwd","chdir","dir","umask","g","eval","webpackPolyfill","deprecate","paths","children","l","fetch","support","searchParams","iterable","blob","Blob","formData","arrayBuffer","viewClasses","isDataView","obj","isPrototypeOf","isArrayBufferView","isView","indexOf","normalizeName","normalizeValue","iteratorFor","items","iterator","next","shift","done","Headers","headers","append","header","getOwnPropertyNames","oldValue","callback","thisArg","consumed","body","bodyUsed","reject","fileReaderReady","reader","onload","onerror","error","readBlobAsArrayBuffer","FileReader","promise","readAsArrayBuffer","readBlobAsText","readAsText","readArrayBufferAsText","buf","view","chars","fromCharCode","join","bufferClone","slice","Body","_initBody","_bodyInit","_bodyText","_bodyBlob","FormData","_bodyFormData","URLSearchParams","_bodyArrayBuffer","rejected","then","text","decode","json","methods","normalizeMethod","method","upcased","toUpperCase","Request","input","url","credentials","mode","referrer","clone","form","trim","bytes","decodeURIComponent","parseHeaders","rawHeaders","preProcessedHeaders","line","parts","Response","bodyInit","status","ok","statusText","response","redirectStatuses","redirect","RangeError","location","request","xhr","XMLHttpRequest","getAllResponseHeaders","responseURL","responseText","ontimeout","open","withCredentials","responseType","setRequestHeader","send","polyfill","CompositeImage","levels","_levels","urlsToTiles","_urlsToTiles","level","tiles","tile","zoomLevel","row","col","loadedByLevel","_loadedByLevel","TileCoverageMap","rows","cols","baseZoomLevel","toRenderByLevel","highestZoomLevel","covered","bestLevelIndex","ceilLevel","findIndex","levelsByPreference","reverse","loaded","additionalTiles","filter","isLoaded","scaleRatio","pow","isNeeded","highResRow","highResCol","byLevel","urls","diva","Events","Diva","element","HTMLElement","getElementById","DivaParentElementNotFoundException","objectData","ObjectDataNotSuppliedException","assign","adaptivePadding","arrowScrollAmount","blockMobileMove","enableAutoTitle","enableFilename","enableFullscreen","enableGotoPage","enableGotoSuggestions","enableGridIcon","enableGridControls","enableImageTitles","enableKeyScroll","enableLinkIcon","enableNonPagedVisibilityIcon","enableSpaceScroll","enableToolbar","enableZoomControls","fillParentHeight","fixedPadding","fixedHeightGrid","goDirectlyTo","hashParamSuffix","iipServerURL","inFullscreen","inBookLayout","inGrid","imageDir","maxPagesPerRow","maxZoomLevel","minPagesPerRow","minZoomLevel","onGotoSubmit","pageAliases","pageAliasFunction","pageLoadTimeout","pagesPerRow","showNonPagedPages","throbberTimeout","tileHeight","tileWidth","toolbarParentObject","verticallyOriented","viewportMargin","wrapperElement","class","appendChild","viewerCore","ViewerCore","viewerState","getInternalState","settings","getSettings","toolbar","Toolbar","id","ID","divaState","render","hashState","_getHashParamState","_loadOrFetchObjectData","_loadObjectData","pendingManifestRequest","_ajaxError","setPendingManifestRequest","showError","errorMessage","dataHasAbsolutePath","lastIndexOf","jsonHost","hostname","href","target","_showError","responseData","manifest","NotAnIIIFManifestException","publish","ImageManifest","fromIIIF","loadOptions","_getLoadOptionsForState","setManifest","state","param","HashParams","f","_getViewState","z","pageIndex","_getPageIndexForManifest","pages","p","horizontalOffset","x","verticalOffset","filename","np","layout","getCurrentLayout","pageOffset","getPageToViewportCenterOffset","currentPageIndex","viewport","hashParams","_getState","hashStringBuilder","encodeURIComponent","warn","_reloadViewer","getYOffset","getXOffset","destinationView","xAnchor","yAnchor","pidx","_isPageIndexValid","xOffset","yOffset","renderer","goto","isPageValid","pageX","pageY","outerOffset","outerElement","getBoundingClientRect","outerTop","top","outerLeft","left","outerBottom","bottom","outerRight","right","getElementsByClassName","curPageIdx","curPage","curOffset","getAttribute","newOptions","reload","protocol","host","pathname","search","_getURLHash","isActiveDiva","destroy","_changeView","closePopups","disableScrollable","enableScrollable","_toggleFullscreen","_getCurrentURL","itemTitle","canvas","getPageDimensionsAtCurrentZoomLevel","getPageOffset","pg","selector","pageIdx","_checkLoaded","numPages","otherImages","getPageDimensions","pgAtZoom","width","w","height","getPageImageURL","_getPageIndexForPageXYValues","region","getPageRegion","_gotoPageByIndex","label","llc","_getPageIndex","uri","isPageVisible","leftOffset","topOffset","offset","intersectsRegion","toggleFullscreen","isValidOption","zoom","_togglePageLayoutOrientation","position","zoomDifference","setZoomLevel","DocumentHandler","_viewerCore","_viewerState","_overlays","getPageTools","overlay","PageToolsOverlay","addPageOverlay","event","coords","newZoomLevel","ctrlKey","getPagePositionAtViewportOffset","startDistance","endDistance","centerOffset","anchorPage","_handleZoomLevelChange","fileName","getPageName","renderedPages","targetPage","currentPage","getCentermostPage","getViewport","setCurrentPage","oldZoomLevel","removePageOverlay","centerY","centerX","centerPage","dims","imageOffset","excludePadding","midX","midY","dx","dy","DocumentLayout","config","computedLayout","getComputedLayout","dimensions","pageGroups","_pageLookup","getPageLookup","getPageRegionFromPageInfo","pageInfo","padding","group","scrollLeft","elementWidth","scrollTop","elementHeight","page","groupOffset","pageLookup","scaledLayouts","pageLayouts","getScaledPageLayouts","documentSecondaryExtent","getExtentAlongSecondaryAxis","primaryDocPosition","pagePadding","scaleDimensions","secondaryDim","secondaryPadding","docPadding","reduce","maxDim","onDoubleClick","onPinch","onDoubleTap","DOUBLE_CLICK_TIMEOUT","DOUBLE_TAP_DISTANCE_THRESHOLD","DOUBLE_TAP_TIMEOUT","elem","addEventListener","getRelativeOffset","currentTarget","tracker","createDoubleEventTracker","preventDefault","isTriggered","reset","trigger","originalEvent","touches","distance","clientX","clientY","moveDistance","zoomDelta","touchCenter","firstTap","secondTap","changedTouches","tapDistance","x1","y1","x2","y2","sqrt","timeoutDuration","triggered","timeoutId","resetTimeout","pageCoords","bounds","GridHandler","pageToViewportCenterOffset","groups","getPageInfo","chosenGroup","getCentermostGroup","hasCurrentPage","some","viewportMiddle","groupMiddle","IIIFSourceAdapter","dimens","quality","api","encodeURI","params","rowCount","tileDimensions","colCount","maxZoom","xoffset","yoffset","DEFAULT_MAX_KEYS","ImageCache","maxKeys","_held","_urls","_lru","record","img","_promote","_tryEvict","extraCapacity","allowedEntryCount","evictionIndex","count","urlAdapter","pgs","max_zoom","maxRatio","max_ratio","minRatio","min_ratio","item_title","paged","_maxWidths","max_w","_maxHeights","max_h","_averageWidths","a_wid","_averageHeights","a_hei","_totalHeights","t_hei","_totalWidths","t_wid","_urlAdapter","maxDims","getScaleRatio","isFinite","getTileImageURL","iiifManifest","getMaxWidth","zoomedPropertyGetter","getMaxHeight","getAverageWidth","getAverageHeight","getTotalWidth","getTotalHeight","privateName","sourceZoomLevel","targetZoomLevel","ImageRequestHandler","_url","_callback","_errorCallback","timeoutTime","_aborted","_complete","_image","Image","crossOrigin","_handleLoad","_handleError","src","animate","easing","linear","linearEasing","cubic","inOutCubicEasing","now","performance","durationMs","duration","parameters","onUpdate","onEnd","tweenFns","paramKeys","interpolate","from","to","requestId","requestAnimationFrame","update","cancel","cancelAnimationFrame","handleAnimationCompletion","interrupted","elapsed","updateValues","info","t","getBookLayoutGroups","viewerConfig","groupings","getGroupings","getGroupLayoutsFromPageGrouping","grouping","pagesByGroup","leftPage","nonPagedPages","_addNonPagedPages","nlen","pageRecord","facingPages","getFacingPageGroup","pageDims","shouldBeHorizontallyAdjusted","rightPage","leftDims","rightDims","firstLeftOffset","secondLeftOffset","midWidth","getGridLayoutGroups","viewportWidth","horizontalPadding","pageWidth","gridPageWidth","rowHeight","currentPages","getGridPageDimensions","pageDimenData","pageData","heightToWidthRatio","pageHeight","rowDimensions","pageDimens","getPageLayouts","pluck","out","getMaxPageDimensions","getSinglesLayoutGroups","PageOverlayManager","_pages","_renderedPages","_renderedPageMap","overlaysByPage","mount","overlayIndex","unmount","previouslyRendered","newRenderedMap","_invokeOnOverlays","refresh","overlays","o","_innerElement","innerElement","_pageToolsElem","_buttons","_initializePageToolButtons","publicInstance","getPublicInstance","plugin","button","pageToolsIcon","cloneNode","handleClick","removeChild","pos","incorporateViewport","parseIIIFManifest","getMaxZoomLevel","largestDimension","incorporateZoom","imageDimension","getOtherImageData","lowestMaxZoom","itm","parseImageInfo","il","sequence","sequences","canvases","numCanvases","thisCanvas","thisResource","thisImage","context","imageAPIVersion","imageLabel","zoomDimensions","widthAtCurrentZoomLevel","heightAtCurrentZoomLevel","mz","ratio","totalWidths","totalHeights","maxWidths","maxHeights","images","resource","default","item","service","viewingHint","averageWidths","averageHeights","a","fragmentRegex","xywh","stripURL","urlArray","imageInfo","debugPaints","REQUEST_DEBOUNCE_INTERVAL","Renderer","hooks","_viewport","_outerElement","_documentElement","_hooks","_canvas","_ctx","getContext","_sourceResolver","_config","_zoomLevel","_compositeImages","_renderedTiles","_animation","_cache","_pendingRequests","viewportPosition","sourceResolver","_clearAnimation","onViewWillLoad","_setLayoutToZoomLevel","parentNode","insertBefore","firstChild","onViewDidLoad","_goto","setInnerDimensions","_render","onViewDidUpdate","newRenderedPages","visiblePages","clearRect","_paintOutline","zoomLevels","getAllZoomLevelsForPage","composite","updateFromCache","_initiateTileRequests","changes","findChanges","removed","_paint","onPageWillLoad","added","renderedTiles","getTiles","scaled","getScaledTileRecord","_isTileVisible","_drawTile","acquire","release","_getImageOffset","viewportPaddingX","viewportPaddingY","viewportOffsetX","viewportOffsetY","destXOffset","destYOffset","canvasX","canvasY","destWidth","destHeight","strokeStyle","strokeRect","newPendingRequests","initiateRequest","put","updateWithLoadedUrls","_isTileForSourceVisible","getBestZoomLevelForPage","abort","scaledTile","tileOffset","_getTileToDocumentOffset","sourceXOffset","sourceYOffset","sourceWidth","sourceHeight","drawImage","tileSource","desiredVerticalCenter","desiredHorizontalCenter","getPosition","onViewDidTransition","InterpolateAnimation","_setViewportPosition","onZoomLevelWillChange","req","handler","HTMLCanvasElement","scaleFactor","oldArray","newArray","oldEntry","newEntry","createSettingsView","sources","registerMixin","mixin","_rows","_cols","_map","viewer","ident","base","attrs","subscribe","icon","innerName","innerValue","zoomOutIcon","_createZoomOutIcon","zoomInIcon","_createZoomInIcon","zoomButtons","createButton","createLabel","zoomHandler","labelEl","textContent","_subscribe","gridMoreIcon","_createGridMoreIcon","gridFewerIcon","_createGridFewerIcon","gridButtons","setGridPagesPerRow","gridChangeHandler","viewOptionsList","_elemAttrs","gridViewIcon","_createGridViewIcon","bookViewIcon","_createBookViewIcon","pageViewIcon","_createPageViewIcon","viewOptionsToggle","display","changeViewButton","selectView","changeView","updateViewMenu","viewIconClasses","className","viewOptions","createDocumentFragment","fullscreenIcon","_createFullscreenIcon","toggleFullscreenMode","toggleZoomGridControls","leftTools","createZoomButtons","createGridControls","rightTools","createViewMenu","createFullscreenButton","tools","createElementNS","setAttributeNS","glyph","pEl","_createToolbarIcon","factory","define","_window","_document","mousemove","mouseup","mousedown","EventListener","removeEventListener","newScrollX","newScrollY","dragged","el","container","md","mu","mm","lastClientX","lastClientY","pushed","scroller","cont","hasAttribute","elementFromPoint","readyState","elt","setAttributes","setDOMAttributes","createElement","handleEltConstructorArg","createTextNode","Node","childCount","attributes","prop","setStyle","setAttribute","cssText","cssProp","DivaEvents","topic","scope","thisTopic","thisTopicGlobal","globalCount","getInstanceId","instanceID","thisTopicInstance","scopedCount","handle","completely","topicArray","topics","getScrollbarWidth","inner","outer","visibility","overflow","w1","offsetWidth","w2","clientWidth","getHashParam","updateHashParam","startIndex","endIndex","substring","originalValue","startThing","_raf","_isTouch","_extend","VanillaKinetic","DEFAULTS","ACTIVE_CLASS","_initElements","_VanillaKinetic","cursor","decelerate","triggerHardware","threshold","slowdown","maxvelocity","throttleFPS","invert","movingClass","up","down","deceleratingClass","velocity","velocityY","_move","stop","stopped","detach","_detachListeners","classList","remove","attach","contains","_attachListeners","xpos","prevXPos","ypos","prevYPos","mouseDown","throttleTimeout","lastMove","elementFocused","that","documentResetHandler","_resetMouse","html","_initEvents","prefixes","styles","prefix","events","touchStart","touch","_useTarget","_threshold","_start","stopPropagation","touchMove","_inputmove","inputDown","nodeName","inputEnd","_end","inputMove","scroll","moved","inputClick","dragStart","selectStart","getTime","movedX","movedY","blur","focus","_calculateVelocities","_setMoveClasses","_capVelocity","filterTarget","_decelerateVelocity","newVelocity","classes","_getScroller","scrollWidth","scrollHeight","moving","ValidationRunner","whitelistedKeys","additionalProperties","validations","validationIndex","validation","dummyChanges","proxier","createSettingsProxier","_runValidation","_validateOptions","cloned","settingsProxier","_applyValidations","corrected","warningSuppressed","emitWarning","suppressWarning","outputValue","validate","proxy","runner","lookup","lookupValue","properties","whitelisted","additional","currentKey","defineProperties","original","extension","generateId","counter","optionsValidations","parentObject","initialKeyScroll","initialSpaceScroll","innerObject","isScrollable","isZooming","mobileWebkit","outerObject","pageOverlays","pageTools","pluginInstances","resizeTimer","scrollbarWidth","throbberTimeoutID","verticalPadding","viewHandler","viewportElement","viewportObject","zoomDuration","idNumber","panelHeight","panelWidth","optionsValidator","orientation","innerElem","elemAttrs","viewportElem","outerElem","Viewport","intersectionTolerance","boundScrollFunction","scrollFunction","boundEscapeListener","escapeListener","initPlugins","handleEvents","showThrobber","isValid","attribute","keyCode","reloadViewer","queuedEvents","getValidatedOptions","hasChangedOption","prepareModeChange","clearViewer","updateViewHandlerAndRendering","rendererConfig","getPadding","sourceProvider","getCurrentSourceProvider","serialized","changeClass","storedHeight","storedWidth","invalidate","newHeight","newWidth","Handler","initializeRenderer","compatErrors","getCompatibilityErrors","updatePageOverlays","gridSourceProvider","getPageImageTiles","levelCount","topPadding","leftPadding","docVPadding","docHPadding","updateOverlays","getRenderedPages","focalPoint","currentRegion","pageRegion","focalXToCenter","focalYToCenter","getPositionForZoomLevel","initZoom","zoomRatio","initialZoomLevel","endPosition","transitionViewportPosition","anchor","getPageData","updateOffsets","gestureEvents","updatePanelSize","previousTopScroll","previousLeftScroll","direction","newScrollTop","newScrollLeft","adjust","primaryScroll","bindMouseEvents","upArrowKey","downArrowKey","leftArrowKey","rightArrowKey","spaceKey","pageUpKey","pageDownKey","homeKey","endKey","shiftKey","metaKey","Infinity","onResize","plugins","isPageTool","hideThrobber","thb","errorElement","querySelector","innerHTML","needsXCoord","needsYCoord","anchoredVertically","anchoredHorizontally","minWidth","minHeight","addOverlay","removeOverlay","docOffset","docCoords","pageCount","handleZoom","hasClass","dblclick","contextmenu","removeClass","parent","empty","removeData","removeAttr","unsubscribeAll","maxExtent","_top","_left","_width","_height","_innerDimensions","hasHorizontalOverlap","hasVerticalOverlap","fallsBetween","clampMax","clientHeight","clamp","getCoordinateDescriptor","getDimensionDescriptor","coord","associatedDimension","privateProp","charAt","newValue","normalized","maxAllowed","clampMin","dimen","point"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"diva.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_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, __webpack_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__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_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__webpack_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__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_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__webpack_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) __webpack_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__webpack_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__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","(function () {\n if (Array.prototype.fill) return;\n\n var fill = function (value) {\n // Steps 1-2.\n if (this == null) {\n throw new TypeError(\"this is null or not defined\");\n }\n\n var O = Object(this);\n\n // Steps 3-5.\n var len = O.length >>> 0;\n\n // Steps 6-7.\n var start = arguments[1];\n var relativeStart = start >> 0;\n\n // Step 8.\n var k = relativeStart < 0 ?\n Math.max(len + relativeStart, 0) :\n Math.min(relativeStart, len);\n\n // Steps 9-10.\n var end = arguments[2];\n var relativeEnd = end === undefined ?\n len : end >> 0;\n\n // Step 11.\n var last = relativeEnd < 0 ?\n Math.max(len + relativeEnd, 0) :\n Math.min(relativeEnd, len);\n\n // Step 12.\n while (k < last) {\n O[k] = value;\n k++;\n }\n\n // Step 13.\n return O;\n };\n\n if (Object.defineProperty) {\n try {\n Object.defineProperty(Array.prototype, 'fill', {\n value: fill,\n configurable: true,\n enumerable: false,\n writable: true\n });\n } catch(e) {}\n }\n\n if (!Array.prototype.fill) {\n Array.prototype.fill = fill;\n }\n})(this);\n","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n PARTIAL_COMPARE_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n * The bitmask may be composed of the following flags:\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = getTag(object);\n objTag = objTag == argsTag ? objectTag : objTag;\n }\n if (!othIsArr) {\n othTag = getTag(other);\n othTag = othTag == argsTag ? objectTag : othTag;\n }\n var objIsObj = objTag == objectTag && !isHostObject(object),\n othIsObj = othTag == objectTag && !isHostObject(other),\n isSameTag = objTag == othTag;\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n }\n if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!seen.has(othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n return seen.add(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, customizer, bitmask, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= UNORDERED_COMPARE_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var result,\n index = -1,\n length = path.length;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result) {\n return result;\n }\n var length = object ? object.length : 0;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\n/**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\nfunction maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)\n : undefined;\n}\n\nmodule.exports = maxBy;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n","import TileCoverageMap from \"./tile-coverage-map\";\n\n/**\n * @class CompositeImage\n * @private\n *\n * Utility class to composite tiles into a complete image\n * and track the rendered state of an image as new tiles\n * load.\n */\n\n/**\n * @param levels {Array.>}\n * @constructor\n */\nexport default class CompositeImage\n{\n constructor(levels)\n {\n this._levels = levels; // Assume levels sorted high-res first\n const urlsToTiles = this._urlsToTiles = {};\n\n levels.forEach(level =>\n {\n level.tiles.forEach(tile =>\n {\n urlsToTiles[tile.url] = {\n zoomLevel: level.zoomLevel,\n row: tile.row,\n col: tile.col\n };\n });\n });\n\n this.clear();\n }\n\n clear ()\n {\n const loadedByLevel = this._loadedByLevel = {};\n\n this._levels.forEach(level => {\n loadedByLevel[level.zoomLevel] = new TileCoverageMap(level.rows, level.cols);\n });\n }\n\n getTiles (baseZoomLevel)\n {\n const toRenderByLevel = [];\n const highestZoomLevel = this._levels[0].zoomLevel;\n const covered = new TileCoverageMap(this._levels[0].rows, this._levels[0].cols);\n\n let bestLevelIndex;\n\n // Default to the lowest zoom level\n if (baseZoomLevel === null)\n {\n bestLevelIndex = 0;\n }\n else\n {\n const ceilLevel = Math.ceil(baseZoomLevel);\n bestLevelIndex = findIndex(this._levels, level => level.zoomLevel <= ceilLevel);\n // bestLevelIndex = this._levels.findIndex((level) => level.zoomLevel <= ceilLevel);\n }\n\n\n // The best level, followed by higher-res levels in ascending order of resolution,\n // followed by lower-res levels in descending order of resolution\n const levelsByPreference = this._levels.slice(0, bestLevelIndex + 1).reverse()\n .concat(this._levels.slice(bestLevelIndex + 1));\n\n levelsByPreference.forEach( (level) =>\n {\n const loaded = this._loadedByLevel[level.zoomLevel];\n\n let additionalTiles = level.tiles.filter(tile => loaded.isLoaded(tile.row, tile.col));\n\n // Filter out entirely covered tiles\n\n // FIXME: Is it better to draw all of a partially covered tile,\n // with some of it ultimately covered, or to pick out the region\n // which needs to be drawn?\n // See https://github.com/DDMAL/diva.js/issues/358\n const scaleRatio = Math.pow(2, highestZoomLevel - level.zoomLevel);\n\n additionalTiles = additionalTiles.filter(tile => {\n let isNeeded = false;\n\n const highResRow = tile.row * scaleRatio;\n const highResCol = tile.col * scaleRatio;\n\n for (let i=0; i < scaleRatio; i++)\n {\n for (let j=0; j < scaleRatio; j++)\n {\n if (!covered.isLoaded(highResRow + i, highResCol + j))\n {\n isNeeded = true;\n covered.set(highResRow + i, highResCol + j, true);\n }\n }\n }\n\n return isNeeded;\n });\n\n toRenderByLevel.push(additionalTiles);\n }, this);\n\n // Less-preferred tiles should come first\n toRenderByLevel.reverse();\n\n const tiles = [];\n\n toRenderByLevel.forEach(byLevel => {\n tiles.push.apply(tiles, byLevel);\n });\n\n return tiles;\n }\n\n /**\n * Update the composite image to take into account all the URLs\n * loaded in an image cache.\n *\n * @param cache {ImageCache}\n */\n updateFromCache (cache)\n {\n this.clear();\n\n this._levels.forEach( (level) =>\n {\n const loaded = this._loadedByLevel[level.zoomLevel];\n\n level.tiles.forEach(tile => {\n if (cache.has(tile.url))\n loaded.set(tile.row, tile.col, true);\n });\n }, this);\n }\n\n updateWithLoadedUrls (urls)\n {\n urls.forEach( (url) =>\n {\n const entry = this._urlsToTiles[url];\n this._loadedByLevel[entry.zoomLevel].set(entry.row, entry.col, true);\n }, this);\n }\n}\n\n// function fill (count, value)\n// {\n// const arr = new Array(count);\n//\n// for (let i=0; i < count; i++)\n// arr[i] = value;\n//\n// return arr;\n// }\n\nfunction findIndex (array, predicate)\n{\n const length = array.length;\n for (let i = 0; i < length; i++)\n {\n if (predicate(array[i], i))\n return i;\n }\n\n return -1;\n}\n","import { Events } from './utils/events';\n// import PluginRegistry from './plugin-registry';\n\nconst diva = {\n Events: Events,\n\n // registerPlugin: function (plugin)\n // {\n // PluginRegistry.register(plugin);\n // },\n\n /**\n * Create a new Diva instance at the given element\n *\n * @param element {Element}\n * @param options {Object}\n * @returns {Diva}\n */\n // create: function (element, options)\n // {\n // if (diva.find(element))\n // throw new Error('Diva is already initialized on ' + reprElem(element));\n //\n // const $elem = $(element);\n // $elem.diva(options);\n //\n // return $elem.data('diva');\n // },\n\n /**\n * Return the Diva instance attached to the\n * element, if any.\n *\n * @param element\n * @returns {Diva|null}\n */\n // find: function (element)\n // {\n // return $(element).data('diva') || null;\n // }\n};\n\nexport default diva;\n\n// function reprElem(elem)\n// {\n// const id = elem.id ? '#' + elem.id : elem.id;\n// const classes = elem.className ? '.' + elem.className.split(/\\s+/g).join('.') : '';\n//\n// return (id ? id : elem.tagName.toLowerCase()) + classes;\n// }\n","import './utils/vanilla.kinetic';\nimport './utils/dragscroll';\nimport { elt } from \"./utils/elt\";\nimport {\n DivaParentElementNotFoundException,\n NotAnIIIFManifestException,\n ObjectDataNotSuppliedException\n} from \"./exceptions\";\nimport diva from \"./diva-global\";\nimport ViewerCore from \"./viewer-core\";\nimport ImageManifest from \"./image-manifest\";\nimport Toolbar from \"./toolbar\";\nimport HashParams from \"./utils/hash-params\";\n\n\n/**\n * The top-level class for Diva objects. This is instantiated by passing in an HTML element\n * ID or HTML Element node and an object containing a list of options, of which the 'objectData'\n * option is required and which must point to a IIIF Presentation API Manifest:\n *\n * var diva = new Diva('element-id', {\n * objectData: \"http://example.com/iiif-manifest.json\"\n * });\n *\n * This class also serves as the entry point for the Events system, in which applications can subscribe\n * to notifications sent from Diva instances:\n *\n * Diva.Events.subscribe('VisiblePageDidChange', function () { console.log(\"Visible Page Changed\"); });\n *\n *\n *\n **/\nclass Diva\n{\n constructor (element, options)\n {\n /*\n * If a string is passed in, convert that to an element.\n * */\n if (!(element instanceof HTMLElement))\n {\n this.element = document.getElementById(element);\n\n if (this.element === null)\n {\n throw new DivaParentElementNotFoundException();\n }\n }\n\n if (!options.objectData)\n {\n throw new ObjectDataNotSuppliedException('You must supply either a URL or a literal object to the `objectData` key.');\n }\n\n this.options = Object.assign({\n adaptivePadding: 0.05, // The ratio of padding to the page dimension\n arrowScrollAmount: 40, // The amount (in pixels) to scroll by when using arrow keys\n blockMobileMove: false, // Prevent moving or scrolling the page on mobile devices\n objectData: '', // A IIIF Manifest or a JSON file generated by process.py that provides the object dimension data, or a URL pointing to such data - *REQUIRED*\n enableAutoTitle: true, // Shows the title within a div of id diva-title\n enableFilename: true, // Uses filenames and not page numbers for links (i=bm_001.tif, not p=1)\n enableFullscreen: true, // Enable or disable fullscreen icon (mode still available)\n enableGotoPage: true, // A \"go to page\" jump box\n enableGotoSuggestions: true, // Controls whether suggestions are shown under the input field when the user is typing in the 'go to page' form\n enableGridIcon: true, // A grid view of all the pages\n enableGridControls: 'buttons', // Specify control of pages per grid row in Grid view. Possible values: 'buttons' (+/-), 'slider'. Any other value disables the controls.\n enableImageTitles: true, // Adds \"Page {n}\" title to page images if true\n enableKeyScroll: true, // Captures scrolling using the arrow and page up/down keys regardless of page focus. When off, defers to default browser scrolling behavior.\n enableLinkIcon: true, // Controls the visibility of the link icon\n enableNonPagedVisibilityIcon: true, // Controls the visibility of the icon to toggle the visibility of non-paged pages. (Automatically hidden if no 'non-paged' pages).\n enableSpaceScroll: false, // Scrolling down by pressing the space key\n enableToolbar: true, // Enables the toolbar. Note that disabling this means you have to handle all controls yourself.\n enableZoomControls: 'buttons', // Specify controls for zooming in and out. Possible values: 'buttons' (+/-), 'slider'. Any other value disables the controls.\n fillParentHeight: true, // Use a flexbox layout to allow Diva to fill its parent's height\n fixedPadding: 10, // Fallback if adaptive padding is set to 0\n fixedHeightGrid: true, // So each page in grid view has the same height (only widths differ)\n goDirectlyTo: 0, // Default initial page to show (0-indexed)\n hashParamSuffix: null, // Used when there are multiple document viewers on a page\n iipServerURL: '', // The URL to the IIPImage installation, including the `?FIF=` - *REQUIRED*, unless using IIIF\n inFullscreen: false, // Set to true to load fullscreen mode initially\n inBookLayout: false, // Set to true to view the document with facing pages in document mode\n inGrid: false, // Set to true to load grid view initially\n imageDir: '', // Image directory, either absolute path or relative to IIP's FILESYSTEM_PREFIX - *REQUIRED*, unless using IIIF\n maxPagesPerRow: 8, // Maximum number of pages per row in grid view\n maxZoomLevel: -1, // Optional; defaults to the max zoom returned in the JSON response\n minPagesPerRow: 2, // Minimum pages per row in grid view. Recommended default.\n minZoomLevel: 0, // Defaults to 0 (the minimum zoom)\n onGotoSubmit: null, // When set to a function that takes a string and returns a page index, this will override the default behaviour of the 'go to page' form submission\n pageAliases: {}, // An object mapping specific page indices to aliases (has priority over 'pageAliasFunction'\n pageAliasFunction: function(){return false;}, // A function mapping page indices to an alias. If false is returned, default page number is displayed\n pageLoadTimeout: 200, // Number of milliseconds to wait before loading pages\n pagesPerRow: 5, // The default number of pages per row in grid view\n showNonPagedPages: false, // Whether pages tagged as 'non-paged' (in IIIF manifests only) should be visible after initial load\n throbberTimeout: 100, // Number of milliseconds to wait before showing throbber\n tileHeight: 256, // The height of each tile, in pixels; usually 256\n tileWidth: 256, // The width of each tile, in pixels; usually 256\n toolbarParentObject: null, // The toolbar parent object.\n verticallyOriented: true, // Determines vertical vs. horizontal orientation\n viewportMargin: 200, // Pretend tiles +/- 200px away from viewport are in\n zoomLevel: 2 // The initial zoom level (used to store the current zoom level)\n }, options);\n\n // In order to fill the height, use a wrapper div displayed using a flexbox layout\n const wrapperElement = elt('div', {\n class: `diva-wrapper${this.options.fillParentHeight ? \" diva-wrapper-flexbox\" : \"\"}`\n });\n\n this.element.appendChild(wrapperElement);\n\n this.options.toolbarParentObject = this.options.toolbarParentObject || wrapperElement;\n\n const viewerCore = new ViewerCore(wrapperElement, this.options, this);\n\n this.viewerState = viewerCore.getInternalState();\n this.settings = viewerCore.getSettings();\n this.toolbar = new Toolbar(this);\n\n wrapperElement.id = this.settings.ID + 'wrapper';\n\n this.divaState = {\n viewerCore: viewerCore,\n toolbar: this.settings.enableToolbar ? this.toolbar : null\n };\n\n this.toolbar.render();\n this.hashState = this._getHashParamState();\n\n this._loadOrFetchObjectData();\n }\n\n /**\n * @private\n **/\n _loadOrFetchObjectData ()\n {\n if (typeof this.settings.objectData === 'object')\n {\n \tlet self = this;\n // Defer execution until initialization has completed\n setTimeout(function ()\n {\n self._loadObjectData(self.settings.objectData, self.hashState);\n }, 0);\n }\n else\n {\n const pendingManifestRequest = fetch(this.settings.objectData, {\n headers: {\n \"Accept\": \"application/json\"\n }\n }).then( (response) =>\n {\n if (!response.ok)\n {\n this._ajaxError(response);\n\n let error = new Error(response.statusText);\n error.response = response;\n throw error;\n }\n return response.json();\n\n }).then( (data) =>\n {\n this._loadObjectData(data, this.hashState);\n });\n\n // Store the pending request so that it can be cancelled in the event that Diva needs to be destroyed\n this.divaState.viewerCore.setPendingManifestRequest(pendingManifestRequest);\n }\n }\n\n /**\n * @private\n **/\n _showError (message)\n {\n this.divaState.viewerCore.showError(message);\n }\n\n /**\n * @private\n * */\n _ajaxError (response)\n {\n // Show a basic error message within the document viewer pane\n const errorMessage = ['Invalid objectData setting. Error code: ' + response.status + ' ' + response.statusText];\n\n // Detect and handle CORS errors\n const dataHasAbsolutePath = this.settings.objectData.lastIndexOf('http', 0) === 0;\n\n if (dataHasAbsolutePath)\n {\n const jsonHost = this.settings.objectData.replace(/https?:\\/\\//i, \"\").split(/[/?#]/)[0];\n\n if (window.location.hostname !== jsonHost)\n {\n errorMessage.push(\n elt('p', 'Attempted to access cross-origin data without CORS.'),\n elt('p',\n 'You may need to update your server configuration to support CORS. For help, see the ',\n elt('a', {\n href: 'https://github.com/DDMAL/diva.js/wiki/Installation#a-note-about-cross-site-requests',\n target: '_blank'\n }, 'cross-site request documentation.')\n )\n );\n }\n }\n\n this._showError(errorMessage);\n }\n\n /**\n * @private\n **/\n _loadObjectData (responseData, hashState)\n {\n let manifest;\n\n // TODO improve IIIF detection method\n if (!responseData.hasOwnProperty('@context') && (responseData['@context'].indexOf('iiif') === -1 || responseData['@context'].indexOf('shared-canvas') === -1))\n {\n throw new NotAnIIIFManifestException('This does not appear to be a IIIF Manifest.');\n }\n\n // trigger ManifestDidLoad event\n // FIXME: Why is this triggered before the manifest is parsed? See https://github.com/DDMAL/diva.js/issues/357\n diva.Events.publish('ManifestDidLoad', [responseData], this);\n\n manifest = ImageManifest.fromIIIF(responseData);\n const loadOptions = hashState ? this._getLoadOptionsForState(hashState, manifest) : {};\n\n this.divaState.viewerCore.setManifest(manifest, loadOptions);\n }\n\n /**\n * Parse the hash parameters into the format used by getState and setState\n *\n * @private\n **/\n _getHashParamState ()\n {\n const state = {};\n\n ['f', 'v', 'z', 'n', 'i', 'p', 'y', 'x'].forEach( (param) =>\n {\n const value = HashParams.get(param + this.settings.hashParamSuffix);\n\n // `false` is returned if the value is missing\n if (value !== false)\n state[param] = value;\n });\n\n // Do some awkward special-casing, since this format is kind of weird.\n\n // For inFullscreen (f), true and false strings should be interpreted\n // as booleans.\n if (state.f === 'true')\n state.f = true;\n else if (state.f === 'false')\n state.f = false;\n\n // Convert numerical values to integers, if provided\n ['z', 'n', 'p', 'x', 'y'].forEach( (param) =>\n {\n if (param in state)\n state[param] = parseInt(state[param], 10);\n });\n\n return state;\n }\n\n /**\n * @private\n **/\n _getLoadOptionsForState (state, manifest)\n {\n manifest = manifest || this.settings.manifest;\n\n const options = ('v' in state) ? this._getViewState(state.v) : {};\n\n if ('f' in state)\n options.inFullscreen = state.f;\n\n if ('z' in state)\n options.zoomLevel = state.z;\n\n if ('n' in state)\n options.pagesPerRow = state.n;\n\n // Only change specify the page if state.i or state.p is valid\n let pageIndex = this._getPageIndexForManifest(manifest, state.i);\n\n if (!(pageIndex >= 0 && pageIndex < manifest.pages.length))\n {\n pageIndex = state.p - 1;\n\n // Possibly NaN\n if (!(pageIndex >= 0 && pageIndex < manifest.pages.length))\n pageIndex = null;\n }\n\n if (pageIndex !== null)\n {\n const horizontalOffset = parseInt(state.x, 10);\n const verticalOffset = parseInt(state.y, 10);\n\n options.goDirectlyTo = pageIndex;\n options.horizontalOffset = horizontalOffset;\n options.verticalOffset = verticalOffset;\n }\n\n return options;\n }\n\n /**\n * @private\n * */\n _getViewState (view)\n {\n switch (view)\n {\n case 'd':\n return {\n inGrid: false,\n inBookLayout: false\n };\n\n case 'b':\n return {\n inGrid: false,\n inBookLayout: true\n };\n\n case 'g':\n return {\n inGrid: true,\n inBookLayout: false\n };\n\n default:\n return null;\n }\n }\n\n /**\n * @private\n * */\n _getPageIndexForManifest (manifest, filename)\n {\n let i;\n const np = manifest.pages.length;\n\n for (i = 0; i < np; i++)\n {\n if (manifest.pages[i].f === filename)\n {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * @private\n * */\n _getState ()\n {\n let view;\n\n if (this.settings.inGrid)\n {\n view = 'g';\n }\n else if (this.settings.inBookLayout)\n {\n view = 'b';\n }\n else\n {\n view = 'd';\n }\n\n const layout = this.divaState.viewerCore.getCurrentLayout();\n const pageOffset = layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n return {\n 'f': this.settings.inFullscreen,\n 'v': view,\n 'z': this.settings.zoomLevel,\n 'n': this.settings.pagesPerRow,\n 'i': this.settings.enableFilename ? this.settings.manifest.pages[this.settings.currentPageIndex].f : false,\n 'p': this.settings.enableFilename ? false : this.settings.currentPageIndex + 1,\n 'y': pageOffset ? pageOffset.y : false,\n 'x': pageOffset ? pageOffset.x : false\n };\n }\n\n /**\n * @private\n **/\n _getURLHash ()\n {\n const hashParams = this._getState();\n const hashStringBuilder = [];\n let param;\n\n for (param in hashParams)\n {\n if (hashParams[param] !== false)\n hashStringBuilder.push(param + this.settings.hashParamSuffix + '=' + encodeURIComponent(hashParams[param]));\n }\n\n return hashStringBuilder.join('&');\n }\n\n /**\n * Returns the page index associated with the given filename; must called after setting settings.manifest\n *\n * @private\n **/\n _getPageIndex (filename)\n {\n return this._getPageIndexForManifest(this.settings.manifest, filename);\n }\n\n /**\n * @private\n * */\n _checkLoaded ()\n {\n if (!this.viewerState.loaded)\n {\n console.warn(\"The viewer is not completely initialized. This is likely because it is still downloading data. To fix this, only call this function if the isReady() method returns true.\");\n return false;\n }\n return true;\n }\n\n /**\n * Called when the fullscreen icon is clicked\n *\n * @private\n **/\n _toggleFullscreen ()\n {\n this._reloadViewer({\n inFullscreen: !this.settings.inFullscreen\n });\n }\n\n /**\n * Toggles between orientations\n *\n * @private\n * */\n _togglePageLayoutOrientation ()\n {\n const verticallyOriented = !this.settings.verticallyOriented;\n\n //if in grid, switch out of grid\n this._reloadViewer({\n inGrid: false,\n verticallyOriented: verticallyOriented,\n goDirectlyTo: this.settings.currentPageIndex,\n verticalOffset: this.divaState.viewerCore.getYOffset(),\n horizontalOffset: this.divaState.viewerCore.getXOffset()\n });\n\n return verticallyOriented;\n }\n\n /**\n * Called when the change view icon is clicked\n *\n * @private\n **/\n _changeView (destinationView)\n {\n switch (destinationView)\n {\n case 'document':\n return this._reloadViewer({\n inGrid: false,\n inBookLayout: false\n });\n\n case 'book':\n return this._reloadViewer({\n inGrid: false,\n inBookLayout: true\n });\n\n case 'grid':\n return this._reloadViewer({\n inGrid: true\n });\n\n default:\n return false;\n }\n }\n\n /**\n * @private\n *\n * @param {Number} pageIndex - 0-based page index.\n * @param {Number} xAnchor - x coordinate to jump to on resulting page.\n * @param {Number} yAnchor - y coordinate to jump to on resulting page.\n * @returns {Boolean} - Whether the jump was successful.\n **/\n _gotoPageByIndex (pageIndex, xAnchor, yAnchor)\n {\n let pidx = parseInt(pageIndex, 10);\n\n if (this._isPageIndexValid(pidx))\n {\n const xOffset = this.divaState.viewerCore.getXOffset(pidx, xAnchor);\n const yOffset = this.divaState.viewerCore.getYOffset(pidx, yAnchor);\n\n this.viewerState.renderer.goto(pidx, yOffset, xOffset);\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if a page index is valid\n *\n * @private\n * @param {Number} pageIndex - Numeric (0-based) page index\n * @return {Boolean} whether the page index is valid or not.\n */\n _isPageIndexValid (pageIndex)\n {\n return this.settings.manifest.isPageValid(pageIndex, this.settings.showNonPagedPages);\n }\n\n /**\n * Given a pageX and pageY value, returns either the page visible at that (x,y)\n * position or -1 if no page is.\n *\n * @private\n */\n _getPageIndexForPageXYValues (pageX, pageY)\n {\n //get the four edges of the outer element\n const outerOffset = this.viewerState.outerElement.getBoundingClientRect();\n const outerTop = outerOffset.top;\n const outerLeft = outerOffset.left;\n const outerBottom = outerOffset.bottom;\n const outerRight = outerOffset.right;\n\n //if the clicked position was outside the diva-outer object, it was not on a visible portion of a page\n if (pageX < outerLeft || pageX > outerRight)\n return -1;\n\n if (pageY < outerTop || pageY > outerBottom)\n return -1;\n\n //navigate through all diva page objects\n const pages = document.getElementsByClassName('diva-page');\n let curPageIdx = pages.length;\n while (curPageIdx--)\n {\n //get the offset for each page\n const curPage = pages[curPageIdx];\n const curOffset = curPage.getBoundingClientRect();\n\n //if this point is outside the horizontal boundaries of the page, continue\n if (pageX < curOffset.left || pageX > curOffset.right)\n continue;\n\n //same with vertical boundaries\n if (pageY < curOffset.top || pageY > curOffset.bottom)\n continue;\n\n //if we made it through the above two, we found the page we're looking for\n return curPage.getAttribute('data-index');\n }\n\n //if we made it through that entire while loop, we didn't click on a page\n return -1;\n }\n\n /**\n * @private\n **/\n _reloadViewer (newOptions)\n {\n return this.divaState.viewerCore.reload(newOptions);\n }\n\n /**\n * @private\n */\n _getCurrentURL ()\n {\n return location.protocol + '//' + location.host + location.pathname + location.search + '#' + this._getURLHash();\n }\n\n /**\n * ===============================================\n * PUBLIC FUNCTIONS\n * ===============================================\n **/\n\n /**\n * Activate this instance of diva via the active Diva controller.\n *\n * @public\n */\n activate ()\n {\n this.viewerState.isActiveDiva = true;\n }\n\n /**\n * Change the object (objectData) parameter currently being rendered by Diva.\n *\n * @public\n * @params {object} objectData - An IIIF Manifest object OR a URL to a IIIF manifest.\n */\n changeObject (objectData)\n {\n this.viewerState.loaded = false;\n this.divaState.viewerCore.clear();\n\n if (this.viewerState.renderer)\n this.viewerState.renderer.destroy();\n\n this.viewerState.options.objectData = objectData;\n\n this._loadOrFetchObjectData();\n }\n\n /**\n * Change views. Takes 'document', 'book', or 'grid' to specify which view to switch into\n *\n * @public\n * @params {string} destinationView - the destination view to change to.\n */\n changeView (destinationView)\n {\n this._changeView(destinationView);\n }\n\n /**\n * Close all popups on the toolbar.\n *\n * @public\n **/\n closePopups ()\n {\n this.divaState.toolbar.closePopups();\n }\n\n /**\n * Deactivate this diva instance through the active Diva controller.\n *\n * @public\n **/\n deactivate ()\n {\n this.viewerState.isActiveDiva = false;\n }\n\n /**\n * Destroys this instance, tells plugins to do the same\n *\n * @public\n **/\n destroy ()\n {\n this.divaState.viewerCore.destroy();\n }\n\n /**\n * Disables document dragging, scrolling (by keyboard if set), and zooming by double-clicking\n *\n * @public\n **/\n disableScrollable ()\n {\n this.divaState.viewerCore.disableScrollable();\n }\n\n /**\n * Re-enables document dragging, scrolling (by keyboard if set), and zooming by double-clicking\n *\n * @public\n **/\n enableScrollable ()\n {\n this.divaState.viewerCore.enableScrollable();\n }\n\n /**\n * Enter fullscreen mode if currently not in fullscreen mode. If currently in fullscreen\n * mode this will have no effect.\n *\n * This function will work even if enableFullscreen is set to false in the options.\n *\n * @public\n * @returns {boolean} - Whether the switch to fullscreen was successful or not.\n **/\n enterFullscreenMode ()\n {\n if (!this.settings.inFullscreen)\n {\n this._toggleFullscreen();\n return true;\n }\n\n return false;\n }\n\n /**\n * Enter grid view if currently not in grid view. If currently in grid view mode\n * this will have no effect.\n *\n * @public\n * @returns {boolean} - Whether the switch to grid view was successful or not.\n **/\n enterGridView ()\n {\n if (!this.settings.inGrid)\n {\n this._changeView('grid');\n return true;\n }\n\n return false;\n }\n\n /**\n * Return the current URL for the viewer, including the hash parameters reflecting\n * the current state of the viewer.\n *\n * @public\n * @returns {string} - The URL for the current view state.\n * */\n getCurrentURL ()\n {\n return this._getCurrentURL();\n }\n\n /**\n * Returns the title of the document, based on the label in the IIIF manifest.\n *\n * @public\n * @returns {string} - The current title of the object from the label key in the IIIF Manifest.\n **/\n getItemTitle ()\n {\n return this.settings.manifest.itemTitle;\n }\n\n /**\n * Get the canvas identifier for the currently visible page.\n *\n * @public\n * @returns {string} - The URI of the currently visible canvas.\n **/\n getCurrentCanvas ()\n {\n return this.settings.manifest.pages[this.settings.currentPageIndex].canvas;\n }\n\n /**\n * Returns the dimensions of the current page at the current zoom level. Also works in\n * grid view.\n *\n * @public\n * @returns {object} - An object containing the current page dimensions at the current zoom level.\n **/\n getCurrentPageDimensionsAtCurrentZoomLevel ()\n {\n return this.getPageDimensionsAtCurrentZoomLevel(this.settings.currentPageIndex);\n }\n\n /**\n * Returns the current filename (deprecated). Returns the URI for current page.\n *\n * @public\n * @deprecated\n * @returns {string} - The URI for the current page image.\n **/\n getCurrentPageFilename ()\n {\n console.warn('This method will be deprecated in the next version of Diva. Please use getCurrentPageURI instead.');\n return this.settings.manifest.pages[this.settings.currentPageIndex].f;\n }\n\n /**\n * Returns the current URI for the visible page.\n *\n * @public\n * @returns {string} - The URI for the current page image.\n **/\n getCurrentPageURI ()\n {\n return this.settings.manifest.pages[this.settings.currentPageIndex].f;\n }\n\n /**\n * Returns the 0-based index for the current page.\n *\n * @public\n * @returns {number} - The 0-based index for the currently visible page.\n **/\n getCurrentPageIndex ()\n {\n return this.settings.currentPageIndex;\n }\n\n /**\n * Shortcut to getPageOffset for current page.\n *\n * @public\n * @returns {} -\n * */\n getCurrentPageOffset ()\n {\n return this.getPageOffset(this.settings.currentPageIndex);\n }\n\n /**\n * Returns an array of all filenames in the document. Deprecated.\n *\n * @public\n * @deprecated\n * @returns {Array} - An array of all the URIs in the document.\n * */\n getFilenames ()\n {\n console.warn('This will be removed in the next version of Diva. Use getAllPageURIs instead.');\n\n return this.settings.manifest.pages.map( (pg) =>\n {\n return pg.f;\n });\n }\n\n /**\n * Returns an array of all page image URIs in the document.\n *\n * @public\n * @returns {Array} - An array of all the URIs in the document.\n * */\n getAllPageURIs ()\n {\n return this.settings.manifest.pages.map( (pg) =>\n {\n return pg.f;\n });\n }\n\n /**\n * Get the number of grid pages per row.\n *\n * @public\n * @returns {number} - The number of grid pages per row.\n **/\n getGridPagesPerRow ()\n {\n // TODO(wabain): Add test case\n return this.settings.pagesPerRow;\n }\n\n /**\n * Get the instance ID number.\n *\n * @public\n * @returns {number} - The instance ID.\n * */\n //\n getInstanceId ()\n {\n return this.settings.ID;\n }\n\n /**\n * Get the instance selector for this instance. This is the selector for the parent\n * div.\n *\n * @public\n * @returns {string} - The viewport selector.\n * */\n getInstanceSelector ()\n {\n console.log(this);\n return this.divaState.viewerCore.selector;\n }\n\n /**\n * Gets the maximum zoom level for the entire document.\n *\n * @public\n * @returns {number} - The maximum zoom level for the document\n * */\n getMaxZoomLevel ()\n {\n return this.settings.maxZoomLevel;\n }\n\n /**\n * Gets the max zoom level for a given page.\n *\n * @public\n * @param {number} pageIdx - The 0-based index number for the page.\n * @returns {number} - The maximum zoom level for that page.\n * */\n getMaxZoomLevelForPage (pageIdx)\n {\n if (!this._checkLoaded())\n return false;\n\n return this.settings.manifest.pages[pageIdx].m;\n }\n\n /**\n * Gets the minimum zoom level for the entire document.\n *\n * @public\n * @returns {number} - The minimum zoom level for the document\n * */\n getMinZoomLevel ()\n {\n return this.settings.minZoomLevel;\n }\n\n /**\n * Gets the number of pages in the document.\n *\n * @public\n * @returns {number} - The number of pages in the document.\n * */\n getNumberOfPages ()\n {\n if (!this._checkLoaded())\n return false;\n\n return this.settings.numPages;\n }\n\n /**\n * If a canvas has multiple images defined, returns the non-primary image.\n *\n * @public\n * @params {number} pageIndex - The page index for which to return the other images.\n * @returns {object} An object containing the other images.\n **/\n getOtherImages (pageIndex)\n {\n return this.settings.manifest.pages[pageIndex].otherImages;\n }\n\n /**\n * Get page dimensions in the current view and zoom level\n *\n * @public\n * @params {number} pageIndex - A valid 0-based page index\n * @returns {object} - An object containing the dimensions of the page\n * */\n getPageDimensions (pageIndex)\n {\n if (!this._checkLoaded())\n return null;\n\n return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(pageIndex);\n }\n\n /**\n * Get page dimensions at a given zoom level\n *\n * @public\n * @params {number} pageIdx - A valid 0-based page index\n * @params {number} zoomLevel - A candidate zoom level.\n * @returns {object} - An object containing the dimensions of the page at the given zoom level.\n **/\n getPageDimensionsAtZoomLevel (pageIdx, zoomLevel)\n {\n if (!this._checkLoaded())\n return false;\n\n if (zoomLevel > this.settings.maxZoomLevel)\n zoomLevel = this.settings.maxZoomLevel;\n\n const pg = this.settings.manifest.pages[parseInt(pageIdx, 10)];\n const pgAtZoom = pg.d[parseInt(zoomLevel, 10)];\n\n return {\n width: pgAtZoom.w,\n height: pgAtZoom.h\n };\n }\n\n /**\n * Returns the dimensions of a given page at the current zoom level.\n * Also works in Grid view\n *\n * @public\n * @param {number} pageIndex - The 0-based page index\n * @returns {object} - An object containing the page dimensions at the current zoom level.\n * */\n getPageDimensionsAtCurrentZoomLevel (pageIndex)\n {\n let pidx = parseInt(pageIndex, 10);\n\n if (!this._isPageIndexValid(pidx))\n throw new Error('Invalid Page Index');\n\n return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(pidx);\n }\n\n /**\n * Returns a URL for the image of the page at the given index. The\n * optional size parameter supports setting the image width or height\n * (default is full-sized).\n *\n * @public\n * @params {number} pageIndex - 0-based page index\n * @params {?object} size - an object containing width and height information\n * @returns {string} - The IIIF URL for a given page at an optional size\n */\n getPageImageURL (pageIndex, size)\n {\n return this.settings.manifest.getPageImageURL(pageIndex, size);\n }\n\n /**\n * Given a set of co-ordinates (e.g., from a mouse click), return the 0-based page index\n * for which it matches.\n *\n * @public\n * @params {number} pageX - The x co-ordinate\n * @params {number} pageY - The y co-ordinate\n * @returns {number} - The page index matching the co-ordinates.\n * */\n getPageIndexForPageXYValues (pageX, pageY)\n {\n return this._getPageIndexForPageXYValues(pageX, pageY);\n }\n\n /**\n * Returns distance between the northwest corners of diva-inner and page index.\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @params {?options} options - A set of options to pass in.\n * @returns {object} - The offset between the upper left corner and the page.\n *\n * */\n getPageOffset (pageIndex, options)\n {\n const region = this.divaState.viewerCore.getPageRegion(pageIndex, options);\n\n return {\n top: region.top,\n left: region.left\n };\n }\n\n /**\n * Get the instance settings.\n *\n * @public\n * @returns {object} - The current instance settings.\n * */\n getSettings ()\n {\n return this.settings;\n }\n\n /**\n * Get an object representing the complete state of the viewer.\n *\n * @public\n * @returns {object} - The current instance state.\n * */\n getState ()\n {\n return this._getState();\n }\n\n /**\n * Get the current zoom level.\n *\n * @public\n * @returns {number} - The current zoom level.\n * */\n getZoomLevel ()\n {\n return this.settings.zoomLevel;\n }\n\n /**\n * Go to a particular page (with indexing starting at 0).\n * The (xAnchor) side of the page will be anchored to the (xAnchor) side of the diva-outer element\n *\n * @public\n * @params {number} pageIndex - 0-based page index.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"; same process as xAnchor.\n * @returns {boolean} - True if the page index is valid; false if it is not.\n * */\n gotoPageByIndex (pageIndex, xAnchor, yAnchor)\n {\n this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Given a canvas label, attempt to go to that page. If no label was found.\n * the label will be attempted to match against the page index.\n *\n * @public\n * @params {string} label - The label to search on.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} - True if the page index is valid; false if it is not.\n * */\n gotoPageByLabel (label, xAnchor, yAnchor)\n {\n const pages = this.settings.manifest.pages;\n let llc = label.toLowerCase();\n\n for (let i = 0, len = pages.length; i < len; i++)\n {\n if (pages[i].l.toLowerCase().indexOf(llc) > -1)\n return this._gotoPageByIndex(i, xAnchor, yAnchor);\n }\n\n const pageIndex = parseInt(label, 10) - 1;\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Jump to a page based on its filename. Deprecated. Use gotoPageByURI instead.\n *\n * @public\n * @params {string} filename - The filename of the image to jump to.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} true if successful and false if the filename is not found.\n */\n gotoPageByName (filename, xAnchor, yAnchor)\n {\n console.warn('This method will be removed in the next version of Diva.js. Use gotoPageByURI instead.');\n const pageIndex = this._getPageIndex(filename);\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Jump to a page based on its URI.\n *\n * @public\n * @params {string} uri - The URI of the image to jump to.\n * @params {?string} xAnchor - may either be \"left\", \"right\", or default \"center\"\n * @params {?string} yAnchor - may either be \"top\", \"bottom\", or default \"center\"\n * @returns {boolean} true if successful and false if the URI is not found.\n */\n gotoPageByURI (uri, xAnchor, yAnchor)\n {\n const pageIndex = this._getPageIndex(uri);\n return this._gotoPageByIndex(pageIndex, xAnchor, yAnchor);\n }\n\n /**\n * Whether the page has other images to display.\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @returns {boolean} Whether the page has other images to display.\n **/\n hasOtherImages (pageIndex)\n {\n return this.settings.manifest.pages[pageIndex].otherImages === true;\n }\n\n /**\n * Hides the pages that are marked \"non-paged\" in the IIIF manifest.\n *\n * @public\n **/\n hideNonPagedPages ()\n {\n this._reloadViewer({ showNonPagedPages: false });\n }\n\n /**\n * Is the viewer currently in full-screen mode?\n *\n * @public\n * @returns {boolean} - Whether the viewer is in fullscreen mode.\n **/\n isInFullscreen ()\n {\n return this.settings.inFullscreen;\n }\n\n /**\n * Check if a page index is within the range of the document\n *\n * @public\n * @returns {boolean} - Whether the page index is valid.\n **/\n isPageIndexValid (pageIndex)\n {\n return this._isPageIndexValid(pageIndex);\n }\n\n /**\n * Determines if a page is currently in the viewport\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @returns {boolean} - Whether the page is currently in the viewport.\n **/\n isPageInViewport (pageIndex)\n {\n return this.viewerState.renderer.isPageVisible(pageIndex);\n }\n\n /**\n * Whether the Diva viewer has been fully initialized.\n *\n * @public\n * @returns {boolean} - True if the viewer is initialized; false otherwise.\n **/\n isReady ()\n {\n return this.viewerState.loaded;\n }\n\n /**\n * Check if something (e.g. a highlight box on a particular page) is visible\n *\n * @public\n * @params {number} pageIndex - The 0-based page index\n * @params {number} leftOffset - The distance of the region from the left of the viewport\n * @params {number} topOffset - The distance of the region from the top of the viewport\n * @params {number} width - The width of the region\n * @params {number} height - The height of the region\n * @returns {boolean} - Whether the region is in the viewport.\n **/\n isRegionInViewport (pageIndex, leftOffset, topOffset, width, height)\n {\n const layout = this.divaState.viewerCore.getCurrentLayout();\n\n if (!layout)\n return false;\n\n const offset = layout.getPageOffset(pageIndex);\n\n const top = offset.top + topOffset;\n const left = offset.left + leftOffset;\n\n return this.viewerState.viewport.intersectsRegion({\n top: top,\n bottom: top + height,\n left: left,\n right: left + width\n });\n }\n\n /**\n * Whether the page layout is vertically or horizontally oriented.\n *\n * @public\n * @returns {boolean} - True if vertical; false if horizontal.\n **/\n isVerticallyOriented ()\n {\n return this.settings.verticallyOriented;\n }\n\n /**\n * Leave fullscreen mode if currently in fullscreen mode.\n *\n * @public\n * @returns {boolean} - true if in fullscreen mode intitially, false otherwise\n **/\n leaveFullscreenMode ()\n {\n if (this.settings.inFullscreen)\n {\n this.toggleFullscreen();\n return true;\n }\n\n return false;\n }\n\n /**\n * Leave grid view if currently in grid view.\n *\n * @public\n * @returns {boolean} - true if in grid view initially, false otherwise\n **/\n leaveGridView ()\n {\n if (this.settings.inGrid)\n {\n this._reloadViewer({ inGrid: false });\n return true;\n }\n\n return false;\n }\n\n /**\n * Set the number of grid pages per row.\n *\n * @public\n * @params {number} pagesPerRow - The number of pages per row\n * @returns {boolean} - True if the operation was successful.\n **/\n setGridPagesPerRow (pagesPerRow)\n {\n // TODO(wabain): Add test case\n if (!this.divaState.viewerCore.isValidOption('pagesPerRow', pagesPerRow))\n return false;\n\n return this._reloadViewer({\n inGrid: true,\n pagesPerRow: pagesPerRow\n });\n }\n\n /**\n * Align this diva instance with a state object (as returned by getState)\n *\n * @public\n * @params {object} state - A Diva state object.\n * @returns {boolean} - True if the operation was successful.\n **/\n setState (state)\n {\n this._reloadViewer(this._getLoadOptionsForState(state));\n }\n\n /**\n * Show non-paged pages.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n showNonPagedPages ()\n {\n this._reloadViewer({ showNonPagedPages: true });\n }\n\n /**\n * Sets the zoom level.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n setZoomLevel (zoomLevel)\n {\n if (this.settings.inGrid)\n {\n this._reloadViewer({\n inGrid: false\n });\n }\n\n return this.divaState.viewerCore.zoom(zoomLevel);\n }\n\n /**\n * Toggle fullscreen mode.\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n toggleFullscreenMode ()\n {\n this._toggleFullscreen();\n }\n\n /**\n * Show/Hide non-paged pages\n *\n * @public\n * @returns {boolean} - True if the operation was successful.\n **/\n toggleNonPagedPagesVisibility ()\n {\n this._reloadViewer({\n showNonPagedPages: !this.settings.showNonPagedPages\n });\n }\n\n //Changes between horizontal layout and vertical layout. Returns true if document is now vertically oriented, false otherwise.\n toggleOrientation ()\n {\n return this._togglePageLayoutOrientation();\n }\n\n /**\n * Translates a measurement from the zoom level on the largest size\n * to one on the current zoom level.\n *\n * For example, a point 1000 on an image that is on zoom level 2 of 5\n * translates to a position of 111.111... (1000 / (5 - 2)^2).\n *\n * Works for a single pixel co-ordinate or a dimension (e.g., translates a box\n * that is 1000 pixels wide on the original to one that is 111.111 pixels wide\n * on the current zoom level).\n *\n * @public\n * @params {number} position - A point on the max zoom level\n * @returns {number} - The same point on the current zoom level.\n */\n translateFromMaxZoomLevel (position)\n {\n const zoomDifference = this.settings.maxZoomLevel - this.settings.zoomLevel;\n return position / Math.pow(2, zoomDifference);\n }\n\n /**\n * Translates a measurement from the current zoom level to the position on the\n * largest zoom level.\n *\n * Works for a single pixel co-ordinate or a dimension (e.g., translates a box\n * that is 111.111 pixels wide on the current image to one that is 1000 pixels wide\n * on the current zoom level).\n *\n * @public\n * @params {number} position - A point on the current zoom level\n * @returns {number} - The same point on the max zoom level.\n */\n translateToMaxZoomLevel (position)\n {\n const zoomDifference = this.settings.maxZoomLevel - this.settings.zoomLevel;\n\n // if there is no difference, it's a box on the max zoom level and\n // we can just return the position.\n if (zoomDifference === 0)\n return position;\n\n return position * Math.pow(2, zoomDifference);\n }\n\n /**\n * Zoom in.\n *\n * @public\n * @returns {boolean} - false if it's at the maximum zoom\n **/\n zoomIn ()\n {\n return this.setZoomLevel(this.settings.zoomLevel + 1);\n }\n\n /**\n * Zoom out.\n * @returns {boolean} - false if it's at the minimum zoom\n **/\n zoomOut ()\n {\n return this.setZoomLevel(this.settings.zoomLevel - 1);\n }\n}\n\nexport default Diva;\n\n/**\n * Make `Diva` available in the global context.\n * */\n(function (global)\n{\n global.Diva = global.Diva || Diva;\n global.Diva.Events = diva.Events;\n})(window);\n","import maxBy from 'lodash.maxby';\nimport PageToolsOverlay from './page-tools-overlay';\n\n\nexport default class DocumentHandler\n{\n constructor (viewerCore)\n {\n this._viewerCore = viewerCore;\n this._viewerState = viewerCore.getInternalState();\n this._overlays = [];\n\n if (this._viewerCore.getPageTools().length)\n {\n const numPages = viewerCore.getSettings().numPages;\n\n for (let i = 0; i < numPages; i++)\n {\n const overlay = new PageToolsOverlay(i, viewerCore);\n this._overlays.push(overlay);\n this._viewerCore.addPageOverlay(overlay);\n }\n }\n }\n\n // USER EVENTS\n onDoubleClick (event, coords)\n {\n const settings = this._viewerCore.getSettings();\n const newZoomLevel = event.ctrlKey ? settings.zoomLevel - 1 : settings.zoomLevel + 1;\n\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n this._viewerCore.zoom(newZoomLevel, position);\n }\n\n onPinch (event, coords, startDistance, endDistance)\n {\n // FIXME: Do this check in a way which is less spaghetti code-y\n const viewerState = this._viewerCore.getInternalState();\n const settings = this._viewerCore.getSettings();\n\n let newZoomLevel = Math.log(Math.pow(2, settings.zoomLevel) * endDistance / (startDistance * Math.log(2))) / Math.log(2);\n newZoomLevel = Math.max(settings.minZoomLevel, newZoomLevel);\n newZoomLevel = Math.min(settings.maxZoomLevel, newZoomLevel);\n\n if (newZoomLevel === settings.zoomLevel)\n {\n return;\n }\n\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n\n const layout = this._viewerCore.getCurrentLayout();\n const centerOffset = layout.getPageToViewportCenterOffset(position.anchorPage, viewerState.viewport);\n const scaleRatio = 1 / Math.pow(2, settings.zoomLevel - newZoomLevel);\n\n this._viewerCore.reload({\n zoomLevel: newZoomLevel,\n goDirectlyTo: position.anchorPage,\n horizontalOffset: (centerOffset.x - position.offset.left) + position.offset.left * scaleRatio,\n verticalOffset: (centerOffset.y - position.offset.top) + position.offset.top * scaleRatio\n });\n }\n\n // VIEW EVENTS\n onViewWillLoad ()\n {\n this._viewerCore.publish('DocumentWillLoad', this._viewerCore.getSettings());\n }\n\n onViewDidLoad ()\n {\n // TODO: Should only be necessary to handle changes on view update, not\n // initial load\n this._handleZoomLevelChange();\n\n const currentPageIndex = this._viewerCore.getSettings().currentPageIndex;\n const fileName = this._viewerCore.getPageName(currentPageIndex);\n this._viewerCore.publish(\"DocumentDidLoad\", currentPageIndex, fileName);\n }\n\n onViewDidUpdate (renderedPages, targetPage)\n {\n const currentPage = (targetPage !== null) ?\n targetPage :\n getCentermostPage(renderedPages, this._viewerCore.getCurrentLayout(), this._viewerCore.getViewport());\n\n // Don't change the current page if there is no page in the viewport\n // FIXME: Would be better to fall back to the page closest to the viewport\n if (currentPage !== null)\n {\n this._viewerCore.setCurrentPage(currentPage);\n }\n\n if (targetPage !== null)\n {\n this._viewerCore.publish(\"ViewerDidJump\", targetPage);\n }\n\n this._handleZoomLevelChange();\n }\n\n _handleZoomLevelChange ()\n {\n const viewerState = this._viewerState;\n const zoomLevel = viewerState.options.zoomLevel;\n\n // If this is not the initial load, trigger the zoom events\n if (viewerState.oldZoomLevel !== zoomLevel && viewerState.oldZoomLevel >= 0)\n {\n if (viewerState.oldZoomLevel < zoomLevel)\n {\n this._viewerCore.publish(\"ViewerDidZoomIn\", zoomLevel);\n }\n else\n {\n this._viewerCore.publish(\"ViewerDidZoomOut\", zoomLevel);\n }\n\n this._viewerCore.publish(\"ViewerDidZoom\", zoomLevel);\n }\n\n viewerState.oldZoomLevel = zoomLevel;\n }\n\n destroy ()\n {\n this._overlays.forEach((overlay) =>\n {\n this._viewerCore.removePageOverlay(overlay);\n }, this);\n }\n}\n\nfunction getCentermostPage (renderedPages, layout, viewport)\n{\n const centerY = viewport.top + (viewport.height / 2);\n const centerX = viewport.left + (viewport.width / 2);\n\n // Find the minimum distance from the viewport center to a page.\n // Compute minus the squared distance from viewport center to the page's border.\n // http://gamedev.stackexchange.com/questions/44483/how-do-i-calculate-distance-between-a-point-and-an-axis-aligned-rectangle\n const centerPage = maxBy(renderedPages, pageIndex =>\n {\n const dims = layout.getPageDimensions(pageIndex);\n const imageOffset = layout.getPageOffset(pageIndex, {excludePadding: false});\n\n const midX = imageOffset.left + (dims.height / 2);\n const midY = imageOffset.top + (dims.width / 2);\n\n const dx = Math.max(Math.abs(centerX - midX) - (dims.width / 2), 0);\n const dy = Math.max(Math.abs(centerY - midY) - (dims.height / 2), 0);\n\n return -(dx * dx + dy * dy);\n });\n\n return centerPage != null ? centerPage : null;\n}\n","/**\n * Translate page layouts, as generated by page-layouts, into an\n * object which computes layout information for the document as\n * a whole.\n */\nexport default class DocumentLayout\n{\n constructor (config, zoomLevel)\n {\n const computedLayout = getComputedLayout(config, zoomLevel);\n\n this.dimensions = computedLayout.dimensions;\n this.pageGroups = computedLayout.pageGroups;\n this._pageLookup = getPageLookup(computedLayout.pageGroups);\n }\n\n /**\n * @typedef {Object} PageInfo\n * @property {number} index\n * @property {{index, dimensions, pages, region, padding}} group\n * @property {{height: number, width: number}} dimensions\n * @property {{top: number, left: number}} groupOffset\n */\n\n /**\n * @param pageIndex\n * @returns {PageInfo|null}\n */\n getPageInfo (pageIndex)\n {\n return this._pageLookup[pageIndex] || null;\n }\n\n /**\n * Get the dimensions of a page\n *\n * @param pageIndex\n * @returns {{height: number, width: number}}\n */\n getPageDimensions (pageIndex)\n {\n if (!this._pageLookup || !this._pageLookup[pageIndex])\n return null;\n\n const region = getPageRegionFromPageInfo(this._pageLookup[pageIndex]);\n\n return {\n height: region.bottom - region.top,\n width: region.right - region.left\n };\n }\n\n // TODO(wabain): Get rid of this; it's a subset of the page region, so\n // give that instead\n /**\n * Get the top-left coordinates of a page, including*** padding\n *\n * @param pageIndex\n * @param options\n * @returns {{top: number, left: number} | null}\n */\n getPageOffset (pageIndex, options)\n {\n const region = this.getPageRegion(pageIndex, options);\n\n if (!region)\n return null;\n\n return {\n top: region.top,\n left: region.left\n };\n }\n\n getPageRegion (pageIndex, options)\n {\n const pageInfo = this._pageLookup[pageIndex];\n\n if (!pageInfo)\n return null;\n\n const region = getPageRegionFromPageInfo(pageInfo);\n\n if (options && options.excludePadding)\n {\n // FIXME?\n const padding = pageInfo.group.padding;\n\n return {\n top: region.top + padding.top,\n left: region.left + padding.left,\n bottom: region.bottom,\n right: region.right\n };\n }\n\n return region;\n }\n\n /**\n * Get the distance from the top-right of the page to the center of the\n * specified viewport region\n *\n * @param pageIndex\n * @param viewport {{top: number, left: number, bottom: number, right: number}}\n * @returns {{x: number, y: number}}\n */\n getPageToViewportCenterOffset (pageIndex, viewport)\n {\n const scrollLeft = viewport.left;\n const elementWidth = viewport.right - viewport.left;\n\n const offset = this.getPageOffset(pageIndex);\n\n const x = scrollLeft - offset.left + parseInt(elementWidth / 2, 10);\n\n const scrollTop = viewport.top;\n const elementHeight = viewport.bottom - viewport.top;\n\n const y = scrollTop - offset.top + parseInt(elementHeight / 2, 10);\n\n return {\n x: x,\n y: y\n };\n }\n}\n\nfunction getPageRegionFromPageInfo (page)\n{\n const top = page.groupOffset.top + page.group.region.top;\n const bottom = top + page.dimensions.height;\n const left = page.groupOffset.left + page.group.region.left;\n const right = left + page.dimensions.width;\n\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right\n };\n}\n\nfunction getPageLookup (pageGroups)\n{\n const pageLookup = {};\n\n pageGroups.forEach(group => {\n group.pages.forEach(page => {\n pageLookup[page.index] = {\n index: page.index,\n group: group,\n dimensions: page.dimensions,\n groupOffset: page.groupOffset\n };\n });\n });\n\n return pageLookup;\n}\n\nfunction getComputedLayout (config, zoomLevel)\n{\n const scaledLayouts = zoomLevel === null ? config.pageLayouts : getScaledPageLayouts(config, zoomLevel);\n\n const documentSecondaryExtent = getExtentAlongSecondaryAxis(config, scaledLayouts);\n\n // The current position in the document along the primary axis\n let primaryDocPosition = config.verticallyOriented ?\n config.padding.document.top :\n config.padding.document.left;\n\n const pageGroups = [];\n\n // TODO: Use bottom, right as well\n const pagePadding = {\n top: config.padding.page.top,\n left: config.padding.page.left\n };\n\n scaledLayouts.forEach((layout, index) => {\n let top, left;\n\n if (config.verticallyOriented)\n {\n top = primaryDocPosition;\n left = (documentSecondaryExtent - layout.dimensions.width) / 2;\n }\n else\n {\n top = (documentSecondaryExtent - layout.dimensions.height) / 2;\n left = primaryDocPosition;\n }\n\n const region = {\n top: top,\n bottom: top + pagePadding.top + layout.dimensions.height,\n left: left,\n right: left + pagePadding.left + layout.dimensions.width\n };\n\n pageGroups.push({\n index: index,\n dimensions: layout.dimensions,\n pages: layout.pages,\n region: region,\n padding: pagePadding\n });\n\n primaryDocPosition = config.verticallyOriented ? region.bottom : region.right;\n });\n\n let height, width;\n\n if (config.verticallyOriented)\n {\n height = primaryDocPosition + pagePadding.top;\n width = documentSecondaryExtent;\n }\n else\n {\n height = documentSecondaryExtent;\n width = primaryDocPosition + pagePadding.left;\n }\n\n return {\n dimensions: {\n height: height,\n width: width\n },\n pageGroups: pageGroups\n };\n}\n\nfunction getScaledPageLayouts (config, zoomLevel)\n{\n const scaleRatio = Math.pow(2, zoomLevel - config.maxZoomLevel);\n\n return config.pageLayouts.map(group => ({\n dimensions: scaleDimensions(group.dimensions, scaleRatio),\n\n pages: group.pages.map(page => ({\n index: page.index,\n\n groupOffset: {\n top: Math.floor(page.groupOffset.top * scaleRatio),\n left: Math.floor(page.groupOffset.left * scaleRatio)\n },\n\n dimensions: scaleDimensions(page.dimensions, scaleRatio)\n }))\n }));\n}\n\nfunction scaleDimensions (dimensions, scaleRatio)\n{\n return {\n height: Math.floor(dimensions.height * scaleRatio),\n width: Math.floor(dimensions.width * scaleRatio)\n };\n}\n\nfunction getExtentAlongSecondaryAxis (config, scaledLayouts)\n{\n // Get the extent of the document along the secondary axis\n let secondaryDim, secondaryPadding;\n const docPadding = config.padding.document;\n\n if (config.verticallyOriented)\n {\n secondaryDim = 'width';\n secondaryPadding = docPadding.left + docPadding.right;\n }\n else\n {\n secondaryDim = 'height';\n secondaryPadding = docPadding.top + docPadding.bottom;\n }\n\n return secondaryPadding + scaledLayouts.reduce((maxDim, layout) => Math.max(layout.dimensions[secondaryDim], maxDim), 0);\n}\n","export function DivaParentElementNotFoundException (message)\n{\n this.name = \"DivaParentElementNotFoundException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nDivaParentElementNotFoundException.prototype = new Error();\n\nexport function NotAnIIIFManifestException (message)\n{\n this.name = \"NotAnIIIFManifestException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nNotAnIIIFManifestException.prototype = new Error();\n\nexport function ObjectDataNotSuppliedException (message)\n{\n this.name = \"ObjectDataNotSuppliedException\";\n this.message = message;\n this.stack = (new Error()).stack;\n}\n\nObjectDataNotSuppliedException.prototype = new Error();\n","export default {\n onDoubleClick,\n onPinch,\n onDoubleTap\n};\n\nconst DOUBLE_CLICK_TIMEOUT = 500;\nconst DOUBLE_TAP_DISTANCE_THRESHOLD = 50;\nconst DOUBLE_TAP_TIMEOUT = 250;\n\nfunction onDoubleClick(elem, callback)\n{\n elem.addEventListener('dblclick', function (event)\n {\n if (!event.ctrlKey)\n {\n callback(event, getRelativeOffset(event.currentTarget, event));\n }\n });\n\n // Handle the control key for macs (in conjunction with double-clicking)\n // FIXME: Does a click get handled with ctrl pressed on non-Macs?\n const tracker = createDoubleEventTracker(DOUBLE_CLICK_TIMEOUT);\n\n elem.addEventListener('contextmenu', function (event)\n {\n event.preventDefault();\n\n if (event.ctrlKey)\n {\n if (tracker.isTriggered())\n {\n tracker.reset();\n callback(event, getRelativeOffset(event.currentTarget, event));\n }\n else\n {\n tracker.trigger();\n }\n }\n });\n}\n\nfunction onPinch(elem, callback)\n{\n let startDistance = 0;\n\n elem.addEventListener('touchstart', function (event)\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (event.originalEvent.touches.length === 2)\n {\n startDistance = distance(\n event.originalEvent.touches[0].clientX,\n event.originalEvent.touches[0].clientY,\n event.originalEvent.touches[1].clientX,\n event.originalEvent.touches[1].clientY\n );\n }\n });\n\n elem.addEventListener('touchmove', function(event)\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (event.originalEvent.touches.length === 2)\n {\n const touches = event.originalEvent.touches;\n\n const moveDistance = distance(\n touches[0].clientX,\n touches[0].clientY,\n touches[1].clientX,\n touches[1].clientY\n );\n\n const zoomDelta = moveDistance - startDistance;\n\n if (Math.abs(zoomDelta) > 0)\n {\n const touchCenter = {\n pageX: (touches[0].clientX + touches[1].clientX) / 2,\n pageY: (touches[0].clientY + touches[1].clientY) / 2\n };\n\n callback(event, getRelativeOffset(event.currentTarget, touchCenter), startDistance, moveDistance);\n }\n }\n });\n}\n\nfunction onDoubleTap(elem, callback)\n{\n const tracker = createDoubleEventTracker(DOUBLE_TAP_TIMEOUT);\n let firstTap = null;\n\n elem.addEventListener('touchend', (event) =>\n {\n // Prevent mouse event from firing\n event.preventDefault();\n\n if (tracker.isTriggered())\n {\n tracker.reset();\n\n // Doubletap has occurred\n const secondTap = {\n pageX: event.originalEvent.changedTouches[0].clientX,\n pageY: event.originalEvent.changedTouches[0].clientY\n };\n\n // If first tap is close to second tap (prevents interference with scale event)\n const tapDistance = distance(firstTap.pageX, firstTap.pageY, secondTap.pageX, secondTap.pageY);\n\n // TODO: Could give something higher-level than secondTap to callback\n if (tapDistance < DOUBLE_TAP_DISTANCE_THRESHOLD)\n callback(event, getRelativeOffset(event.currentTarget, secondTap));\n\n firstTap = null;\n }\n else\n {\n firstTap = {\n pageX: event.originalEvent.changedTouches[0].clientX,\n pageY: event.originalEvent.changedTouches[0].clientY\n };\n\n tracker.trigger();\n }\n });\n}\n\n// Pythagorean theorem to get the distance between two points (used for\n// calculating finger distance for double-tap and pinch-zoom)\nfunction distance(x1, y1, x2, y2)\n{\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n}\n\n// Utility to keep track of whether an event has been triggered twice\n// during a a given duration\nfunction createDoubleEventTracker(timeoutDuration)\n{\n let triggered = false;\n let timeoutId = null;\n\n return {\n trigger()\n {\n triggered = true;\n resetTimeout();\n timeoutId = setTimeout(function ()\n {\n triggered = false;\n timeoutId = null;\n }, timeoutDuration);\n },\n isTriggered()\n {\n return triggered;\n },\n reset()\n {\n triggered = false;\n resetTimeout();\n }\n };\n\n function resetTimeout()\n {\n if (timeoutId !== null)\n {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n}\n\nfunction getRelativeOffset(elem, pageCoords)\n{\n const bounds = elem.getBoundingClientRect();\n\n return {\n left: pageCoords.pageX - bounds.left,\n top: pageCoords.pageY - bounds.top\n };\n}\n","import maxBy from 'lodash.maxby';\n\nexport default class GridHandler\n{\n constructor (viewerCore)\n {\n this._viewerCore = viewerCore;\n }\n\n // USER EVENTS\n onDoubleClick (event, coords)\n {\n const position = this._viewerCore.getPagePositionAtViewportOffset(coords);\n\n const layout = this._viewerCore.getCurrentLayout();\n const viewport = this._viewerCore.getViewport();\n const pageToViewportCenterOffset = layout.getPageToViewportCenterOffset(position.anchorPage, viewport);\n\n this._viewerCore.reload({\n inGrid: false,\n goDirectlyTo: position.anchorPage,\n horizontalOffset: pageToViewportCenterOffset.x + position.offset.left,\n verticalOffset: pageToViewportCenterOffset.y + position.offset.top\n });\n }\n\n onPinch ()\n {\n this._viewerCore.reload({inGrid: false});\n }\n\n // VIEW EVENTS\n onViewWillLoad ()\n {\n // FIXME(wabain): Should something happen here?\n /* No-op */\n }\n\n onViewDidLoad ()\n {\n // FIXME(wabain): Should something happen here?\n /* No-op */\n }\n\n onViewDidUpdate (renderedPages, targetPage)\n {\n // return early if there are no rendered pages in view.\n if (renderedPages.length === 0) return;\n\n if (targetPage !== null)\n {\n this._viewerCore.setCurrentPage(targetPage);\n return;\n }\n\n // Select the current page from the first row if it is fully visible, or from\n // the second row if it is fully visible, or from the centermost row otherwise.\n // If the current page is in that group then don't change it. Otherwise, set\n // the current page to the group's first page.\n\n const layout = this._viewerCore.getCurrentLayout();\n const groups = [];\n\n renderedPages.forEach(pageIndex =>\n {\n const group = layout.getPageInfo(pageIndex).group;\n if (groups.length === 0 || group !== groups[groups.length - 1])\n {\n groups.push(group);\n }\n });\n\n const viewport = this._viewerCore.getViewport();\n let chosenGroup;\n\n if (groups.length === 1 || groups[0].region.top >= viewport.top)\n {\n chosenGroup = groups[0];\n }\n else if (groups[1].region.bottom <= viewport.bottom)\n {\n chosenGroup = groups[1];\n }\n else\n {\n chosenGroup = getCentermostGroup(groups, viewport);\n }\n\n const currentPage = this._viewerCore.getSettings().currentPageIndex;\n\n const hasCurrentPage = chosenGroup.pages.some(page => page.index === currentPage);\n\n if (!hasCurrentPage)\n {\n this._viewerCore.setCurrentPage(chosenGroup.pages[0].index);\n }\n }\n\n destroy ()\n {\n // No-op\n }\n}\n\nfunction getCentermostGroup (groups, viewport)\n{\n const viewportMiddle = viewport.top + viewport.height / 2;\n\n return maxBy(groups, group =>\n {\n const groupMiddle = group.region.top + group.dimensions.height / 2;\n return -Math.abs(viewportMiddle - groupMiddle);\n });\n}\n","export default class IIIFSourceAdapter\n{\n getPageImageURL (manifest, pageIndex, size)\n {\n let dimens;\n\n if (!size || (size.width == null && size.height == null))\n {\n dimens = 'full';\n }\n else\n {\n dimens = (size.width == null ? '' : size.width) + ',' + (size.height == null ? '' : size.height);\n }\n\n const page = manifest.pages[pageIndex];\n const quality = (page.api > 1.1) ? 'default' : 'native';\n\n return encodeURI(page.url + 'full/' + dimens + '/0/' + quality + '.jpg');\n }\n\n getTileImageURL (manifest, pageIndex, params)\n {\n const page = manifest.pages[pageIndex];\n\n let height, width;\n\n if (params.row === params.rowCount - 1)\n {\n height = page.d[params.zoomLevel].h - (params.rowCount - 1) * params.tileDimensions.height;\n }\n else\n {\n height = params.tileDimensions.height;\n }\n\n if (params.col === params.colCount - 1)\n {\n width = page.d[params.zoomLevel].w - (params.colCount - 1) * params.tileDimensions.width;\n }\n else\n {\n width = params.tileDimensions.width;\n }\n\n const zoomDifference = Math.pow(2, manifest.maxZoom - params.zoomLevel);\n\n let x = params.col * params.tileDimensions.width * zoomDifference;\n let y = params.row * params.tileDimensions.height * zoomDifference;\n\n if (page.hasOwnProperty('xoffset'))\n {\n x += page.xoffset;\n y += page.yoffset;\n }\n\n const region = [x, y, width * zoomDifference, height * zoomDifference].join(',');\n\n const quality = (page.api > 1.1) ? 'default' : 'native';\n\n return encodeURI(page.url + region + '/' + width + ',' + height + '/0/' + quality + '.jpg');\n }\n}\n","const debug = require('debug')('diva:ImageCache');\n\n/* FIXME(wabain): The caching strategy here is completely\n * arbitrary and the implementation isn't especially efficient.\n */\nconst DEFAULT_MAX_KEYS = 100;\n\nexport default class ImageCache\n{\n constructor (options)\n {\n options = options || { maxKeys: DEFAULT_MAX_KEYS };\n this.maxKeys = options.maxKeys || DEFAULT_MAX_KEYS;\n\n this._held = {};\n this._urls = {};\n this._lru = [];\n }\n\n get (url)\n {\n const record = this._urls[url];\n return record ? record.img : null;\n }\n\n has (url)\n {\n return !!this._urls[url];\n }\n\n put (url, img)\n {\n let record = this._urls[url];\n if (record)\n {\n // FIXME: Does this make sense for this use case?\n record.img = img;\n this._promote(record);\n }\n else\n {\n record = {\n img: img,\n url: url\n };\n\n this._urls[url] = record;\n this._tryEvict(1);\n this._lru.unshift(record);\n }\n }\n\n _promote (record)\n {\n const index = this._lru.indexOf(record);\n this._lru.splice(index, 1);\n this._lru.unshift(record);\n }\n\n _tryEvict (extraCapacity)\n {\n const allowedEntryCount = this.maxKeys - extraCapacity;\n\n if (this._lru.length <= allowedEntryCount)\n return;\n\n let evictionIndex = this._lru.length - 1;\n\n for (;;)\n {\n const target = this._lru[evictionIndex];\n\n if (!this._held[target.url])\n {\n debug('Evicting image %s', target.url);\n this._lru.splice(evictionIndex, 1);\n delete this._urls[target.url];\n\n if (this._lru.length <= allowedEntryCount)\n break;\n }\n\n if (evictionIndex === 0)\n {\n /* istanbul ignore next */\n debug.enabled && debug('Cache overfull by %s (all entries are being held)',\n this._lru.length - allowedEntryCount);\n\n break;\n }\n\n evictionIndex--;\n }\n }\n\n acquire (url)\n {\n this._held[url] = (this._held[url] || 0) + 1;\n this._promote(this._urls[url]);\n }\n\n release (url)\n {\n const count = this._held[url];\n\n if (count > 1)\n this._held[url]--;\n else\n delete this._held[url];\n\n this._tryEvict(0);\n }\n}\n","import parseIIIFManifest from './parse-iiif-manifest';\nimport IIIFSourceAdapter from \"./iiif-source-adapter\";\n\n\nexport default class ImageManifest\n{\n constructor (data, urlAdapter)\n {\n // Save all the data we need\n this.pages = data.pgs;\n this.maxZoom = data.max_zoom;\n this.maxRatio = data.dims.max_ratio;\n this.minRatio = data.dims.min_ratio;\n this.itemTitle = data.item_title;\n\n // Only given for IIIF manifests\n this.paged = !!data.paged;\n\n // These are arrays, the index corresponding to the zoom level\n this._maxWidths = data.dims.max_w;\n this._maxHeights = data.dims.max_h;\n this._averageWidths = data.dims.a_wid;\n this._averageHeights = data.dims.a_hei;\n this._totalHeights = data.dims.t_hei;\n this._totalWidths = data.dims.t_wid;\n\n this._urlAdapter = urlAdapter;\n }\n\n static fromIIIF (iiifManifest)\n {\n const data = parseIIIFManifest(iiifManifest);\n return new ImageManifest(data, new IIIFSourceAdapter());\n }\n\n isPageValid (pageIndex, showNonPagedPages)\n {\n if (!showNonPagedPages && this.paged && !this.pages[pageIndex].paged)\n {\n return false;\n }\n\n return pageIndex >= 0 && pageIndex < this.pages.length;\n }\n\n getMaxPageDimensions (pageIndex)\n {\n const maxDims = this.pages[pageIndex].d[this.maxZoom];\n\n return {\n height: maxDims.h,\n width: maxDims.w\n };\n }\n\n getPageDimensionsAtZoomLevel (pageIndex, zoomLevel)\n {\n const maxDims = this.pages[pageIndex].d[this.maxZoom];\n\n const scaleRatio = getScaleRatio(this.maxZoom, zoomLevel);\n\n return {\n height: maxDims.h * scaleRatio,\n width: maxDims.w * scaleRatio\n };\n }\n\n /**\n * Returns a URL for the image of the given page. The optional size\n * parameter supports setting the image width or height (default is\n * full-sized).\n */\n getPageImageURL (pageIndex, size)\n {\n return this._urlAdapter.getPageImageURL(this, pageIndex, size);\n }\n\n /**\n * Return an array of tile objects for the specified page and integer zoom level\n */\n getPageImageTiles (pageIndex, zoomLevel, tileDimensions)\n {\n const page = this.pages[pageIndex];\n\n if (!isFinite(zoomLevel) || zoomLevel % 1 !== 0)\n {\n throw new TypeError('Zoom level must be an integer: ' + zoomLevel);\n }\n\n const rows = Math.ceil(page.d[zoomLevel].h / tileDimensions.height);\n const cols = Math.ceil(page.d[zoomLevel].w / tileDimensions.width);\n\n const tiles = [];\n\n let row, col, url;\n\n for (row = 0; row < rows; row++)\n {\n for (col = 0; col < cols; col++)\n {\n url = this._urlAdapter.getTileImageURL(this, pageIndex, {\n row: row,\n col: col,\n rowCount: rows,\n colCount: cols,\n zoomLevel: zoomLevel,\n tileDimensions: tileDimensions\n });\n\n // FIXME: Dimensions should account for partial tiles (e.g. the\n // last row and column in a tiled image)\n tiles.push({\n row: row,\n col: col,\n zoomLevel: zoomLevel,\n dimensions: {\n height: tileDimensions.height,\n width: tileDimensions.width\n },\n offset: {\n top: row * tileDimensions.height,\n left: col * tileDimensions.width\n },\n url: url\n });\n }\n }\n\n return {\n zoomLevel: zoomLevel,\n rows: rows,\n cols: cols,\n tiles: tiles\n };\n }\n}\n\nImageManifest.prototype.getMaxWidth = zoomedPropertyGetter('_maxWidths');\nImageManifest.prototype.getMaxHeight = zoomedPropertyGetter('_maxHeights');\nImageManifest.prototype.getAverageWidth = zoomedPropertyGetter('_averageWidths');\nImageManifest.prototype.getAverageHeight = zoomedPropertyGetter('_averageHeights');\nImageManifest.prototype.getTotalWidth = zoomedPropertyGetter('_totalWidths');\nImageManifest.prototype.getTotalHeight = zoomedPropertyGetter('_totalHeights');\n\nfunction zoomedPropertyGetter (privateName)\n{\n return function (zoomLevel)\n {\n return this[privateName][zoomLevel];\n };\n}\n\nfunction getScaleRatio (sourceZoomLevel, targetZoomLevel)\n{\n return 1 / Math.pow(2, sourceZoomLevel - targetZoomLevel);\n}\n","const debug = require('debug')('diva:ImageRequestHandler');\n/**\n * Handler for the request for an image tile\n *\n * @param url\n * @param callback\n * @constructor\n */\nexport default class ImageRequestHandler\n{\n constructor (options)\n {\n this._url = options.url;\n this._callback = options.load;\n this._errorCallback = options.error;\n this.timeoutTime = options.timeoutTime || 0;\n this._aborted = this._complete = false;\n\n //Use a timeout to allow the requests to be debounced (as they are in renderer)\n this.timeout = setTimeout(() => {\n // Initiate the request\n this._image = new Image();\n this._image.crossOrigin = \"anonymous\";\n this._image.onload = this._handleLoad.bind(this);\n this._image.onerror = this._handleError.bind(this);\n this._image.src = options.url;\n\n debug('Requesting image %s', options.url);\n }, this.timeoutTime);\n }\n\n abort ()\n {\n debug('Aborting request to %s', this._url);\n\n clearTimeout(this.timeout);\n\n // FIXME\n // People on the Internet say that doing this {{should/should not}} abort the request. I believe\n // it corresponds to what the WHATWG HTML spec says should happen when the UA\n // updates the image data if selected source is null.\n //\n // Sources:\n //\n // https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element\n // http://stackoverflow.com/questions/7390888/does-changing-the-src-attribute-of-an-image-stop-the-image-from-downloading\n if (this._image)\n {\n this._image.onload = this._image.onerror = null;\n\n this._image.src = '';\n }\n\n this._aborted = true;\n }\n\n _handleLoad ()\n {\n if (this._aborted)\n {\n console.error('ImageRequestHandler invoked on cancelled request for ' + this._url);\n return;\n }\n\n if (this._complete)\n {\n console.error('ImageRequestHandler invoked on completed request for ' + this._url);\n return;\n }\n\n this._complete = true;\n\n debug('Received image %s', this._url);\n this._callback(this._image);\n }\n\n _handleError ()\n {\n debug('Failed to load image %s', this._url);\n this._errorCallback(this._image);\n }\n}\n","// TODO: requestAnimationFrame fallback\n\nexport default {\n animate,\n easing: {\n linear: linearEasing,\n cubic: inOutCubicEasing\n }\n};\n\nlet now;\n\nif (typeof performance !== 'undefined' && performance.now)\n{\n now = () => { return performance.now(); };\n}\nelse\n{\n now = () => { return Date.now(); };\n}\n\n\nfunction animate (options)\n{\n const durationMs = options.duration;\n const parameters = options.parameters;\n const onUpdate = options.onUpdate;\n const onEnd = options.onEnd;\n\n // Setup\n // Times are in milliseconds from a basically arbitrary start\n const start = now(); \n const end = start + durationMs;\n\n const tweenFns = {};\n const values = {};\n const paramKeys = Object.keys(parameters);\n\n paramKeys.forEach(key => {\n const config = parameters[key];\n tweenFns[key] = interpolate(config.from, config.to, config.easing || inOutCubicEasing);\n });\n\n // Run it!\n let requestId = requestAnimationFrame(update);\n\n return {\n cancel()\n {\n if (requestId !== null)\n {\n cancelAnimationFrame(requestId);\n handleAnimationCompletion({\n interrupted: true\n });\n }\n }\n };\n\n function update()\n {\n const current = now(); \n const elapsed = Math.min((current - start) / durationMs, 1);\n\n updateValues(elapsed);\n onUpdate(values);\n\n if (current < end)\n {\n requestId = requestAnimationFrame(update);\n }\n else\n {\n handleAnimationCompletion({\n interrupted: false\n });\n }\n }\n\n function updateValues(elapsed)\n {\n paramKeys.forEach(key => {\n values[key] = tweenFns[key](elapsed);\n });\n }\n\n function handleAnimationCompletion(info)\n {\n requestId = null;\n\n if (onEnd)\n onEnd(info);\n }\n}\n\nfunction interpolate(start, end, easing)\n{\n return (elapsed) => { return start + (end - start) * easing(elapsed); };\n}\n\n/**\n * Easing functions. inOutCubicEasing is the default, but\n * others are given for convenience.\n *\n **/\nfunction linearEasing(e)\n{\n return e;\n}\n\nfunction inOutCubicEasing (t)\n{\n return t < 0.5 ? 4 * t * t * t : ( t - 1 ) * ( 2 * t - 2 ) * ( 2 * t - 2 ) + 1;\n}\n","import getPageDimensions from './page-dimensions';\n\nexport default function getBookLayoutGroups (viewerConfig)\n{\n const groupings = getGroupings(viewerConfig);\n\n return groupings.map(grouping => getGroupLayoutsFromPageGrouping(viewerConfig, grouping));\n}\n\nfunction getGroupings(viewerConfig)\n{\n const manifest = viewerConfig.manifest;\n\n const pagesByGroup = [];\n let leftPage = null;\n let nonPagedPages = []; // Pages to display below the current group\n\n const _addNonPagedPages = () =>\n {\n for (let i = 0, nlen = nonPagedPages.length; i < nlen; i++)\n {\n pagesByGroup.push([ nonPagedPages[i] ]);\n }\n nonPagedPages = [];\n };\n\n manifest.pages.forEach( (page, index) =>\n {\n const pageRecord = {\n index: index,\n dimensions: getPageDimensions(index, manifest),\n paged: (!manifest.paged || page.paged)\n };\n\n // Only display non-paged pages if specified in the settings\n if (!viewerConfig.showNonPagedPages && !pageRecord.paged)\n return;\n\n if (!pageRecord.paged)\n {\n nonPagedPages.push(pageRecord);\n }\n else if (index === 0 || page.facingPages)\n {\n // The first page is placed on its own\n pagesByGroup.push([pageRecord]);\n _addNonPagedPages();\n }\n else if (leftPage === null)\n {\n leftPage = pageRecord;\n }\n else\n {\n pagesByGroup.push([leftPage, pageRecord]);\n leftPage = null;\n _addNonPagedPages();\n }\n });\n\n // Flush a final left page\n if (leftPage !== null)\n {\n pagesByGroup.push([leftPage]);\n _addNonPagedPages();\n }\n\n return pagesByGroup;\n}\n\nfunction getGroupLayoutsFromPageGrouping(viewerConfig, grouping)\n{\n const verticallyOriented = viewerConfig.verticallyOriented;\n\n if (grouping.length === 2)\n return getFacingPageGroup(grouping[0], grouping[1], verticallyOriented);\n\n const page = grouping[0];\n const pageDims = page.dimensions;\n\n // The first page is placed on its own to the right in vertical orientation.\n // NB that this needs to be the page with index 0; if the first page is excluded\n // from the layout then this special case shouldn't apply.\n // If the page is tagged as 'non-paged', center it horizontally\n let leftOffset;\n if (page.paged)\n leftOffset = (page.index === 0 && verticallyOriented) ? pageDims.width : 0;\n else\n leftOffset = (verticallyOriented) ? pageDims.width / 2 : 0;\n\n const shouldBeHorizontallyAdjusted =\n verticallyOriented && !viewerConfig.manifest.pages[page.index].facingPages;\n\n // We need to left-align the page in vertical orientation, so we double\n // the group width\n return {\n dimensions: {\n height: pageDims.height,\n width: shouldBeHorizontallyAdjusted ? pageDims.width * 2 : pageDims.width\n },\n pages: [{\n index: page.index,\n groupOffset: {\n top: 0,\n left: leftOffset\n },\n dimensions: pageDims\n }]\n };\n}\n\nfunction getFacingPageGroup(leftPage, rightPage, verticallyOriented)\n{\n const leftDims = leftPage.dimensions;\n const rightDims = rightPage.dimensions;\n\n const height = Math.max(leftDims.height, rightDims.height);\n\n let width, firstLeftOffset, secondLeftOffset;\n\n if (verticallyOriented)\n {\n const midWidth = Math.max(leftDims.width, rightDims.width);\n\n width = midWidth * 2;\n\n firstLeftOffset = midWidth - leftDims.width;\n secondLeftOffset = midWidth;\n }\n else\n {\n width = leftDims.width + rightDims.width;\n firstLeftOffset = 0;\n secondLeftOffset = leftDims.width;\n }\n\n return {\n dimensions: {\n height: height,\n width: width\n },\n pages: [\n {\n index: leftPage.index,\n dimensions: leftDims,\n groupOffset: {\n top: 0,\n left: firstLeftOffset\n }\n },\n {\n index: rightPage.index,\n dimensions: rightDims,\n groupOffset: {\n top: 0,\n left: secondLeftOffset\n }\n }\n ]\n };\n}\n","\nexport default function getGridLayoutGroups (viewerConfig)\n{\n const viewportWidth = viewerConfig.viewport.width;\n const manifest = viewerConfig.manifest;\n const pagesPerRow = viewerConfig.pagesPerRow;\n const fixedHeightGrid = viewerConfig.fixedHeightGrid;\n const fixedPadding = viewerConfig.fixedPadding;\n const showNonPagedPages = viewerConfig.showNonPagedPages;\n\n const horizontalPadding = fixedPadding * (pagesPerRow + 1);\n const pageWidth = (viewportWidth - horizontalPadding) / pagesPerRow;\n const gridPageWidth = pageWidth;\n\n // Calculate the row height depending on whether we want to fix the width or the height\n const rowHeight = (fixedHeightGrid) ? fixedPadding + manifest.minRatio * pageWidth : fixedPadding + manifest.maxRatio * pageWidth;\n\n const groups = [];\n let currentPages = [];\n\n const getGridPageDimensions = pageData =>\n {\n // Calculate the width, height and horizontal placement of this page\n // Get dimensions at max zoom level, although any level should be fine\n const pageDimenData = pageData.d[pageData.d.length - 1];\n const heightToWidthRatio = pageDimenData.h / pageDimenData.w;\n\n let pageWidth, pageHeight;\n\n if (fixedHeightGrid)\n {\n pageWidth = (rowHeight - fixedPadding) / heightToWidthRatio;\n pageHeight = rowHeight - fixedPadding;\n }\n else\n {\n pageWidth = gridPageWidth;\n pageHeight = pageWidth * heightToWidthRatio;\n }\n\n return {\n width: Math.round(pageWidth),\n height: Math.round(pageHeight)\n };\n };\n\n const rowDimensions = {\n height: rowHeight,\n width: viewportWidth\n };\n\n manifest.pages.forEach( (page, pageIndex) =>\n {\n if (!showNonPagedPages && manifest.paged && !page.paged)\n return;\n\n // Calculate the width, height and horizontal placement of this page\n const pageDimens = getGridPageDimensions(page);\n let leftOffset = Math.floor(currentPages.length * (fixedPadding + gridPageWidth) + fixedPadding);\n\n // Center the page if the height is fixed (otherwise, there is no horizontal padding)\n if (fixedHeightGrid)\n {\n leftOffset += (gridPageWidth - pageDimens.width) / 2;\n }\n\n // TODO: Precompute page dimensions everywhere\n currentPages.push({\n index: pageIndex,\n dimensions: pageDimens,\n groupOffset: {\n top: 0,\n left: leftOffset\n }\n });\n\n if (currentPages.length === pagesPerRow)\n {\n groups.push({\n dimensions: rowDimensions,\n pages: currentPages\n });\n\n currentPages = [];\n }\n });\n\n if (currentPages.length > 0)\n {\n groups.push({\n dimensions: rowDimensions,\n pages: currentPages\n });\n }\n\n return groups;\n}\n","import getBookLayoutGroups from './book-layout';\nimport getSinglesLayoutGroups from './singles-layout';\nimport getGridLayoutGroups from './grid-layout';\n\n/** Get the relative positioning of pages for the current view */\nexport default function getPageLayouts (settings)\n{\n if (settings.inGrid)\n {\n return getGridLayoutGroups(pluck(settings, [\n 'manifest',\n 'viewport',\n 'pagesPerRow',\n 'fixedHeightGrid',\n 'fixedPadding',\n 'showNonPagedPages'\n ]));\n }\n else\n {\n const config = pluck(settings, ['manifest', 'verticallyOriented', 'showNonPagedPages']);\n\n if (settings.inBookLayout)\n return getBookLayoutGroups(config);\n else\n return getSinglesLayoutGroups(config);\n }\n}\n\nfunction pluck (obj, keys)\n{\n const out = {};\n keys.forEach(function (key)\n {\n out[key] = obj[key];\n });\n return out;\n}\n","export default function getPageDimensions (pageIndex, manifest)\n{\n const dims = manifest.getMaxPageDimensions(pageIndex);\n\n return {\n width: Math.floor(dims.width),\n height: Math.floor(dims.height)\n };\n}\n","import getPageDimensions from './page-dimensions';\n\nexport default function getSinglesLayoutGroups (viewerConfig)\n{\n const manifest = viewerConfig.manifest;\n\n // Render each page alone in a group\n const pages = [];\n manifest.pages.forEach( (page, index) =>\n {\n if (!viewerConfig.showNonPagedPages && manifest.paged && !page.paged)\n return;\n\n const pageDims = getPageDimensions(index, manifest);\n\n pages.push({\n dimensions: pageDims,\n pages: [{\n index: index,\n groupOffset: { top: 0, left: 0 },\n dimensions: pageDims\n }]\n });\n });\n\n return pages;\n}\n","/**\n * Manages a collection of page overlays, which implement a low-level\n * API for synchronizing HTML pages to the canvas. Each overlay needs\n * to implement the following protocol:\n *\n * mount(): Called when a page is first rendered\n * refresh(): Called when a page is moved\n * unmount(): Called when a previously rendered page has stopped being rendered\n *\n * @class\n */\n\nexport default class PageOverlayManager\n{\n constructor ()\n {\n this._pages = {};\n this._renderedPages = [];\n this._renderedPageMap = {};\n }\n\n addOverlay (overlay)\n {\n const overlaysByPage = this._pages[overlay.page] || (this._pages[overlay.page] = []);\n\n overlaysByPage.push(overlay);\n\n if (this._renderedPageMap[overlay.page])\n overlay.mount();\n }\n\n removeOverlay (overlay)\n {\n const page = overlay.page;\n const overlaysByPage = this._pages[page];\n\n if (!overlaysByPage)\n return;\n\n const overlayIndex = overlaysByPage.indexOf(overlay);\n\n if (overlayIndex === -1)\n return;\n\n if (this._renderedPageMap[page])\n overlaysByPage[overlayIndex].unmount();\n\n overlaysByPage.splice(overlayIndex, 1);\n\n if (overlaysByPage.length === 0)\n delete this._pages[page];\n }\n\n updateOverlays (renderedPages)\n {\n const previouslyRendered = this._renderedPages;\n const newRenderedMap = {};\n\n renderedPages.map( (pageIndex) =>\n {\n newRenderedMap[pageIndex] = true;\n\n if (!this._renderedPageMap[pageIndex])\n {\n this._renderedPageMap[pageIndex] = true;\n\n this._invokeOnOverlays(pageIndex, overlay =>\n {\n overlay.mount();\n });\n }\n });\n\n previouslyRendered.map( (pageIndex) =>\n {\n if (newRenderedMap[pageIndex])\n {\n this._invokeOnOverlays(pageIndex, (overlay) =>\n {\n overlay.refresh();\n });\n }\n else\n {\n delete this._renderedPageMap[pageIndex];\n this._invokeOnOverlays(pageIndex, overlay =>\n {\n overlay.unmount();\n });\n }\n });\n\n this._renderedPages = renderedPages;\n }\n\n _invokeOnOverlays (pageIndex, func)\n {\n const overlays = this._pages[pageIndex];\n if (overlays)\n overlays.map( (o) => func(o) );\n }\n}\n","import { elt } from './utils/elt';\n/**\n*\n*\n**/\nexport default class PageToolsOverlay\n{\n constructor (pageIndex, viewerCore)\n {\n this.page = pageIndex;\n\n this._viewerCore = viewerCore;\n\n this._innerElement = this._viewerCore.getSettings().innerElement;\n this._pageToolsElem = null;\n //\n // this._buttons = null;\n }\n\n mount ()\n {\n if (this._pageToolsElem === null)\n {\n this._buttons = this._initializePageToolButtons();\n\n this._pageToolsElem = elt('div', { class: 'diva-page-tools-wrapper' },\n elt('div', { class: 'diva-page-tools' }, this._buttons)\n );\n }\n\n this.refresh();\n this._innerElement.appendChild(this._pageToolsElem);\n }\n\n _initializePageToolButtons ()\n {\n // Callback parameters\n const settings = this._viewerCore.getSettings();\n const publicInstance = this._viewerCore.getPublicInstance();\n const pageIndex = this.page;\n\n return this._viewerCore.getPageTools().map( (plugin) =>\n {\n // !!! The node needs to be cloned otherwise it is detached from\n // one and reattached to the other.\n const button = plugin.pageToolsIcon.cloneNode(true);\n\n // ensure the plugin instance is handed as the first argument to call;\n // this will set the context (i.e., `this`) of the handleClick call to the plugin instance\n // itself.\n button.addEventListener('click', (event) =>\n {\n plugin.handleClick.call(plugin, event, settings, publicInstance, pageIndex);\n }, false);\n\n button.addEventListener('touchend', (event) =>\n {\n // Prevent firing of emulated mouse events\n event.preventDefault();\n\n plugin.handleClick.call(plugin, event, settings, publicInstance, pageIndex);\n }, false);\n\n return button;\n\n });\n }\n\n unmount ()\n {\n this._innerElement.removeChild(this._pageToolsElem);\n }\n\n refresh ()\n {\n const pos = this._viewerCore.getPageRegion(this.page, {\n excludePadding: true,\n incorporateViewport: true\n });\n\n this._pageToolsElem.style.top = pos.top + 'px';\n this._pageToolsElem.style.left = pos.left + 'px';\n }\n}\n","const getMaxZoomLevel = (width, height) =>\n{\n const largestDimension = Math.max(width, height);\n return Math.ceil(Math.log((largestDimension + 1) / (256 + 1)) / Math.log(2));\n};\n\nconst incorporateZoom = (imageDimension, zoomDifference) => imageDimension / (Math.pow(2, zoomDifference));\n\nconst getOtherImageData = (otherImages, lowestMaxZoom) =>\n{\n return otherImages.map( (itm) =>\n {\n const w = itm.width;\n const h = itm.height;\n const info = parseImageInfo(itm);\n const url = info.url.slice(-1) !== '/' ? info.url + '/' : info.url; // append trailing slash to url if it's not there.\n\n const dims = new Array(lowestMaxZoom + 1);\n for (let j = 0; j < lowestMaxZoom + 1; j++)\n {\n dims[j] = {\n h: Math.floor(incorporateZoom(h, lowestMaxZoom - j)),\n w: Math.floor(incorporateZoom(w, lowestMaxZoom - j))\n };\n }\n\n return {\n f: info.url,\n url: url,\n il: itm.label || \"\",\n d: dims\n };\n });\n};\n\n/**\n * Parses an IIIF Presentation API Manifest and converts it into a Diva.js-format object\n * (See https://github.com/DDMAL/diva.js/wiki/Development-notes#data-received-through-ajax-request)\n *\n * @param {Object} manifest - an object that represents a valid IIIF manifest\n * @returns {Object} divaServiceBlock - the data needed by Diva to show a view of a single document\n */\nexport default function parseIIIFManifest (manifest)\n{\n const sequence = manifest.sequences[0];\n const canvases = sequence.canvases;\n const numCanvases = canvases.length;\n\n const pages = new Array(canvases.length);\n\n let thisCanvas, thisResource, thisImage, otherImages, context, url, info, imageAPIVersion, width, height, maxZoom, canvas, label, imageLabel, zoomDimensions, widthAtCurrentZoomLevel, heightAtCurrentZoomLevel;\n\n let lowestMaxZoom = 100;\n let maxRatio = 0;\n let minRatio = 100;\n\n // quickly determine the lowest possible max zoom level (i.e., the upper bound for images) across all canvases.\n // while we're here, compute the global ratios as well.\n for (let z = 0; z < numCanvases; z++)\n {\n const c = canvases[z];\n const w = c.width;\n const h = c.height;\n const mz = getMaxZoomLevel(w, h);\n const ratio = h / w;\n maxRatio = Math.max(ratio, maxRatio);\n minRatio = Math.min(ratio, minRatio);\n\n lowestMaxZoom = Math.min(lowestMaxZoom, mz);\n }\n\n /*\n These arrays need to be pre-initialized since we will do arithmetic and value checking on them\n */\n const totalWidths = new Array(lowestMaxZoom + 1).fill(0);\n const totalHeights = new Array(lowestMaxZoom + 1).fill(0);\n const maxWidths = new Array(lowestMaxZoom + 1).fill(0);\n const maxHeights = new Array(lowestMaxZoom + 1).fill(0);\n\n for (let i = 0; i < numCanvases; i++)\n {\n thisCanvas = canvases[i];\n canvas = thisCanvas['@id'];\n label = thisCanvas.label;\n thisResource = thisCanvas.images[0].resource;\n\n /*\n * If a canvas has multiple images it will be encoded\n * with a resource type of \"oa:Choice\". The primary image will be available\n * on the 'default' key, with other images available under 'item.'\n * */\n if (thisResource['@type'] === \"oa:Choice\")\n {\n thisImage = thisResource.default;\n }\n else\n {\n thisImage = thisResource;\n }\n\n // Prioritize the canvas height / width first, since images may not have h/w\n width = thisCanvas.width || thisImage.width;\n height = thisCanvas.height || thisImage.height;\n if (width <= 0 || height <= 0)\n {\n console.warn('Invalid width or height for canvas ' + label + '. Skipping');\n continue;\n }\n\n maxZoom = getMaxZoomLevel(width, height);\n\n if (thisResource.item)\n {\n otherImages = getOtherImageData(thisResource.item, lowestMaxZoom);\n }\n else\n {\n otherImages = [];\n }\n\n imageLabel = thisImage.label || null;\n\n info = parseImageInfo(thisImage);\n url = info.url.slice(-1) !== '/' ? info.url + '/' : info.url; // append trailing slash to url if it's not there.\n\n context = thisImage.service['@context'];\n\n if (context === 'http://iiif.io/api/image/2/context.json')\n {\n imageAPIVersion = 2;\n }\n else if (context === 'http://library.stanford.edu/iiif/image-api/1.1/context.json')\n {\n imageAPIVersion = 1.1;\n }\n else\n {\n imageAPIVersion = 1.0;\n }\n\n zoomDimensions = new Array(lowestMaxZoom + 1);\n\n for (let k = 0; k < lowestMaxZoom + 1; k++)\n {\n widthAtCurrentZoomLevel = Math.floor(incorporateZoom(width, lowestMaxZoom - k));\n heightAtCurrentZoomLevel = Math.floor(incorporateZoom(height, lowestMaxZoom - k));\n zoomDimensions[k] = {\n h: heightAtCurrentZoomLevel,\n w: widthAtCurrentZoomLevel\n };\n\n totalWidths[k] += widthAtCurrentZoomLevel;\n totalHeights[k] += heightAtCurrentZoomLevel;\n maxWidths[k] = Math.max(widthAtCurrentZoomLevel, maxWidths[k]);\n maxHeights[k] = Math.max(heightAtCurrentZoomLevel, maxHeights[k]);\n }\n\n pages[i] = {\n d: zoomDimensions,\n m: maxZoom,\n l: label, // canvas label ('page 1, page 2', etc.)\n il: imageLabel, // default image label ('primary image', 'UV light', etc.)\n f: info.url,\n url: url,\n api: imageAPIVersion,\n paged: thisCanvas.viewingHint !== 'non-paged',\n facingPages: thisCanvas.viewingHint === 'facing-pages',\n canvas: canvas,\n otherImages: otherImages,\n xoffset: info.x || null,\n yoffset: info.y || null\n };\n }\n\n const averageWidths = new Array(lowestMaxZoom + 1);\n const averageHeights = new Array(lowestMaxZoom + 1);\n\n for (let a = 0; a < lowestMaxZoom + 1; a++)\n {\n averageWidths[a] = totalWidths[a] / numCanvases;\n averageHeights[a] = totalHeights[a] / numCanvases;\n }\n\n const dims = {\n a_wid: averageWidths,\n a_hei: averageHeights,\n max_w: maxWidths,\n max_h: maxHeights,\n max_ratio: maxRatio,\n min_ratio: minRatio,\n t_hei: totalHeights,\n t_wid: totalWidths\n };\n\n return {\n item_title: manifest.label,\n dims: dims,\n max_zoom: lowestMaxZoom,\n pgs: pages,\n paged: manifest.viewingHint === 'paged' || sequence.viewingHint === 'paged'\n };\n}\n\n/**\n * Takes in a resource block from a canvas and outputs the following information associated with that resource:\n * - Image URL\n * - Image region to be displayed\n *\n * @param {Object} resource - an object representing the resource block of a canvas section in a IIIF manifest\n * @returns {Object} imageInfo - an object containing image URL and region\n */\nfunction parseImageInfo (resource)\n{\n let url = resource['@id'];\n const fragmentRegex = /#xywh=([0-9]+,[0-9]+,[0-9]+,[0-9]+)/;\n let xywh = '';\n let stripURL = true;\n\n if (/\\/([0-9]+,[0-9]+,[0-9]+,[0-9]+)\\//.test(url))\n {\n // if resource in image API format, extract region x,y,w,h from URL (after 4th slash from last)\n // matches coordinates in URLs of the form http://www.example.org/iiif/book1-page1/40,50,1200,1800/full/0/default.jpg\n const urlArray = url.split('/');\n xywh = urlArray[urlArray.length - 4];\n }\n else if (fragmentRegex.test(url))\n {\n // matches coordinates of the style http://www.example.org/iiif/book1/canvas/p1#xywh=50,50,320,240\n const result = fragmentRegex.exec(url);\n xywh = result[1];\n }\n else if (resource.service && resource.service['@id'])\n {\n // assume canvas size based on image size\n url = resource.service['@id'];\n // this URL excludes region parameters so we don't need to remove them\n stripURL = false;\n }\n\n if (stripURL)\n {\n // extract URL up to identifier (we eliminate the last 5 parameters: /region/size/rotation/quality.format)\n url = url.split('/').slice(0, -4).join('/');\n }\n\n const imageInfo = {\n url: url\n };\n\n if (xywh.length)\n {\n // parse into separate components\n const dimensions = xywh.split(',');\n imageInfo.x = parseInt(dimensions[0], 10);\n imageInfo.y = parseInt(dimensions[1], 10);\n imageInfo.w = parseInt(dimensions[2], 10);\n imageInfo.h = parseInt(dimensions[3], 10);\n }\n\n return imageInfo;\n}\n","const debug = require('debug')('diva:Renderer');\nconst debugPaints = require('debug')('diva:Renderer:paints');\n\nimport { elt, setAttributes } from './utils/elt';\nimport CompositeImage from './composite-image';\nimport DocumentLayout from './document-layout';\nimport ImageCache from './image-cache';\nimport ImageRequestHandler from './image-request-handler';\nimport InterpolateAnimation from './interpolate-animation';\n\nconst REQUEST_DEBOUNCE_INTERVAL = 250;\n\nexport default class Renderer\n{\n constructor (options, hooks)\n {\n this._viewport = options.viewport;\n this._outerElement = options.outerElement;\n this._documentElement = options.innerElement;\n\n this._hooks = hooks || {};\n\n this._canvas = elt('canvas', { class: 'diva-viewer-canvas' });\n this._ctx = this._canvas.getContext('2d');\n\n this.layout = null;\n\n this._sourceResolver = null;\n this._renderedPages = null;\n this._config = null;\n this._zoomLevel = null;\n this._compositeImages = null;\n this._renderedTiles = null;\n this._animation = null;\n\n // FIXME(wabain): What level should this be maintained at?\n // Diva global?\n this._cache = new ImageCache();\n this._pendingRequests = {};\n }\n\n static getCompatibilityErrors ()\n {\n if (typeof HTMLCanvasElement !== 'undefined')\n {\n return null;\n }\n\n return [\n 'Your browser lacks support for the ', elt('pre', 'canvas'),\n ' element. Please upgrade your browser.'\n ];\n }\n\n load (config, viewportPosition, sourceResolver)\n {\n this._clearAnimation();\n\n if (this._hooks.onViewWillLoad)\n {\n this._hooks.onViewWillLoad();\n }\n\n this._sourceResolver = sourceResolver;\n this._config = config;\n this._compositeImages = {};\n this._setLayoutToZoomLevel(viewportPosition.zoomLevel);\n\n // FIXME(wabain): Remove this when there's more confidence the check shouldn't be needed\n if (!this.layout.getPageInfo(viewportPosition.anchorPage))\n {\n throw new Error('invalid page: ' + viewportPosition.anchorPage);\n }\n\n if (this._canvas.width !== this._viewport.width || this._canvas.height !== this._viewport.height)\n {\n debug('Canvas dimension change: (%s, %s) -> (%s, %s)', this._canvas.width, this._canvas.height,\n this._viewport.width, this._viewport.height);\n\n this._canvas.width = this._viewport.width;\n this._canvas.height = this._viewport.height;\n }\n else\n {\n debug('Reload, no size change');\n }\n\n // FIXME: What hooks should be called here?\n this.goto(viewportPosition.anchorPage, viewportPosition.verticalOffset, viewportPosition.horizontalOffset);\n\n if (this._canvas.parentNode !== this._outerElement)\n {\n this._outerElement.insertBefore(this._canvas, this._outerElement.firstChild);\n }\n\n if (this._hooks.onViewDidLoad)\n {\n this._hooks.onViewDidLoad();\n }\n }\n\n _setViewportPosition (viewportPosition)\n {\n if (viewportPosition.zoomLevel !== this._zoomLevel)\n {\n if (this._zoomLevel === null)\n {\n throw new TypeError('The current view is not zoomable');\n }\n else if (viewportPosition.zoomLevel === null)\n {\n throw new TypeError('The current view requires a zoom level');\n }\n\n this._setLayoutToZoomLevel(viewportPosition.zoomLevel);\n }\n\n this._goto(viewportPosition.anchorPage, viewportPosition.verticalOffset, viewportPosition.horizontalOffset);\n }\n\n _setLayoutToZoomLevel (zoomLevel)\n {\n this.layout = new DocumentLayout(this._config, zoomLevel);\n this._zoomLevel = zoomLevel;\n\n setAttributes(this._documentElement, {\n style: {\n height: this.layout.dimensions.height + 'px',\n width: this.layout.dimensions.width + 'px'\n }\n });\n\n this._viewport.setInnerDimensions(this.layout.dimensions);\n }\n\n adjust ()\n {\n this._clearAnimation();\n\n this._render();\n\n if (this._hooks.onViewDidUpdate)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), null);\n }\n }\n\n _render ()\n {\n const newRenderedPages = [];\n this.layout.pageGroups.forEach((group) =>\n {\n if (!this._viewport.intersectsRegion(group.region))\n {\n return;\n }\n\n const visiblePages = group.pages\n .filter(function (page)\n {\n return this.isPageVisible(page.index);\n }, this)\n .map(page => page.index);\n\n newRenderedPages.push.apply(newRenderedPages, visiblePages);\n }, this);\n\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._paintOutline(newRenderedPages);\n\n newRenderedPages.forEach((pageIndex) =>\n {\n if (!this._compositeImages[pageIndex])\n {\n const page = this.layout.getPageInfo(pageIndex);\n const zoomLevels = this._sourceResolver.getAllZoomLevelsForPage(page);\n const composite = new CompositeImage(zoomLevels);\n composite.updateFromCache(this._cache);\n this._compositeImages[pageIndex] = composite;\n }\n }, this);\n\n this._initiateTileRequests(newRenderedPages);\n\n const changes = findChanges(this._renderedPages || [], newRenderedPages);\n\n changes.removed.forEach((pageIndex) =>\n {\n delete this._compositeImages[pageIndex];\n }, this);\n\n this._renderedPages = newRenderedPages;\n this._paint();\n\n if (this._hooks.onPageWillLoad)\n {\n changes.added.forEach((pageIndex) =>\n {\n this._hooks.onPageWillLoad(pageIndex);\n }, this);\n }\n }\n\n _paint ()\n {\n debug('Repainting');\n\n const renderedTiles = [];\n\n this._renderedPages.forEach(function (pageIndex)\n {\n this._compositeImages[pageIndex].getTiles(this._zoomLevel).forEach((source) =>\n {\n const scaled = getScaledTileRecord(source, this._zoomLevel);\n\n if (this._isTileVisible(pageIndex, scaled))\n {\n renderedTiles.push(source.url);\n this._drawTile(pageIndex, scaled, this._cache.get(source.url));\n }\n }, this);\n }, this);\n\n const cache = this._cache;\n\n const changes = findChanges(this._renderedTiles || [], renderedTiles);\n\n changes.added.forEach(url =>\n {\n cache.acquire(url);\n });\n\n changes.removed.forEach(url =>\n {\n cache.release(url);\n });\n\n if (changes.removed)\n {\n // FIXME: Should only need to update the composite images\n // for which tiles were removed\n this._renderedPages.forEach((pageIndex) =>\n {\n this._compositeImages[pageIndex].updateFromCache(this._cache);\n }, this);\n }\n\n this._renderedTiles = renderedTiles;\n }\n\n // Paint a page outline while the tiles are loading.\n _paintOutline (pages)\n {\n pages.forEach(function (pageIndex)\n {\n const pageInfo = this.layout.getPageInfo(pageIndex);\n const pageOffset = this._getImageOffset(pageIndex);\n\n // Ensure the document is drawn to the center of the viewport\n const viewportPaddingX = Math.max(0, (this._viewport.width - this.layout.dimensions.width) / 2);\n const viewportPaddingY = Math.max(0, (this._viewport.height - this.layout.dimensions.height) / 2);\n\n const viewportOffsetX = pageOffset.left - this._viewport.left + viewportPaddingX;\n const viewportOffsetY = pageOffset.top - this._viewport.top + viewportPaddingY;\n\n const destXOffset = viewportOffsetX < 0 ? -viewportOffsetX : 0;\n const destYOffset = viewportOffsetY < 0 ? -viewportOffsetY : 0;\n\n const canvasX = Math.max(0, viewportOffsetX);\n const canvasY = Math.max(0, viewportOffsetY);\n\n const destWidth = pageInfo.dimensions.width - destXOffset;\n const destHeight = pageInfo.dimensions.height - destYOffset;\n\n this._ctx.strokeStyle = '#AAA';\n // In order to get a 1px wide line using strokes, we need to start at a 'half pixel'\n this._ctx.strokeRect(canvasX + 0.5, canvasY + 0.5, destWidth, destHeight);\n }, this);\n }\n\n // This method should be sent all visible pages at once because it will initiate\n // all image requests and cancel any remaining image requests. In the case that\n // a request is ongoing and the tile is still visible in the viewport, the old request\n // is kept active instead of restarting it. The image requests are given a timeout\n // before loading in order to debounce them and have a small reaction time\n // to cancel them and avoid useless requests.\n _initiateTileRequests (pages)\n {\n // Only requests in this object are kept alive, since all others are not visible in the viewport\n const newPendingRequests = {};\n\n // Used later as a closure to initiate the image requests with the right source and pageIndex\n const initiateRequest = (source, pageIndex) =>\n {\n const composite = this._compositeImages[pageIndex];\n\n newPendingRequests[source.url] = new ImageRequestHandler({\n url: source.url,\n timeoutTime: REQUEST_DEBOUNCE_INTERVAL,\n load: img =>\n {\n delete this._pendingRequests[source.url];\n this._cache.put(source.url, img);\n\n // Awkward way to check for updates\n if (composite === this._compositeImages[pageIndex])\n {\n composite.updateWithLoadedUrls([source.url]);\n\n if (this._isTileForSourceVisible(pageIndex, source))\n {\n this._paint();\n }\n else\n {\n debugPaints('Page %s, tile %s no longer visible on image load', pageIndex, source.url);\n }\n }\n },\n error: () =>\n {\n // TODO: Could make a limited number of retries, etc.\n delete this._pendingRequests[source.url];\n }\n });\n };\n\n for (let i = 0; i < pages.length; i++)\n {\n const pageIndex = pages[i];\n const tiles = this._sourceResolver.getBestZoomLevelForPage(this.layout.getPageInfo(pageIndex)).tiles;\n\n for (let j = 0; j < tiles.length; j++)\n {\n const source = tiles[j];\n if (this._cache.has(source.url) || !this._isTileForSourceVisible(pageIndex, source))\n {\n continue;\n }\n\n // Don't create a new request if the tile is already being loaded\n if (this._pendingRequests[source.url])\n {\n newPendingRequests[source.url] = this._pendingRequests[source.url];\n delete this._pendingRequests[source.url];\n continue;\n }\n\n // Use a closure since the load and error methods are going to be called later and\n // we need to keep the right reference to the source and the page index\n initiateRequest(source, pageIndex);\n }\n }\n\n for (const url in this._pendingRequests)\n {\n this._pendingRequests[url].abort();\n }\n this._pendingRequests = newPendingRequests;\n }\n\n _drawTile (pageIndex, scaledTile, img)\n {\n const tileOffset = this._getTileToDocumentOffset(pageIndex, scaledTile);\n\n // Ensure the document is drawn to the center of the viewport\n const viewportPaddingX = Math.max(0, (this._viewport.width - this.layout.dimensions.width) / 2);\n const viewportPaddingY = Math.max(0, (this._viewport.height - this.layout.dimensions.height) / 2);\n\n const viewportOffsetX = tileOffset.left - this._viewport.left + viewportPaddingX;\n const viewportOffsetY = tileOffset.top - this._viewport.top + viewportPaddingY;\n\n const destXOffset = viewportOffsetX < 0 ? -viewportOffsetX : 0;\n const destYOffset = viewportOffsetY < 0 ? -viewportOffsetY : 0;\n\n const sourceXOffset = destXOffset / scaledTile.scaleRatio;\n const sourceYOffset = destYOffset / scaledTile.scaleRatio;\n\n const canvasX = Math.max(0, viewportOffsetX);\n const canvasY = Math.max(0, viewportOffsetY);\n\n // Ensure that the specified dimensions are no greater than the actual\n // size of the image. Safari won't display the tile if they are.\n const destWidth = Math.min(scaledTile.dimensions.width, img.width * scaledTile.scaleRatio) - destXOffset;\n const destHeight = Math.min(scaledTile.dimensions.height, img.height * scaledTile.scaleRatio) - destYOffset;\n\n const sourceWidth = destWidth / scaledTile.scaleRatio;\n const sourceHeight = destHeight / scaledTile.scaleRatio;\n\n if (debugPaints.enabled)\n {\n debugPaints('Drawing page %s, tile %sx (%s, %s) from %s, %s to viewport at %s, %s, scale %s%%',\n pageIndex,\n scaledTile.sourceZoomLevel, scaledTile.row, scaledTile.col,\n sourceXOffset, sourceYOffset,\n canvasX, canvasY,\n Math.round(scaledTile.scaleRatio * 100));\n }\n\n this._ctx.drawImage(\n img,\n sourceXOffset, sourceYOffset,\n sourceWidth, sourceHeight,\n canvasX, canvasY,\n destWidth, destHeight);\n }\n\n _isTileForSourceVisible (pageIndex, tileSource)\n {\n return this._isTileVisible(pageIndex, getScaledTileRecord(tileSource, this._zoomLevel));\n }\n\n _isTileVisible (pageIndex, scaledTile)\n {\n const tileOffset = this._getTileToDocumentOffset(pageIndex, scaledTile);\n\n // FIXME(wabain): This check is insufficient during a zoom transition\n return this._viewport.intersectsRegion({\n top: tileOffset.top,\n bottom: tileOffset.top + scaledTile.dimensions.height,\n left: tileOffset.left,\n right: tileOffset.left + scaledTile.dimensions.width\n });\n }\n\n _getTileToDocumentOffset (pageIndex, scaledTile)\n {\n const imageOffset = this._getImageOffset(pageIndex);\n\n return {\n top: imageOffset.top + scaledTile.offset.top,\n left: imageOffset.left + scaledTile.offset.left\n };\n }\n\n _getImageOffset (pageIndex)\n {\n return this.layout.getPageOffset(pageIndex, {excludePadding: true});\n }\n\n // TODO: Update signature\n goto (pageIndex, verticalOffset, horizontalOffset)\n {\n this._clearAnimation();\n this._goto(pageIndex, verticalOffset, horizontalOffset);\n if (this._hooks.onViewDidUpdate)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), pageIndex);\n }\n }\n\n _goto (pageIndex, verticalOffset, horizontalOffset)\n {\n // FIXME(wabain): Move this logic to the viewer\n const pageOffset = this.layout.getPageOffset(pageIndex);\n\n const desiredVerticalCenter = pageOffset.top + verticalOffset;\n const top = desiredVerticalCenter - parseInt(this._viewport.height / 2, 10);\n\n const desiredHorizontalCenter = pageOffset.left + horizontalOffset;\n const left = desiredHorizontalCenter - parseInt(this._viewport.width / 2, 10);\n\n this._viewport.top = top;\n this._viewport.left = left;\n\n this._render();\n }\n\n transitionViewportPosition (options)\n {\n this._clearAnimation();\n\n const getPosition = options.getPosition;\n const onViewDidTransition = this._hooks.onViewDidTransition;\n\n this._animation = InterpolateAnimation.animate({\n duration: options.duration,\n parameters: options.parameters,\n onUpdate: (values) =>\n {\n // TODO: Do image preloading, work with that\n this._setViewportPosition(getPosition(values));\n this._hooks.onZoomLevelWillChange(values.zoomLevel);\n\n if (onViewDidTransition)\n {\n onViewDidTransition();\n }\n },\n onEnd: (info) =>\n {\n if (options.onEnd)\n {\n options.onEnd(info);\n }\n\n if (this._hooks.onViewDidUpdate && !info.interrupted)\n {\n this._hooks.onViewDidUpdate(this._renderedPages.slice(), null);\n }\n }\n });\n }\n\n _clearAnimation ()\n {\n if (this._animation)\n {\n this._animation.cancel();\n this._animation = null;\n }\n }\n\n preload ()\n {\n // TODO\n }\n\n isPageVisible (pageIndex)\n {\n if (!this.layout)\n {\n return false;\n }\n\n const page = this.layout.getPageInfo(pageIndex);\n\n if (!page)\n {\n return false;\n }\n\n return this._viewport.intersectsRegion(this.layout.getPageRegion(pageIndex));\n }\n\n getRenderedPages ()\n {\n return this._renderedPages.slice();\n }\n\n destroy ()\n {\n this._clearAnimation();\n\n // FIXME(wabain): I don't know if we should actually do this\n Object.keys(this._pendingRequests).forEach((req) =>\n {\n const handler = this._pendingRequests[req];\n delete this._pendingRequests[req];\n\n handler.abort();\n }, this);\n\n this._canvas.parentNode.removeChild(this._canvas);\n }\n}\n\nfunction getScaledTileRecord (source, scaleFactor)\n{\n let scaleRatio;\n\n if (scaleFactor === null)\n {\n scaleRatio = 1;\n }\n else\n {\n scaleRatio = Math.pow(2, scaleFactor - source.zoomLevel);\n }\n\n return {\n sourceZoomLevel: source.zoomLevel,\n scaleRatio: scaleRatio,\n row: source.row,\n col: source.col,\n dimensions: {\n width: source.dimensions.width * scaleRatio,\n height: source.dimensions.height * scaleRatio\n },\n offset: {\n left: source.offset.left * scaleRatio,\n top: source.offset.top * scaleRatio\n },\n url: source.url\n };\n}\n\nfunction findChanges (oldArray, newArray)\n{\n if (oldArray === newArray)\n {\n return {\n added: [],\n removed: []\n };\n }\n\n const removed = oldArray.filter(oldEntry => newArray.indexOf(oldEntry) === -1);\n\n const added = newArray.filter(newEntry => oldArray.indexOf(newEntry) === -1);\n\n return {\n added: added,\n removed: removed\n };\n}\n","\nexport default function createSettingsView(sources)\n{\n const obj = {};\n\n sources.forEach( (source) =>\n {\n registerMixin(obj, source);\n });\n\n return obj;\n}\n\nfunction registerMixin(obj, mixin)\n{\n Object.keys(mixin).forEach( (key) =>\n {\n Object.defineProperty(obj, key, {\n get: () =>\n {\n return mixin[key];\n },\n set: () =>\n {\n // TODO: Make everything strict mode so this isn't needed\n throw new TypeError('Cannot set settings.' + key);\n }\n });\n });\n}\n","export default class TileCoverageMap\n{\n constructor (rows, cols)\n {\n this._rows = rows;\n this._cols = cols;\n this._map = new Array(rows).fill(null).map(() => new Array(cols).fill(false));\n }\n\n isLoaded (row, col)\n {\n // Return true for out of bounds tiles because they\n // don't need to load. (Unfortunately this will also\n // mask logical errors.)\n if (row >= this._rows || col >= this._cols)\n return true;\n\n return this._map[row][col];\n }\n\n set(row, col, value)\n {\n this._map[row][col] = value;\n }\n}","import diva from './diva-global';\nimport { elt } from './utils/elt';\n\nexport default class Toolbar\n{\n constructor (viewer)\n {\n this.viewer = viewer;\n this.settings = viewer.settings;\n }\n\n _elemAttrs (ident, base)\n {\n const attrs = {\n id: this.settings.ID + ident,\n class: 'diva-' + ident\n };\n\n if (base)\n return Object.assign(attrs, base);\n else\n return attrs;\n }\n\n\n /** Convenience function to subscribe to a Diva event */\n _subscribe (event, callback)\n {\n diva.Events.subscribe(event, callback, this.settings.ID);\n }\n\n\n createButton (name, label, callback, icon)\n {\n const button = elt('button', {\n type: 'button',\n id: this.settings.ID + name,\n class: 'diva-' + name + ' diva-button',\n title: label\n });\n\n if (icon)\n button.appendChild(icon);\n\n if (callback)\n button.addEventListener('click', callback);\n\n return button;\n }\n\n createLabel (name, id, label, innerName, innerValue)\n {\n return elt('div', { id: this.settings.ID + id, class: name + ' diva-label'},\n [ label, elt('span', { id: this.settings.ID + innerName }, innerValue)\n ]);\n }\n\n createZoomButtons ()\n {\n let zoomOutIcon = this._createZoomOutIcon();\n let zoomInIcon = this._createZoomInIcon();\n\n let zoomButtons = [\n this.createButton('zoom-out-button', 'Zoom Out', () => {\n this.viewer.setZoomLevel(this.settings.zoomLevel - 1);\n }, zoomOutIcon),\n this.createButton('zoom-in-button', 'Zoom In', () => {\n this.viewer.setZoomLevel(this.settings.zoomLevel + 1);\n }, zoomInIcon),\n this.createLabel('diva-zoom-label', 'zoom-label', 'Zoom level: ', 'zoom-level', this.settings.zoomLevel + 1)\n ];\n\n let zoomHandler = function ()\n {\n let labelEl = document.getElementById(this.settings.ID + 'zoom-level');\n labelEl.textContent = this.settings.zoomLevel + 1;\n };\n\n this._subscribe('ZoomLevelDidChange', zoomHandler);\n this._subscribe('ViewerDidLoad', zoomHandler);\n\n return elt('div', { id: this.settings.ID + \"zoom-controls\", style: \"display: none\"}, zoomButtons);\n }\n\n createGridControls ()\n {\n let gridMoreIcon = this._createGridMoreIcon();\n let gridFewerIcon = this._createGridFewerIcon();\n\n let gridButtons = [\n this.createButton('grid-out-button', 'Fewer', () => {\n this.viewer.setGridPagesPerRow(this.settings.pagesPerRow - 1);\n }, gridFewerIcon),\n this.createButton('grid-in-button', 'More', () => {\n this.viewer.setGridPagesPerRow(this.settings.pagesPerRow + 1);\n }, gridMoreIcon),\n this.createLabel('diva-grid-label', 'grid-label', 'Pages per row: ', 'pages-per-row', this.settings.pagesPerRow)\n ];\n\n let gridChangeHandler = function ()\n {\n let labelEl = document.getElementById(this.settings.ID + 'pages-per-row');\n labelEl.textContent = this.settings.pagesPerRow;\n };\n\n this._subscribe('GridRowNumberDidChange', gridChangeHandler);\n\n return elt('div', {id: this.settings.ID + \"grid-controls\", style: \"display:none\" }, gridButtons);\n }\n\n createViewMenu ()\n {\n const viewOptionsList = elt('div', this._elemAttrs('view-options'));\n const gridViewIcon = this._createGridViewIcon();\n const bookViewIcon = this._createBookViewIcon();\n const pageViewIcon = this._createPageViewIcon();\n\n const viewOptionsToggle = () =>\n {\n viewOptionsList.style.display = viewOptionsList.style.display === \"none\" ? \"block\" : \"none\";\n };\n\n const changeViewButton = this.createButton('view-icon', 'Change view', viewOptionsToggle);\n\n const selectView = (view) =>\n {\n this.viewer.changeView(view);\n\n //hide view menu\n viewOptionsList.style.display = \"none\";\n };\n\n const updateViewMenu = () =>\n {\n const viewIconClasses = ' diva-view-icon diva-button';\n\n\n // display the icon of the mode we're currently in (?)\n if (this.settings.inGrid)\n {\n changeViewButton.appendChild(gridViewIcon);\n changeViewButton.className = 'diva-grid-icon' + viewIconClasses;\n }\n else if (this.settings.inBookLayout)\n {\n changeViewButton.appendChild(bookViewIcon);\n changeViewButton.className = 'diva-book-icon' + viewIconClasses;\n }\n else\n {\n changeViewButton.appendChild(pageViewIcon);\n changeViewButton.className = 'diva-document-icon' + viewIconClasses;\n }\n\n const viewOptions = document.createDocumentFragment();\n\n // then display document, book, and grid buttons in that order, excluding the current view\n if (this.settings.inGrid || this.settings.inBookLayout)\n viewOptions.appendChild(this.createButton('document-icon', 'Document View', selectView.bind(null, 'document'), pageViewIcon));\n\n if (this.settings.inGrid || !this.settings.inBookLayout)\n viewOptions.appendChild(this.createButton('book-icon', 'Book View', selectView.bind(null, 'book'), bookViewIcon));\n\n if (!this.settings.inGrid)\n viewOptions.appendChild(this.createButton('grid-icon', 'Grid View', selectView.bind(null, 'grid'), gridViewIcon));\n\n // remove old menu\n while (viewOptionsList.firstChild)\n {\n viewOptionsList.removeChild(viewOptionsList.firstChild);\n }\n\n // insert new menu\n viewOptionsList.appendChild(viewOptions);\n };\n\n document.addEventListener('mouseup', event =>\n {\n if (viewOptionsList !== event.target)\n {\n viewOptionsList.style.display = 'none';\n }\n });\n\n this._subscribe('ViewDidSwitch', updateViewMenu);\n this._subscribe('ObjectDidLoad', updateViewMenu);\n\n return elt('div', this._elemAttrs('view-menu'),\n changeViewButton,\n viewOptionsList\n );\n }\n\n createFullscreenButton ()\n {\n let fullscreenIcon = this._createFullscreenIcon();\n\n return this.createButton('fullscreen-icon', 'Toggle fullscreen mode', () => {\n this.viewer.toggleFullscreenMode();\n }, fullscreenIcon);\n }\n\n toggleZoomGridControls ()\n {\n if (!this.settings.inGrid)\n {\n document.getElementById(this.settings.ID + \"zoom-controls\").style.display = \"block\";\n document.getElementById(this.settings.ID + \"grid-controls\").style.display = \"none\";\n }\n else\n {\n document.getElementById(this.settings.ID + \"zoom-controls\").style.display = \"none\";\n document.getElementById(this.settings.ID + \"grid-controls\").style.display = \"block\";\n }\n\n }\n\n render ()\n {\n this._subscribe(\"ViewDidSwitch\", this.toggleZoomGridControls);\n this._subscribe(\"ObjectDidLoad\", this.toggleZoomGridControls);\n\n let leftTools = [\n this.createZoomButtons(),\n this.createGridControls()\n ];\n let rightTools = [\n this.createViewMenu(),\n this.createFullscreenButton()\n ];\n\n const tools = elt('div', this._elemAttrs('tools'),\n elt('div', this._elemAttrs('tools-left'), leftTools),\n elt('div', this._elemAttrs('tools-right'), rightTools)\n );\n\n this.settings.toolbarParentObject.insertBefore(\n tools,\n this.settings.toolbarParentObject.firstChild\n );\n }\n\n _createToolbarIcon (paths)\n {\n let icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttributeNS(null, 'viewBox', \"0 0 25 25\");\n icon.setAttributeNS(null, 'x', '0px');\n icon.setAttributeNS(null, 'y', '0px');\n icon.setAttributeNS(null, 'style', \"enable-background:new 0 0 48 48;\");\n\n let glyph = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n glyph.setAttributeNS(null, \"transform\", \"matrix(1, 0, 0, 1, -12, -12)\");\n\n paths.forEach( (path) =>\n {\n let pEl = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n pEl.setAttributeNS(null, \"d\", path);\n glyph.appendChild(pEl);\n });\n\n icon.appendChild(glyph);\n return icon;\n }\n\n _createZoomOutIcon ()\n {\n let paths = [\n \"M19.5,23c-0.275,0-0.5-0.225-0.5-0.5v-1c0-0.275,0.225-0.5,0.5-0.5h7c0.275,0,0.5,0.225,0.5,0.5v1c0,0.275-0.225,0.5-0.5,0.5H19.5z\",\n \"M37.219,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.422,33.722,37.422,34.054,37.219,34.257z M29.568,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.555,28.818,29.568,25.805,29.568,22.099z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n _createZoomInIcon ()\n {\n let paths = [\n \"M37.469,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.672,33.722,37.672,34.054,37.469,34.257z M29.818,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.805,28.818,29.818,25.805,29.818,22.099z M26.5,21H24v-2.5c0-0.275-0.225-0.5-0.5-0.5h-1c-0.275,0-0.5,0.225-0.5,0.5V21h-2.5c-0.275,0-0.5,0.225-0.5,0.5v1c0,0.275,0.225,0.5,0.5,0.5H22v2.5c0,0.275,0.225,0.5,0.5,0.5h1c0.275,0,0.5-0.225,0.5-0.5V23h2.5c0.275,0,0.5-0.225,0.5-0.5v-1C27,21.225,26.775,21,26.5,21z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridMoreIcon ()\n {\n let paths = [\n \"M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridFewerIcon ()\n {\n let paths = [\n \"M25.5,35c-0.275,0-0.5-0.225-0.5-0.5v-9c0-0.275,0.225-0.5,0.5-0.5h9c0.275,0,0.5,0.225,0.5,0.5v9c0,0.275-0.225,0.5-0.5,0.5H25.5z M22.5,35c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z M34.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H34.5z M22.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createGridViewIcon ()\n {\n let paths = [\n \"M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createBookViewIcon ()\n {\n let paths = [\n \"M35,16.8v-1.323c0,0-2.292-1.328-5.74-1.328c-3.448,0-5.26,1.25-5.26,1.25s-1.813-1.25-5.26-1.25c-3.448,0-5.74,1.328-5.74,1.328V16.8l-1,0.531v0.021v15.687c0,0,4.531-1.578,6.999-1.578c2.468,0,5.001,0.885,5.001,0.885s2.532-0.885,5-0.885c0.306,0,0.643,0.024,1,0.066v4.325l1.531-2.016L33,35.852v-3.72c2,0.43,3,0.906,3,0.906V17.352v-0.021L35,16.8z M23,29.03c-1-0.292-2.584-0.679-3.981-0.679c-2.246,0-3.019,0.404-4.019,0.699V16.634c0,0,1.125-0.699,4.019-0.699c1.694,0,2.981,0.417,3.981,1.126V29.03z M33,29.051c-1-0.295-1.773-0.699-4.02-0.699c-1.396,0-2.981,0.387-3.98,0.679V17.06c1-0.709,2.286-1.126,3.98-1.126c2.895,0,4.02,0.699,4.02,0.699V29.051z\"\n ];\n return this._createToolbarIcon(paths);\n }\n\n _createPageViewIcon ()\n {\n let paths = [\n \"M29.425,29h4.47L29,33.934v-4.47C29,29.19,29.151,29,29.425,29z M34,14.563V28h-5.569C28.157,28,28,28.196,28,28.47V34H14.497C14.223,34,14,33.71,14,33.437V14.563C14,14.29,14.223,14,14.497,14h18.9C33.672,14,34,14.29,34,14.563z M25.497,26.497C25.497,26.223,25.275,26,25,26h-7c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,27.777,17.725,28,18,28h7c0.275,0,0.497-0.223,0.497-0.497V26.497z M30.497,22.497C30.497,22.223,30.275,22,30,22H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,23.777,17.725,24,18,24h12c0.275,0,0.497-0.223,0.497-0.497V22.497z M30.497,18.497C30.497,18.223,30.275,18,30,18H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,19.777,17.725,20,18,20h12c0.275,0,0.497-0.223,0.497-0.497V18.497z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n _createFullscreenIcon ()\n {\n let paths = [\n \"M35,12H13c-0.55,0-1,0.45-1,1v22c0,0.55,0.45,1,1,1h22c0.55,0,1-0.45,1-1V13C36,12.45,35.55,12,35,12z M34,34H14V14h20V34z\",\n \"M17,21.75v-4.5c0-0.138,0.112-0.25,0.25-0.25h4.5c0.138,0,0.17,0.08,0.073,0.177l-1.616,1.616l1.823,1.823c0.097,0.097,0.097,0.256,0,0.354l-1.061,1.06c-0.097,0.097-0.256,0.097-0.354,0l-1.823-1.823l-1.616,1.616C17.08,21.92,17,21.888,17,21.75z M20.97,25.97c-0.097-0.097-0.256-0.097-0.354,0l-1.823,1.823l-1.616-1.616C17.08,26.08,17,26.112,17,26.25v4.5c0,0.138,0.112,0.25,0.25,0.25h4.5c0.138,0,0.17-0.08,0.073-0.177l-1.616-1.616l1.823-1.823c0.097-0.097,0.097-0.256,0-0.354L20.97,25.97z M30.75,17h-4.5c-0.138,0-0.17,0.08-0.073,0.177l1.616,1.616l-1.823,1.823c-0.097,0.097-0.097,0.256,0,0.354l1.061,1.06c0.097,0.097,0.256,0.097,0.354,0l1.823-1.823l1.616,1.616C30.92,21.92,31,21.888,31,21.75v-4.5C31,17.112,30.888,17,30.75,17z M30.823,26.177l-1.616,1.616l-1.823-1.823c-0.097-0.097-0.256-0.097-0.354,0l-1.061,1.06c-0.097,0.097-0.097,0.256,0,0.354l1.823,1.823l-1.616,1.616C26.08,30.92,26.112,31,26.25,31h4.5c0.138,0,0.25-0.112,0.25-0.25v-4.5C31,26.112,30.92,26.08,30.823,26.177z M26,22.5c0-0.275-0.225-0.5-0.5-0.5h-3c-0.275,0-0.5,0.225-0.5,0.5v3c0,0.275,0.225,0.5,0.5,0.5h3c0.275,0,0.5-0.225,0.5-0.5V22.5z\"\n ];\n\n return this._createToolbarIcon(paths);\n }\n\n\n}\n\n\n// export default function createToolbar (viewer)\n// {\n// const settings = viewer.getSettings();\n//\n// // FIXME(wabain): Temporarily copied from within Diva\n// const elemAttrs = (ident, base) => {\n// const attrs = {\n// id: settings.ID + ident,\n// class: 'diva-' + ident\n// };\n//\n// if (base)\n// return Object.assign(attrs, base);\n// else\n// return attrs;\n// };\n//\n// /** Convenience function to subscribe to a Diva event */\n// const subscribe = (event, callback) => {\n// diva.Events.subscribe(event, callback, settings.ID);\n// };\n//\n// // Creates a toolbar button\n// const createButtonElement = (name, label, callback) => {\n// const button = elt('button', {\n// type: 'button',\n// id: settings.ID + name,\n// class: 'diva-' + name + ' diva-button',\n// title: label\n// });\n//\n// if (callback)\n// button.addEventListener('click', callback, false);\n//\n// return button;\n// };\n//\n// // Higher-level function for creators of zoom and grid controls\n// const getResolutionControlCreator = config => () => {\n// let controls;\n//\n// switch (settings[config.controllerSetting])\n// {\n// case 'slider':\n// controls = config.createSlider();\n// break;\n//\n// case 'buttons':\n// controls = config.createButtons();\n// break;\n//\n// default:\n// // Don't display anything\n// return null;\n// }\n//\n// const wrapper = elt('span',\n// controls,\n// config.createLabel()\n// );\n//\n// const updateWrapper = () => {\n// if (settings.inGrid === config.showInGrid)\n// wrapper.style.display = 'inline';\n// else\n// wrapper.style.display = 'none';\n// };\n//\n// subscribe('ViewDidSwitch', updateWrapper);\n// subscribe('ObjectDidLoad', updateWrapper);\n//\n// // Set initial value\n// updateWrapper();\n//\n// return wrapper;\n// };\n//\n// // Zoom controls\n// const createZoomControls = getResolutionControlCreator({\n// controllerSetting: 'enableZoomControls',\n// showInGrid: false,\n//\n// createSlider: function ()\n// {\n// const elem = createSlider('zoom-slider', {\n// step: 0.1,\n// value: settings.zoomLevel,\n// min: settings.minZoomLevel,\n// max: settings.maxZoomLevel\n// });\n//\n// elem.addEventListener('input', () =>\n// {\n// const floatValue = parseFloat(this.value);\n// viewer.setZoomLevel(floatValue);\n// });\n//\n// elem.addEventListener('change', () =>\n// {\n// const floatValue = parseFloat(this.value);\n// if (floatValue !== settings.zoomLevel)\n// viewer.setZoomLevel(floatValue);\n// });\n//\n// const updateSlider = () => {\n// if (settings.zoomLevel !== $elem.val())\n// $elem.val(settings.zoomLevel);\n// };\n//\n// subscribe('ZoomLevelDidChange', updateSlider);\n// subscribe('ViewerDidLoad', () => {\n// elt.setAttributes(elem, {\n// min: settings.minZoomLevel,\n// max: settings.maxZoomLevel\n// });\n//\n// updateSlider();\n// });\n//\n// return elem;\n// },\n//\n// createButtons: function ()\n// {\n// return elt('span',\n// createButtonElement('zoom-out-button', 'Zoom Out', () => {\n// viewer.setZoomLevel(settings.zoomLevel - 1);\n// }),\n// createButtonElement('zoom-in-button', 'Zoom In', () => {\n// viewer.setZoomLevel(settings.zoomLevel + 1);\n// })\n// );\n// },\n//\n// createLabel: function ()\n// {\n// const elem = createLabel('diva-zoom-label', 'zoom-label', 'Zoom level: ', 'zoom-level', settings.zoomLevel);\n// const textSpan = $(elem).find(settings.selector + 'zoom-level')[0];\n//\n// const updateText = () => {\n// textSpan.textContent = settings.zoomLevel.toFixed(2);\n// };\n//\n// subscribe('ZoomLevelDidChange', updateText);\n// subscribe('ViewerDidLoad', updateText);\n//\n// return elem;\n// }\n// });\n//\n// // Grid controls\n// const createGridControls = getResolutionControlCreator({\n// controllerSetting: 'enableGridControls',\n// showInGrid: true,\n//\n// createSlider: function ()\n// {\n// const elem = createSlider('grid-slider', {\n// value: settings.pagesPerRow,\n// min: settings.minPagesPerRow,\n// max: settings.maxPagesPerRow\n// });\n//\n// elem.addEventListener('input', () => {\n// const intValue = parseInt(elem.value, 10);\n// viewer.setGridPagesPerRow(intValue);\n// });\n//\n// elem.addEventListener('change', () => {\n// const intValue = parseInt(elem.value, 10);\n// if (intValue !== settings.pagesPerRow)\n// viewer.setGridPagesPerRow(intValue);\n// });\n//\n// subscribe('GridRowNumberDidChange', () => {\n// // Update the position of the handle within the slider\n// if (settings.pagesPerRow !== $elem.val())\n// $elem.val(settings.pagesPerRow);\n// });\n//\n// return elem;\n// },\n//\n// createButtons: function ()\n// {\n// return elt('span',\n// createButtonElement('grid-out-button', 'Zoom Out', () => {\n// viewer.setGridPagesPerRow(settings.pagesPerRow - 1);\n// }),\n// createButtonElement('grid-in-button', 'Zoom In', () => {\n// viewer.setGridPagesPerRow(settings.pagesPerRow + 1);\n// })\n// );\n// },\n//\n// createLabel: function ()\n// {\n// const elem = createLabel('diva-grid-label', 'grid-label', 'Pages per row: ', 'pages-per-row', settings.pagesPerRow);\n// const textSpan = $(elem).find(settings.selector + 'pages-per-row')[0];\n//\n// subscribe('GridRowNumberDidChange', () => {\n// textSpan.textContent = settings.pagesPerRow;\n// });\n//\n// return elem;\n// }\n// });\n//\n// const createViewMenu = () => {\n// const viewOptionsList = elt('div', elemAttrs('view-options'));\n//\n// const changeViewButton = createButtonElement('view-icon', 'Change view', () => {\n// $(viewOptionsList).toggle();\n// });\n//\n// document.addEventListener('mouseup', event => {\n// const container = $(viewOptionsList);\n//\n// if (!container.is(event.target) && container.has(event.target).length === 0 && event.target.id !== settings.ID + 'view-icon')\n// {\n// container.hide();\n// }\n// });\n//\n// const selectView = view => {\n// viewer.changeView(view);\n//\n// //hide view menu\n// $(viewOptionsList).hide();\n// };\n//\n// const updateViewMenu = () => {\n// const viewIconClasses = ' diva-view-icon diva-button';\n//\n// // display the icon of the mode we're currently in (?)\n// if (settings.inGrid)\n// {\n// changeViewButton.className = 'diva-grid-icon' + viewIconClasses;\n// }\n// else if (settings.inBookLayout)\n// {\n// changeViewButton.className = 'diva-book-icon' + viewIconClasses;\n// }\n// else\n// {\n// changeViewButton.className = 'diva-document-icon' + viewIconClasses;\n// }\n//\n// const viewOptions = document.createDocumentFragment();\n//\n// // then display document, book, and grid buttons in that order, excluding the current view\n// if (settings.inGrid || settings.inBookLayout)\n// viewOptions.appendChild(createButtonElement('document-icon', 'Document View', selectView.bind(null, 'document')));\n//\n// if (settings.inGrid || !settings.inBookLayout)\n// viewOptions.appendChild(createButtonElement('book-icon', 'Book View', selectView.bind(null, 'book')));\n//\n// if (!settings.inGrid)\n// viewOptions.appendChild(createButtonElement('grid-icon', 'Grid View', selectView.bind(null, 'grid')));\n//\n// // remove old menu\n// while (viewOptionsList.firstChild)\n// {\n// viewOptionsList.removeChild(viewOptionsList.firstChild);\n// }\n//\n// // insert new menu\n// viewOptionsList.appendChild(viewOptions);\n// };\n//\n// subscribe('ViewDidSwitch', updateViewMenu);\n// subscribe('ObjectDidLoad', updateViewMenu);\n//\n// return elt('div', elemAttrs('view-menu'),\n// changeViewButton,\n// viewOptionsList\n// );\n// };\n//\n// const createSlider = (name, options) => elt('input', options, {\n// id: settings.ID + name,\n// class: 'diva-' + name + ' diva-slider',\n// type: 'range'\n// });\n//\n// const createLabel = (name, id, label, innerName, innerValue) => elt('div', {\n// id: settings.ID + id,\n// class: name + ' diva-label'\n// },\n// [\n// label,\n// elt('span', {\n// id: settings.ID + innerName\n// }, innerValue)\n// ]);\n//\n// const createPageNavigationControls = () => {\n// // Go to page form\n// const gotoForm = settings.enableGotoPage ? createGotoPageForm() : null;\n//\n// return elt('span', elemAttrs('page-nav'),\n// createPageLabel(), // 'Page x of y' label\n// gotoForm\n// );\n// };\n//\n// const createGotoPageForm = () => {\n// const gotoPageInput = elt('input', {\n// id: settings.ID + 'goto-page-input',\n// class: 'diva-input diva-goto-page-input',\n// autocomplete: 'off',\n// type: 'text'\n// });\n//\n// const gotoPageSubmit = elt('input', {\n// id: settings.ID + 'goto-page-submit',\n// class: 'diva-button diva-button-text',\n// type: 'submit',\n// value: 'Go'\n// });\n//\n// const inputSuggestions = elt('div', {\n// id: settings.ID + 'input-suggestions',\n// class: 'diva-input-suggestions'\n// }\n// );\n//\n// const gotoForm = elt('form', {\n// id: settings.ID + 'goto-page',\n// class: 'diva-goto-form'\n// },\n// gotoPageInput,\n// gotoPageSubmit,\n// inputSuggestions\n// );\n//\n// $(gotoForm).on('submit', () => {\n// const desiredPageLabel = gotoPageInput.value;\n//\n// if (settings.onGotoSubmit && typeof settings.onGotoSubmit === \"function\")\n// {\n// const pageIndex = settings.onGotoSubmit(desiredPageLabel);\n// if (!viewer.gotoPageByIndex(pageIndex))\n// alert(\"No page could be found with that label or page number\");\n//\n// }\n// else // Default if no function is specified in the settings\n// {\n// if (!viewer.gotoPageByLabel(desiredPageLabel))\n// alert(\"No page could be found with that label or page number\");\n// }\n//\n// // Hide the suggestions\n// inputSuggestions.style.display = 'none';\n//\n// // Prevent the default action of reloading the page\n// return false;\n// });\n//\n// $(gotoPageInput).on('input focus', () => {\n// inputSuggestions.innerHTML = ''; // Remove all previous suggestions\n//\n// const value = gotoPageInput.value;\n// let numSuggestions = 0;\n// if (settings.enableGotoSuggestions && value)\n// {\n// const pages = settings.manifest.pages;\n// for (let i = 0, len = pages.length; i < len && numSuggestions < 10; i++)\n// {\n// if (pages[i].l.toLowerCase().indexOf(value.toLowerCase()) > -1)\n// {\n// const newInputSuggestion = elt('div', {\n// class: 'diva-input-suggestion'\n// },\n// pages[i].l\n// );\n//\n// inputSuggestions.appendChild(newInputSuggestion);\n//\n// numSuggestions++;\n// }\n// }\n//\n// // Show label suggestions\n// if (numSuggestions > 0)\n// inputSuggestions.style.display = 'block';\n// }\n// else\n// inputSuggestions.style.display = 'none';\n// });\n//\n// $(gotoPageInput).on('keydown', e => {\n// let el;\n// if (e.keyCode === 13) // 'Enter' key\n// {\n// const active = $('.active', inputSuggestions);\n// if (active.length)\n// gotoPageInput.value = active.text();\n//\n// }\n// if (e.keyCode === 38) // Up arrow key\n// {\n// el = $('.active', inputSuggestions);\n// const prevEl = el.prev();\n// if (prevEl.length)\n// {\n// el.removeClass('active');\n// prevEl.addClass('active');\n// }\n// else\n// {\n// el.removeClass('active');\n// $('.diva-input-suggestion:last', inputSuggestions).addClass('active');\n// }\n// }\n// else if (e.keyCode === 40) // Down arrow key\n// {\n// el = $('.active', inputSuggestions);\n// const nextEl = el.next();\n// if (nextEl.length)\n// {\n// el.removeClass('active');\n// nextEl.addClass('active');\n// }\n// else\n// {\n// el.removeClass('active');\n// $('.diva-input-suggestion:first', inputSuggestions).addClass('active');\n// }\n// }\n// });\n//\n// $(inputSuggestions).on('mousedown', '.diva-input-suggestion', function()\n// {\n// gotoPageInput.value = this.textContent;\n// inputSuggestions.style.display = 'none';\n// $(gotoPageInput).trigger('submit');\n// });\n//\n// $(gotoPageInput).on('blur', () => {\n// // Hide label suggestions\n// inputSuggestions.style.display = 'none';\n// });\n//\n// return gotoForm;\n// };\n//\n// const createPageLabel = () => {\n// // Current page\n// const currentPage = elt('span', {\n// id: settings.ID + 'current-page'\n// });\n//\n// const updateCurrentPage = () => {\n// currentPage.textContent = viewer.getCurrentAliasedPageIndex();\n// };\n//\n// subscribe('VisiblePageDidChange', updateCurrentPage);\n// subscribe('ViewerDidLoad', updateCurrentPage);\n//\n// // Number of pages\n// const numPages = elt('span', {\n// id: settings.ID + 'num-pages'\n// });\n//\n// const updateNumPages = () => {\n// numPages.textContent = settings.numPages;\n// };\n//\n// subscribe('NumberOfPagesDidChange', updateNumPages);\n// subscribe('ObjectDidLoad', updateNumPages);\n//\n// return elt('span', {\n// class: 'diva-page-label diva-label'\n// },\n// 'Page ', currentPage, ' of ', numPages\n// );\n// };\n//\n// const createToolbarButtonGroup = () => {\n// const buttons = [createViewMenu()];\n//\n// if (settings.enableLinkIcon)\n// buttons.push(createLinkIcon());\n//\n// if (settings.enableNonPagedVisibilityIcon)\n// buttons.push(createToggleNonPagedButton());\n//\n// if (settings.enableFullscreen)\n// buttons.push(createFullscreenButton());\n//\n// return elt('span', elemAttrs('toolbar-button-group'), buttons);\n// };\n//\n// const createLinkIcon = () => {\n// const elem = createButtonElement('link-icon', 'Link to this page');\n// const linkIcon = $(elem);\n//\n// linkIcon.on('click', () => {\n// $('body').prepend(\n// elt('div', {\n// id: settings.ID + 'link-popup',\n// class: 'diva-popup diva-link-popup'\n// }, [\n// elt('input', {\n// id: settings.ID + 'link-popup-input',\n// class: 'diva-input',\n// type: 'text',\n// value: viewer.getCurrentURL()\n// })\n// ])\n// );\n//\n// if (settings.inFullscreen)\n// {\n// $(settings.selector + 'link-popup').addClass('in-fullscreen');\n// }\n// else\n// {\n// // Calculate the left and top offsets\n// const leftOffset = linkIcon.offset().left - 222 + linkIcon.outerWidth();\n// const topOffset = linkIcon.offset().top + linkIcon.outerHeight() - 1;\n//\n// $(settings.selector + 'link-popup').css({\n// 'top': topOffset + 'px',\n// 'left': leftOffset + 'px'\n// });\n// }\n//\n// // Catch onmouseup events outside of this div\n// $('body').mouseup(event => {\n// const targetID = event.target.id;\n//\n// if (targetID !== settings.ID + 'link-popup' && targetID !== settings.ID + 'link-popup-input')\n// $(settings.selector + 'link-popup').remove();\n// });\n//\n// // Also delete it upon scroll and page up/down key events\n// // FIXME(wabain): This is aggressive\n// settings.viewportObject.scroll(() => {\n// $(settings.selector + 'link-popup').remove();\n// });\n// $(settings.selector + 'link-popup input').click(function ()\n// {\n// $(this).focus().select();\n// });\n//\n// return false;\n// });\n//\n// return elem;\n// };\n//\n// var createFullscreenButton = () => createButtonElement('fullscreen-icon', 'Toggle fullscreen mode', () => {\n// viewer.toggleFullscreenMode();\n// });\n//\n// var createToggleNonPagedButton = () => {\n// const getClassName = () => 'toggle-nonpaged-icon' + (viewer.getSettings().showNonPagedPages ? '-active' : '');\n//\n// const toggleNonPagedButton = createButtonElement(getClassName(), 'Toggle visibility of non-paged pages', function()\n// {\n// viewer.toggleNonPagedPagesVisibility();\n// const newClassName = 'diva-' + getClassName();\n// this.className = this.className.replace(/diva-toggle-nonpaged-icon(-active)?/, newClassName);\n// });\n//\n// const updateNonPagedButtonVisibility = () => {\n// const pages = settings.manifest.pages;\n// for (let i = 0; i < pages.length; i++)\n// {\n// if (settings.manifest.paged && !pages[i].paged)\n// {\n// // Show the button, there is at least one non-paged page\n// toggleNonPagedButton.style.display = 'inline-block';\n// return;\n// }\n// }\n//\n// // No non-paged pages were found, hide the button\n// toggleNonPagedButton.style.display = 'none';\n// };\n// subscribe('ObjectDidLoad', updateNonPagedButtonVisibility);\n//\n// return toggleNonPagedButton;\n// };\n//\n// // Handles all status updating etc (both fullscreen and not)\n// const init = () => {\n// const leftTools = [createZoomControls(), createGridControls()];\n// const rightTools = [createPageNavigationControls(), createToolbarButtonGroup()];\n//\n// const tools = elt('div', elemAttrs('tools'),\n// elt('div', elemAttrs('tools-left'), leftTools),\n// elt('div', elemAttrs('tools-right'), rightTools)\n// );\n//\n// settings.toolbarParentObject.prepend(tools);\n//\n// // Handle entry to and exit from fullscreen mode\n// const switchMode = () => {\n// const toolsRightElement = document.getElementById(settings.ID + 'tools-right');\n// const pageNavElement = document.getElementById(settings.ID + 'page-nav');\n//\n// if (!settings.inFullscreen)\n// {\n// // Leaving fullscreen\n// $(tools).removeClass('diva-fullscreen-tools');\n//\n// //move ID-page-nav to beginning of tools right\n// toolsRightElement.removeChild(pageNavElement);\n// toolsRightElement.insertBefore(pageNavElement, toolsRightElement.firstChild);\n// }\n// else\n// {\n// // Entering fullscreen\n// $(tools).addClass('diva-fullscreen-tools');\n//\n// //move ID-page-nav to end of tools right\n// toolsRightElement.removeChild(pageNavElement);\n// toolsRightElement.appendChild(pageNavElement);\n// }\n// };\n//\n// subscribe('ModeDidSwitch', switchMode);\n// subscribe('ViewerDidLoad', switchMode);\n//\n// const toolbar = {\n// element: tools,\n// closePopups: function ()\n// {\n// $('.diva-popup').css('display', 'none');\n// }\n// };\n//\n// return toolbar;\n// };\n//\n// return init();\n// }\n","/**\n * @fileoverview dragscroll - scroll area by dragging\n * @version 0.0.8\n *\n * @license MIT, see http://github.com/asvd/dragscroll\n * @copyright 2015 asvd \n */\n(function (root, factory)\n{\n if (typeof define === 'function' && define.amd)\n {\n define(['exports'], factory);\n }\n else if (typeof exports !== 'undefined')\n {\n factory(exports);\n }\n else\n {\n factory((root.dragscroll = {}));\n }\n}(this, function (exports)\n{\n var _window = window;\n var _document = document;\n var mousemove = 'mousemove';\n var mouseup = 'mouseup';\n var mousedown = 'mousedown';\n var EventListener = 'EventListener';\n var addEventListener = 'add' + EventListener;\n var removeEventListener = 'remove' + EventListener;\n var newScrollX, newScrollY; // jshint ignore:line\n\n var dragged = [];\n\n var reset = function (i, el)\n {\n for (i = 0; i < dragged.length;)\n {\n el = dragged[i++];\n el = el.container || el;\n el[removeEventListener](mousedown, el.md, 0);\n _window[removeEventListener](mouseup, el.mu, 0);\n _window[removeEventListener](mousemove, el.mm, 0);\n }\n\n // suppress warning about functions in loops.\n /* jshint ignore:start */\n // cloning into array since HTMLCollection is updated dynamically\n dragged = [].slice.call(_document.getElementsByClassName('dragscroll'));\n for (i = 0; i < dragged.length;)\n {\n (function (el, lastClientX, lastClientY, pushed, scroller, cont)\n {\n (cont = el.container || el)[addEventListener](\n mousedown,\n cont.md = function (e)\n {\n if (!el.hasAttribute('nochilddrag') || _document.elementFromPoint(e.pageX, e.pageY) === cont)\n {\n pushed = 1;\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n\n e.preventDefault();\n }\n }, 0\n );\n\n _window[addEventListener](mouseup, cont.mu = function ()\n {\n pushed = 0;\n }, 0);\n\n _window[addEventListener](mousemove, cont.mm = function (e)\n {\n if (pushed)\n {\n (scroller = el.scroller || el).scrollLeft -=\n newScrollX = (-lastClientX + (lastClientX = e.clientX));\n scroller.scrollTop -=\n newScrollY = (-lastClientY + (lastClientY = e.clientY));\n if (el === _document.body)\n {\n (scroller = _document.documentElement).scrollLeft -= newScrollX;\n scroller.scrollTop -= newScrollY;\n }\n }\n }, 0);\n })(dragged[i++]);\n }\n /* jshint ignore:end */\n };\n\n if (_document.readyState === 'complete')\n {\n reset();\n }\n else\n {\n _window[addEventListener]('load', reset, 0);\n }\n\n exports.reset = reset;\n}));\n","export { setDOMAttributes as setAttributes };\n\n/**\n * Convenience function to create a DOM element, set attributes on it, and\n * append children. All arguments which are not of primitive type, are not\n * arrays, and are not DOM nodes are treated as attribute hashes and are\n * handled as described for setDOMAttributes. Children can either be a DOM\n * node or a primitive value, which is converted to a text node. Arrays are\n * handled recursively. Null and undefined values are ignored.\n *\n * Inspired by the ProseMirror helper of the same name.\n */\nexport function elt (tag)\n{\n const el = document.createElement(tag);\n const args = Array.prototype.slice.call(arguments, 1);\n\n while (args.length)\n {\n const arg = args.shift();\n handleEltConstructorArg(el, arg);\n }\n\n return el;\n}\n\nfunction handleEltConstructorArg (el, arg)\n{\n if (arg == null) // NB: == is correct;\n return;\n\n if (typeof arg !== 'object' && typeof arg !== 'function')\n {\n // Coerce to string\n el.appendChild(document.createTextNode(arg));\n }\n else if (arg instanceof window.Node)\n {\n el.appendChild(arg);\n }\n else if (arg instanceof Array)\n {\n const childCount = arg.length;\n for (let i = 0; i < childCount; i++)\n handleEltConstructorArg(el, arg[i]);\n }\n else\n {\n setDOMAttributes(el, arg);\n }\n}\n\n/**\n * Set attributes of a DOM element. The `style` property is special-cased to\n * accept either a string or an object whose own attributes are assigned to\n * el.style.\n */\nfunction setDOMAttributes (el, attributes)\n{\n for (const prop in attributes)\n {\n if (!attributes.hasOwnProperty(prop))\n continue;\n\n if (prop === 'style')\n {\n setStyle(el, attributes.style);\n }\n else\n {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n}\n\nfunction setStyle (el, style)\n{\n if (!style)\n return;\n\n if (typeof style !== 'object')\n {\n el.style.cssText = style;\n return;\n }\n\n for (const cssProp in style)\n {\n if (!style.hasOwnProperty(cssProp))\n continue;\n\n el.style[cssProp] = style[cssProp];\n }\n}\n","/**\n * Events. Pub/Sub system for Loosely Coupled logic.\n * Based on Peter Higgins' port from Dojo to jQuery\n * https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js\n *\n * Re-adapted to vanilla Javascript\n *\n * @class Events\n */\n\nclass DivaEvents\n{\n constructor()\n {\n this._cache = {};\n }\n\n /**\n * diva.Events.publish\n * e.g.: diva.Events.publish(\"PageDidLoad\", [pageIndex, filename, pageSelector], this);\n *\n * @class Events\n * @method publish\n * @param topic {String}\n * @param args {Array}\n * @param scope {Object=} Optional - Subscribed functions will be executed with the supplied object as `this`.\n * It is necessary to supply this argument with the self variable when within a Diva instance.\n * The scope argument is matched with the instance ID of subscribers to determine whether they\n * should be executed. (See instanceID argument of subscribe.)\n */\n publish(topic, args, scope)\n {\n if (this._cache[topic])\n {\n const thisTopic = this._cache[topic];\n\n if (typeof thisTopic.global !== 'undefined')\n {\n const thisTopicGlobal = thisTopic.global;\n const globalCount = thisTopicGlobal.length;\n\n for (let i=0; i < globalCount; i++)\n {\n thisTopicGlobal[i].apply(scope || null, args || []);\n }\n }\n\n if (scope && typeof scope.getInstanceId !== 'undefined')\n {\n // get publisher instance ID from scope arg, compare, and execute if match\n const instanceID = scope.getInstanceId();\n\n if (this._cache[topic][instanceID])\n {\n const thisTopicInstance = this._cache[topic][instanceID];\n const scopedCount = thisTopicInstance.length;\n\n for (let j=0; j < scopedCount; j++)\n {\n thisTopicInstance[j].apply(scope, args || []);\n }\n }\n }\n }\n }\n\n /**\n * diva.Events.subscribe\n * e.g.: diva.Events.subscribe(\"PageDidLoad\", highlight, settings.ID)\n *\n * @class Events\n * @method subscribe\n * @param {string} topic\n * @param {function} callback\n * @param {string=} instanceID Optional - String representing the ID of a Diva instance; if provided,\n * callback only fires for events published from that instance.\n * @return Event handler {Array}\n */\n subscribe(topic, callback, instanceID)\n {\n if (!this._cache[topic])\n {\n this._cache[topic] = {};\n }\n\n if (typeof instanceID === 'string')\n {\n if (!this._cache[topic][instanceID])\n {\n this._cache[topic][instanceID] = [];\n }\n\n this._cache[topic][instanceID].push(callback);\n }\n else\n {\n if (!this._cache[topic].global)\n {\n this._cache[topic].global = [];\n }\n\n this._cache[topic].global.push(callback);\n }\n\n return instanceID ? [topic, callback, instanceID] : [topic, callback];\n }\n\n /**\n * diva.Events.unsubscribe\n * e.g.: var handle = Events.subscribe(\"PageDidLoad\", highlight);\n * Events.unsubscribe(handle);\n *\n * @class Events\n * @method unsubscribe\n * @param {array} handle\n * @param {boolean=} completely - Unsubscribe all events for a given topic.\n * @return {boolean} success\n */\n unsubscribe(handle, completely)\n {\n const t = handle[0];\n\n if (this._cache[t])\n {\n let topicArray;\n const instanceID = handle.length === 3 ? handle[2] : 'global';\n\n topicArray = this._cache[t][instanceID];\n\n if (!topicArray)\n {\n return false;\n }\n\n if (completely)\n {\n delete this._cache[t][instanceID];\n return topicArray.length > 0;\n }\n\n let i = topicArray.length;\n\n while (i--)\n {\n if (topicArray[i] === handle[1])\n {\n this._cache[t][instanceID].splice(i, 1);\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * diva.Events.unsubscribeAll\n * e.g.: diva.Events.unsubscribeAll('global');\n *\n * @class Events\n * @param {string=} instanceID Optional - instance ID to remove subscribers from or 'global' (if omitted,\n * subscribers in all scopes removed)\n * @method unsubscribeAll\n */\n unsubscribeAll(instanceID)\n {\n if (instanceID)\n {\n const topics = Object.keys(this._cache);\n let i = topics.length;\n let topic;\n\n while (i--)\n {\n topic = topics[i];\n\n if (typeof this._cache[topic][instanceID] !== 'undefined')\n {\n delete this._cache[topic][instanceID];\n }\n }\n }\n else\n {\n this._cache = {};\n }\n }\n}\n\nexport let Events = new DivaEvents();\n","// From http://www.alexandre-gomes.com/?p=115, modified slightly\nexport default function getScrollbarWidth()\n{\n let inner = document.createElement('p');\n inner.style.width = '100%';\n inner.style.height = '200px';\n\n let outer = document.createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '200px';\n outer.style.height = '150px';\n outer.style.overflow = 'hidden';\n outer.appendChild(inner);\n\n document.body.appendChild(outer);\n\n let w1 = inner.offsetWidth;\n outer.style.overflow = 'scroll';\n let w2 = inner.offsetWidth;\n if (w1 === w2) {\n w2 = outer.clientWidth; // for IE i think\n }\n\n document.body.removeChild(outer);\n return w1 - w2;\n}\n","export default {\n get: getHashParam,\n update: updateHashParam\n};\n\n\n// For getting the #key values from the URL. For specifying a page and zoom level\n// Look into caching, because we only need to get this during the initial load\n// Although for the tests I guess we would need to override caching somehow\nfunction getHashParam (key)\n{\n const hash = window.location.hash;\n\n if (hash !== '')\n {\n // Check if there is something that looks like either &key= or #key=\n let startIndex = (hash.indexOf('&' + key + '=') > 0) ? hash.indexOf('&' + key + '=') : hash.indexOf('#' + key + '=');\n\n // If startIndex is still -1, it means it can't find either\n if (startIndex >= 0)\n {\n // Add the length of the key plus the & and =\n startIndex += key.length + 2;\n\n // Either to the next ampersand or to the end of the string\n const endIndex = hash.indexOf('&', startIndex);\n if (endIndex > startIndex)\n {\n return decodeURIComponent(hash.substring(startIndex, endIndex));\n }\n else if (endIndex < 0)\n {\n // This means this hash param is the last one\n return decodeURIComponent(hash.substring(startIndex));\n }\n // If the key doesn't have a value I think\n return '';\n }\n else\n {\n // If it can't find the key\n return false;\n }\n }\n else\n {\n // If there are no hash params just return false\n return false;\n }\n}\n\nfunction updateHashParam (key, value)\n{\n // First make sure that we have to do any work at all\n const originalValue = getHashParam(key);\n const hash = window.location.hash;\n\n if (originalValue !== value)\n {\n // Is the key already in the URL?\n if (typeof originalValue === 'string')\n {\n // Already in the URL. Just get rid of the original value\n const startIndex = (hash.indexOf('&' + key + '=') > 0) ? hash.indexOf('&' + key + '=') : hash.indexOf('#' + key + '=');\n const endIndex = startIndex + key.length + 2 + originalValue.length;\n // # if it's the first, & otherwise\n const startThing = (startIndex === 0) ? '#' : '&';\n window.location.replace(hash.substring(0, startIndex) + startThing + key + '=' + value + hash.substring(endIndex));\n }\n else\n {\n // It's not present - add it\n if (hash.length === 0)\n {\n window.location.replace('#' + key + '=' + value);\n }\n else\n {\n // Append it\n window.location.replace(hash + '&' + key + '=' + value);\n }\n }\n }\n}\n","/*\n The MIT License (MIT)\n Copyright (c) <2011> \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 deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is furnished\n to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n 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, FITNESS\n FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n Port to vanilla Javascript by Jacek Nowacki http://jacek-nowacki.net/\n**/\n\n(function() {\n var _raf = window.requestAnimationFrame;\n\n var _isTouch = 'ontouchend' in document;\n\n // this is simple, no \"deep\" support\n var _extend = function() {\n for (var i=1; i 0 || Math.abs(self.velocityY) > 0) {\n e.preventDefault();\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n },\n dragStart: function(e) {\n if (self._useTarget(e.target, e) && self.elementFocused) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n },\n selectStart: function(e) {\n if (typeof self.settings.selectStart === 'function') {\n return self.settings.selectStart.apply(self, arguments);\n }\n else if (self._useTarget(e.target, e)) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n return false;\n }\n }\n };\n\n this._attachListeners();\n };\n\n VanillaKinetic.prototype._inputmove = function(clientX, clientY) {\n if (!this.lastMove || new Date() > new Date(this.lastMove.getTime() + this.throttleTimeout)) {\n this.lastMove = new Date();\n\n if (this.mouseDown && (this.xpos || this.ypos)) {\n var movedX = (clientX - this.xpos);\n var movedY = (clientY - this.ypos);\n if (this.settings.invert) {\n movedX *= -1;\n movedY *= -1;\n }\n if (this.threshold>0) {\n var moved = Math.sqrt(movedX*movedX + movedY*movedY);\n if (this.threshold>moved) {\n return;\n }\n else {\n this.threshold = 0;\n }\n }\n if (this.elementFocused) {\n this.elementFocused.blur();\n this.elementFocused = null;\n this.el.focus();\n }\n\n this.settings.decelerate = false;\n this.velocity = this.velocityY = 0;\n\n var scrollLeft = this.scrollLeft();\n var scrollTop = this.scrollTop();\n\n this.scrollLeft(this.settings.x ? scrollLeft - movedX : scrollLeft);\n this.scrollTop(this.settings.y ? scrollTop - movedY : scrollTop);\n\n this.prevXPos = this.xpos;\n this.prevYPos = this.ypos;\n this.xpos = clientX;\n this.ypos = clientY;\n\n this._calculateVelocities();\n this._setMoveClasses(this.settings.movingClass);\n\n if (typeof this.settings.moved === 'function') {\n this.settings.moved.call(this, this.settings);\n }\n }\n }\n };\n\n VanillaKinetic.prototype._calculateVelocities = function() {\n this.velocity = this._capVelocity(this.prevXPos - this.xpos, this.settings.maxvelocity);\n this.velocityY = this._capVelocity(this.prevYPos - this.ypos, this.settings.maxvelocity);\n if (this.settings.invert) {\n this.velocity *= -1;\n this.velocityY *= -1;\n }\n };\n\n VanillaKinetic.prototype._end = function() {\n if (this.xpos && this.prevXPos && this.settings.decelerate === false) {\n this.settings.decelerate = true;\n this._calculateVelocities();\n this.xpos = this.prevXPos = this.mouseDown = false;\n this._move();\n }\n };\n\n VanillaKinetic.prototype._useTarget = function(target, event) {\n if (typeof this.settings.filterTarget === 'function') {\n return this.settings.filterTarget.call(this, target, event) !== false;\n }\n return true;\n\n };\n\n VanillaKinetic.prototype._threshold = function(target, event) {\n if (typeof this.settings.threshold === 'function') {\n return this.settings.threshold.call(this, target, event);\n }\n return this.settings.threshold;\n };\n\n VanillaKinetic.prototype._start = function(clientX, clientY) {\n this.mouseDown = true;\n this.velocity = this.prevXPos = 0;\n this.velocityY = this.prevYPos = 0;\n this.xpos = clientX;\n this.ypos = clientY;\n };\n\n VanillaKinetic.prototype._resetMouse = function() {\n this.xpos = false;\n this.ypos = false;\n this.mouseDown = false;\n };\n\n VanillaKinetic.prototype._decelerateVelocity = function(velocity, slowdown) {\n return Math.floor(Math.abs(velocity)) === 0 ? 0 // is velocity less than 1?\n : velocity * slowdown; // reduce slowdown\n };\n\n VanillaKinetic.prototype._capVelocity = function(velocity, max) {\n var newVelocity = velocity;\n if (velocity > 0){\n if (velocity > max){\n newVelocity = max;\n }\n } else {\n if (velocity < (0 - max)){\n newVelocity = (0 - max);\n }\n }\n return newVelocity;\n };\n\n VanillaKinetic.prototype._setMoveClasses = function(classes) {\n // The fix-me comment below is from original jQuery.kinetic project\n // FIXME: consider if we want to apply PL #44, this should not remove\n // classes we have not defined on the element!\n var settings = this.settings;\n var el = this.el;\n\n el.classList.remove(settings.movingClass.up);\n el.classList.remove(settings.movingClass.down);\n el.classList.remove(settings.movingClass.left);\n el.classList.remove(settings.movingClass.right);\n el.classList.remove(settings.deceleratingClass.up);\n el.classList.remove(settings.deceleratingClass.down);\n el.classList.remove(settings.deceleratingClass.left);\n el.classList.remove(settings.deceleratingClass.right);\n\n if (this.velocity > 0){\n el.classList.add(classes.right);\n }\n if (this.velocity < 0){\n el.classList.add(classes.left);\n }\n if (this.velocityY > 0){\n el.classList.add(classes.down);\n }\n if (this.velocityY < 0){\n el.classList.add(classes.up);\n }\n };\n\n VanillaKinetic.prototype._move = function() {\n var scroller = this._getScroller();\n var self = this;\n var settings = this.settings;\n\n if (settings.x && scroller.scrollWidth > 0) {\n this.scrollLeft(this.scrollLeft() + this.velocity);\n if (Math.abs(this.velocity) > 0) {\n this.velocity = settings.decelerate ?\n self._decelerateVelocity(this.velocity, settings.slowdown) : this.velocity;\n }\n }\n else {\n this.velocity = 0;\n }\n\n if (settings.y && scroller.scrollHeight > 0){\n this.scrollTop(this.scrollTop() + this.velocityY);\n if (Math.abs(this.velocityY) > 0){\n this.velocityY = settings.decelerate ?\n self._decelerateVelocity(this.velocityY, settings.slowdown) : this.velocityY;\n }\n }\n else {\n this.velocityY = 0;\n }\n\n self._setMoveClasses(settings.deceleratingClass);\n\n if (typeof settings.moved === 'function'){\n settings.moved.call(this, settings);\n }\n\n if (Math.abs(this.velocity) > 0 || Math.abs(this.velocityY) > 0){\n if (!this.moving) {\n this.moving = true;\n // tick for next movement\n _raf(function() {\n self.moving = false;\n self._move();\n });\n }\n }\n else {\n self.stop();\n }\n };\n\n VanillaKinetic.prototype._getScroller = function() {\n // FIXME we may want to normalize behaviour across browsers as in original jQuery.kinetic\n // currently this won't work correctly on all brwosers when attached to html or body element\n return this.el;\n };\n\n VanillaKinetic.prototype.scrollLeft = function(left) {\n var scroller = this._getScroller();\n if (typeof left === 'number') {\n scroller.scrollLeft = left;\n this.settings.scrollLeft = left;\n }\n else {\n return scroller.scrollLeft;\n }\n };\n\n VanillaKinetic.prototype.scrollTop = function(top) {\n var scroller = this._getScroller();\n if (typeof top === 'number') {\n scroller.scrollTop = top;\n this.settings.scrollTop = top;\n }\n else {\n return scroller.scrollTop;\n }\n };\n\n VanillaKinetic.prototype._attachListeners = function() {\n var el = this.el;\n var settings = this.settings;\n\n if (_isTouch) {\n el.addEventListener('touchstart', settings.events.touchStart, false);\n el.addEventListener('touchend', settings.events.inputEnd, false);\n el.addEventListener('touchmove', settings.events.touchMove, false);\n }\n\n el.addEventListener('mousedown', settings.events.inputDown, false);\n el.addEventListener('mouseup', settings.events.inputEnd, false);\n el.addEventListener('mousemove', settings.events.inputMove, false);\n\n el.addEventListener('click', settings.events.inputClick, false);\n el.addEventListener('scroll', settings.events.scroll, false);\n el.addEventListener('selectstart', settings.events.selectStart, false);\n el.addEventListener('dragstart', settings.events.dragStart, false);\n };\n\n VanillaKinetic.prototype._detachListeners = function() {\n var el = this.el;\n var settings = this.settings;\n\n if (_isTouch) {\n el.removeEventListener('touchstart', settings.events.touchStart, false);\n el.removeEventListener('touchend', settings.events.inputEnd, false);\n el.removeEventListener('touchmove', settings.events.touchMove, false);\n }\n\n el.removeEventListener('mousedown', settings.events.inputDown, false);\n el.removeEventListener('mouseup', settings.events.inputEnd, false);\n el.removeEventListener('mousemove', settings.events.inputMove, false);\n\n el.removeEventListener('click', settings.events.inputClick, false);\n el.removeEventListener('scroll', settings.events.scroll, false);\n el.removeEventListener('selectstart', settings.events.selectStart, false);\n el.removeEventListener('dragstart', settings.events.dragStart, false);\n };\n\n\n window.VanillaKinetic = VanillaKinetic;\n})();\n","export default class ValidationRunner\n{\n constructor (options)\n {\n this.whitelistedKeys = options.whitelistedKeys || [];\n this.additionalProperties = options.additionalProperties || [];\n this.validations = options.validations;\n }\n\n isValid (key, value, settings)\n {\n // Get the validation index\n let validationIndex = null;\n\n this.validations.some((validation, index) =>\n {\n if (validation.key !== key)\n {\n return false;\n }\n\n validationIndex = index;\n return true;\n });\n\n if (validationIndex === null)\n {\n return true;\n }\n\n // Run the validation\n const dummyChanges = {};\n dummyChanges[key] = value;\n const proxier = createSettingsProxier(settings, dummyChanges, this);\n\n return !this._runValidation(validationIndex, value, proxier);\n }\n\n validate (settings)\n {\n this._validateOptions({}, settings);\n }\n\n getValidatedOptions (settings, options)\n {\n const cloned = Object.assign({}, options);\n this._validateOptions(settings, cloned);\n return cloned;\n }\n\n _validateOptions (settings, options)\n {\n const settingsProxier = createSettingsProxier(settings, options, this);\n this._applyValidations(options, settingsProxier);\n }\n\n _applyValidations (options, proxier)\n {\n this.validations.forEach((validation, index) =>\n {\n if (!options.hasOwnProperty(validation.key))\n {\n return;\n }\n\n const input = options[validation.key];\n const corrected = this._runValidation(index, input, proxier);\n\n if (corrected)\n {\n if (!corrected.warningSuppressed)\n {\n emitWarning(validation.key, input, corrected.value);\n }\n\n options[validation.key] = corrected.value;\n }\n }, this);\n }\n\n _runValidation (index, input, proxier)\n {\n const validation = this.validations[index];\n\n proxier.index = index;\n\n let warningSuppressed = false;\n const config = {\n suppressWarning: () =>\n {\n warningSuppressed = true;\n }\n };\n\n const outputValue = validation.validate(input, proxier.proxy, config);\n\n if (outputValue === undefined || outputValue === input)\n {\n return null;\n }\n\n return {\n value: outputValue,\n warningSuppressed: warningSuppressed\n };\n }\n}\n\n/**\n * The settings proxy wraps the settings object and ensures that\n * only values which have previously been validated are accessed,\n * throwing a TypeError otherwise.\n *\n * FIXME(wabain): Is it worth keeping this? When I wrote it I had\n * multiple validation stages and it was a lot harder to keep track\n * of everything, so this was more valuable.\n */\nfunction createSettingsProxier (settings, options, runner)\n{\n const proxier = {\n proxy: {},\n index: null\n };\n\n const lookup = lookupValue.bind(null, settings, options);\n\n const properties = {};\n\n runner.whitelistedKeys.forEach((whitelisted) =>\n {\n properties[whitelisted] = {\n get: lookup.bind(null, whitelisted)\n };\n });\n\n runner.additionalProperties.forEach((additional) =>\n {\n properties[additional.key] = {\n get: additional.get\n };\n });\n\n runner.validations.forEach( (validation, validationIndex) =>\n {\n properties[validation.key] = {\n get: () =>\n {\n if (validationIndex < proxier.index)\n {\n return lookup(validation.key);\n }\n\n const currentKey = runner.validations[proxier.index].key;\n throw new TypeError('Cannot access setting ' + validation.key + ' while validating ' + currentKey);\n }\n };\n });\n\n Object.defineProperties(proxier.proxy, properties);\n\n return proxier;\n}\n\nfunction emitWarning (key, original, corrected)\n{\n console.warn('Invalid value for ' + key + ': ' + original + '. Using ' + corrected + ' instead.');\n}\n\nfunction lookupValue (base, extension, key)\n{\n if (key in extension)\n {\n return extension[key];\n }\n\n return base[key];\n}\n","import { elt } from './utils/elt';\nimport getScrollbarWidth from './utils/get-scrollbar-width';\nimport gestureEvents from './gesture-events';\nimport diva from './diva-global';\nimport DocumentHandler from './document-handler';\nimport GridHandler from './grid-handler';\nimport PageOverlayManager from './page-overlay-manager';\nimport Renderer from './renderer';\nimport getPageLayouts from './page-layouts';\nimport createSettingsView from './settings-view';\nimport ValidationRunner from './validation-runner';\nimport Viewport from './viewport';\n\nconst debug = require('debug')('diva:ViewerCore');\n\nfunction generateId() {\n return generateId.counter++;\n}\ngenerateId.counter = 1;\n\n\n// Define validations\nconst optionsValidations = [\n {\n key: 'goDirectlyTo',\n validate: (value, settings) =>\n {\n if (value < 0 || value >= settings.manifest.pages.length)\n return 0;\n }\n },\n {\n key: 'minPagesPerRow',\n validate: (value) =>\n {\n return Math.max(2, value);\n }\n },\n {\n key: 'maxPagesPerRow',\n validate: (value, settings) =>\n {\n return Math.max(value, settings.minPagesPerRow);\n }\n },\n {\n key: 'pagesPerRow',\n validate: (value, settings) =>\n {\n // Default to the maximum\n if (value < settings.minPagesPerRow || value > settings.maxPagesPerRow)\n return settings.maxPagesPerRow;\n }\n },\n {\n key: 'maxZoomLevel',\n validate: (value, settings, config) =>\n {\n // Changing this value isn't really an error, it just depends on the\n // source manifest\n config.suppressWarning();\n\n if (value < 0 || value > settings.manifest.maxZoom)\n return settings.manifest.maxZoom;\n }\n },\n {\n key: 'minZoomLevel',\n validate: (value, settings, config) =>\n {\n // Changes based on the manifest value shouldn't trigger a\n // warning\n if (value > settings.manifest.maxZoom)\n {\n config.suppressWarning();\n return 0;\n }\n\n if (value < 0 || value > settings.maxZoomLevel)\n return 0;\n }\n },\n {\n key: 'zoomLevel',\n validate: (value, settings, config) =>\n {\n if (value > settings.manifest.maxZoom)\n {\n config.suppressWarning();\n return 0;\n }\n\n if (value < settings.minZoomLevel || value > settings.maxZoomLevel)\n return settings.minZoomLevel;\n }\n }\n];\n\nexport default class ViewerCore\n{\n constructor (element, options, publicInstance)\n {\n this.parentObject = element;\n this.publicInstance = publicInstance;\n\n // Things that cannot be changed because of the way they are used by the script\n // Many of these are declared with arbitrary values that are changed later on\n this.viewerState = {\n currentPageIndex: 0, // The current page in the viewport (center-most page)\n horizontalOffset: 0, // Distance from the center of the diva element to the top of the current page\n horizontalPadding: 0, // Either the fixed padding or adaptive padding\n ID: null, // The prefix of the IDs of the elements (usually 1-diva-)\n initialKeyScroll: false, // Holds the initial state of enableKeyScroll\n initialSpaceScroll: false, // Holds the initial state of enableSpaceScroll\n innerElement: null, // The native .diva-outer DOM object\n innerObject: {}, // $(settings.ID + 'inner'), for selecting the .diva-inner element\n isActiveDiva: true, // In the case that multiple diva panes exist on the same page, this should have events funneled to it.\n isScrollable: true, // Used in enable/disableScrollable public methods\n isZooming: false, // Flag to keep track of whether zooming is still in progress, for handleZoom\n loaded: false, // A flag for when everything is loaded and ready to go.\n manifest: null,\n mobileWebkit: false, // Checks if the user is on a touch device (iPad/iPod/iPhone/Android)\n numPages: 0, // Number of pages in the array\n oldZoomLevel: -1, // Holds the previous zoom level after zooming in or out\n options: options,\n outerElement: null, // The native .diva-outer DOM object\n outerObject: {}, // $(settings.ID + 'outer'), for selecting the .diva-outer element\n pageOverlays: new PageOverlayManager(),\n pageTools: [], // The plugins which are enabled as page tools\n parentObject: this.parentObject, // JQuery object referencing the parent element\n pendingManifestRequest: null, // Reference to the xhr request retrieving the manifest. Used to cancel the request on destroy()\n pluginInstances: [], // Filled with the enabled plugins from the registry\n renderer: null,\n resizeTimer: -1, // Holds the ID of the timeout used when resizing the window (for clearing)\n scrollbarWidth: 0, // Set to the actual scrollbar width in init()\n selector: '', // Uses the generated ID prefix to easily select elements\n throbberTimeoutID: -1, // Holds the ID of the throbber loading timeout\n toolbar: null, // Holds an object with some toolbar-related functions\n verticalOffset: 0, // Distance from the center of the diva element to the left side of the current page\n verticalPadding: 0, // Either the fixed padding or adaptive padding\n viewHandler: null,\n viewport: null, // Object caching the viewport dimensions\n viewportElement: null,\n viewportObject: null,\n zoomDuration: 600\n };\n\n this.settings = createSettingsView([options, this.viewerState]);\n\n // Generate an ID that can be used as a prefix for all the other IDs\n const idNumber = generateId();\n this.viewerState.ID = 'diva-' + idNumber + '-';\n this.viewerState.selector = this.settings.ID;\n\n // Aliases for compatibility\n Object.defineProperties(this.settings, {\n // Height of the document viewer pane\n panelHeight: {\n get: () =>\n {\n return this.viewerState.viewport.height;\n }\n },\n // Width of the document viewer pane\n panelWidth: {\n get: () =>\n {\n return this.viewerState.viewport.width;\n }\n }\n });\n\n this.optionsValidator = new ValidationRunner({\n additionalProperties: [\n {\n key: 'manifest',\n get: () =>\n {\n return this.viewerState.manifest;\n }\n }\n ],\n\n validations: optionsValidations\n });\n\n this.viewerState.scrollbarWidth = getScrollbarWidth();\n\n // If window.orientation is defined, then it's probably mobileWebkit\n this.viewerState.mobileWebkit = window.orientation !== undefined;\n\n if (options.hashParamSuffix === null)\n {\n // Omit the suffix from the first instance\n if (idNumber === 1)\n options.hashParamSuffix = '';\n else\n options.hashParamSuffix = idNumber + '';\n }\n\n // Create the inner and outer panels\n const innerElem = elt('div', this.elemAttrs('inner', { class: 'diva-inner' }));\n const viewportElem = elt('div', this.elemAttrs('viewport'), innerElem);\n const outerElem = elt('div', this.elemAttrs('outer'),\n viewportElem,\n elt('div', this.elemAttrs('throbber'),\n [\n elt('div', { class: 'cube cube1' }),\n elt('div', { class: 'cube cube2' }),\n elt('div', { class: 'cube cube3' }),\n elt('div', { class: 'cube cube4' }),\n elt('div', { class: 'cube cube5' }),\n elt('div', { class: 'cube cube6' }),\n elt('div', { class: 'cube cube7' }),\n elt('div', { class: 'cube cube8' }),\n elt('div', { class: 'cube cube9' }),\n ]\n ));\n\n this.viewerState.innerElement = innerElem;\n this.viewerState.viewportElement = viewportElem;\n this.viewerState.outerElement = outerElem;\n\n this.viewerState.innerObject = innerElem;\n this.viewerState.viewportObject = viewportElem;\n this.viewerState.outerObject = outerElem;\n\n this.settings.parentObject.append(outerElem);\n\n this.viewerState.viewport = new Viewport(this.viewerState.viewportElement, {\n intersectionTolerance: this.settings.viewportMargin\n });\n\n this.boundScrollFunction = this.scrollFunction.bind(this);\n this.boundEscapeListener = this.escapeListener.bind(this);\n\n // Do all the plugin initialisation\n this.initPlugins();\n this.handleEvents();\n\n // Show the throbber while waiting for the manifest to load\n this.showThrobber();\n }\n\n isValidOption (key, value)\n {\n return this.optionsValidator.isValid(key, value, this.viewerState.options);\n }\n\n elemAttrs (ident, base)\n {\n const attrs = {\n id: this.settings.ID + ident,\n class: 'diva-' + ident\n };\n\n if (base)\n return Object.assign(attrs, base);\n else\n return attrs;\n }\n\n getPageData (pageIndex, attribute)\n {\n return this.settings.manifest.pages[pageIndex].d[this.settings.zoomLevel][attribute];\n }\n\n // Reset some settings and empty the viewport\n clearViewer ()\n {\n this.viewerState.viewport.top = 0;\n\n // Clear all the timeouts to prevent undesired pages from loading\n clearTimeout(this.viewerState.resizeTimer);\n }\n\n hasChangedOption (options, key)\n {\n return key in options && options[key] !== this.settings[key];\n }\n\n //Shortcut for closing fullscreen with the escape key\n escapeListener (e)\n {\n if (e.keyCode === 27)\n {\n this.reloadViewer({\n inFullscreen: !this.settings.inFullscreen\n });\n }\n }\n\n /**\n * Update settings to match the specified options. Load the viewer,\n * fire appropriate events for changed options.\n */\n reloadViewer (newOptions)\n {\n const queuedEvents = [];\n\n newOptions = this.optionsValidator.getValidatedOptions(this.settings, newOptions);\n\n // Set the zoom level if valid and fire a ZoomLevelDidChange event\n if (this.hasChangedOption(newOptions, 'zoomLevel'))\n {\n this.viewerState.oldZoomLevel = this.settings.zoomLevel;\n this.viewerState.options.zoomLevel = newOptions.zoomLevel;\n queuedEvents.push([\"ZoomLevelDidChange\", newOptions.zoomLevel]);\n }\n\n // Set the pages per row if valid and fire an event\n if (this.hasChangedOption(newOptions, 'pagesPerRow'))\n {\n this.viewerState.options.pagesPerRow = newOptions.pagesPerRow;\n queuedEvents.push([\"GridRowNumberDidChange\", newOptions.pagesPerRow]);\n }\n\n // Update verticallyOriented (no event fired)\n if (this.hasChangedOption(newOptions, 'verticallyOriented'))\n this.viewerState.options.verticallyOriented = newOptions.verticallyOriented;\n\n // Show/Hide non-paged pages\n if (this.hasChangedOption(newOptions, 'showNonPagedPages'))\n {\n this.viewerState.options.showNonPagedPages = newOptions.showNonPagedPages;\n }\n\n // Update page position (no event fired here)\n if ('goDirectlyTo' in newOptions)\n {\n this.viewerState.options.goDirectlyTo = newOptions.goDirectlyTo;\n\n if ('verticalOffset' in newOptions)\n this.viewerState.verticalOffset = newOptions.verticalOffset;\n\n if ('horizontalOffset' in newOptions)\n this.viewerState.horizontalOffset = newOptions.horizontalOffset;\n }\n else\n {\n // Otherwise the default is to remain on the current page\n this.viewerState.options.goDirectlyTo = this.settings.currentPageIndex;\n }\n\n if (this.hasChangedOption(newOptions, 'inGrid') || this.hasChangedOption(newOptions, 'inBookLayout'))\n {\n if ('inGrid' in newOptions)\n this.viewerState.options.inGrid = newOptions.inGrid;\n\n if ('inBookLayout' in newOptions)\n this.viewerState.options.inBookLayout = newOptions.inBookLayout;\n\n queuedEvents.push([\"ViewDidSwitch\", this.settings.inGrid]);\n }\n\n // Note: prepareModeChange() depends on inGrid and the vertical/horizontalOffset (for now)\n if (this.hasChangedOption(newOptions, 'inFullscreen'))\n {\n this.viewerState.options.inFullscreen = newOptions.inFullscreen;\n this.prepareModeChange(newOptions);\n queuedEvents.push([\"ModeDidSwitch\", this.settings.inFullscreen]);\n }\n\n this.clearViewer();\n this.updateViewHandlerAndRendering();\n\n if (this.viewerState.renderer)\n {\n // TODO: The usage of padding variables is still really\n // messy and inconsistent\n const rendererConfig = {\n pageLayouts: getPageLayouts(this.settings),\n padding: this.getPadding(),\n maxZoomLevel: this.settings.inGrid ? null : this.viewerState.manifest.maxZoom,\n verticallyOriented: this.settings.verticallyOriented || this.settings.inGrid,\n };\n\n const viewportPosition = {\n zoomLevel: this.settings.inGrid ? null : this.settings.zoomLevel,\n anchorPage: this.settings.goDirectlyTo,\n verticalOffset: this.viewerState.verticalOffset,\n horizontalOffset: this.viewerState.horizontalOffset\n };\n\n const sourceProvider = this.getCurrentSourceProvider();\n\n if (debug.enabled)\n {\n const serialized = Object.keys(rendererConfig)\n .filter(function (key)\n {\n // Too long\n return key !== 'pageLayouts' && key !== 'padding';\n })\n .map(function (key)\n {\n const value = rendererConfig[key];\n return key + ': ' + JSON.stringify(value);\n })\n .join(', ');\n\n debug('reload with %s', serialized);\n }\n\n this.viewerState.renderer.load(rendererConfig, viewportPosition, sourceProvider);\n }\n\n queuedEvents.forEach( (params) =>\n {\n this.publish.apply(this, params);\n });\n\n return true;\n }\n\n // Handles switching in and out of fullscreen mode\n prepareModeChange (options)\n {\n // Toggle the classes\n const changeClass = options.inFullscreen ? 'add' : 'remove';\n this.viewerState.outerObject.classList[changeClass]('diva-fullscreen');\n document.body.classList[changeClass]('diva-hide-scrollbar');\n this.settings.parentObject.classList[changeClass]('diva-full-width');\n\n // Adjust Diva's internal panel size, keeping the old values\n const storedHeight = this.settings.panelHeight;\n const storedWidth = this.settings.panelWidth;\n this.viewerState.viewport.invalidate();\n\n // If this isn't the original load, the offsets matter, and the position isn't being changed...\n if (!this.viewerState.loaded && !this.settings.inGrid && !('verticalOffset' in options))\n {\n //get the updated panel size\n const newHeight = this.settings.panelHeight;\n const newWidth = this.settings.panelWidth;\n\n //and re-center the new panel on the same point\n this.viewerState.verticalOffset += ((storedHeight - newHeight) / 2);\n this.viewerState.horizontalOffset += ((storedWidth - newWidth) / 2);\n }\n\n //turn on/off escape key listener\n if (options.inFullscreen)\n document.addEventListener('keyup', this.boundEscapeListener);\n else\n document.removeEventListener('keyup', this.boundEscapeListener);\n }\n\n // Update the view handler and the view rendering for the current view\n updateViewHandlerAndRendering ()\n {\n const Handler = this.settings.inGrid ? GridHandler : DocumentHandler;\n\n if (this.viewerState.viewHandler && !(this.viewerState.viewHandler instanceof Handler))\n {\n this.viewerState.viewHandler.destroy();\n this.viewerState.viewHandler = null;\n }\n\n if (!this.viewerState.viewHandler)\n this.viewerState.viewHandler = new Handler(this);\n\n if (!this.viewerState.renderer)\n this.initializeRenderer();\n }\n\n // TODO: This could probably be done upon ViewerCore initialization\n initializeRenderer ()\n {\n const compatErrors = Renderer.getCompatibilityErrors();\n\n if (compatErrors)\n {\n this.showError(compatErrors);\n }\n else\n {\n const options = {\n viewport: this.viewerState.viewport,\n outerElement: this.viewerState.outerElement,\n innerElement: this.viewerState.innerElement\n };\n\n const hooks = {\n onViewWillLoad: () =>\n {\n this.viewerState.viewHandler.onViewWillLoad();\n },\n onViewDidLoad: () =>\n {\n this.updatePageOverlays();\n this.viewerState.viewHandler.onViewDidLoad();\n },\n onViewDidUpdate: (pages, targetPage) =>\n {\n this.updatePageOverlays();\n this.viewerState.viewHandler.onViewDidUpdate(pages, targetPage);\n },\n onViewDidTransition: () =>\n {\n this.updatePageOverlays();\n },\n onPageWillLoad: (pageIndex) =>\n {\n this.publish('PageWillLoad', pageIndex);\n },\n onZoomLevelWillChange: (zoomLevel) =>\n {\n this.publish('ZoomLevelWillChange', zoomLevel);\n }\n };\n\n this.viewerState.renderer = new Renderer(options, hooks);\n }\n }\n\n getCurrentSourceProvider ()\n {\n if (this.settings.inGrid)\n {\n const gridSourceProvider = {\n getAllZoomLevelsForPage: (page) =>\n {\n return [gridSourceProvider.getBestZoomLevelForPage(page)];\n },\n getBestZoomLevelForPage: (page) =>\n {\n const url = this.settings.manifest.getPageImageURL(page.index, {\n width: page.dimensions.width\n });\n\n return {\n zoomLevel: 1, // FIXME\n rows: 1,\n cols: 1,\n tiles: [{\n url: url,\n zoomLevel: 1, // FIXME\n row: 0,\n col: 0,\n dimensions: page.dimensions,\n offset: {\n top: 0,\n left: 0\n }\n }]\n };\n }\n };\n\n return gridSourceProvider;\n }\n\n const tileDimensions = {\n width: this.settings.tileWidth,\n height: this.settings.tileHeight\n };\n\n return {\n getBestZoomLevelForPage: (page) =>\n {\n return this.settings.manifest.getPageImageTiles(page.index, Math.ceil(this.settings.zoomLevel), tileDimensions);\n },\n getAllZoomLevelsForPage: (page) =>\n {\n const levels = [];\n const levelCount = this.viewerState.manifest.maxZoom;\n\n for (let level=0; level <= levelCount; level++)\n {\n levels.push(this.settings.manifest.getPageImageTiles(page.index, level, tileDimensions));\n }\n\n levels.reverse();\n\n return levels;\n }\n };\n }\n\n getPadding ()\n {\n let topPadding, leftPadding;\n let docVPadding, docHPadding;\n\n if (this.settings.inGrid)\n {\n docVPadding = this.settings.fixedPadding;\n topPadding = leftPadding = docHPadding = 0;\n }\n else\n {\n topPadding = this.settings.verticallyOriented ? this.viewerState.verticalPadding : 0;\n leftPadding = this.settings.verticallyOriented ? 0 : this.viewerState.horizontalPadding;\n\n docVPadding = this.settings.verticallyOriented ? 0 : this.viewerState.verticalPadding;\n docHPadding = this.settings.verticallyOriented ? this.viewerState.horizontalPadding : 0;\n }\n\n return {\n document: {\n top: docVPadding,\n bottom: docVPadding,\n left: docHPadding,\n right: docHPadding\n },\n page: {\n top: topPadding,\n bottom: 0,\n left: leftPadding,\n right: 0\n }\n };\n }\n\n updatePageOverlays ()\n {\n this.viewerState.pageOverlays.updateOverlays(\n this.viewerState.renderer.getRenderedPages()\n );\n }\n\n // Called to handle any zoom level\n handleZoom (newZoomLevel, focalPoint)\n {\n // If the zoom level provided is invalid, return false\n if (!this.isValidOption('zoomLevel', newZoomLevel))\n return false;\n\n // While zooming, don't update scroll offsets based on the scaled version of diva-inner\n this.viewerState.viewportObject.removeEventListener('scroll', this.boundScrollFunction);\n\n // If no focal point was given, zoom on the center of the viewport\n if (!focalPoint)\n {\n const viewport = this.viewerState.viewport;\n const currentRegion = this.viewerState.renderer.layout.getPageRegion(this.settings.currentPageIndex);\n\n focalPoint = {\n anchorPage: this.settings.currentPageIndex,\n offset: {\n left: (viewport.width / 2) - (currentRegion.left - viewport.left),\n top: (viewport.height / 2) - (currentRegion.top - viewport.top)\n }\n };\n }\n\n const pageRegion = this.viewerState.renderer.layout.getPageRegion(focalPoint.anchorPage);\n\n // calculate distance from cursor coordinates to center of viewport\n const focalXToCenter = (pageRegion.left + focalPoint.offset.left) -\n (this.settings.viewport.left + (this.settings.viewport.width / 2));\n const focalYToCenter = (pageRegion.top + focalPoint.offset.top) -\n (this.settings.viewport.top + (this.settings.viewport.height / 2));\n\n const getPositionForZoomLevel = function (zoomLevel, initZoom)\n {\n const zoomRatio = Math.pow(2, zoomLevel - initZoom);\n\n //TODO(jeromepl): Calculate position from page top left to viewport top left\n // calculate horizontal/verticalOffset: distance from viewport center to page upper left corner\n const horizontalOffset = (focalPoint.offset.left * zoomRatio) - focalXToCenter;\n const verticalOffset = (focalPoint.offset.top * zoomRatio) - focalYToCenter;\n\n return {\n zoomLevel: zoomLevel,\n anchorPage: focalPoint.anchorPage,\n verticalOffset: verticalOffset,\n horizontalOffset: horizontalOffset\n };\n };\n\n this.viewerState.options.zoomLevel = newZoomLevel;\n let initialZoomLevel = this.viewerState.oldZoomLevel;\n this.viewerState.oldZoomLevel = this.settings.zoomLevel;\n const endPosition = getPositionForZoomLevel(newZoomLevel, initialZoomLevel);\n this.viewerState.options.goDirectlyTo = endPosition.anchorPage;\n this.viewerState.verticalOffset = endPosition.verticalOffset;\n this.viewerState.horizontalOffset = endPosition.horizontalOffset;\n\n this.viewerState.renderer.transitionViewportPosition({\n duration: this.settings.zoomDuration,\n parameters: {\n zoomLevel: {\n from: initialZoomLevel,\n to: newZoomLevel\n }\n },\n getPosition: (parameters) =>\n {\n return getPositionForZoomLevel(parameters.zoomLevel, initialZoomLevel);\n },\n onEnd: (info) =>\n {\n this.viewerState.viewportObject.addEventListener('scroll', this.boundScrollFunction);\n\n if (info.interrupted)\n this.viewerState.oldZoomLevel = newZoomLevel;\n }\n });\n\n // Send off the zoom level did change event.\n this.publish(\"ZoomLevelDidChange\", newZoomLevel);\n\n return true;\n }\n\n /*\n Gets the Y-offset for a specific point on a specific page\n Acceptable values for \"anchor\":\n \"top\" (default) - will anchor top of the page to the top of the diva-outer element\n \"bottom\" - top, s/top/bottom\n \"center\" - will center the page on the diva element\n Returned value will be the distance from the center of the diva-outer element to the top of the current page for the specified anchor\n */\n getYOffset (pageIndex, anchor)\n {\n let pidx = (typeof(pageIndex) === \"undefined\" ? this.settings.currentPageIndex : pageIndex);\n\n if (anchor === \"center\" || anchor === \"centre\") //how you can tell an American coded this\n {\n return parseInt(this.getPageData(pidx, \"h\") / 2, 10);\n }\n else if (anchor === \"bottom\")\n {\n return parseInt(this.getPageData(pidx, \"h\") - this.settings.panelHeight / 2, 10);\n }\n else\n {\n return parseInt(this.settings.panelHeight / 2, 10);\n }\n }\n\n //Same as getYOffset with \"left\" and \"right\" as acceptable values instead of \"top\" and \"bottom\"\n getXOffset (pageIndex, anchor)\n {\n let pidx = (typeof(pageIndex) === \"undefined\" ? this.settings.currentPageIndex : pageIndex);\n\n if (anchor === \"left\")\n {\n return parseInt(this.settings.panelWidth / 2, 10);\n }\n else if (anchor === \"right\")\n {\n return parseInt(this.getPageData(pidx, \"w\") - this.settings.panelWidth / 2, 10);\n }\n else\n {\n return parseInt(this.getPageData(pidx, \"w\") / 2, 10);\n }\n }\n\n // updates panelHeight/panelWidth on resize\n updatePanelSize ()\n {\n this.viewerState.viewport.invalidate();\n\n // FIXME(wabain): This should really only be called after initial load\n if (this.viewerState.renderer)\n {\n this.updateOffsets();\n this.viewerState.renderer.goto(this.settings.currentPageIndex, this.viewerState.verticalOffset, this.viewerState.horizontalOffset);\n }\n\n return true;\n }\n\n updateOffsets ()\n {\n const pageOffset = this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n if (pageOffset)\n {\n this.viewerState.horizontalOffset = pageOffset.x;\n this.viewerState.verticalOffset = pageOffset.y;\n }\n }\n\n // Bind mouse events (drag to scroll, double-click)\n bindMouseEvents ()\n {\n // Set drag scroll on the viewport object\n this.viewerState.viewportObject.classList.add('dragscroll');\n\n gestureEvents.onDoubleClick(this.viewerState.viewportObject, (event, coords) =>\n {\n debug('Double click at %s, %s', coords.left, coords.top);\n this.viewerState.viewHandler.onDoubleClick(event, coords);\n });\n }\n\n onResize ()\n {\n this.updatePanelSize();\n // Cancel any previously-set resize timeouts\n clearTimeout(this.viewerState.resizeTimer);\n\n this.viewerState.resizeTimer = setTimeout( () =>\n {\n const pageOffset = this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.currentPageIndex, this.viewerState.viewport);\n\n if (pageOffset)\n {\n this.reloadViewer({\n goDirectlyTo: this.settings.currentPageIndex,\n verticalOffset: pageOffset.y,\n horizontalOffset: pageOffset.x\n });\n }\n else\n {\n this.reloadViewer({\n goDirectlyTo: this.settings.currentPageIndex\n });\n }\n }, 200);\n }\n\n // Bind touch and orientation change events\n bindTouchEvents ()\n {\n // Block the user from moving the window only if it's not integrated\n if (this.settings.blockMobileMove)\n {\n document.body.addEventListener('touchmove', (event) =>\n {\n const e = event.originalEvent;\n e.preventDefault();\n\n return false;\n });\n }\n\n // Touch events for swiping in the viewport to scroll pages\n // this.viewerState.viewportObject.addEventListener('scroll', this.scrollFunction.bind(this));\n\n gestureEvents.onPinch(this.viewerState.viewportObject, function (event, coords, start, end)\n {\n debug('Pinch %s at %s, %s', end - start, coords.left, coords.top);\n this.viewerState.viewHandler.onPinch(event, coords, start, end);\n });\n\n gestureEvents.onDoubleTap(this.viewerState.viewportObject, function (event, coords)\n {\n debug('Double tap at %s, %s', coords.left, coords.top);\n this.viewerState.viewHandler.onDoubleClick(event, coords);\n });\n }\n\n // Handle the scroll\n scrollFunction ()\n {\n const previousTopScroll = this.viewerState.viewport.top;\n const previousLeftScroll = this.viewerState.viewport.left;\n\n let direction;\n\n this.viewerState.viewport.invalidate();\n\n const newScrollTop = this.viewerState.viewport.top;\n const newScrollLeft = this.viewerState.viewport.left;\n\n if (this.settings.verticallyOriented || this.settings.inGrid)\n direction = newScrollTop - previousTopScroll;\n else\n direction = newScrollLeft - previousLeftScroll;\n\n //give adjust the direction we care about\n this.viewerState.renderer.adjust();\n\n const primaryScroll = (this.settings.verticallyOriented || this.settings.inGrid) ? newScrollTop : newScrollLeft;\n\n this.publish(\"ViewerDidScroll\", primaryScroll);\n\n if (direction > 0)\n {\n this.publish(\"ViewerDidScrollDown\", primaryScroll);\n }\n else if (direction < 0)\n {\n this.publish(\"ViewerDidScrollUp\", primaryScroll);\n }\n\n this.updateOffsets();\n }\n\n // Binds most of the event handlers (some more in createToolbar)\n handleEvents ()\n {\n // Change the cursor for dragging\n this.viewerState.innerObject.addEventListener('mousedown', () =>\n {\n this.viewerState.innerObject.classList.add('diva-grabbing');\n });\n\n this.viewerState.innerObject.addEventListener('mouseup', () =>\n {\n this.viewerState.innerObject.classList.remove('diva-grabbing');\n });\n\n this.bindMouseEvents();\n this.viewerState.viewportObject.addEventListener('scroll', this.boundScrollFunction);\n\n const upArrowKey = 38, downArrowKey = 40, leftArrowKey = 37, rightArrowKey = 39, spaceKey = 32, pageUpKey = 33, pageDownKey = 34, homeKey = 36, endKey = 35;\n\n // Catch the key presses in document\n document.addEventListener('keydown.diva', (event) =>\n {\n if (!this.viewerState.isActiveDiva)\n return true;\n\n // Space or page down - go to the next page\n if ((this.settings.enableSpaceScroll && !event.shiftKey && event.keyCode === spaceKey) || (this.settings.enableKeyScroll && event.keyCode === pageDownKey))\n {\n this.viewerState.viewport.top += this.settings.panelHeight;\n return false;\n }\n else if (!this.settings.enableSpaceScroll && event.keyCode === spaceKey)\n {\n event.preventDefault();\n }\n\n if (this.settings.enableKeyScroll)\n {\n // Don't steal keyboard shortcuts (metaKey = command [OS X], super [Win/Linux])\n if (event.shiftKey || event.ctrlKey || event.metaKey)\n return true;\n\n switch (event.keyCode)\n {\n case pageUpKey:\n // Page up - go to the previous page\n this.viewerState.viewport.top -= this.settings.panelHeight;\n return false;\n\n case upArrowKey:\n // Up arrow - scroll up\n this.viewerState.viewport.top -= this.settings.arrowScrollAmount;\n return false;\n\n case downArrowKey:\n // Down arrow - scroll down\n this.viewerState.viewport.top += this.settings.arrowScrollAmount;\n return false;\n\n case leftArrowKey:\n // Left arrow - scroll left\n this.viewerState.viewport.left -= this.settings.arrowScrollAmount;\n return false;\n\n case rightArrowKey:\n // Right arrow - scroll right\n this.viewerState.viewport.left += this.settings.arrowScrollAmount;\n return false;\n\n case homeKey:\n // Home key - go to the beginning of the document\n this.viewerState.viewport.top = 0;\n return false;\n\n case endKey:\n // End key - go to the end of the document\n // Count on the viewport coordinate value being normalized\n if (this.settings.verticallyOriented)\n this.viewerState.viewport.top = Infinity;\n else\n this.viewerState.viewport.left = Infinity;\n\n return false;\n\n default:\n return true;\n }\n }\n return true;\n });\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n document.removeEventListener('keydown.diva');\n }, this.settings.ID);\n\n // this.bindTouchEvents();\n\n // Handle window resizing events\n window.addEventListener('resize', this.onResize.bind(this), false);\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n window.removeEventListener('resize', this.onResize, false);\n }, this.settings.ID);\n\n // Handle orientation change separately\n if ('onorientationchange' in window)\n {\n window.addEventListener('orientationchange', this.onResize, false);\n\n diva.Events.subscribe('ViewerDidTerminate', function()\n {\n window.removeEventListener('orientationchange', this.onResize, false);\n }, this.settings.ID);\n }\n\n diva.Events.subscribe('PanelSizeDidChange', this.updatePanelSize, this.settings.ID);\n\n // Clear page and resize timeouts when the viewer is destroyed\n diva.Events.subscribe('ViewerDidTerminate', () =>\n {\n if (this.viewerState.renderer)\n this.viewerState.renderer.destroy();\n\n clearTimeout(this.viewerState.resizeTimer);\n }, this.settings.ID);\n }\n\n initPlugins ()\n {\n if (!this.settings.hasOwnProperty('plugins'))\n return null;\n\n this.viewerState.pluginInstances = this.settings.plugins.map( (plugin) =>\n {\n const p = new plugin(this);\n\n if (p.isPageTool)\n this.viewerState.pageTools.push(p);\n\n return p;\n });\n }\n\n showThrobber ()\n {\n this.hideThrobber();\n\n this.viewerState.throbberTimeoutID = setTimeout( () =>\n {\n let thb = document.getElementById(this.settings.selector + 'throbber');\n if (thb) thb.style.display = 'block';\n }, this.settings.throbberTimeout);\n }\n\n hideThrobber ()\n {\n // Clear the timeout, if it hasn't executed yet\n clearTimeout(this.viewerState.throbberTimeoutID);\n\n let thb = document.getElementById(this.settings.selector + 'throbber');\n // Hide the throbber if it has already executed\n if (thb) thb.style.display = 'none';\n }\n\n showError (message)\n {\n const errorElement = elt('div', this.elemAttrs('error'), [\n elt('button', this.elemAttrs('error-close', {'aria-label': 'Close dialog'})),\n elt('p',\n elt('strong', 'Error')\n ),\n elt('div', message)\n ]);\n\n this.viewerState.outerObject.appendChild(errorElement);\n\n //bind dialog close button\n document.querySelector(this.settings.selector + 'error-close').addEventListener('click', () =>\n {\n errorElement.parentNode.removeChild(errorElement);\n });\n }\n\n setManifest (manifest, loadOptions)\n {\n this.viewerState.manifest = manifest;\n\n this.hideThrobber();\n\n // Convenience value\n this.viewerState.numPages = this.settings.manifest.pages.length;\n\n this.optionsValidator.validate(this.viewerState.options);\n\n this.publish('NumberOfPagesDidChange', this.settings.numPages);\n\n if (this.settings.enableAutoTitle)\n {\n let title = document.getElementById(this.settings.selector + 'title');\n\n if (title)\n {\n title.innerHTML(this.settings.manifest.itemTitle);\n }\n else\n {\n this.settings.parentObject.insertBefore(\n elt('div', this.elemAttrs('title'), [this.settings.manifest.itemTitle]),\n this.settings.parentObject.firstChild\n );\n }\n }\n\n // Calculate the horizontal and vertical inter-page padding based on the dimensions of the average zoom level\n if (this.settings.adaptivePadding > 0)\n {\n const z = Math.floor((this.settings.minZoomLevel + this.settings.maxZoomLevel) / 2);\n this.viewerState.horizontalPadding = parseInt(this.settings.manifest.getAverageWidth(z) * this.settings.adaptivePadding, 10);\n this.viewerState.verticalPadding = parseInt(this.settings.manifest.getAverageHeight(z) * this.settings.adaptivePadding, 10);\n }\n else\n {\n // It's less than or equal to 0; use fixedPadding instead\n this.viewerState.horizontalPadding = this.settings.fixedPadding;\n this.viewerState.verticalPadding = this.settings.fixedPadding;\n }\n\n // Make sure the vertical padding is at least 40, if plugin icons are enabled\n if (this.viewerState.pageTools.length)\n {\n this.viewerState.verticalPadding = Math.max(40, this.viewerState.verticalPadding);\n }\n\n // If we detect a viewingHint of 'paged' in the manifest or sequence, enable book view by default\n if (this.settings.manifest.paged)\n {\n this.viewerState.options.inBookLayout = true;\n }\n\n // Plugin setup hooks should be bound to the ObjectDidLoad event\n this.publish('ObjectDidLoad', this.settings);\n\n // Adjust the document panel dimensions\n this.updatePanelSize();\n\n let needsXCoord, needsYCoord;\n\n let anchoredVertically = false;\n let anchoredHorizontally = false;\n\n // NB: `==` here will check both null and undefined\n if (loadOptions.goDirectlyTo == null)\n {\n loadOptions.goDirectlyTo = this.settings.goDirectlyTo;\n needsXCoord = needsYCoord = true;\n }\n else\n {\n needsXCoord = loadOptions.horizontalOffset == null || isNaN(loadOptions.horizontalOffset);\n needsYCoord = loadOptions.verticalOffset == null || isNaN(loadOptions.verticalOffset);\n }\n\n // Set default values for the horizontal and vertical offsets\n if (needsXCoord)\n {\n // FIXME: What if inBookLayout/verticallyOriented is changed by loadOptions?\n if (loadOptions.goDirectlyTo === 0 && this.settings.inBookLayout && this.settings.verticallyOriented)\n {\n // if in book layout, center the first opening by default\n loadOptions.horizontalOffset = this.viewerState.horizontalPadding;\n }\n else\n {\n anchoredHorizontally = true;\n loadOptions.horizontalOffset = this.getXOffset(loadOptions.goDirectlyTo, \"center\");\n }\n }\n\n if (needsYCoord)\n {\n anchoredVertically = true;\n loadOptions.verticalOffset = this.getYOffset(loadOptions.goDirectlyTo, \"top\");\n }\n\n this.reloadViewer(loadOptions);\n\n //prep dimensions one last time now that pages have loaded\n this.updatePanelSize();\n\n // FIXME: This is a hack to ensure that the outerElement scrollbars are taken into account\n if (this.settings.verticallyOriented)\n this.viewerState.innerElement.style.minWidth = this.settings.panelWidth + 'px';\n else\n this.viewerState.innerElement.style.minHeight = this.settings.panelHeight + 'px';\n\n // FIXME: If the page was supposed to be positioned relative to the viewport we need to\n // recalculate it to take into account the scrollbars\n if (anchoredVertically || anchoredHorizontally)\n {\n if (anchoredVertically)\n this.viewerState.verticalOffset = this.getYOffset(this.settings.currentPageIndex, \"top\");\n\n if (anchoredHorizontally)\n this.viewerState.horizontalOffset = this.getXOffset(this.settings.currentPageIndex, \"center\");\n\n this.viewerState.renderer.goto(this.settings.currentPageIndex, this.viewerState.verticalOffset, this.viewerState.horizontalOffset);\n }\n\n // signal that everything should be set up and ready to go.\n this.viewerState.loaded = true;\n\n this.publish(\"ViewerDidLoad\", this.settings);\n }\n\n publish (event)\n {\n const args = Array.prototype.slice.call(arguments, 1);\n diva.Events.publish(event, args, this.publicInstance);\n }\n\n getSettings ()\n {\n return this.settings;\n }\n\n // Temporary accessor for the state of the viewer core\n // TODO: Replace this with a more restricted view of whatever needs\n // be exposed through settings for backwards compat\n getInternalState ()\n {\n return this.viewerState;\n }\n\n getPublicInstance ()\n {\n return this.publicInstance;\n }\n\n getPageTools ()\n {\n return this.viewerState.pageTools;\n }\n\n getCurrentLayout ()\n {\n return this.viewerState.renderer ? this.viewerState.renderer.layout : null;\n }\n\n /** Get a copy of the current viewport dimensions */\n getViewport ()\n {\n const viewport = this.viewerState.viewport;\n\n return {\n top: viewport.top,\n left: viewport.left,\n bottom: viewport.bottom,\n right: viewport.right,\n\n width: viewport.width,\n height: viewport.height\n };\n }\n\n addPageOverlay (overlay)\n {\n this.viewerState.pageOverlays.addOverlay(overlay);\n }\n\n removePageOverlay (overlay)\n {\n this.viewerState.pageOverlays.removeOverlay(overlay);\n }\n\n getPageRegion (pageIndex, options)\n {\n const layout = this.viewerState.renderer.layout;\n const region = layout.getPageRegion(pageIndex, options);\n\n if (options && options.incorporateViewport)\n {\n const secondaryDim = this.settings.verticallyOriented ? 'width' : 'height';\n\n if (this.viewerState.viewport[secondaryDim] > layout.dimensions[secondaryDim])\n {\n const docOffset = (this.viewerState.viewport[secondaryDim] - layout.dimensions[secondaryDim]) / 2;\n\n if (this.settings.verticallyOriented)\n {\n return {\n top: region.top,\n bottom: region.bottom,\n\n left: region.left + docOffset,\n right: region.right + docOffset\n };\n }\n else\n {\n return {\n top: region.top + docOffset,\n bottom: region.bottom + docOffset,\n\n left: region.left,\n right: region.right\n };\n }\n }\n }\n\n return region;\n }\n\n getPagePositionAtViewportOffset (coords)\n {\n const docCoords = {\n left: coords.left + this.viewerState.viewport.left,\n top: coords.top + this.viewerState.viewport.top\n };\n\n const renderedPages = this.viewerState.renderer.getRenderedPages();\n const pageCount = renderedPages.length;\n\n // Find the page on which the coords occur\n for (let i=0; i < pageCount; i++)\n {\n const pageIndex = renderedPages[i];\n const region = this.viewerState.renderer.layout.getPageRegion(pageIndex);\n\n if (region.left <= docCoords.left && region.right >= docCoords.left &&\n region.top <= docCoords.top && region.bottom >= docCoords.top)\n {\n return {\n anchorPage: pageIndex,\n offset: {\n left: docCoords.left - region.left,\n top: docCoords.top - region.top\n }\n };\n }\n }\n\n // Fall back to current page\n // FIXME: Would be better to use the closest page or something\n const currentRegion = this.viewerState.renderer.layout.getPageRegion(this.settings.currentPageIndex);\n\n return {\n anchorPage: this.settings.currentPageIndex,\n offset: {\n left: docCoords.left - currentRegion.left,\n top: docCoords.top - currentRegion.top\n }\n };\n }\n\n // setManifest (manifest, loadOptions)\n // {\n // setManifest(manifest, loadOptions || {});\n // }\n\n /**\n * Set the current page to the given index, firing VisiblePageDidChange\n *\n * @param pageIndex\n */\n setCurrentPage (pageIndex)\n {\n if (this.viewerState.currentPageIndex !== pageIndex)\n {\n this.viewerState.currentPageIndex = pageIndex;\n this.publish(\"VisiblePageDidChange\", pageIndex, this.getPageName(pageIndex));\n\n // Publish an event if the page we're switching to has other images.\n if (this.viewerState.manifest.pages[pageIndex].otherImages.length > 0)\n this.publish('VisiblePageHasAlternateViews', pageIndex);\n }\n }\n\n getPageName (pageIndex)\n {\n return this.viewerState.manifest.pages[pageIndex].f;\n }\n\n reload (newOptions)\n {\n this.reloadViewer(newOptions);\n }\n\n zoom (zoomLevel, focalPoint)\n {\n return this.handleZoom(zoomLevel, focalPoint);\n }\n\n enableScrollable ()\n {\n if (!this.viewerState.isScrollable)\n {\n this.bindMouseEvents();\n this.viewerState.options.enableKeyScroll = this.viewerState.initialKeyScroll;\n this.viewerState.options.enableSpaceScroll = this.viewerState.initialSpaceScroll;\n this.viewerState.viewportElement.style.overflow = 'auto';\n this.viewerState.isScrollable = true;\n }\n }\n\n disableScrollable ()\n {\n if (this.viewerState.isScrollable)\n {\n // block dragging/double-click zooming\n if (this.viewerState.innerObject.hasClass('diva-dragger'))\n this.viewerState.innerObject.mousedown = null;\n\n this.viewerState.outerObject.dblclick = null;\n this.viewerState.outerObject.contextmenu = null;\n\n // disable all other scrolling actions\n this.viewerState.viewportElement.style.overflow = 'hidden';\n\n // block scrolling keys behavior, respecting initial scroll settings\n this.viewerState.initialKeyScroll = this.settings.enableKeyScroll;\n this.viewerState.initialSpaceScroll = this.settings.enableSpaceScroll;\n this.viewerState.options.enableKeyScroll = false;\n this.viewerState.options.enableSpaceScroll = false;\n\n this.viewerState.isScrollable = false;\n }\n }\n\n // isValidOption (key, value)\n // {\n // return isValidOption(key, value);\n // }\n\n // getXOffset (pageIndex, xAnchor)\n // {\n // return getXOffset(pageIndex, xAnchor);\n // }\n\n // getYOffset (pageIndex, yAnchor)\n // {\n // return getYOffset(pageIndex, yAnchor);\n // }\n\n // this.publish = publish;\n\n clear ()\n {\n this.clearViewer();\n }\n\n setPendingManifestRequest (pendingManifestRequest)\n {\n this.viewerState.pendingManifestRequest = pendingManifestRequest;\n }\n\n destroy ()\n {\n // Useful event to access elements in diva before they get destroyed. Used by the highlight plugin.\n this.publish('ViewerWillTerminate', this.settings);\n\n // Cancel any pending request retrieving a manifest\n if (this.settings.pendingManifestRequest)\n this.settings.pendingManifestRequest.abort();\n\n // Removes the hide-scrollbar class from the body\n document.body.removeClass('diva-hide-scrollbar');\n\n // Empty the parent container and remove any diva-related data\n this.settings.parentObject.parent().empty().removeData('diva');\n\n // Remove any additional styling on the parent element\n this.settings.parentObject.parent().removeAttr('style').removeAttr('class');\n\n this.publish('ViewerDidTerminate', this.settings);\n\n // Clear the Events cache\n diva.Events.unsubscribeAll(this.settings.ID);\n }\n}\n","export default class Viewport\n{\n constructor (outer, options)\n {\n options = options || {};\n\n this.intersectionTolerance = options.intersectionTolerance || 0;\n this.maxExtent = options.maxExtent || 2000;\n\n this.outer = outer;\n\n this._top = this._left = this._width = this._height = this._innerDimensions = null;\n\n this.invalidate();\n }\n\n intersectsRegion (region)\n {\n return this.hasHorizontalOverlap(region) && this.hasVerticalOverlap(region);\n }\n\n hasVerticalOverlap (region)\n {\n const top = this.top - this.intersectionTolerance;\n const bottom = this.bottom + this.intersectionTolerance;\n\n return (\n fallsBetween(region.top, top, bottom) ||\n fallsBetween(region.bottom, top, bottom) ||\n (region.top <= top && region.bottom >= bottom)\n );\n }\n\n hasHorizontalOverlap (region)\n {\n const left = this.left - this.intersectionTolerance;\n const right = this.right + this.intersectionTolerance;\n\n return (\n fallsBetween(region.left, left, right) ||\n fallsBetween(region.right, left, right) ||\n (region.left <= left && region.right >= right)\n );\n }\n\n invalidate ()\n {\n // FIXME: Should this check the inner dimensions as well?\n this._width = clampMax(this.outer.clientWidth, this.maxExtent);\n this._height = clampMax(this.outer.clientHeight, this.maxExtent);\n\n this._top = this.outer.scrollTop;\n this._left = this.outer.scrollLeft;\n }\n\n setInnerDimensions (dimensions)\n {\n this._innerDimensions = dimensions;\n\n if (dimensions)\n {\n this._top = clamp(this._top, 0, dimensions.height - this._height);\n this._left = clamp(this._left, 0, dimensions.width - this._width);\n }\n }\n}\n\nObject.defineProperties(Viewport.prototype, {\n top: getCoordinateDescriptor('top', 'height'),\n left: getCoordinateDescriptor('left', 'width'),\n\n width: getDimensionDescriptor('width'),\n height: getDimensionDescriptor('height'),\n\n bottom: {\n get: function ()\n {\n return this._top + this._height;\n }\n },\n right: {\n get: function ()\n {\n return this._left + this._width;\n }\n }\n});\n\nfunction getCoordinateDescriptor (coord, associatedDimension)\n{\n const privateProp = '_' + coord;\n const source = 'scroll' + coord.charAt(0).toUpperCase() + coord.slice(1);\n\n return {\n get: function ()\n {\n return this[privateProp];\n },\n set: function (newValue)\n {\n let normalized;\n\n if (this._innerDimensions)\n {\n const maxAllowed = this._innerDimensions[associatedDimension] - this[associatedDimension];\n normalized = clamp(newValue, 0, maxAllowed);\n }\n else\n {\n normalized = clampMin(newValue, 0);\n }\n\n this[privateProp] = this.outer[source] = normalized;\n }\n };\n}\n\nfunction getDimensionDescriptor (dimen)\n{\n return {\n get: function ()\n {\n return this['_' + dimen];\n }\n };\n}\n\nfunction fallsBetween (point, start, end)\n{\n return point >= start && point <= end;\n}\n\nfunction clamp (value, min, max)\n{\n return clampMin(clampMax(value, max), min);\n}\n\nfunction clampMin (value, min)\n{\n return Math.max(value, min);\n}\n\nfunction clampMax (value, max)\n{\n return Math.min(value, max);\n}\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/download.js b/static/js/download.js
index 4e12ad9..eebdd2e 100644
--- a/static/js/download.js
+++ b/static/js/download.js
@@ -1 +1 @@
-!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=17)}({17:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n=0&&I=0&&x=n?255:0;return[i,i,i,255]}function h(t,e,a,n){var i=p(t,e,a),r=i.h,o=i.s,s=i.v;r*=100,r+=Math.abs(n),r%=100;var u=v(r/=100,o,s);return[u.r,u.g,u.b,255]}function p(t,e,a){var n=t,i=e,r=a;n/=255,i/=255,r/=255;var o=Math.max(n,i,r),s=Math.min(n,i,r),u=o,c=o-s,l=0===o?0:c/o,d=void 0;if(o===s)d=0;else{switch(o){case n:d=(i-r)/c+(i=0&&I=0&&x=n?255:0;return[i,i,i,255]}function h(t,e,a,n){var i=p(t,e,a),r=i.h,o=i.s,s=i.v;r*=100,r+=Math.abs(n),r%=100;var u=v(r/=100,o,s);return[u.r,u.g,u.b,255]}function p(t,e,a){var n=t,i=e,r=a;n/=255,i/=255,r/=255;var o=Math.max(n,i,r),s=Math.min(n,i,r),u=o,c=o-s,l=0===o?0:c/o,d=void 0;if(o===s)d=0;else{switch(o){case n:d=(i-r)/c+(i=this.red-t&&e.red<=this.red+t&&(e.blue>=this.blue-t&&e.blue<=this.blue+t&&(e.green>=this.green-t&&e.green<=this.green+t))}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Rectangle=void 0;var i=function(){function e(e,t){for(var a=0;a=0&&v>=0&&p0?this.paths[this.paths.length-1]:null}},{key:"createNewPath",value:function(e,t){var a=new n.Path(e,t);this.paths.push(a),this.addAction(new s.Action(a,this))}},{key:"removePathFromLayer",value:function(e){var t=this,a=this.paths.indexOf(e);this.paths.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeShapeFromLayer",value:function(e){var t=this,a=this.shapes.indexOf(e);this.shapes.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeSelectionFromLayer",value:function(e){var t=this,a=this.pastedRegions.indexOf(e);this.pastedRegions.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"setOpacity",value:function(e){this.colour.alpha=e}},{key:"getOpacity",value:function(){return this.colour.alpha}},{key:"getCurrentShape",value:function(){return this.shapes.length>0?this.shapes[this.shapes.length-1]:null}},{key:"isActivated",value:function(){return this.activated}},{key:"setLayerOpacity",value:function(e){this.layerOpacity=e}},{key:"getLayerOpacity",value:function(){return this.layerOpacity}},{key:"getLayerOpacityCSSString",value:function(){return"opacity : "+this.layerOpacity}},{key:"drawLayer",value:function(e,t){this.isActivated()&&this.drawLayerInPageCoords(e,t,this.pageIndex)}},{key:"drawLayerInPageCoords",value:function(e,t,a){var i=this,n=t.getContext("2d");n.clearRect(0,0,t.width,t.height),null!==this.backgroundImageCanvas&&n.drawImage(this.backgroundImageCanvas,0,0),this.actions.forEach(function(n){n.object.drawOnPage(i,a,e,i.pixelInstance.core.getSettings().renderer,t)})}},{key:"setBackgroundImageCanvas",value:function(e){this.backgroundImageCanvas=e}},{key:"addToPastedRegions",value:function(e){this.pastedRegions.push(e),this.addAction(new s.Action(e,this))}},{key:"addAction",value:function(e){this.actions.push(e),"selection"===e.object.type&&"select"===e.object.selectedShape.blendMode||this.pixelInstance.actions.push(e)}},{key:"removeAction",value:function(e){var t=this.actions.indexOf(e);this.actions.splice(t,1);var a=this.pixelInstance.actions.indexOf(e);this.pixelInstance.actions.splice(a,1)}},{key:"displayColourOptions",value:function(){console.log("colour clicked here")}},{key:"displayLayerOptions",value:function(){var e=document.getElementById("layer-"+this.layerId+"-options");e.classList.contains("unchecked-layer-settings")?(e.classList.remove("unchecked-layer-settings"),e.classList.add("checked-layer-settings"),this.pixelInstance.uiManager.createOpacitySlider(this,e.parentElement.parentElement,e.parentElement)):(e.classList.remove("checked-layer-settings"),e.classList.add("unchecked-layer-settings"),this.pixelInstance.uiManager.destroyOpacitySlider(this))}},{key:"activateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-deactivated"),e.classList.add("layer-activated"),this.getCanvas().style.opacity=this.getLayerOpacity(),this.layerId===this.pixelInstance.background.layerId?this.activated=!0:(this.activated=!0,this.pixelInstance.redrawLayer(this))}},{key:"deactivateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-activated"),e.classList.add("layer-deactivated"),this.activated=!1,this.layerId===this.pixelInstance.background.layerId?this.getCanvas().style.opacity=0:this.clearCtx()}},{key:"toggleLayerActivation",value:function(){document.getElementById("layer-"+this.layerId+"-activation").classList.contains("layer-deactivated")?this.activateLayer():this.deactivateLayer()}}]),e}()},function(e,t,a){"use strict";function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var s=function e(t){r(this,e),this.message=t};t.CannotDeleteLayerException=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return n(t,s),t}(),t.CannotSelectLayerException=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return n(t,s),t}()},function(e,t,a){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;at){for(var i=1;i<=e-t;i++)this.layers[e-i+1]=this.layers[e-i];this.layers[t]=a}else if(e=49&&a<=57){try{this.uiManager.highlightLayerSelectorById(a-49+1)}catch(e){e instanceof p.CannotSelectLayerException&&alert(e.message)}t!==this.selectedLayerIndex&&this.mousePressed&&(this.layerChangedMidDraw=!0)}switch(e.key.toLowerCase()){case"shift":this.shiftDown=!1;break;case"h":this.layers[this.selectedLayerIndex].toggleLayerActivation()}}},{key:"onKeyDown",value:function(e){switch(e.key.toLowerCase()){case"[":console.log(this.selectedLayerIndex),0!==this.selectedLayerIndex&&this.reorderLayers(this.selectedLayerIndex,this.selectedLayerIndex-1);break;case"]":this.selectedLayerIndex!==this.layers.length-1&&this.reorderLayers(this.selectedLayerIndex,this.selectedLayerIndex+1);break;case"escape":null!==this.selection&&null===this.selection.imageData&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel);break;case"backspace":try{(e.ctrlKey||e.metaKey)&&this.deleteLayer()}catch(e){e instanceof p.CannotDeleteLayerException&&alert(e.message)}break;case"n":(e.ctrlKey||e.metaKey)&&this.createLayer();break;case"z":(e.ctrlKey||e.metaKey)&&e.shiftKey?this.redoAction():(e.ctrlKey||e.metaKey)&&this.undoAction();break;case"c":(e.ctrlKey||e.metaKey)&&this.selection.copyShape(this.core.getSettings().maxZoomLevel);break;case"x":(e.ctrlKey||e.metaKey)&&this.selection.cutShape(this.core.getSettings().maxZoomLevel);break;case"v":(e.ctrlKey||e.metaKey)&&null!==this.selection&&null!==this.selection.imageData&&(this.selection.pasteShapeToLayer(this.layers[this.selectedLayerIndex]),this.selection=null,this.redrawLayer(this.layers[this.selectedLayerIndex]));break;case"shift":this.shiftDown=!0;break;case"f":this.core.publicInstance.toggleFullscreenMode();break;case"b":this.tools.setCurrentTool(this.tools.type.brush);break;case"r":this.tools.setCurrentTool(this.tools.type.rectangle);break;case"g":this.tools.setCurrentTool(this.tools.type.grab);break;case"e":this.tools.setCurrentTool(this.tools.type.erase);break;case"s":this.tools.setCurrentTool(this.tools.type.select);break;case"m":this.layers[this.selectedLayerIndex].toggleLayerActivation();break;case"h":this.layers[this.selectedLayerIndex].isActivated()&&this.layers[this.selectedLayerIndex].toggleLayerActivation()}}},{key:"editLayerName",value:function(e,t,a,i,n,r){a.removeAttribute("draggable"),a.setAttribute("draggable","false"),(13===(e.which||e.keyCode)||i)&&!1===n&&(r.updateLayerName(t.value),t.setAttribute("readonly","true"),a.setAttribute("draggable","true"))}},{key:"getMousePos",value:function(e,t){var a=e.getBoundingClientRect();return{x:t.clientX-a.left,y:t.clientY-a.top}}},{key:"onMouseDown",value:function(e){var t=document.getElementById("diva-1-outer"),a=this.getMousePos(t,e);switch(null!==this.selection&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel),1===e.which&&(this.rightMousePressed=!1),3===e.which&&(this.rightMousePressed=!0),this.mousePressed=!0,this.tools.getCurrentTool()){case this.tools.type.brush:this.rightMousePressed?this.initializeBrushSizeChange(a):this.initializeNewPathInCurrentLayer(a);break;case this.tools.type.rectangle:this.initializeRectanglePreview(a);break;case this.tools.type.grab:t.style.cursor="-webkit-grabbing";break;case this.tools.type.erase:this.rightMousePressed?this.initializeBrushSizeChange(a):this.initializeNewPathInCurrentLayer(a);break;case this.tools.type.select:this.selection=new y.Selection,this.initializeRectanglePreview(a)}this.undoneActions=[]}},{key:"onMouseMove",value:function(e){var t=document.getElementById("diva-1-outer"),a=this.getMousePos(t,e);switch(this.tools.getCurrentTool()){case this.tools.type.brush:this.rightMousePressed?this.changeBrushSize(a):this.addPointToCurrentPath(a),this.uiManager.moveBrushCursor(a);break;case this.tools.type.rectangle:this.rectanglePreview(a);break;case this.tools.type.erase:this.rightMousePressed?this.changeBrushSize(a):this.addPointToCurrentPath(a),this.uiManager.moveBrushCursor(a);break;case this.tools.type.select:this.rectanglePreview(a)}}},{key:"onMouseUp",value:function(){var e=document.getElementById("diva-1-outer");switch(this.mousePressed=!1,this.rightMousePressed=!1,this.horizontalMove=!1,this.initialShiftPress=!0,this.tools.getCurrentTool()){case this.tools.type.rectangle:break;case this.tools.type.grab:e.style.cursor="-webkit-grab"}}},{key:"deleteLayer",value:function(){var e=this.layers.length;if("undefined"==typeof numberInputLayers){if(e<=1)throw new p.CannotDeleteLayerException("Must at least have one layer other than the background");this.uiManager.destroyPluginElements(this.layers,this.background),this.layers.splice(this.selectedLayerIndex,1),this.selectedLayerIndex=0,this.uiManager.createPluginElements(this.layers),this.redrawAllLayers()}}},{key:"createLayer",value:function(){if("undefined"==typeof numberInputLayers){var e=void 0;switch(this.layerIdCounter){case 1:e=new l.Colour(51,102,255,1);break;case 2:e=new l.Colour(255,51,102,1);break;case 3:e=new l.Colour(255,255,10,1);break;case 4:e=new l.Colour(2,136,0,1);break;case 5:e=new l.Colour(96,0,186,1);break;case 6:e=new l.Colour(239,143,0,1);break;case 7:e=new l.Colour(71,239,200,1);break;case 8:e=new l.Colour(247,96,229,1);break;case 9:e=new l.Colour(114,61,0,1);break;default:e=new l.Colour(parseInt(255*Math.random()),parseInt(255*Math.random()),parseInt(255*Math.random()),1)}var t=new o.Layer(this.layerIdCounter,e,"Layer "+this.layerIdCounter,this,.5);this.layerIdCounter++,this.layers.push(t),this.changeCurrentlySelectedLayerIndex(this.layers.length-1),this.uiManager.destroyPluginElements(this.layers,this.background),this.uiManager.createPluginElements(this.layers),this.redrawAllLayers()}}},{key:"redoAction",value:function(){if(this.undoneActions.length>0){var e=this.undoneActions[this.undoneActions.length-1];if(!e.layer.isActivated())return;switch(e.object.type){case"path":e.layer.addPathToLayer(e.object);break;case"shape":e.layer.addShapeToLayer(e.object);break;case"selection":e.layer.addToPastedRegions(e.object)}this.undoneActions.splice(this.undoneActions.length-1,1),this.redrawLayer(e.layer)}}},{key:"undoAction",value:function(){if(this.actions.length>0){var e=this.actions[this.actions.length-1];if(!e.layer.isActivated())return;this.undoneActions.push(e),this.removeActionAtIndex(this.actions.length-1)}}},{key:"removeActionAtIndex",value:function(e){if(this.actions.length>0&&this.actions.length>=e){var t=this.actions[e];this.removeAction(t)}}},{key:"removeAction",value:function(e){if(null!==e){switch(e.object.type){case"path":e.layer.removePathFromLayer(e.object);break;case"shape":e.layer.removeShapeFromLayer(e.object);break;case"selection":e.layer.removeSelectionFromLayer(e.object)}this.redrawLayer(e.layer)}}},{key:"initializeNewPathInCurrentLayer",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex){var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a);if(this.uiManager.isInPageBounds(n.x,n.y)){var s=this.layers[this.selectedLayerIndex],o=new r.Point(n.x,n.y,t),l=this.uiManager.getBrushSizeSelectorValue();this.lastRelCoordX=n.x,this.lastRelCoordY=n.y,this.tools.getCurrentTool()===this.tools.type.brush?(s.createNewPath(l,"add"),s.addToCurrentPath(o,"add")):this.tools.getCurrentTool()===this.tools.type.erase&&(s.createNewPath(l,"subtract"),s.addToCurrentPath(o,"subtract")),a=this.core.getSettings().maxZoomLevel,s.getCurrentPath().connectPoint(s,o,t,a,!1,this.core.getSettings().renderer,s.getCanvas(),"page")}else this.mousePressed=!1}}},{key:"addPointToCurrentPath",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex&&this.mousePressed){var t=void 0,a=this.core.getSettings().currentPageIndex,i=this.core.getSettings().zoomLevel,n=this.core.getSettings().renderer,s=(new r.Point).getRelativeCoordinatesFromPadded(a,n,e.x,e.y,i);if(this.uiManager.isInPageBounds(s.x,s.y))if(this.layerChangedMidDraw)this.initializeNewPathInCurrentLayer(e),this.layerChangedMidDraw=!1;else{var o=this.core.getSettings().currentPageIndex,l=this.core.getSettings().maxZoomLevel;switch(this.mousePressed&&this.shiftDown?(this.initialShiftPress&&(Math.abs(s.x-this.lastRelCoordX)>=Math.abs(s.y-this.lastRelCoordY)&&(this.horizontalMove=!0),this.initialShiftPress=!1),t=this.horizontalMove?new r.Point(s.x,this.lastRelCoordY,o):new r.Point(this.lastRelCoordX,s.y,o)):(this.horizontalMove=!1,this.initialShiftPress=!0,this.lastRelCoordX=s.x,this.lastRelCoordY=s.y,t=new r.Point(s.x,s.y,o)),this.tools.getCurrentTool()){case this.tools.type.brush:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"add");break;case this.tools.type.erase:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"subtract");break;default:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"add")}var c=this.layers[this.selectedLayerIndex];c.getCurrentPath().connectPoint(c,t,o,l,!0,this.core.getSettings().renderer,c.getCanvas(),"page")}}}},{key:"initializeRectanglePreview",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex){var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a);if(this.uiManager.isInPageBounds(n.x,n.y)){var o=this.layers[this.selectedLayerIndex];switch(this.tools.getCurrentTool()){case this.tools.type.select:o.addShapeToLayer(new s.Rectangle(new r.Point(n.x,n.y,t),0,0,"select",this.tools.getCurrentTool())),this.selection.setSelectedShape(o.getCurrentShape(),this.layers[this.selectedLayerIndex]);break;case this.tools.type.rectangle:this.rightMousePressed?o.addShapeToLayer(new s.Rectangle(new r.Point(n.x,n.y,t),0,0,"subtract",this.tools.getCurrentTool())):o.addShapeToLayer(new s.Rectangle(new r.Point(n.x,n.y,t),0,0,"add",this.tools.getCurrentTool()))}this.redrawLayer(o)}}}},{key:"rectanglePreview",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex)if(this.layerChangedMidDraw)this.layerChangedMidDraw=!1,this.initializeRectanglePreview(e);else{if(!this.mousePressed)return;var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a),s=this.layers[this.selectedLayerIndex].getCurrentShape();if(!this.uiManager.isInPageBounds(n.x,n.y))return;var o=s.relativeRectWidth;if(s.relativeRectWidth=n.x-s.origin.relativeOriginX,this.shiftDown){var l=void 0;l=this.isInMainDiagonal(n,s)?1:-1,this.uiManager.isInPageBounds(s.origin.relativeOriginX+s.relativeRectWidth,s.origin.relativeOriginY+l*s.relativeRectWidth)?s.relativeRectHeight=l*s.relativeRectWidth:s.relativeRectWidth=o}else s.relativeRectHeight=n.y-s.origin.relativeOriginY;this.redrawLayer(this.layers[this.selectedLayerIndex])}}},{key:"initializeBrushSizeChange",value:function(e){var t=document.getElementById("brush-size-selector");this.prevMouseX=e.x,this.prevSize=t.value}},{key:"changeBrushSize",value:function(e){var t=document.getElementById("brush-size-selector"),a=.1*(parseFloat(e.x)-parseFloat(this.prevMouseX));t.value=parseFloat(this.prevSize)+a,this.uiManager.resizeBrushCursor()}},{key:"isInMainDiagonal",value:function(e,t){return e.xt.origin.relativeOriginX&&e.y>t.origin.relativeOriginY}},{key:"redrawLayer",value:function(e){e.drawLayer(this.core.getSettings().maxZoomLevel,e.getCanvas())}},{key:"redrawAllLayers",value:function(){var e=this;this.layers.forEach(function(t){e.redrawLayer(t)})}},{key:"changeCurrentlySelectedLayerIndex",value:function(e){this.selectedLayerIndex=e,null!==this.selection&&null===this.selection.imageData&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel)}},{key:"exportAsImageData",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().zoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsImageData()}},{key:"exportAsPNG",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().zoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsPNG()}},{key:"exportAsCSV",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().maxZoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsCSV()}},{key:"importPNGToLayer",value:function(e){new h.Import(this,this.layers,this.core.getSettings().currentPageIndex,this.core.getSettings().zoomLevel,this.uiManager).uploadLocalImageToLayer(this.layers[this.selectedLayerIndex],e)}}]),t}();t.default=v,v.prototype.pluginName="pixel",v.prototype.isPageTool=!0,window.Diva.PixelPlugin=v}).call(this,a(6))},function(e,t){var a;a=function(){return this}();try{a=a||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(a=window)}e.exports=a},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PixelWrapper=void 0;var i=function(){function e(e,t){for(var a=0;aWhile in the Select Region Layer, use the rectangle tool to select the regions of the page that you will classify.
Once you select these regions, select another layer and begin classifying! Keep in mind that classification outside these regions will not be utilized.
You can select the entire page by pressing SHIFT + A.
You can deselect the entire page by pressing ESC. This will destroy all selection regions that you have created.
",t.appendChild(i),e.appendChild(t)}},{key:"createButtons",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Submit To Rodan");this.exportToRodan=function(){e.createBackgroundLayer()},t.setAttribute("id","rodan-export-button"),t.appendChild(a),t.addEventListener("click",this.exportToRodan),document.body.insertBefore(t,document.getElementById("imageLoader"))}},{key:"destroyButtons",value:function(){var e=document.getElementById("rodan-export-button");e.parentNode.removeChild(e)}},{key:"createLayers",value:function(){if(this.pixelInstance.tools.currentTool="rectangle",1===this.layers.length){var e=numberInputLayers;if(0===numberInputLayers)for(;e<=0||e>7;)e=parseInt(prompt("How many layers will you classify?\nThis must be two (2) less than the total number of output ports.",3));this.selectRegionLayer=new s.Layer(-1,new o.Colour(240,232,227,1),"Select Region",this.pixelInstance,.3),this.layers.unshift(this.selectRegionLayer);for(var t=2;ty||x<=y&&b>y)&&g.push({absolutePaddedX:w,absolutePaddedY:y})}if(g.sort(function(e,t){return e.absolutePaddedX-t.absolutePaddedX}),!(g.length<=0))for(var C=0;C=0&&A.x>=0&&A.y<=s.height&&A.x<=s.width){var M=(new n.Point).getPaddedCoordinatesFromAbsolute(t,i,A.x,A.y),S=h.getImageData(M.x,M.y,1,1).data,T=new r.Colour(S[0],S[1],S[2],S[3]);u.fillStyle=T.toHTMLColour(),u.fillRect(A.x,A.y,1,1)}}else"subtract"===this.blendMode&&u.clearRect(A.x,A.y,1,1)}}}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a=i.height);)if(ds.height?i.goto(a,e+s.height,t):h.x<0?i.goto(a,e,t):h.x>s.width&&i.goto(a,e,t+s.width);var y=d.getImageData(h.x,h.y,1,1).data,g=new n.Colour(y[0],y[1],y[2],y[3]);c.fillStyle=g.toHTMLColour(),c.fillRect(t,e,1,1),u.fillStyle=g.toHTMLColour(),u.fillRect(t,e,1,1)}},{key:"postProcessImageDataIteration",value:function(e,t,a,i,n){if((e===n.height||this.exportInterrupted)&&(this.exportLayersCount-=1),e100?100:Math.round(10*r)/10;return this.pixelInstance.uiManager.updateProgress(s),{needsRecall:!0}}return this.exportInterrupted&&0===this.exportLayersCount?(this.exportInterrupted=!1,this.uiManager.destroyExportElements()):this.exportInterrupted||(t.toBlob(function(e){var a=document.createTextNode("Download "+t.getAttribute("value")+" image data "),i=document.getElementById(t.getAttribute("value")+"-image-data-download");if(null===i){var n=document.createElement("img"),r=URL.createObjectURL(e);n.src=r,(i=document.createElement("a")).appendChild(a),document.body.appendChild(i)}var s=URL.createObjectURL(e);i.setAttribute("class","export-download"),i.setAttribute("id",t.getAttribute("value")+"-image-data-download"),i.setAttribute("href",s),i.setAttribute("download",t.getAttribute("value")+" image data")}),0===this.exportLayersCount&&this.uiManager.destroyExportElements()),{needsRecall:!1}}},{key:"fillMatrix",value:function(e,t,a,i){var n=this,r=a.width,s=3,o=i.getContext("2d"),l=a.getContext("2d").getImageData(0,0,a.width,a.height).data;!function i(){var c=r;for(0;c--&&!(s>l.length);){if(0!==l[s]){var d=Math.floor(s/4),u=parseInt(d/a.height),h=parseInt(d%a.width);t[u][h]=e.layerId,o.fillStyle=e.colour.toHTMLColour(),o.fillRect(h,u,1,1)}s+=4}if(s>=l.length||n.exportInterrupted)n.exportLayersCount-=1;else{var y=s/l.length*100,g=y>100?100:Math.round(10*y)/10;n.pixelInstance.uiManager.updateProgress(g),setTimeout(i,1)}0===n.exportLayersCount&&(n.uiManager.destroyExportElements(),n.exportInterrupted?n.exportInterrupted=!1:n.transformMatrixToCSV())}()}},{key:"initializeMatrix",value:function(){var e=this.pixelInstance.core,t=e.publicInstance.getPageDimensionsAtZoomLevel(this.pageIndex,this.zoomLevel).height,a=e.publicInstance.getPageDimensionsAtZoomLevel(this.pageIndex,this.zoomLevel).width;this.matrix=new Array(t).fill(null).map(function(){return new Array(a).fill(0)})}},{key:"transformMatrixToCSV",value:function(){for(var e="",t=0;t=0;a--){var i=e[a];i.placeCanvasAfterElement(t),i.isActivated()?i.getCanvas().style.opacity=i.getLayerOpacity():i.getCanvas().style.opacity=0}this.pixelInstance.background.isActivated()?this.pixelInstance.background.getCanvas().style.opacity=this.pixelInstance.background.getLayerOpacity():this.pixelInstance.background.getCanvas().style.opacity=0}},{key:"destroyPixelCanvases",value:function(e){e.forEach(function(e){null!==e.getCanvas().parentNode&&e.getCanvas().parentNode.removeChild(e.getCanvas())})}},{key:"createOpacitySlider",value:function(e,t,a){var i=document.createElement("br"),n=document.createElement("div"),r=document.createElement("p"),s=document.createElement("input"),o=document.createTextNode("Opacity");i.setAttribute("id","opacity-br-"+e.layerId),n.setAttribute("class","layer-tool"),n.setAttribute("id","layer-"+e.layerId+"-opacity-tool"),r.setAttribute("class","layer-tool-text"),r.setAttribute("id","layer-"+e.layerId+"-opacity-text"),s.setAttribute("class","layer-tool-slider"),s.setAttribute("id","layer-"+e.layerId+"-opacity-slider"),s.setAttribute("type","range"),s.setAttribute("max",50),s.setAttribute("min",0),s.setAttribute("value",50*e.getLayerOpacity()),s.setAttribute("draggable","false"),s.addEventListener("input",function(){e.setLayerOpacity(s.value/50),e.isActivated()&&(e.getCanvas().style.opacity=e.getLayerOpacity())}),r.appendChild(o),n.appendChild(r),n.appendChild(s),t.insertBefore(n,a.nextSibling),t.insertBefore(i,a.nextSibling)}},{key:"destroyOpacitySlider",value:function(e){var t=document.getElementById("layer-"+e.layerId+"-opacity-tool"),a=document.getElementById("opacity-br-"+e.layerId);t.parentElement.removeChild(t),a.parentElement.removeChild(a)}},{key:"createBackground",value:function(){var e=document.createElement("div");e.setAttribute("id","background-view"),e.setAttribute("class","background-view");var t=this.pixelInstance.background,a=document.createElement("div"),i=document.createElement("div"),n=document.createElement("input"),r=document.createElement("div"),s=document.createElement("div");a.setAttribute("draggable","false"),a.setAttribute("class","layer-div"),a.setAttribute("value",t.layerId),a.setAttribute("id","layer-"+t.layerId+"-selector"),n.setAttribute("type","text"),n.setAttribute("readonly","true"),n.setAttribute("value",t.layerName),i.setAttribute("class","color-box"),i.setAttribute("style","background-color: "+t.colour.toHexString()+";"),r.setAttribute("class","unchecked-layer-settings"),r.setAttribute("id","layer-"+t.layerId+"-options"),this.pixelInstance.background.isActivated()?(s.setAttribute("class","layer-activated"),this.pixelInstance.background.getCanvas().style.opacity=1):(s.setAttribute("class","layer-deactivated"),this.pixelInstance.background.getCanvas().style.opacity=0),s.setAttribute("id","layer-"+t.layerId+"-activation"),i.addEventListener("click",function(){t.displayColourOptions()}),s.addEventListener("click",function(){t.toggleLayerActivation()}),r.onclick=function(){t.displayLayerOptions()},a.appendChild(n),a.appendChild(r),a.appendChild(i),a.appendChild(s),e.appendChild(a),document.body.appendChild(e)}},{key:"destroyLockedLayerSelectors",value:function(){var e=document.getElementById("background-view");e.parentNode.removeChild(e)}},{key:"createLayersView",value:function(e){var t=this,a=void 0,i=void 0,n=!1,r=document.createElement("div");r.setAttribute("id","layers-view"),r.setAttribute("class","layers-view");for(var s=function(){var s=e[o],l=document.createElement("div"),c=document.createElement("br"),d=document.createElement("div"),u=document.createElement("input"),h=document.createElement("div"),y=document.createElement("div");l.setAttribute("index",o),l.setAttribute("draggable","true"),l.setAttribute("class","layer-div"),l.setAttribute("value",s.layerId),l.setAttribute("id","layer-"+s.layerId+"-selector"),l.setAttribute("title","Hotkey: "+s.layerId),u.setAttribute("type","text"),u.setAttribute("readonly","true"),u.setAttribute("value",s.layerName),u.setAttribute("ondblclick","this.readOnly='';"),u.addEventListener("dblclick",function(e){t.pixelInstance.editLayerName(e,u,l,!1,n,s),u.onblur=function(e){t.pixelInstance.editLayerName(e,u,l,!0,n,s)}}),d.setAttribute("class","color-box"),d.setAttribute("style","background-color: "+s.colour.toHexString()+";"),h.setAttribute("class","unchecked-layer-settings"),h.setAttribute("id","layer-"+s.layerId+"-options"),s.isActivated()?y.setAttribute("class","layer-activated"):y.setAttribute("class","layer-deactivated"),y.setAttribute("id","layer-"+s.layerId+"-activation"),s.layerId===t.pixelInstance.layers[t.pixelInstance.selectedLayerIndex].layerId&&l.classList.add("selected-layer"),function(e,r,s,o,l,c){r.addEventListener("click",function(){e.displayColourOptions()}),s.addEventListener("click",function(){e.toggleLayerActivation()}),o.addEventListener("keypress",function(a){t.pixelInstance.editLayerName(a,o,c,!1,n,e)}),l.onclick=function(){e.displayLayerOptions()},c.ondrag=function(e){t.pixelInstance.dragging(e),n=!0},c.ondragstart=function(e){t.pixelInstance.dragStart(e)},c.ondrop=function(e){t.pixelInstance.drop(e,a,i),n=!1},c.onmousedown=function(){a=c.getAttribute("index"),t.highlightLayerSelectorById(e.layerId)},c.ondragover=function(e){t.pixelInstance.allowDrop(e),i=c.getAttribute("index")}}(s,d,y,u,h,l),l.appendChild(u),l.appendChild(h),l.appendChild(d),l.appendChild(y),r.appendChild(l),r.appendChild(c)},o=e.length-1;o>=0;o--)s();document.body.appendChild(r),this.createBackground(e)}},{key:"destroyLayerSelectors",value:function(){var e=document.getElementById("layers-view");e.parentNode.removeChild(e)}},{key:"highlightLayerSelectorById",value:function(e){var t=this,a=!1;if(this.pixelInstance.layers.forEach(function(t){t.layerId===e&&(a=!0)}),!a)throw new r.CannotSelectLayerException("The layer you are trying to select does not exist.");this.pixelInstance.layers.forEach(function(a){if(a.layerId===e){var i=document.getElementById("layer-"+a.layerId+"-selector");i.hasAttribute("selected-layer")||i.classList.add("selected-layer"),t.pixelInstance.changeCurrentlySelectedLayerIndex(t.pixelInstance.layers.indexOf(a))}else{var n=document.getElementById("layer-"+a.layerId+"-selector");n.classList.contains("selected-layer")&&n.classList.remove("selected-layer")}})}},{key:"createBrushSizeSelector",value:function(){var e=this,t=document.createElement("div");t.setAttribute("class","tool-settings"),t.setAttribute("id","brush-size");var a=document.createTextNode("Brush size:"),i=document.createElement("input");i.setAttribute("id","brush-size-selector"),i.setAttribute("type","range"),i.setAttribute("max",40),i.setAttribute("min",1),i.setAttribute("value",25),i.addEventListener("input",function(){e.createBrushCursor()}),t.appendChild(a),t.appendChild(i),document.body.appendChild(t)}},{key:"destroyBrushSizeSelector",value:function(){var e=document.getElementById("brush-size");null!==e&&e.parentNode.removeChild(e)}},{key:"createUndoButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Undo");this.undo=function(){e.pixelInstance.undoAction()},t.setAttribute("id","undo-button"),t.appendChild(a),t.addEventListener("click",this.undo),document.body.appendChild(t)}},{key:"destroyUndoButton",value:function(){var e=document.getElementById("undo-button");e.parentNode.removeChild(e)}},{key:"createRedoButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Redo");this.redo=function(){e.pixelInstance.redoAction()},t.setAttribute("id","redo-button"),t.appendChild(a),t.addEventListener("click",this.redo),document.body.appendChild(t)}},{key:"destroyRedoButton",value:function(){var e=document.getElementById("redo-button");e.parentNode.removeChild(e)}},{key:"createDeleteLayerButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Delete selected layer");this.deleteLayer=function(){try{e.pixelInstance.deleteLayer()}catch(e){e instanceof r.CannotDeleteLayerException&&alert(e.message)}},t.setAttribute("id","delete-layer-button"),t.appendChild(a),t.addEventListener("click",this.deleteLayer),document.body.appendChild(t)}},{key:"destroyDeleteLayerButton",value:function(){var e=document.getElementById("delete-layer-button");e.parentNode.removeChild(e)}},{key:"createCreateLayerButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Create new layer");this.createLayer=function(){e.pixelInstance.createLayer()},t.setAttribute("id","create-layer-button"),t.appendChild(a),t.addEventListener("click",this.createLayer),document.body.appendChild(t)}},{key:"destroyCreateLayerButton",value:function(){var e=document.getElementById("create-layer-button");e.parentNode.removeChild(e)}},{key:"createExportButtons",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Export as CSV"),i=document.createElement("button"),n=document.createTextNode("Export as PNG"),r=document.createElement("button"),s=document.createTextNode("Export as image Data PNG");this.exportCSV=function(){e.pixelInstance.exportAsCSV()},this.exportPNG=function(){e.pixelInstance.exportAsPNG()},this.exportPNGData=function(){e.pixelInstance.exportAsImageData()},t.setAttribute("id","csv-export-button"),t.appendChild(a),t.addEventListener("click",this.exportCSV),i.setAttribute("id","png-export-button"),i.appendChild(n),i.addEventListener("click",this.exportPNG),r.setAttribute("id","png-export-data-button"),r.appendChild(s),r.addEventListener("click",this.exportPNGData),document.body.appendChild(t),document.body.appendChild(i),document.body.appendChild(r)}},{key:"destroyExportButtons",value:function(){var e=document.getElementById("csv-export-button"),t=document.getElementById("png-export-button"),a=document.getElementById("png-export-data-button");e.parentNode.removeChild(e),t.parentNode.removeChild(t),a.parentNode.removeChild(a)}},{key:"createImportButtons",value:function(){var e=this,t=document.createElement("input");t.setAttribute("type","file"),t.setAttribute("id","imageLoader"),t.setAttribute("name","imageLoader"),this.import=function(t){e.pixelInstance.importPNGToLayer(t)},t.addEventListener("change",this.import,!1),document.body.appendChild(t)}},{key:"destroyImportButtons",value:function(){var e=document.getElementById("imageLoader");e.parentNode.removeChild(e)}},{key:"updateProgress",value:function(e){var t=e+"%",a="width: "+t;document.getElementById("pbar-inner-div").setAttribute("style",a),document.getElementById("pbar-inner-text").innerHTML=t}},{key:"destroyBackground",value:function(e){this.pixelInstance.destroyLockedLayerSelectors(e)}},{key:"createExportElements",value:function(e){var t=document.createElement("div"),a=document.createTextNode("Exporting"),i=document.createTextNode("0%"),n=document.createElement("div"),r=document.createElement("div"),s=document.createElement("div"),o=document.createElement("div"),l=document.createElement("div"),c=document.createTextNode("Cancel");return t.setAttribute("class","export-div"),t.setAttribute("id","pixel-export-div"),n.setAttribute("class","pbar-outer-div"),n.setAttribute("id","pbar-outer-div"),r.setAttribute("class","pbar-inner-div"),r.setAttribute("id","pbar-inner-div"),s.setAttribute("class","pbar-inner-text"),s.setAttribute("id","pbar-inner-text"),o.setAttribute("class","pbar-export-text"),o.setAttribute("id","pbar-export-text"),l.setAttribute("class","cancel-export-div"),l.setAttribute("id","cancel-export-div"),l.addEventListener("click",function(){l.setAttribute("style","background-color: #AAAAAA;"),e.exportInterrupted=!0}),o.appendChild(a),l.appendChild(c),s.appendChild(i),n.appendChild(r),n.appendChild(s),n.appendChild(o),n.appendChild(l),t.appendChild(n),document.body.appendChild(t),{progressCanvas:this.createProgressCanvas(e.pageIndex,e.zoomLevel)}}},{key:"destroyExportElements",value:function(){var e=document.getElementById("pixel-export-div");e.parentNode.removeChild(e)}},{key:"destroyDownloadLinks",value:function(){for(var e=document.getElementsByClassName("export-download");e[0];)e[0].parentNode.removeChild(e[0])}},{key:"createProgressCanvas",value:function(e,t){var a=this.pixelInstance.core.publicInstance.getPageDimensionsAtZoomLevel(e,t).height,i=this.pixelInstance.core.publicInstance.getPageDimensionsAtZoomLevel(e,t).width,n=document.createElement("canvas");n.setAttribute("id","progress-canvas"),n.style.opacity=.3,n.width=i,n.height=a,n.globalAlpha=1;var r=window,s=document,o=s.documentElement,l=s.getElementsByTagName("body")[0],c=r.innerHeight||o.clientHeight||l.clientHeight;return n.style.height=c+"px",document.getElementById("pixel-export-div").appendChild(n),n}},{key:"markToolSelected",value:function(e){document.getElementById(e).checked=!0}},{key:"getBrushSizeSelectorValue",value:function(){var e=document.getElementById("brush-size-selector"),t=e.value/e.max*10;return.05+Math.exp(t-6)}},{key:"createBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div"),t=document.getElementById("diva-1-viewport"),a=document.getElementById("diva-1-outer");null===e&&((e=document.createElement("div")).setAttribute("id","brush-cursor-div"),a.insertBefore(e,t)),e.setAttribute("oncontextmenu","return false"),this.resizeBrushCursor()}},{key:"resizeBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div");if(null!==e){var t=Math.pow(2,this.pixelInstance.core.getSettings().zoomLevel),a=this.getBrushSizeSelectorValue()*t;e.style.width=a+"px",e.style.height=a+"px"}}},{key:"destroyBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div");null!==e&&e.parentNode.removeChild(e)}},{key:"moveBrushCursor",value:function(e){var t=document.getElementById("brush-cursor-div"),a=Math.pow(2,this.pixelInstance.core.getSettings().zoomLevel),i=this.getBrushSizeSelectorValue()*a;t.style.left=e.x-i/2-1+"px",t.style.top=e.y-i/2-1+"px"}},{key:"restoreDefaultCursor",value:function(){document.getElementById("diva-1-outer").style.cursor="default"}},{key:"setMousePosition",value:function(e){this.mouse.x=e.x-1,this.mouse.y=e.y-1}},{key:"createRectanglePreview",value:function(e,t){this.setMousePosition(e);var a=document.getElementById("diva-1-viewport"),i=document.getElementById("diva-1-outer");this.mouse.startX=this.mouse.x,this.mouse.startY=this.mouse.y;var n=document.createElement("div");n.className="rectangle",n.id="preview-rectangle",n.style.left=this.mouse.x+"px",n.style.top=this.mouse.y+"px",n.style.border="1px solid "+t.colour.toHexString(),i.insertBefore(n,a)}},{key:"resizeRectanglePreview",value:function(e,t){this.setMousePosition(e);var a=document.getElementById("preview-rectangle");null!==a&&(a.style.border="1px solid "+t.colour.toHexString(),a.style.width=Math.abs(this.mouse.x-this.mouse.startX)+"px",a.style.height=Math.abs(this.mouse.y-this.mouse.startY)+"px",a.style.left=this.mouse.x-this.mouse.startX<0?this.mouse.x+"px":this.mouse.startX+"px",a.style.top=this.mouse.y-this.mouse.startY<0?this.mouse.y+"px":this.mouse.startY+"px")}},{key:"removeRectanglePreview",value:function(){var e=document.getElementById("preview-rectangle");null!==e&&e.parentNode.removeChild(e)}},{key:"isInPageBounds",value:function(e,t){var a=this.pixelInstance.core.getSettings().currentPageIndex,i=this.pixelInstance.core.getSettings().zoomLevel,r=this.pixelInstance.core.getSettings().renderer,s=this.pixelInstance.core.publicInstance.getCurrentPageDimensionsAtCurrentZoomLevel(),o=(new n.Point).getCoordsInViewport(i,a,r),l=s.width+o.x,c=s.height+o.y,d=(new n.Point).getRelativeCoordinatesFromPadded(a,r,l,c,i);return!(e<0||t<0||e>d.x||t>d.y)}},{key:"tutorial",value:function(){var e=document.createElement("div");e.setAttribute("id","tutorial-div");var t=document.createElement("div");t.setAttribute("id","tutorial-overlay");var a=document.createElement("div");a.setAttribute("id","myModal"),a.setAttribute("class","modal");var i=document.createElement("div");i.setAttribute("class","modal-content");var n=document.createElement("div");n.setAttribute("class","modal-header");var r=document.createTextNode("Hello, World"),s=document.createElement("h2");s.appendChild(r);var o=document.createElement("span");o.setAttribute("class","close"),o.innerHTML="×";var l=document.createElement("div");l.setAttribute("class","modal-body");var c=document.createElement("p");c.innerHTML="The following is a glossary of the hotkeys you will find useful when using Pixel.js";var d=document.createElement("ul");d.setAttribute("style","list-style-type:none;");var u=document.createElement("li");u.innerHTML="1 ... 9 layer select";var h=document.createElement("li");h.innerHTML="b brush tool";var y=document.createElement("li");y.innerHTML="r rectangle tool";var g=document.createElement("li");g.innerHTML="g grab tool";var p=document.createElement("li");p.innerHTML="e eraser tool";var v=document.createElement("li");v.innerHTML="Shift force tools to paint in an exact way.";var m=document.createElement("li");m.innerHTML="cmd + z undo";var b=document.createElement("li");b.innerHTML="cmd + Shift + z redo";var f=document.createElement("div");f.setAttribute("class","modal-footer");var x=document.createElement("h2");x.innerHTML="Got It!",d.appendChild(u),d.appendChild(h),d.appendChild(y),d.appendChild(g),d.appendChild(p),d.appendChild(v),d.appendChild(m),d.appendChild(b),a.appendChild(i),i.appendChild(n),i.appendChild(l),i.appendChild(f),n.appendChild(s),n.appendChild(o),l.appendChild(c),l.appendChild(d),f.appendChild(x),e.appendChild(t),e.appendChild(a),document.body.appendChild(e),a.style.display="block",f.addEventListener("click",function(){e.parentNode.removeChild(e)})}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a A collection of keyboard shortcuts have been implemented. Each layer can be selected by its number (from 1 to 9). Hover over the layers to receive a prompt.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/02.gif";break;case 2:i.innerHTML="You can upload images to the currently selected layer. The image will be converted to the specified layer's colour.
In this example, we have uploaded the output images of a classification method in order to correct it.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/03.gif";break;case 3:i.innerHTML="Double click on the layer's name to rename it.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/04.gif";break;case 4:i.innerHTML="Use zoom along with the grab tool g to navigate a page.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/06.gif";break;case 5:i.innerHTML="Use the select tool s to copy Ctrl + c or cut Ctrl + x and paste Ctrl + v rectangular regions of pixels from one layer to another.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/07.gif";break;case 6:i.innerHTML="Right-click and drag right and left on the erase e and brush b tools to change the brush size.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/09.gif";break;case 7:i.innerHTML="Press Shift and drag on the erase e and brush b tools to draw straight lines.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/10.gif";break;case 8:i.innerHTML="Right-click and drag on rectangle tool r to erase rectangular regions, left-click to draw rectangle. Press Shift to draw squares.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/08.gif";break;case 9:i.innerHTML="Use the Fullscreen mode f and the browser zoom to get more precision, when needed.
To exit Fullscreen mode, press on f again.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/fullscreen.gif";break;case 10:i.innerHTML="You can bring a layer forward/backward by clicking and dragging them to their desired position.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/11.gif";break;case 11:i.innerHTML="You can undo Ctrl + z and redo Ctrl + Shift + z an action.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/undo_redo.gif";break;case 12:i.innerHTML="You can delete a layer by selecting it and then using Ctrl + del.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/delete_layer.gif";break;case 13:i.innerHTML="You can mute (press m to toggle on/off) or hide (hold h to turn off, release to turn on) layers.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/12_layers_on_off.gif";break;case 14:i.innerHTML="Change the opacity of a layer by displaying the layer options.",n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/05.gif";break;case 15:i.innerHTML='Export layers as PNGs to save a specific layer as an image. See the wiki for details on the different export buttons and more information.',n.src="https://github.com/DDMAL/Pixel.js/wiki/assets/21_export.gif"}return a.appendChild(n),a.appendChild(i),0!==this.currentTutorialPageIndex&&a.appendChild(s),15!==this.currentTutorialPageIndex&&a.appendChild(r),a.appendChild(o),a}},{key:"getTutorialPage",value:function(e){var t=document.getElementById("modal-body");t.parentElement.removeChild(t),this.modalContent.insertBefore(this.getModalBody(e),document.getElementById("modal-footer"))}}]),e}()}]);
\ No newline at end of file
+!function(e){var t={};function a(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,a),n.l=!0,n.exports}a.m=e,a.c=t,a.d=function(e,t,i){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(a.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(i,n,function(t){return e[t]}.bind(null,n));return i},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=5)}([function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a=this.red-t&&e.red<=this.red+t&&(e.blue>=this.blue-t&&e.blue<=this.blue+t&&(e.green>=this.green-t&&e.green<=this.green+t))}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a=this.red-t&&e.red<=this.red+t&&(e.blue>=this.blue-t&&e.blue<=this.blue+t&&(e.green>=this.green-t&&e.green<=this.green+t))}}]),e}()},function(e,t,a){"use strict";function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function e(t){r(this,e),this.message=t};t.CannotDeleteLayerException=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return n(t,o),t}(),t.CannotSelectLayerException=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return n(t,o),t}()},function(e,t,a){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;at){for(var i=1;i<=e-t;i++)this.layers[e-i+1]=this.layers[e-i];this.layers[t]=a}else if(e=49&&a<=57){try{this.uiManager.highlightLayerSelectorById(a-49+1)}catch(e){e instanceof p.CannotSelectLayerException&&alert(e.message)}t!==this.selectedLayerIndex&&this.mousePressed&&(this.layerChangedMidDraw=!0)}switch(e.key.toLowerCase()){case"shift":this.shiftDown=!1;break;case"h":this.layers[this.selectedLayerIndex].toggleLayerActivation()}}},{key:"onKeyDown",value:function(e){switch(e.key.toLowerCase()){case"[":console.log(this.selectedLayerIndex),0!==this.selectedLayerIndex&&this.reorderLayers(this.selectedLayerIndex,this.selectedLayerIndex-1);break;case"]":this.selectedLayerIndex!==this.layers.length-1&&this.reorderLayers(this.selectedLayerIndex,this.selectedLayerIndex+1);break;case"escape":null!==this.selection&&null===this.selection.imageData&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel);break;case"backspace":try{(e.ctrlKey||e.metaKey)&&this.deleteLayer()}catch(e){e instanceof p.CannotDeleteLayerException&&alert(e.message)}break;case"n":(e.ctrlKey||e.metaKey)&&this.createLayer();break;case"z":(e.ctrlKey||e.metaKey)&&e.shiftKey?this.redoAction():(e.ctrlKey||e.metaKey)&&this.undoAction();break;case"c":(e.ctrlKey||e.metaKey)&&this.selection.copyShape(this.core.getSettings().maxZoomLevel);break;case"x":(e.ctrlKey||e.metaKey)&&this.selection.cutShape(this.core.getSettings().maxZoomLevel);break;case"v":(e.ctrlKey||e.metaKey)&&null!==this.selection&&null!==this.selection.imageData&&(this.selection.pasteShapeToLayer(this.layers[this.selectedLayerIndex]),this.selection=null,this.redrawLayer(this.layers[this.selectedLayerIndex]));break;case"shift":this.shiftDown=!0;break;case"f":this.core.publicInstance.toggleFullscreenMode();break;case"b":this.tools.setCurrentTool(this.tools.type.brush);break;case"r":this.tools.setCurrentTool(this.tools.type.rectangle);break;case"g":this.tools.setCurrentTool(this.tools.type.grab);break;case"e":this.tools.setCurrentTool(this.tools.type.erase);break;case"s":this.tools.setCurrentTool(this.tools.type.select);break;case"m":this.layers[this.selectedLayerIndex].toggleLayerActivation();break;case"h":this.layers[this.selectedLayerIndex].isActivated()&&this.layers[this.selectedLayerIndex].toggleLayerActivation()}}},{key:"editLayerName",value:function(e,t,a,i,n,r){a.removeAttribute("draggable"),a.setAttribute("draggable","false"),(13===(e.which||e.keyCode)||i)&&!1===n&&(r.updateLayerName(t.value),t.setAttribute("readonly","true"),a.setAttribute("draggable","true"))}},{key:"getMousePos",value:function(e,t){var a=e.getBoundingClientRect();return{x:t.clientX-a.left,y:t.clientY-a.top}}},{key:"onMouseDown",value:function(e){var t=document.getElementById("diva-1-outer"),a=this.getMousePos(t,e);switch(null!==this.selection&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel),1===e.which&&(this.rightMousePressed=!1),3===e.which&&(this.rightMousePressed=!0),this.mousePressed=!0,this.tools.getCurrentTool()){case this.tools.type.brush:this.rightMousePressed?this.initializeBrushSizeChange(a):this.initializeNewPathInCurrentLayer(a);break;case this.tools.type.rectangle:this.initializeRectanglePreview(a);break;case this.tools.type.grab:t.style.cursor="-webkit-grabbing";break;case this.tools.type.erase:this.rightMousePressed?this.initializeBrushSizeChange(a):this.initializeNewPathInCurrentLayer(a);break;case this.tools.type.select:this.selection=new y.Selection,this.initializeRectanglePreview(a)}this.undoneActions=[]}},{key:"onMouseMove",value:function(e){var t=document.getElementById("diva-1-outer"),a=this.getMousePos(t,e);switch(this.tools.getCurrentTool()){case this.tools.type.brush:this.rightMousePressed?this.changeBrushSize(a):this.addPointToCurrentPath(a),this.uiManager.moveBrushCursor(a);break;case this.tools.type.rectangle:this.rectanglePreview(a);break;case this.tools.type.erase:this.rightMousePressed?this.changeBrushSize(a):this.addPointToCurrentPath(a),this.uiManager.moveBrushCursor(a);break;case this.tools.type.select:this.rectanglePreview(a)}}},{key:"onMouseUp",value:function(){var e=document.getElementById("diva-1-outer");switch(this.mousePressed=!1,this.rightMousePressed=!1,this.horizontalMove=!1,this.initialShiftPress=!0,this.tools.getCurrentTool()){case this.tools.type.rectangle:break;case this.tools.type.grab:e.style.cursor="-webkit-grab"}}},{key:"deleteLayer",value:function(){var e=this.layers.length;if("undefined"==typeof numberInputLayers){if(e<=1)throw new p.CannotDeleteLayerException("Must at least have one layer other than the background");this.uiManager.destroyPluginElements(this.layers,this.background),this.layers.splice(this.selectedLayerIndex,1),this.selectedLayerIndex=0,this.uiManager.createPluginElements(this.layers),this.redrawAllLayers()}}},{key:"createLayer",value:function(){if("undefined"==typeof numberInputLayers){var e=void 0;switch(this.layerIdCounter){case 1:e=new l.Colour(51,102,255,1);break;case 2:e=new l.Colour(255,51,102,1);break;case 3:e=new l.Colour(255,255,10,1);break;case 4:e=new l.Colour(2,136,0,1);break;case 5:e=new l.Colour(96,0,186,1);break;case 6:e=new l.Colour(239,143,0,1);break;case 7:e=new l.Colour(71,239,200,1);break;case 8:e=new l.Colour(247,96,229,1);break;case 9:e=new l.Colour(114,61,0,1);break;default:e=new l.Colour(parseInt(255*Math.random()),parseInt(255*Math.random()),parseInt(255*Math.random()),1)}var t=new s.Layer(this.layerIdCounter,e,"Layer "+this.layerIdCounter,this,.5);this.layerIdCounter++,this.layers.push(t),this.changeCurrentlySelectedLayerIndex(this.layers.length-1),this.uiManager.destroyPluginElements(this.layers,this.background),this.uiManager.createPluginElements(this.layers),this.redrawAllLayers()}}},{key:"redoAction",value:function(){if(this.undoneActions.length>0){var e=this.undoneActions[this.undoneActions.length-1];if(!e.layer.isActivated())return;switch(e.object.type){case"path":e.layer.addPathToLayer(e.object);break;case"shape":e.layer.addShapeToLayer(e.object);break;case"selection":e.layer.addToPastedRegions(e.object)}this.undoneActions.splice(this.undoneActions.length-1,1),this.redrawLayer(e.layer)}}},{key:"undoAction",value:function(){if(this.actions.length>0){var e=this.actions[this.actions.length-1];if(!e.layer.isActivated())return;this.undoneActions.push(e),this.removeActionAtIndex(this.actions.length-1)}}},{key:"removeActionAtIndex",value:function(e){if(this.actions.length>0&&this.actions.length>=e){var t=this.actions[e];this.removeAction(t)}}},{key:"removeAction",value:function(e){if(null!==e){switch(e.object.type){case"path":e.layer.removePathFromLayer(e.object);break;case"shape":e.layer.removeShapeFromLayer(e.object);break;case"selection":e.layer.removeSelectionFromLayer(e.object)}this.redrawLayer(e.layer)}}},{key:"initializeNewPathInCurrentLayer",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex){var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a);if(this.uiManager.isInPageBounds(n.x,n.y)){var o=this.layers[this.selectedLayerIndex],s=new r.Point(n.x,n.y,t),l=this.uiManager.getBrushSizeSelectorValue();this.lastRelCoordX=n.x,this.lastRelCoordY=n.y,this.tools.getCurrentTool()===this.tools.type.brush?(o.createNewPath(l,"add"),o.addToCurrentPath(s,"add")):this.tools.getCurrentTool()===this.tools.type.erase&&(o.createNewPath(l,"subtract"),o.addToCurrentPath(s,"subtract")),a=this.core.getSettings().maxZoomLevel,o.getCurrentPath().connectPoint(o,s,t,a,!1,this.core.getSettings().renderer,o.getCanvas(),"page")}else this.mousePressed=!1}}},{key:"addPointToCurrentPath",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex&&this.mousePressed){var t=void 0,a=this.core.getSettings().currentPageIndex,i=this.core.getSettings().zoomLevel,n=this.core.getSettings().renderer,o=(new r.Point).getRelativeCoordinatesFromPadded(a,n,e.x,e.y,i);if(this.uiManager.isInPageBounds(o.x,o.y))if(this.layerChangedMidDraw)this.initializeNewPathInCurrentLayer(e),this.layerChangedMidDraw=!1;else{var s=this.core.getSettings().currentPageIndex,l=this.core.getSettings().maxZoomLevel;switch(this.mousePressed&&this.shiftDown?(this.initialShiftPress&&(Math.abs(o.x-this.lastRelCoordX)>=Math.abs(o.y-this.lastRelCoordY)&&(this.horizontalMove=!0),this.initialShiftPress=!1),t=this.horizontalMove?new r.Point(o.x,this.lastRelCoordY,s):new r.Point(this.lastRelCoordX,o.y,s)):(this.horizontalMove=!1,this.initialShiftPress=!0,this.lastRelCoordX=o.x,this.lastRelCoordY=o.y,t=new r.Point(o.x,o.y,s)),this.tools.getCurrentTool()){case this.tools.type.brush:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"add");break;case this.tools.type.erase:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"subtract");break;default:this.layers[this.selectedLayerIndex].addToCurrentPath(t,"add")}var c=this.layers[this.selectedLayerIndex];c.getCurrentPath().connectPoint(c,t,s,l,!0,this.core.getSettings().renderer,c.getCanvas(),"page")}}}},{key:"initializeRectanglePreview",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex){var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a);if(this.uiManager.isInPageBounds(n.x,n.y)){var s=this.layers[this.selectedLayerIndex];switch(this.tools.getCurrentTool()){case this.tools.type.select:s.addShapeToLayer(new o.Rectangle(new r.Point(n.x,n.y,t),0,0,"select",this.tools.getCurrentTool())),this.selection.setSelectedShape(s.getCurrentShape(),this.layers[this.selectedLayerIndex]);break;case this.tools.type.rectangle:this.rightMousePressed?s.addShapeToLayer(new o.Rectangle(new r.Point(n.x,n.y,t),0,0,"subtract",this.tools.getCurrentTool())):s.addShapeToLayer(new o.Rectangle(new r.Point(n.x,n.y,t),0,0,"add",this.tools.getCurrentTool()))}this.redrawLayer(s)}}}},{key:"rectanglePreview",value:function(e){if(this.layers[this.selectedLayerIndex].isActivated()&&this.core.getSettings().currentPageIndex===this.layers[0].pageIndex)if(this.layerChangedMidDraw)this.layerChangedMidDraw=!1,this.initializeRectanglePreview(e);else{if(!this.mousePressed)return;var t=this.core.getSettings().currentPageIndex,a=this.core.getSettings().zoomLevel,i=this.core.getSettings().renderer,n=(new r.Point).getRelativeCoordinatesFromPadded(t,i,e.x,e.y,a),o=this.layers[this.selectedLayerIndex].getCurrentShape();if(!this.uiManager.isInPageBounds(n.x,n.y))return;var s=o.relativeRectWidth;if(o.relativeRectWidth=n.x-o.origin.relativeOriginX,this.shiftDown){var l=void 0;l=this.isInMainDiagonal(n,o)?1:-1,this.uiManager.isInPageBounds(o.origin.relativeOriginX+o.relativeRectWidth,o.origin.relativeOriginY+l*o.relativeRectWidth)?o.relativeRectHeight=l*o.relativeRectWidth:o.relativeRectWidth=s}else o.relativeRectHeight=n.y-o.origin.relativeOriginY;this.redrawLayer(this.layers[this.selectedLayerIndex])}}},{key:"initializeBrushSizeChange",value:function(e){var t=document.getElementById("brush-size-selector");this.prevMouseX=e.x,this.prevSize=t.value}},{key:"changeBrushSize",value:function(e){var t=document.getElementById("brush-size-selector"),a=.1*(parseFloat(e.x)-parseFloat(this.prevMouseX));t.value=parseFloat(this.prevSize)+a,this.uiManager.resizeBrushCursor()}},{key:"isInMainDiagonal",value:function(e,t){return e.xt.origin.relativeOriginX&&e.y>t.origin.relativeOriginY}},{key:"redrawLayer",value:function(e){e.drawLayer(this.core.getSettings().maxZoomLevel,e.getCanvas())}},{key:"redrawAllLayers",value:function(){var e=this;this.layers.forEach(function(t){e.redrawLayer(t)})}},{key:"changeCurrentlySelectedLayerIndex",value:function(e){this.selectedLayerIndex=e,null!==this.selection&&null===this.selection.imageData&&this.selection.clearSelection(this.core.getSettings().maxZoomLevel)}},{key:"exportAsImageData",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().zoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsImageData()}},{key:"exportAsPNG",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().zoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsPNG()}},{key:"exportAsCSV",value:function(){var e=this.core.getSettings().currentPageIndex,t=this.core.getSettings().maxZoomLevel;new c.Export(this,this.layers,e,t,this.uiManager).exportLayersAsCSV()}},{key:"importPNGToLayer",value:function(e){new h.Import(this,this.layers,this.core.getSettings().currentPageIndex,this.core.getSettings().zoomLevel,this.uiManager).uploadLocalImageToLayer(this.layers[this.selectedLayerIndex],e)}}]),t}();t.default=v,v.prototype.pluginName="pixel",v.prototype.isPageTool=!0,window.Diva.PixelPlugin=v}).call(this,a(6))},function(e,t){var a;a=function(){return this}();try{a=a||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(a=window)}e.exports=a},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PixelWrapper=void 0;var i=function(){function e(e,t){for(var a=0;aWhile in the Select Region Layer, use the rectangle tool to select the regions of the page that you will classify.Once you select these regions, select another layer and begin classifying! Keep in mind that classification outside these regions will not be utilized.
You can select the entire page by pressing SHIFT + A.
You can deselect the entire page by pressing ESC. This will destroy all selection regions that you have created.
",t.appendChild(i),e.appendChild(t)}},{key:"createButtons",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Submit To Rodan");this.exportToRodan=function(){e.createBackgroundLayer()},t.setAttribute("id","rodan-export-button"),t.appendChild(a),t.addEventListener("click",this.exportToRodan),document.body.insertBefore(t,document.getElementById("imageLoader"))}},{key:"destroyButtons",value:function(){var e=document.getElementById("rodan-export-button");e.parentNode.removeChild(e)}},{key:"createLayers",value:function(){if(this.pixelInstance.tools.currentTool="rectangle",1===this.layers.length){var e=numberInputLayers;if(0===numberInputLayers)for(;e<=0||e>7;)e=parseInt(prompt("How many layers will you classify?\nThis must be two (2) less than the total number of output ports.",3));this.selectRegionLayer=new o.Layer(-1,new s.Colour(240,232,227,1),"Select Region",this.pixelInstance,.3),this.layers.unshift(this.selectRegionLayer);for(var t=2;t=i);)if(d100?100:Math.round(10*r)/10;return this.pixelInstance.uiManager.updateProgress(o),{needsRecall:!0}}return this.exportInterrupted&&0===this.layersCount?(this.exportInterrupted=!1,this.uiManager.destroyExportElements(),this.layers.unshift(this.selectRegionLayer)):this.exportInterrupted||0===this.layersCount&&(n.drawLayer(0,n.getCanvas()),this.layers.unshift(n),this.uiManager.destroyExportElements(),this.exportLayersToRodan()),{needsRecall:!1}}},{key:"rodanImagesToCanvas",value:function(){var e=this;this.layers.forEach(function(t){var a=document.getElementById("layer"+t.layerId+"-img");if(null!==a){var i=document.createElement("canvas");i.width=t.getCanvas().width,i.height=t.getCanvas().height;var n=i.getContext("2d");n.drawImage(a,0,0);for(var r=n.getImageData(0,0,t.getCanvas().width,t.getCanvas().height),o=r.data,s=0;s=0&&v>=0&&py||x<=y&&f>y)&&g.push({absolutePaddedX:k,absolutePaddedY:y})}if(g.sort(function(e,t){return e.absolutePaddedX-t.absolutePaddedX}),!(g.length<=0))for(var I=0;I=0&&M.x>=0&&M.y<=o.height&&M.x<=o.width){var A=(new n.Point).getPaddedCoordinatesFromAbsolute(t,i,M.x,M.y),S=h.getImageData(A.x,A.y,1,1).data,T=new r.Colour(S[0],S[1],S[2],S[3]);u.fillStyle=T.toHTMLColour(),u.fillRect(M.x,M.y,1,1)}}else"subtract"===this.blendMode&&u.clearRect(M.x,M.y,1,1)}}}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Layer=void 0;var i=function(){function e(e,t){for(var a=0;a0?this.paths[this.paths.length-1]:null}},{key:"createNewPath",value:function(e,t){var a=new n.Path(e,t);this.paths.push(a),this.addAction(new o.Action(a,this))}},{key:"removePathFromLayer",value:function(e){var t=this,a=this.paths.indexOf(e);this.paths.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeShapeFromLayer",value:function(e){var t=this,a=this.shapes.indexOf(e);this.shapes.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeSelectionFromLayer",value:function(e){var t=this,a=this.pastedRegions.indexOf(e);this.pastedRegions.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"setOpacity",value:function(e){this.colour.alpha=e}},{key:"getOpacity",value:function(){return this.colour.alpha}},{key:"getCurrentShape",value:function(){return this.shapes.length>0?this.shapes[this.shapes.length-1]:null}},{key:"isActivated",value:function(){return this.activated}},{key:"setLayerOpacity",value:function(e){this.layerOpacity=e}},{key:"getLayerOpacity",value:function(){return this.layerOpacity}},{key:"getLayerOpacityCSSString",value:function(){return"opacity : "+this.layerOpacity}},{key:"drawLayer",value:function(e,t){this.isActivated()&&this.drawLayerInPageCoords(e,t,this.pageIndex)}},{key:"drawLayerInPageCoords",value:function(e,t,a){var i=this,n=t.getContext("2d");n.clearRect(0,0,t.width,t.height),null!==this.backgroundImageCanvas&&n.drawImage(this.backgroundImageCanvas,0,0),this.actions.forEach(function(n){n.object.drawOnPage(i,a,e,i.pixelInstance.core.getSettings().renderer,t)})}},{key:"setBackgroundImageCanvas",value:function(e){this.backgroundImageCanvas=e}},{key:"addToPastedRegions",value:function(e){this.pastedRegions.push(e),this.addAction(new o.Action(e,this))}},{key:"addAction",value:function(e){this.actions.push(e),"selection"===e.object.type&&"select"===e.object.selectedShape.blendMode||this.pixelInstance.actions.push(e)}},{key:"removeAction",value:function(e){var t=this.actions.indexOf(e);this.actions.splice(t,1);var a=this.pixelInstance.actions.indexOf(e);this.pixelInstance.actions.splice(a,1)}},{key:"displayColourOptions",value:function(){console.log("colour clicked here")}},{key:"displayLayerOptions",value:function(){var e=document.getElementById("layer-"+this.layerId+"-options");e.classList.contains("unchecked-layer-settings")?(e.classList.remove("unchecked-layer-settings"),e.classList.add("checked-layer-settings"),this.pixelInstance.uiManager.createOpacitySlider(this,e.parentElement.parentElement,e.parentElement)):(e.classList.remove("checked-layer-settings"),e.classList.add("unchecked-layer-settings"),this.pixelInstance.uiManager.destroyOpacitySlider(this))}},{key:"activateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-deactivated"),e.classList.add("layer-activated"),this.getCanvas().style.opacity=this.getLayerOpacity(),this.layerId===this.pixelInstance.background.layerId?this.activated=!0:(this.activated=!0,this.pixelInstance.redrawLayer(this))}},{key:"deactivateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-activated"),e.classList.add("layer-deactivated"),this.activated=!1,this.layerId===this.pixelInstance.background.layerId?this.getCanvas().style.opacity=0:this.clearCtx()}},{key:"toggleLayerActivation",value:function(){document.getElementById("layer-"+this.layerId+"-activation").classList.contains("layer-deactivated")?this.activateLayer():this.deactivateLayer()}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a=0&&v>=0&&py||x<=y&&f>y)&&g.push({absolutePaddedX:k,absolutePaddedY:y})}if(g.sort(function(e,t){return e.absolutePaddedX-t.absolutePaddedX}),!(g.length<=0))for(var I=0;I=0&&M.x>=0&&M.y<=o.height&&M.x<=o.width){var A=(new n.Point).getPaddedCoordinatesFromAbsolute(t,i,M.x,M.y),S=h.getImageData(A.x,A.y,1,1).data,T=new r.Colour(S[0],S[1],S[2],S[3]);u.fillStyle=T.toHTMLColour(),u.fillRect(M.x,M.y,1,1)}}else"subtract"===this.blendMode&&u.clearRect(M.x,M.y,1,1)}}}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Layer=void 0;var i=function(){function e(e,t){for(var a=0;a0?this.paths[this.paths.length-1]:null}},{key:"createNewPath",value:function(e,t){var a=new n.Path(e,t);this.paths.push(a),this.addAction(new o.Action(a,this))}},{key:"removePathFromLayer",value:function(e){var t=this,a=this.paths.indexOf(e);this.paths.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeShapeFromLayer",value:function(e){var t=this,a=this.shapes.indexOf(e);this.shapes.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"removeSelectionFromLayer",value:function(e){var t=this,a=this.pastedRegions.indexOf(e);this.pastedRegions.splice(a,1),this.actions.forEach(function(a){a.object===e&&t.removeAction(a)})}},{key:"setOpacity",value:function(e){this.colour.alpha=e}},{key:"getOpacity",value:function(){return this.colour.alpha}},{key:"getCurrentShape",value:function(){return this.shapes.length>0?this.shapes[this.shapes.length-1]:null}},{key:"isActivated",value:function(){return this.activated}},{key:"setLayerOpacity",value:function(e){this.layerOpacity=e}},{key:"getLayerOpacity",value:function(){return this.layerOpacity}},{key:"getLayerOpacityCSSString",value:function(){return"opacity : "+this.layerOpacity}},{key:"drawLayer",value:function(e,t){this.isActivated()&&this.drawLayerInPageCoords(e,t,this.pageIndex)}},{key:"drawLayerInPageCoords",value:function(e,t,a){var i=this,n=t.getContext("2d");n.clearRect(0,0,t.width,t.height),null!==this.backgroundImageCanvas&&n.drawImage(this.backgroundImageCanvas,0,0),this.actions.forEach(function(n){n.object.drawOnPage(i,a,e,i.pixelInstance.core.getSettings().renderer,t)})}},{key:"setBackgroundImageCanvas",value:function(e){this.backgroundImageCanvas=e}},{key:"addToPastedRegions",value:function(e){this.pastedRegions.push(e),this.addAction(new o.Action(e,this))}},{key:"addAction",value:function(e){this.actions.push(e),"selection"===e.object.type&&"select"===e.object.selectedShape.blendMode||this.pixelInstance.actions.push(e)}},{key:"removeAction",value:function(e){var t=this.actions.indexOf(e);this.actions.splice(t,1);var a=this.pixelInstance.actions.indexOf(e);this.pixelInstance.actions.splice(a,1)}},{key:"displayColourOptions",value:function(){console.log("colour clicked here")}},{key:"displayLayerOptions",value:function(){var e=document.getElementById("layer-"+this.layerId+"-options");e.classList.contains("unchecked-layer-settings")?(e.classList.remove("unchecked-layer-settings"),e.classList.add("checked-layer-settings"),this.pixelInstance.uiManager.createOpacitySlider(this,e.parentElement.parentElement,e.parentElement)):(e.classList.remove("checked-layer-settings"),e.classList.add("unchecked-layer-settings"),this.pixelInstance.uiManager.destroyOpacitySlider(this))}},{key:"activateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-deactivated"),e.classList.add("layer-activated"),this.getCanvas().style.opacity=this.getLayerOpacity(),this.layerId===this.pixelInstance.background.layerId?this.activated=!0:(this.activated=!0,this.pixelInstance.redrawLayer(this))}},{key:"deactivateLayer",value:function(){var e=document.getElementById("layer-"+this.layerId+"-activation");e.classList.remove("layer-activated"),e.classList.add("layer-deactivated"),this.activated=!1,this.layerId===this.pixelInstance.background.layerId?this.getCanvas().style.opacity=0:this.clearCtx()}},{key:"toggleLayerActivation",value:function(){document.getElementById("layer-"+this.layerId+"-activation").classList.contains("layer-deactivated")?this.activateLayer():this.deactivateLayer()}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a=i.height);)if(do.height?i.goto(a,e+o.height,t):h.x<0?i.goto(a,e,t):h.x>o.width&&i.goto(a,e,t+o.width);var y=d.getImageData(h.x,h.y,1,1).data,g=new n.Colour(y[0],y[1],y[2],y[3]);c.fillStyle=g.toHTMLColour(),c.fillRect(t,e,1,1),u.fillStyle=g.toHTMLColour(),u.fillRect(t,e,1,1)}},{key:"postProcessImageDataIteration",value:function(e,t,a,i,n){if((e===n.height||this.exportInterrupted)&&(this.exportLayersCount-=1),e100?100:Math.round(10*r)/10;return this.pixelInstance.uiManager.updateProgress(o),{needsRecall:!0}}return this.exportInterrupted&&0===this.exportLayersCount?(this.exportInterrupted=!1,this.uiManager.destroyExportElements()):this.exportInterrupted||(t.toBlob(function(e){var a=document.createTextNode("Download "+t.getAttribute("value")+" image data "),i=document.getElementById(t.getAttribute("value")+"-image-data-download");if(null===i){var n=document.createElement("img"),r=URL.createObjectURL(e);n.src=r,(i=document.createElement("a")).appendChild(a),document.body.appendChild(i)}var o=URL.createObjectURL(e);i.setAttribute("class","export-download"),i.setAttribute("id",t.getAttribute("value")+"-image-data-download"),i.setAttribute("href",o),i.setAttribute("download",t.getAttribute("value")+" image data")}),0===this.exportLayersCount&&this.uiManager.destroyExportElements()),{needsRecall:!1}}},{key:"fillMatrix",value:function(e,t,a,i){var n=this,r=a.width,o=3,s=i.getContext("2d"),l=a.getContext("2d").getImageData(0,0,a.width,a.height).data;!function i(){var c=r;for(0;c--&&!(o>l.length);){if(0!==l[o]){var d=Math.floor(o/4),u=parseInt(d/a.height),h=parseInt(d%a.width);t[u][h]=e.layerId,s.fillStyle=e.colour.toHTMLColour(),s.fillRect(h,u,1,1)}o+=4}if(o>=l.length||n.exportInterrupted)n.exportLayersCount-=1;else{var y=o/l.length*100,g=y>100?100:Math.round(10*y)/10;n.pixelInstance.uiManager.updateProgress(g),setTimeout(i,1)}0===n.exportLayersCount&&(n.uiManager.destroyExportElements(),n.exportInterrupted?n.exportInterrupted=!1:n.transformMatrixToCSV())}()}},{key:"initializeMatrix",value:function(){var e=this.pixelInstance.core,t=e.publicInstance.getPageDimensionsAtZoomLevel(this.pageIndex,this.zoomLevel).height,a=e.publicInstance.getPageDimensionsAtZoomLevel(this.pageIndex,this.zoomLevel).width;this.matrix=new Array(t).fill(null).map(function(){return new Array(a).fill(0)})}},{key:"transformMatrixToCSV",value:function(){for(var e="",t=0;t=0;a--){var i=e[a];i.placeCanvasAfterElement(t),i.isActivated()?i.getCanvas().style.opacity=i.getLayerOpacity():i.getCanvas().style.opacity=0}this.pixelInstance.background.isActivated()?this.pixelInstance.background.getCanvas().style.opacity=this.pixelInstance.background.getLayerOpacity():this.pixelInstance.background.getCanvas().style.opacity=0}},{key:"destroyPixelCanvases",value:function(e){e.forEach(function(e){null!==e.getCanvas().parentNode&&e.getCanvas().parentNode.removeChild(e.getCanvas())})}},{key:"createOpacitySlider",value:function(e,t,a){var i=document.createElement("br"),n=document.createElement("div"),r=document.createElement("p"),o=document.createElement("input"),s=document.createTextNode("Opacity");i.setAttribute("id","opacity-br-"+e.layerId),n.setAttribute("class","layer-tool"),n.setAttribute("id","layer-"+e.layerId+"-opacity-tool"),r.setAttribute("class","layer-tool-text"),r.setAttribute("id","layer-"+e.layerId+"-opacity-text"),o.setAttribute("class","layer-tool-slider"),o.setAttribute("id","layer-"+e.layerId+"-opacity-slider"),o.setAttribute("type","range"),o.setAttribute("max",50),o.setAttribute("min",0),o.setAttribute("value",50*e.getLayerOpacity()),o.setAttribute("draggable","false"),o.addEventListener("input",function(){e.setLayerOpacity(o.value/50),e.isActivated()&&(e.getCanvas().style.opacity=e.getLayerOpacity())}),r.appendChild(s),n.appendChild(r),n.appendChild(o),t.insertBefore(n,a.nextSibling),t.insertBefore(i,a.nextSibling)}},{key:"destroyOpacitySlider",value:function(e){var t=document.getElementById("layer-"+e.layerId+"-opacity-tool"),a=document.getElementById("opacity-br-"+e.layerId);t.parentElement.removeChild(t),a.parentElement.removeChild(a)}},{key:"createBackground",value:function(){var e=document.createElement("div");e.setAttribute("id","background-view"),e.setAttribute("class","background-view");var t=this.pixelInstance.background,a=document.createElement("div"),i=document.createElement("div"),n=document.createElement("input"),r=document.createElement("div"),o=document.createElement("div");a.setAttribute("draggable","false"),a.setAttribute("class","layer-div"),a.setAttribute("value",t.layerId),a.setAttribute("id","layer-"+t.layerId+"-selector"),n.setAttribute("type","text"),n.setAttribute("readonly","true"),n.setAttribute("value",t.layerName),i.setAttribute("class","color-box"),i.setAttribute("style","background-color: "+t.colour.toHexString()+";"),r.setAttribute("class","unchecked-layer-settings"),r.setAttribute("id","layer-"+t.layerId+"-options"),this.pixelInstance.background.isActivated()?(o.setAttribute("class","layer-activated"),this.pixelInstance.background.getCanvas().style.opacity=1):(o.setAttribute("class","layer-deactivated"),this.pixelInstance.background.getCanvas().style.opacity=0),o.setAttribute("id","layer-"+t.layerId+"-activation"),i.addEventListener("click",function(){t.displayColourOptions()}),o.addEventListener("click",function(){t.toggleLayerActivation()}),r.onclick=function(){t.displayLayerOptions()},a.appendChild(n),a.appendChild(r),a.appendChild(i),a.appendChild(o),e.appendChild(a),document.body.appendChild(e)}},{key:"destroyLockedLayerSelectors",value:function(){var e=document.getElementById("background-view");e.parentNode.removeChild(e)}},{key:"createLayersView",value:function(e){var t=this,a=void 0,i=void 0,n=!1,r=document.createElement("div");r.setAttribute("id","layers-view"),r.setAttribute("class","layers-view");for(var o=function(){var o=e[s],l=document.createElement("div"),c=document.createElement("br"),d=document.createElement("div"),u=document.createElement("input"),h=document.createElement("div"),y=document.createElement("div");l.setAttribute("index",s),l.setAttribute("draggable","true"),l.setAttribute("class","layer-div"),l.setAttribute("value",o.layerId),l.setAttribute("id","layer-"+o.layerId+"-selector"),l.setAttribute("title","Hotkey: "+o.layerId),u.setAttribute("type","text"),u.setAttribute("readonly","true"),u.setAttribute("value",o.layerName),u.setAttribute("ondblclick","this.readOnly='';"),u.addEventListener("dblclick",function(e){t.pixelInstance.editLayerName(e,u,l,!1,n,o),u.onblur=function(e){t.pixelInstance.editLayerName(e,u,l,!0,n,o)}}),d.setAttribute("class","color-box"),d.setAttribute("style","background-color: "+o.colour.toHexString()+";"),h.setAttribute("class","unchecked-layer-settings"),h.setAttribute("id","layer-"+o.layerId+"-options"),o.isActivated()?y.setAttribute("class","layer-activated"):y.setAttribute("class","layer-deactivated"),y.setAttribute("id","layer-"+o.layerId+"-activation"),o.layerId===t.pixelInstance.layers[t.pixelInstance.selectedLayerIndex].layerId&&l.classList.add("selected-layer"),function(e,r,o,s,l,c){r.addEventListener("click",function(){e.displayColourOptions()}),o.addEventListener("click",function(){e.toggleLayerActivation()}),s.addEventListener("keypress",function(a){t.pixelInstance.editLayerName(a,s,c,!1,n,e)}),l.onclick=function(){e.displayLayerOptions()},c.ondrag=function(e){t.pixelInstance.dragging(e),n=!0},c.ondragstart=function(e){t.pixelInstance.dragStart(e)},c.ondrop=function(e){t.pixelInstance.drop(e,a,i),n=!1},c.onmousedown=function(){a=c.getAttribute("index"),t.highlightLayerSelectorById(e.layerId)},c.ondragover=function(e){t.pixelInstance.allowDrop(e),i=c.getAttribute("index")}}(o,d,y,u,h,l),l.appendChild(u),l.appendChild(h),l.appendChild(d),l.appendChild(y),r.appendChild(l),r.appendChild(c)},s=e.length-1;s>=0;s--)o();document.body.appendChild(r),this.createBackground(e)}},{key:"destroyLayerSelectors",value:function(){var e=document.getElementById("layers-view");e.parentNode.removeChild(e)}},{key:"highlightLayerSelectorById",value:function(e){var t=this,a=!1;if(this.pixelInstance.layers.forEach(function(t){t.layerId===e&&(a=!0)}),!a)throw new r.CannotSelectLayerException("The layer you are trying to select does not exist.");this.pixelInstance.layers.forEach(function(a){if(a.layerId===e){var i=document.getElementById("layer-"+a.layerId+"-selector");i.hasAttribute("selected-layer")||i.classList.add("selected-layer"),t.pixelInstance.changeCurrentlySelectedLayerIndex(t.pixelInstance.layers.indexOf(a))}else{var n=document.getElementById("layer-"+a.layerId+"-selector");n.classList.contains("selected-layer")&&n.classList.remove("selected-layer")}})}},{key:"createBrushSizeSelector",value:function(){var e=this,t=document.createElement("div");t.setAttribute("class","tool-settings"),t.setAttribute("id","brush-size");var a=document.createTextNode("Brush size:"),i=document.createElement("input");i.setAttribute("id","brush-size-selector"),i.setAttribute("type","range"),i.setAttribute("max",40),i.setAttribute("min",1),i.setAttribute("value",25),i.addEventListener("input",function(){e.createBrushCursor()}),t.appendChild(a),t.appendChild(i),document.body.appendChild(t)}},{key:"destroyBrushSizeSelector",value:function(){var e=document.getElementById("brush-size");null!==e&&e.parentNode.removeChild(e)}},{key:"createUndoButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Undo");this.undo=function(){e.pixelInstance.undoAction()},t.setAttribute("id","undo-button"),t.appendChild(a),t.addEventListener("click",this.undo),document.body.appendChild(t)}},{key:"destroyUndoButton",value:function(){var e=document.getElementById("undo-button");e.parentNode.removeChild(e)}},{key:"createRedoButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Redo");this.redo=function(){e.pixelInstance.redoAction()},t.setAttribute("id","redo-button"),t.appendChild(a),t.addEventListener("click",this.redo),document.body.appendChild(t)}},{key:"destroyRedoButton",value:function(){var e=document.getElementById("redo-button");e.parentNode.removeChild(e)}},{key:"createDeleteLayerButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Delete selected layer");this.deleteLayer=function(){try{e.pixelInstance.deleteLayer()}catch(e){e instanceof r.CannotDeleteLayerException&&alert(e.message)}},t.setAttribute("id","delete-layer-button"),t.appendChild(a),t.addEventListener("click",this.deleteLayer),document.body.appendChild(t)}},{key:"destroyDeleteLayerButton",value:function(){var e=document.getElementById("delete-layer-button");e.parentNode.removeChild(e)}},{key:"createCreateLayerButton",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Create new layer");this.createLayer=function(){e.pixelInstance.createLayer()},t.setAttribute("id","create-layer-button"),t.appendChild(a),t.addEventListener("click",this.createLayer),document.body.appendChild(t)}},{key:"destroyCreateLayerButton",value:function(){var e=document.getElementById("create-layer-button");e.parentNode.removeChild(e)}},{key:"createExportButtons",value:function(){var e=this,t=document.createElement("button"),a=document.createTextNode("Export as CSV"),i=document.createElement("button"),n=document.createTextNode("Export as PNG"),r=document.createElement("button"),o=document.createTextNode("Export as image Data PNG");this.exportCSV=function(){e.pixelInstance.exportAsCSV()},this.exportPNG=function(){e.pixelInstance.exportAsPNG()},this.exportPNGData=function(){e.pixelInstance.exportAsImageData()},t.setAttribute("id","csv-export-button"),t.appendChild(a),t.addEventListener("click",this.exportCSV),i.setAttribute("id","png-export-button"),i.appendChild(n),i.addEventListener("click",this.exportPNG),r.setAttribute("id","png-export-data-button"),r.appendChild(o),r.addEventListener("click",this.exportPNGData),document.body.appendChild(t),document.body.appendChild(i),document.body.appendChild(r)}},{key:"destroyExportButtons",value:function(){var e=document.getElementById("csv-export-button"),t=document.getElementById("png-export-button"),a=document.getElementById("png-export-data-button");e.parentNode.removeChild(e),t.parentNode.removeChild(t),a.parentNode.removeChild(a)}},{key:"createImportButtons",value:function(){var e=this,t=document.createElement("input");t.setAttribute("type","file"),t.setAttribute("id","imageLoader"),t.setAttribute("name","imageLoader"),this.import=function(t){e.pixelInstance.importPNGToLayer(t)},t.addEventListener("change",this.import,!1),document.body.appendChild(t)}},{key:"destroyImportButtons",value:function(){var e=document.getElementById("imageLoader");e.parentNode.removeChild(e)}},{key:"updateProgress",value:function(e){var t=e+"%",a="width: "+t;document.getElementById("pbar-inner-div").setAttribute("style",a),document.getElementById("pbar-inner-text").innerHTML=t}},{key:"destroyBackground",value:function(e){this.pixelInstance.destroyLockedLayerSelectors(e)}},{key:"createExportElements",value:function(e){var t=document.createElement("div"),a=document.createTextNode("Exporting"),i=document.createTextNode("0%"),n=document.createElement("div"),r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),l=document.createElement("div"),c=document.createTextNode("Cancel");return t.setAttribute("class","export-div"),t.setAttribute("id","pixel-export-div"),n.setAttribute("class","pbar-outer-div"),n.setAttribute("id","pbar-outer-div"),r.setAttribute("class","pbar-inner-div"),r.setAttribute("id","pbar-inner-div"),o.setAttribute("class","pbar-inner-text"),o.setAttribute("id","pbar-inner-text"),s.setAttribute("class","pbar-export-text"),s.setAttribute("id","pbar-export-text"),l.setAttribute("class","cancel-export-div"),l.setAttribute("id","cancel-export-div"),l.addEventListener("click",function(){l.setAttribute("style","background-color: #AAAAAA;"),e.exportInterrupted=!0}),s.appendChild(a),l.appendChild(c),o.appendChild(i),n.appendChild(r),n.appendChild(o),n.appendChild(s),n.appendChild(l),t.appendChild(n),document.body.appendChild(t),{progressCanvas:this.createProgressCanvas(e.pageIndex,e.zoomLevel)}}},{key:"destroyExportElements",value:function(){var e=document.getElementById("pixel-export-div");e.parentNode.removeChild(e)}},{key:"destroyDownloadLinks",value:function(){for(var e=document.getElementsByClassName("export-download");e[0];)e[0].parentNode.removeChild(e[0])}},{key:"createProgressCanvas",value:function(e,t){var a=this.pixelInstance.core.publicInstance.getPageDimensionsAtZoomLevel(e,t).height,i=this.pixelInstance.core.publicInstance.getPageDimensionsAtZoomLevel(e,t).width,n=document.createElement("canvas");n.setAttribute("id","progress-canvas"),n.style.opacity=.3,n.width=i,n.height=a,n.globalAlpha=1;var r=window,o=document,s=o.documentElement,l=o.getElementsByTagName("body")[0],c=r.innerHeight||s.clientHeight||l.clientHeight;return n.style.height=c+"px",document.getElementById("pixel-export-div").appendChild(n),n}},{key:"markToolSelected",value:function(e){document.getElementById(e).checked=!0}},{key:"getBrushSizeSelectorValue",value:function(){var e=document.getElementById("brush-size-selector"),t=e.value/e.max*10;return.05+Math.exp(t-6)}},{key:"createBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div"),t=document.getElementById("diva-1-viewport"),a=document.getElementById("diva-1-outer");null===e&&((e=document.createElement("div")).setAttribute("id","brush-cursor-div"),a.insertBefore(e,t)),e.setAttribute("oncontextmenu","return false"),this.resizeBrushCursor()}},{key:"resizeBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div");if(null!==e){var t=Math.pow(2,this.pixelInstance.core.getSettings().zoomLevel),a=this.getBrushSizeSelectorValue()*t;e.style.width=a+"px",e.style.height=a+"px"}}},{key:"destroyBrushCursor",value:function(){var e=document.getElementById("brush-cursor-div");null!==e&&e.parentNode.removeChild(e)}},{key:"moveBrushCursor",value:function(e){var t=document.getElementById("brush-cursor-div"),a=Math.pow(2,this.pixelInstance.core.getSettings().zoomLevel),i=this.getBrushSizeSelectorValue()*a;t.style.left=e.x-i/2-1+"px",t.style.top=e.y-i/2-1+"px"}},{key:"restoreDefaultCursor",value:function(){document.getElementById("diva-1-outer").style.cursor="default"}},{key:"setMousePosition",value:function(e){this.mouse.x=e.x-1,this.mouse.y=e.y-1}},{key:"createRectanglePreview",value:function(e,t){this.setMousePosition(e);var a=document.getElementById("diva-1-viewport"),i=document.getElementById("diva-1-outer");this.mouse.startX=this.mouse.x,this.mouse.startY=this.mouse.y;var n=document.createElement("div");n.className="rectangle",n.id="preview-rectangle",n.style.left=this.mouse.x+"px",n.style.top=this.mouse.y+"px",n.style.border="1px solid "+t.colour.toHexString(),i.insertBefore(n,a)}},{key:"resizeRectanglePreview",value:function(e,t){this.setMousePosition(e);var a=document.getElementById("preview-rectangle");null!==a&&(a.style.border="1px solid "+t.colour.toHexString(),a.style.width=Math.abs(this.mouse.x-this.mouse.startX)+"px",a.style.height=Math.abs(this.mouse.y-this.mouse.startY)+"px",a.style.left=this.mouse.x-this.mouse.startX<0?this.mouse.x+"px":this.mouse.startX+"px",a.style.top=this.mouse.y-this.mouse.startY<0?this.mouse.y+"px":this.mouse.startY+"px")}},{key:"removeRectanglePreview",value:function(){var e=document.getElementById("preview-rectangle");null!==e&&e.parentNode.removeChild(e)}},{key:"isInPageBounds",value:function(e,t){var a=this.pixelInstance.core.getSettings().currentPageIndex,i=this.pixelInstance.core.getSettings().zoomLevel,r=this.pixelInstance.core.getSettings().renderer,o=this.pixelInstance.core.publicInstance.getCurrentPageDimensionsAtCurrentZoomLevel(),s=(new n.Point).getCoordsInViewport(i,a,r),l=o.width+s.x,c=o.height+s.y,d=(new n.Point).getRelativeCoordinatesFromPadded(a,r,l,c,i);return!(e<0||t<0||e>d.x||t>d.y)}},{key:"tutorial",value:function(){var e=document.createElement("div");e.setAttribute("id","tutorial-div");var t=document.createElement("div");t.setAttribute("id","tutorial-overlay");var a=document.createElement("div");a.setAttribute("id","myModal"),a.setAttribute("class","modal");var i=document.createElement("div");i.setAttribute("class","modal-content");var n=document.createElement("div");n.setAttribute("class","modal-header");var r=document.createTextNode("Hello, World"),o=document.createElement("h2");o.appendChild(r);var s=document.createElement("span");s.setAttribute("class","close"),s.innerHTML="×";var l=document.createElement("div");l.setAttribute("class","modal-body");var c=document.createElement("p");c.innerHTML="The following is a glossary of the hotkeys you will find useful when using Pixel.js";var d=document.createElement("ul");d.setAttribute("style","list-style-type:none;");var u=document.createElement("li");u.innerHTML="1 ... 9 layer select";var h=document.createElement("li");h.innerHTML="b brush tool";var y=document.createElement("li");y.innerHTML="r rectangle tool";var g=document.createElement("li");g.innerHTML="g grab tool";var p=document.createElement("li");p.innerHTML="e eraser tool";var v=document.createElement("li");v.innerHTML="Shift force tools to paint in an exact way.";var m=document.createElement("li");m.innerHTML="cmd + z undo";var f=document.createElement("li");f.innerHTML="cmd + Shift + z redo";var b=document.createElement("div");b.setAttribute("class","modal-footer");var x=document.createElement("h2");x.innerHTML="Got It!",d.appendChild(u),d.appendChild(h),d.appendChild(y),d.appendChild(g),d.appendChild(p),d.appendChild(v),d.appendChild(m),d.appendChild(f),a.appendChild(i),i.appendChild(n),i.appendChild(l),i.appendChild(b),n.appendChild(o),n.appendChild(s),l.appendChild(c),l.appendChild(d),b.appendChild(x),e.appendChild(t),e.appendChild(a),document.body.appendChild(e),a.style.display="block",b.addEventListener("click",function(){e.parentNode.removeChild(e)})}}]),e}()},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;a A collection of keyboard shortcuts have been implemented. Each layer can be selected by its number (from 1 to 9). Hover over the layers to receive a prompt.",n.src="https://media.giphy.com/media/rBiuWy5YUsIow/giphy.gif";break;case 2:i.innerHTML="You can upload images to the currently selected layer. The image will be converted to the specified layer's colour.
In this example, we have uploaded the output images of a classification method in order to correct it.",n.src="https://media.giphy.com/media/Qy4u6oHru8OpG/giphy.gif";break;case 3:i.innerHTML="Double click on the layer's name to rename it.",n.src="https://media.giphy.com/media/LRxzQa1ogqKAw/giphy.gif";break;case 4:i.innerHTML="Use zoom along with the grab tool g to navigate a page.",n.src="https://media.giphy.com/media/hcLjZ9dFHOKDm/giphy.gif";break;case 5:i.innerHTML="Use the select tool s to copy Ctrl + c or cut Ctrl + x and paste Ctrl + v rectangular regions of pixels from one layer to another.",n.src="https://media.giphy.com/media/ruMD98axGjdyE/giphy.gif";break;case 6:i.innerHTML="Right-click and drag right and left on the erase e and brush b tools to change the brush size.",n.src="https://media.giphy.com/media/NhvALG9MhGYta/giphy.gif";break;case 7:i.innerHTML="Press Shift and drag on the erase e and brush b tools to draw straight lines.",n.src="https://media.giphy.com/media/t74TeR1gd9aaA/giphy.gif";break;case 8:i.innerHTML="Right-click and drag on rectangle tool r to erase rectangular regions, left-click to draw rectangle. Press Shift to draw squares.",n.src="https://media.giphy.com/media/i497rUNYB8t32/giphy.gif";break;case 9:i.innerHTML="Use the Fullscreen mode f and the browser zoom to get more precision, when needed.
To exit Fullscreen mode, press on f again.",n.src="https://media.giphy.com/media/FkzOAenUJxfGg/giphy.gif";break;case 10:i.innerHTML="You can bring a layer forward/backward by clicking and dragging them to their desired position.",n.src="https://media.giphy.com/media/DImPhyGZ3OltC/giphy.gif";break;case 11:i.innerHTML="You can undo Ctrl + z and redo Ctrl + Shift + z an action.",n.src="https://media.giphy.com/media/24kHpWLzbHFrq/giphy.gif";break;case 12:i.innerHTML="You can delete a layer by selecting it and then using Ctrl + del.",n.src="https://media.giphy.com/media/cmQesBkeEvdmM/giphy.gif";break;case 13:i.innerHTML="You can mute (press m to toggle on/off) or hide (hold h to turn off, release to turn on) layers.",n.src="https://media.giphy.com/media/BhVXr7ONVdStq/giphy.gif";break;case 14:i.innerHTML="Change the opacity of a layer by displaying the layer options.",n.src="https://media.giphy.com/media/94EtnDoG2yNAQ/giphy.gif";break;case 15:i.innerHTML='Export layers as PNGs to save a specific layer as an image. See the wiki for details on the different export buttons and more information.',n.src="https://media.giphy.com/media/kBAau6Gebio7e/giphy.gif"}return a.appendChild(n),a.appendChild(i),0!==this.currentTutorialPageIndex&&a.appendChild(o),15!==this.currentTutorialPageIndex&&a.appendChild(r),a.appendChild(s),a}},{key:"getTutorialPage",value:function(e){var t=document.getElementById("modal-body");t.parentElement.removeChild(t),this.modalContent.insertBefore(this.getModalBody(e),document.getElementById("modal-footer"))}}]),e}()}]);
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
index bea709a..a670e6f 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -36,7 +36,7 @@ module.exports = [{
plugins: (process.env.NODE_ENV === "production") ? productionPlugins() : developmentPlugins()
}, {
entry: {
- 'pixel': './source/js/plugins/pixel.js/source/pixel.js',
+ 'pixel': './source/js/plugins/Pixel.js/source/pixel.js',
'download': './source/js/plugins/download.js',
'manipulation': './source/js/plugins/manipulation.js'
},
diff --git a/wrapper.py b/wrapper.py
index d9ec7e9..bb7319d 100644
--- a/wrapper.py
+++ b/wrapper.py
@@ -4,33 +4,25 @@
from rodan.jobs.base import RodanTask
from django.conf import settings
import json
-import numpy as np
-import cv2 as cv
-import zipfile
-import logging
-logger = logging.getLogger('rodan')
-
def media_file_path_to_public_url(media_file_path):
chars_to_remove = len(MEDIA_ROOT)
return os.path.join(MEDIA_URL, media_file_path[chars_to_remove:])
-
-def get_iiif_query(resource_path):
- resource_path = resource_path.split('/')
- resource_path.remove('')
- resource_path.remove('rodan')
- resource_path.remove('data')
- del resource_path[-1] # last element is the original uncoverted file
- resource_path.append('diva')
- resource_path.append('image.jp2')
- resource_path = '%2F'.join(resource_path)
-
- server_url = settings.IIPSRV_URL
- query = server_url + '?IIIF=' + resource_path
-
- return query
-
+def get_iiif_query (resource_path):
+ resource_path = resource_path.split('/')
+ resource_path.remove('')
+ resource_path.remove('rodan')
+ resource_path.remove('data')
+ del resource_path[-1] # last element is the original uncoverted file
+ resource_path.append('diva')
+ resource_path.append('image.jp2')
+ resource_path = '%2F'.join(resource_path)
+
+ server_url = settings.IIPSRV_URL
+ query = server_url + '?IIIF=' + resource_path
+
+ return query
def get_image_dimensions(resource_path):
"""
@@ -45,25 +37,24 @@ def get_image_dimensions(resource_path):
data = json.load(open(resource_path))
return [data['dims']['max_h'][-1], data['dims']['max_w'][-1]]
-
def get_images(resource_path):
- query_url = get_iiif_query(resource_path)
+ query_url = get_iiif_query (resource_path)
height, width = get_image_dimensions(resource_path)
return [
- {
- "@type": "oa:Annotation",
- "motivation": "sc:painting",
- "resource": {
- "@id": query_url,
- "@type": "dctypes:Image",
- "format": "image/jpeg",
- "height":height,
- "width":width,
- "service": {
- "@context": "http://iiif.io/api/image/2/context.json", "@id": query_url, "profile": "http://iiif.io/api/image/2/level2.json"
- }
- },
- "on": "https://images.simssa.ca/iiif/manuscripts/cdn-hsmu-m2149l4/canvas/folio-001r.json"
+ {
+ "@type":"oa:Annotation",
+ "motivation":"sc:painting",
+ "resource": {
+ "@id": query_url,
+ "@type":"dctypes:Image",
+ "format":"image/jpeg",
+ "height":height,
+ "width":width,
+ "service": {
+ "@context": "http://iiif.io/api/image/2/context.json", "@id": query_url, "profile": "http://iiif.io/api/image/2/level2.json"
+ }
+ },
+ "on":"https://images.simssa.ca/iiif/manuscripts/cdn-hsmu-m2149l4/canvas/folio-001r.json"
}
]
@@ -79,21 +70,18 @@ def create_canvases(resource_path):
data['images'] = get_images(resource_path)
return [data]
-
def create_sequences(resource_path):
data = {}
data['@type'] = 'sc:Sequence'
data['canvases'] = create_canvases(resource_path)
return [data]
-
def create_metadata(resource_path):
- return [
- {"label": "Date", "value": "1554-5"},
- {"label": "Siglum", "value": "CDN-Hsmu M2149.L4"},
- {"label": "Provenance", "value": "Salzinnes"}
- ]
-
+ return [
+ {"label": "Date", "value": "1554-5"},
+ {"label": "Siglum", "value": "CDN-Hsmu M2149.L4"},
+ {"label": "Provenance", "value": "Salzinnes"}
+ ]
def create_json(resource_path):
data = {}
@@ -111,87 +99,133 @@ class PixelInteractive(RodanTask):
name = 'Pixel_js'
author = 'Zeyad Saleh, Ke Zhang & Andrew Hankinson'
description = 'Pixel-level ground truth creation and correction'
- settings = {
- 'title': 'Options',
- 'type': 'object',
- 'properties': {
- 'Output Mask': {
- 'type': 'boolean',
- 'default': False
- }
- },
- 'job_queue': 'Python2',
- }
+ settings = {}
enabled = True
category = 'Diva - Pixel.js'
interactive = True
input_port_types = [
- {
- 'name': 'Image',
- 'resource_types': lambda mime: mime.startswith('image/'),
- 'minimum': 1,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 1 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 2 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 3 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 4 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 5 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 6 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- {
- 'name': 'PNG - Layer 7 Input',
- 'resource_types': ['image/rgba+png'],
- 'minimum': 0,
- 'maximum': 1,
- 'is_list': False
- },
- ]
+ {
+ 'name': 'Image',
+ 'resource_types': lambda mime: mime.startswith('image/'),
+ 'minimum': 1,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 1 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 2 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 3 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 4 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 5 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 6 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'PNG - Layer 7 Input',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ ]
output_port_types = [
# {'name': 'Text output', 'minimum': 1, 'maximum': 1, 'resource_types': ['text/plain']},
{
- 'name': 'ZIP',
- 'resource_types': ['application/zip'],
+ 'name': 'rgba PNG - Layer 0 Output',
+ 'resource_types': ['image/rgba+png'],
'minimum': 1,
'maximum': 1,
'is_list': False
- }
+ },
+ {
+ 'name': 'rgba PNG - Layer 1 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 2 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 3 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 4 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 5 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 6 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 7 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
+ {
+ 'name': 'rgba PNG - Layer 8 Output',
+ 'resource_types': ['image/rgba+png'],
+ 'minimum': 0,
+ 'maximum': 1,
+ 'is_list': False
+ },
]
def get_my_interface(self, inputs, settings):
@@ -207,74 +241,37 @@ def get_my_interface(self, inputs, settings):
# Create data to pass.
data = {
- 'json': create_json(inputs['Image'][0]['resource_path']),
- 'layer_urls': layer_urls,
- }
+ 'json': create_json(inputs['Image'][0]['resource_path']),
+ 'layer_urls': layer_urls,
+ }
return ('index.html', data)
def run_my_task(self, inputs, settings, outputs):
if '@done' not in settings:
- return self.WAITING_FOR_INPUT()
+ return self.WAITING_FOR_INPUT()
- # list = settings['@user_input'] # List passed having the image data (base 64) from all layer
- background = cv.imread(inputs['Image'][0]['resource_path'], cv.IMREAD_COLOR)
- output_list=settings['@user_input'] # List passed having the image data (base 64) from all layer
- # Output path
- outfile_path = outputs["ZIP"][0]['resource_path'] + ".zip"
+ list=settings['@user_input'] # List passed having the image data (base 64) from all layer
- with zipfile.ZipFile(outfile_path, 'w') as zipMe:
- for i in range(0, len(output_list) + 1):
- # change to bytes
- if i != len(output_list):
- data = output_list[i].split(',')[1] # Remove header from the base 64 string
+ for i in range(0, len(list)):
+ port = "rgba PNG - Layer %d Output" % (i)
+ if port in outputs:
+ outfile_path = outputs[port][0]['resource_path']
+ data = list[i].split(',')[1] # Remove header from the base 64 string
missing_padding = len(data) % 4
-
+
if missing_padding != 0:
data += '=' * (4 - missing_padding % 4)
binary_data = a2b_base64(data) # Parse base 64 image data
- array = np.fromstring(binary_data, np.uint8)
-
- if settings['Output Mask']:
- tmp = cv.imdecode(array, cv.IMREAD_UNCHANGED)
- retval, buf = cv.imencode('.png', tmp)
- if i == len(output_list):
- retval, buf = cv.imencode('.png', background)
- zipMe.writestr(('Image.png'), buf)
- elif i == 0:
- zipMe.writestr(('rgba PNG - Layer 0 (Background).png'), buf)
- elif i == len(output_list) - 1:
- zipMe.writestr(('rgba PNG - Selected regions.png'), buf)
- else:
- zipMe.writestr(('rgba PNG - Layer {0}.png').format(i), buf)
- # cv.imwrite(outfile_path + ".png", tmp)
- else:
- # Create mask for alpha channel
- layer_image = cv.imdecode(array, cv.IMREAD_GRAYSCALE)
- _, alpha = cv.threshold(layer_image, 1, 255, cv.THRESH_BINARY)
-
- # Set background to black (reduce size) and then make transparent
- result = cv.bitwise_and(background, background, mask=alpha)
- b, g, r = cv.split(result)
- result = cv.merge([b, g, r, alpha], 4)
- retval, buf = cv.imencode('.png', result)
- if i == len(output_list):
- retval, buf = cv.imencode('.png', background)
- zipMe.writestr(('Image.png'), buf)
- elif i == 0:
- zipMe.writestr(('rgba PNG - Layer 0 (Background).png'), buf)
- elif i == len(output_list) - 1:
- zipMe.writestr(('rgba PNG - Selected regions.png'), buf)
- else:
- zipMe.writestr(('rgba PNG - Layer {0}.png').format(i), buf)
- # cv.imwrite(outfile_path + ".png", result) # cv2 needs extension
-
- # add the files to the zip file
- os.rename(outfile_path,outputs["ZIP"][0]['resource_path'])
+ outfile = open(outfile_path + '.png', "wb")
+ outfile.write(binary_data)
+ outfile.close()
+ os.rename(outputs[port][0]['resource_path']+'.png',outputs[port][0]['resource_path'])
return True
def validate_my_user_input(self, inputs, settings, user_input):
return { '@done': True, '@user_input': user_input['user_input'] }
def my_error_information(self, exc, traceback):
- pass
+ pass
+