From f8bfc27baec542c00b7c425dd5f98c32886fc6e6 Mon Sep 17 00:00:00 2001 From: askilondz Date: Fri, 1 Jun 2018 09:47:30 -0500 Subject: [PATCH 1/2] Updated to be compatible with epubsjs 0.3+. Using es6 importing of the library but still need to include the .min.js in the index. --- .sourcemaps/main.js.map | 2 +- package-lock.json | 170 +- package.json | 14 +- src/assets/epubjs/build/epub.js | 9216 ----------------- src/assets/epubjs/build/epub.js.map | 103 - src/assets/epubjs/build/epub.min.js | 8 - src/assets/epubjs/build/hooks.js | 323 - src/assets/epubjs/build/hooks.js.map | 19 - src/assets/epubjs/build/hooks.min.js | 1 - src/assets/epubjs/build/hooks.min.map | 1 - .../epubjs/build/libs/localforage.min.js | 7 - .../epubjs/build/libs/localforage.min.map | 1 - src/assets/epubjs/build/libs/zip.min.js | 14 - src/assets/epubjs/build/libs/zip.min.map | 1 - src/assets/epubjs/build/reader.js | 1146 -- src/assets/epubjs/build/reader.js.map | 29 - src/assets/epubjs/build/reader.min.js | 1 - src/assets/epubjs/build/reader.min.map | 1 - src/assets/epubjs/epub.min.js | 1 + src/index.html | 5 +- src/pages/book/book.html | 4 +- src/pages/book/book.ts | 103 +- src/typings.d.ts | 1 + 23 files changed, 181 insertions(+), 10990 deletions(-) delete mode 100644 src/assets/epubjs/build/epub.js delete mode 100644 src/assets/epubjs/build/epub.js.map delete mode 100644 src/assets/epubjs/build/epub.min.js delete mode 100644 src/assets/epubjs/build/hooks.js delete mode 100644 src/assets/epubjs/build/hooks.js.map delete mode 100644 src/assets/epubjs/build/hooks.min.js delete mode 100644 src/assets/epubjs/build/hooks.min.map delete mode 100644 src/assets/epubjs/build/libs/localforage.min.js delete mode 100644 src/assets/epubjs/build/libs/localforage.min.map delete mode 100644 src/assets/epubjs/build/libs/zip.min.js delete mode 100644 src/assets/epubjs/build/libs/zip.min.map delete mode 100644 src/assets/epubjs/build/reader.js delete mode 100644 src/assets/epubjs/build/reader.js.map delete mode 100644 src/assets/epubjs/build/reader.min.js delete mode 100644 src/assets/epubjs/build/reader.min.map create mode 100644 src/assets/epubjs/epub.min.js create mode 100644 src/typings.d.ts diff --git a/.sourcemaps/main.js.map b/.sourcemaps/main.js.map index 1dcef34..0366738 100644 --- a/.sourcemaps/main.js.map +++ b/.sourcemaps/main.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/@angular/core/esm5 lazy","../../src lazy","../../src/pages/home/home.ts","../../src/pages/book/book.ts","../../src/pages/toc/toc.ts","../../src/pages/settings/settings.ts","../../src/app/main.ts","../../src/app/app.module.ts","../../src/app/app.component.ts"],"names":[],"mappings":"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","file":"main.js","sourcesContent":["function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 109;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@angular/core/esm5 lazy\n// module id = 109\n// module chunks = 0","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 150;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src lazy\n// module id = 150\n// module chunks = 0","import { BookPage } from './../book/book';\nimport { Component } from '@angular/core';\nimport { NavController, NavParams } from 'ionic-angular';\n\nexport class Book {\n label: string;\n file: string;\n}\n\n@Component({\n selector: 'page-home',\n templateUrl: 'home.html',\n})\nexport class HomePage {\n\n books: {}[];\n\n constructor(public navCtrl: NavController, public navParams: NavParams) {\n this.books = [];\n\n let book1 = new Book();\n book1.label = \"Moby Dick (unpacked)\";\n book1.file = \"assets/books/moby-dick/\";\n this.books.push(book1);\n\n let book2 = new Book();\n book2.label = \"Moby Dick (.epub)\";\n book2.file = \"assets/books/moby-dick.epub\";\n this.books.push(book2);\n\n let book3 = new Book();\n book3.label = \"Open (unpacked)\";\n book3.file = \"assets/books/open/\";\n this.books.push(book3);\n\n let book4 = new Book();\n book4.label = \"Remote with Ionic CLI service proxy [works only with `ionic serve`] (.epub)\";\n book4.file = \"amazon/pressbooks-samplefiles/MetamorphosisJacksonTheme/Metamorphosis-jackson.epub\";\n this.books.push(book4);\n\n let book5 = new Book();\n book5.label = \"Remote [works on device in native app only] (.epub)\";\n book5.file = \"https://s3-us-west-2.amazonaws.com//pressbooks-samplefiles/MetamorphosisJacksonTheme/Metamorphosis-jackson.epub\";\n this.books.push(book5);\n\n let book6 = new Book();\n book6.label = \"Remote with correct headers [works everywhere] (.epub)\";\n book6.file = \"https://yatsa.betamo.de/ionic-epubjs/Metamorphosis-jackson.epub\";\n this.books.push(book6);\n\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad HomePage');\n }\n\n show(book) {\n console.log('show', book);\n this.navCtrl.push(BookPage, {\n book: book\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/home/home.ts","import { Component } from '@angular/core';\nimport { NavController, Platform, PopoverController, Events, NavParams } from 'ionic-angular';\nimport { TocPage } from '../toc/toc';\nimport { SettingsPage } from '../settings/settings';\n\ndeclare var ePub: any;\n\n@Component({\n selector: 'page-book',\n templateUrl: 'book.html'\n})\nexport class BookPage {\n\n book: any;\n currentPage: number = 1;\n totalPages: any; // TODO should be number\n pageTitle: string;\n\n showToolbars: boolean = true;\n bgColor: any;\n toolbarColor: string = 'light';\n\n constructor(\n public navCtrl: NavController,\n public platform: Platform,\n public popoverCtrl: PopoverController,\n public events: Events,\n public navParams: NavParams,\n ) {\n let book = this.navParams.get('book');\n\n this.platform.ready().then(() => {\n // load book\n this.book = ePub(book.file);\n\n this._updateTotalPages();\n\n // load toc and then update pagetitle\n this.book.getToc().then(toc => {\n this._updatePageTitle();\n });\n\n // if page changes\n this.book.on('book:pageChanged', (location) => {\n console.log('on book:pageChanged', location);\n this._updateCurrentPage();\n this._updatePageTitle();\n });\n\n // subscribe to events coming from other pages\n this._subscribeToEvents();\n });\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad BookPage');\n\n // render book\n this.book.renderTo(\"book\"); // TODO We should work with ready somehow here I think\n }\n\n _subscribeToEvents() {\n console.log('subscribe to events');\n\n // toc: go to selected chapter\n this.events.subscribe('select:toc', (content) => {\n this.book.goto(content.href);\n });\n\n // settings: change background color\n this.events.subscribe('select:background-color', (bgColor) => {\n console.log('select:background-color', bgColor);\n this.book.setStyle(\"background-color\", bgColor);\n this.bgColor = bgColor;\n // adapt toolbar color to background color\n if (bgColor == 'rgb(255, 255, 255)' || bgColor == 'rgb(249, 241, 228)') { // TODO don't hardcode color values, use some metadata\n this.toolbarColor = 'light';\n }\n else {\n this.toolbarColor = 'dark';\n }\n });\n\n // settings: change color\n this.events.subscribe('select:color', (color) => {\n console.log('select:color', color);\n this.book.setStyle(\"color\", color);\n });\n\n // settings: change font\n this.events.subscribe('select:font-family', (family) => {\n console.log('select:font-family', family);\n this.book.setStyle(\"font-family\", family);\n this._updateTotalPages();\n });\n\n // settings: change font size\n this.events.subscribe('select:font-size', (size) => {\n console.log('select:font-size', size);\n this.book.setStyle(\"font-size\", size);\n this._updateTotalPages();\n });\n\n }\n\n _updateCurrentPage() {\n console.log('_updateCurrentPage');\n // Source: https://github.com/futurepress/epub.js/wiki/Tips-and-Tricks#generating-and-getting-page-numbers (bottom)\n let currentLocation = this.book.getCurrentLocationCfi();\n let page = this.book.pagination.pageFromCfi(currentLocation)\n console.log('_updateCurrentPage location =', currentLocation, 'page =', page);\n this.currentPage = page;\n }\n\n _updateTotalPages() {\n console.log('_updateTotalPages');\n //TODO: cancel prior pagination promise\n // TODO Triggers \"download\" of ALL pages for unpacked books. Really needed? Alternative?\n // Source: https://github.com/futurepress/epub.js/wiki/Tips-and-Tricks#generating-and-getting-page-numbers\n this.book.generatePagination().then(() => {\n let totalPages = this.book.pagination.totalPages;\n console.log('_updateTotalPages totalPages = ', totalPages);\n this.totalPages = `of ${totalPages}`; // TODO where is this.totalPages actually used?\n }).catch(error => {\n console.log('_updateTotalPages error = ', error);\n });\n }\n\n _updatePageTitle() {\n console.log('_updatePageTitle');\n let bookTitle = this.book.metadata.bookTitle;\n let pageTitle = bookTitle; // default to book title\n if (this.book.toc) {\n // Use chapter name\n let chapter = this.book.toc.filter(obj => obj.href == this.book.currentChapter.href)[0]; // TODO What does this code do?\n pageTitle = chapter ? chapter.label : bookTitle; // fallback to book title again\n }\n console.log('_updatePageTitle title =', pageTitle);\n this.pageTitle = pageTitle;\n }\n\n // Navigation\n\n prev() {\n console.log('prev');\n if (this.currentPage == 2) { // TODO Why this special case here?\n this.book.gotoPage(1);\n } else {\n this.book.prevPage();\n }\n }\n\n next() {\n console.log('next');\n this.book.nextPage();\n }\n\n toc(ev) {\n console.log('toc');\n let popover = this.popoverCtrl.create(TocPage, {\n toc: this.book.toc\n });\n popover.present({ ev });\n }\n\n settings(ev) {\n console.log('settings');\n let popover = this.popoverCtrl.create(SettingsPage, {\n backgroundColor: this.book.settings.styles['background-color'], // TODO: Color is not needed here?\n fontFamily: this.book.settings.styles['font-family'],\n fontSize: this.book.settings.styles['font-size'],\n });\n popover.present({ ev });\n }\n\n\n // Touchlayer\n\n toggleToolbars() {\n console.log('toggleToolbars');\n this.showToolbars = !this.showToolbars;\n }\n\n changePage(event) {\n console.log('changePage', event);\n if (event.velocityX < 0) { // TODO Best way to do this?\n this.next();\n }\n else {\n this.prev();\n }\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/book/book.ts","import { Component } from '@angular/core';\nimport { NavController, NavParams, Events } from 'ionic-angular';\n\n@Component({\n selector: 'page-toc',\n templateUrl: 'toc.html',\n})\nexport class TocPage {\n private toc: any;\n constructor(public navCtrl: NavController, public navParams: NavParams, public events : Events) {\n this.toc = navParams.data.toc;\n }\n\n selectToc(content){\n this.events.publish('select:toc', content);\n this.navCtrl.pop();\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/toc/toc.ts","import { Component } from '@angular/core';\nimport { NavController, NavParams, Events } from 'ionic-angular';\n\n@Component({\n selector: 'page-settings',\n templateUrl: 'settings.html',\n})\nexport class SettingsPage {\n\n backgroundColor: string;\n fontSize: any;\n fontFamily: any;\n\n colors = { // TODO Don't send color codes back to the book page, make it set classes\n 'white': {\n 'bg': 'rgb(255, 255, 255)',\n 'fg': 'rgb(0, 0, 0)'\n },\n 'tan': {\n 'bg': 'rgb(249, 241, 228)',\n 'fg': 'rgb(0, 0, 0)'\n },\n 'grey': {\n 'bg': 'rgb(76, 75, 80)',\n 'fg': 'rgb(255, 255, 255)'\n },\n 'black': {\n 'bg': 'rgb(0, 0, 0)',\n 'fg': 'rgb(255, 255, 255)'\n },\n };\n\n constructor(\n public navCtrl: NavController,\n public navParams: NavParams,\n public events: Events\n ) {\n if (this.navParams.data) {\n let backgroundColor = this.navParams.data.backgroundColor;\n this.backgroundColor = this._getColorName(backgroundColor);\n this.fontSize = this.navParams.data.fontSize;\n if (this.navParams.data.fontFamily) {\n this.fontFamily = this.navParams.data.fontFamily.replace(/'/g, \"\"); // TODO Huh?\n }\n else {\n //TODO get the default font-family\n }\n }\n }\n\n _getColorName(color) {\n if (!color) return 'white';\n let colorName = 'white';\n for (var key in this.colors) {\n if (this.colors[key].bg == color) {\n colorName = key;\n }\n }\n return colorName;\n }\n\n changeBackground(backgroundColor) {\n this.backgroundColor = backgroundColor;\n this.events.publish('select:background-color', this.colors[backgroundColor].bg);\n this.events.publish('select:color', this.colors[backgroundColor].fg);\n }\n\n changeFontSize(direction) {\n let size = this.fontSize ? this.fontSize : '1em';\n let sizeValue = +size.replace('em', '');\n let newSizeValue = direction == 'larger' ? sizeValue += 0.1 : sizeValue -= 0.1;\n if (newSizeValue >= 0.4 && newSizeValue <= 2) { // TODO this should be visible in the UI (disable button)\n this.fontSize = `${newSizeValue}em`;\n this.events.publish('select:font-size', this.fontSize);\n }\n }\n\n changeFontFamily() {\n if (this.fontFamily) {\n this.events.publish('select:font-family', this.fontFamily);\n }\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/settings/settings.ts","import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/main.ts","import { BrowserModule } from '@angular/platform-browser';\nimport { ErrorHandler, NgModule } from '@angular/core';\nimport { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';\nimport { SplashScreen } from '@ionic-native/splash-screen';\nimport { StatusBar } from '@ionic-native/status-bar';\n\nimport { MyApp } from './app.component';\nimport { HomePage } from '../pages/home/home';\nimport { BookPage } from '../pages/book/book';\nimport { TocPage } from '../pages/toc/toc';\nimport { SettingsPage } from '../pages/settings/settings';\n\n@NgModule({\n declarations: [\n MyApp,\n HomePage,\n BookPage,\n TocPage,\n SettingsPage\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp)\n ],\n bootstrap: [IonicApp],\n entryComponents: [\n MyApp,\n HomePage,\n BookPage,\n TocPage,\n SettingsPage\n ],\n providers: [\n StatusBar,\n SplashScreen,\n {provide: ErrorHandler, useClass: IonicErrorHandler}\n ]\n})\nexport class AppModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","\nimport { Component } from '@angular/core';\nimport { Platform } from 'ionic-angular';\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\n\nimport { HomePage } from '../pages/home/home';\n\n@Component({\n templateUrl: 'app.html'\n})\nexport class MyApp {\n rootPage:any = HomePage;\n\n constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {\n platform.ready().then(() => {\n // Okay, so the platform is ready and our plugins are available.\n // Here you can do any higher level native things you might need.\n statusBar.styleDefault();\n splashScreen.hide();\n });\n }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["../../node_modules/@angular/core/esm5 lazy","../../src lazy","../../src/pages/home/home.ts","../../src/pages/book/book.ts","../../src/pages/toc/toc.ts","../../src/pages/settings/settings.ts","../../src/app/main.ts","../../src/app/app.module.ts","../../src/app/app.component.ts"],"names":[],"mappings":"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","file":"main.js","sourcesContent":["function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 125;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@angular/core/esm5 lazy\n// module id = 125\n// module chunks = 0","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 166;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src lazy\n// module id = 166\n// module chunks = 0","import { BookPage } from './../book/book';\nimport { Component } from '@angular/core';\nimport { NavController, NavParams } from 'ionic-angular';\n\nexport class Book {\n label: string;\n file: string;\n}\n\n@Component({\n selector: 'page-home',\n templateUrl: 'home.html',\n})\nexport class HomePage {\n\n books: {}[];\n\n constructor(public navCtrl: NavController, public navParams: NavParams) {\n this.books = [];\n\n let book1 = new Book();\n book1.label = \"Moby Dick (unpacked)\";\n book1.file = \"assets/books/moby-dick/\";\n this.books.push(book1);\n\n let book2 = new Book();\n book2.label = \"Moby Dick (.epub)\";\n book2.file = \"assets/books/moby-dick.epub\";\n this.books.push(book2);\n\n let book3 = new Book();\n book3.label = \"Open (unpacked)\";\n book3.file = \"assets/books/open/\";\n this.books.push(book3);\n\n let book4 = new Book();\n book4.label = \"Remote with Ionic CLI service proxy [works only with `ionic serve`] (.epub)\";\n book4.file = \"amazon/pressbooks-samplefiles/MetamorphosisJacksonTheme/Metamorphosis-jackson.epub\";\n this.books.push(book4);\n\n let book5 = new Book();\n book5.label = \"Remote [works on device in native app only] (.epub)\";\n book5.file = \"https://s3-us-west-2.amazonaws.com//pressbooks-samplefiles/MetamorphosisJacksonTheme/Metamorphosis-jackson.epub\";\n this.books.push(book5);\n\n let book6 = new Book();\n book6.label = \"Remote with correct headers [works everywhere] (.epub)\";\n book6.file = \"https://yatsa.betamo.de/ionic-epubjs/Metamorphosis-jackson.epub\";\n this.books.push(book6);\n\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad HomePage');\n }\n\n show(book) {\n console.log('show', book);\n this.navCtrl.push(BookPage, {\n book: book\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/home/home.ts","import { Component } from '@angular/core';\nimport { NavController, Platform, PopoverController, Events, NavParams } from 'ionic-angular';\nimport { TocPage } from '../toc/toc';\nimport { SettingsPage } from '../settings/settings';\nimport { Book, Rendition } from \"epubjs\";\n\ndeclare var ePub: any;\n\n@Component({\n selector: 'page-book',\n templateUrl: 'book.html'\n})\nexport class BookPage {\n\n book: any;\n rendition: any;\n currentPage: string;\n totalPages: any; // TODO should be number\n pageTitle: string;\n metadata: any;\n currentPageText: string;\n\n showToolbars: boolean = true;\n bgColor: any;\n toolbarColor: string = 'light';\n\n constructor(\n public navCtrl: NavController,\n public platform: Platform,\n public popoverCtrl: PopoverController,\n public events: Events,\n public navParams: NavParams,\n ) {\n let book = this.navParams.get('book');\n\n this.platform.ready().then(() => {\n // load book\n this.book = new Book(book.file);\n this.rendition = new Rendition(this.book);\n //Attached the rendition to the book Id element in our html\n this.rendition.attachTo('book');\n\n //Creates a CFI for every X characters in the book\n this.book.locations.generate(); //can pass an optional X characters count\n\n //Output all the objects we can work with\n this.book.loaded.metadata.then((metadata) => {\n console.log(\"METADATA: \", metadata);\n this.metadata = metadata;\n });\n this.book.loaded.spine.then((spine) => { console.log(\"SPINE: \", spine) });\n this.book.loaded.cover.then((cover) => { console.log(\"COVER: \", cover) });\n this.book.loaded.navigation.then((navigation) => { console.log(\"NAVIGATION: \", navigation) });\n this.book.loaded.resources.then((resources) => { console.log(\"RESOURCES: \", resources) });\n\n\n this.rendition.on('relocated', (relocated) => {\n console.log(\"on Relocated called: \", relocated)\n let location = this.rendition.currentLocation();\n let cfi = relocated.start.cfi;\n\n //Example fetching current spine location\n let item = this.book.spine.get(this.rendition.location.start.cfi);\n console.log(\"ITEM: \", item)\n\n //Example fetching current navigation item\n let navItem = this.book.navigation.get(item.href);\n console.log(\"NAV ITEM: \", navItem)\n\n if (navItem && navItem.label !== 'Cover') {\n this.pageTitle = navItem.label;\n } else {\n this.pageTitle = this.metadata.title;\n }\n\n //Example grabbing the current page's first block of text\n let range = this.rendition.getRange(cfi);\n console.log('RANGE: ', range);\n this.currentPageText = range.startContainer.textContent.substr(range.startOffset);\n\n //Currently not finding a good way to display current page of Total pages since the whole book\n //is no longer rendered but instead only the current section (chapter). So instead can easily display chapter and page\n //number within the chapter.\n this.currentPage = item.idref + \".\" + relocated.start.displayed.page;\n });\n\n // subscribe to events coming from other pages\n this._subscribeToEvents();\n });\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad BookPage');\n }\n\n _subscribeToEvents() {\n console.log('subscribe to events');\n\n // toc: go to selected chapter\n this.events.subscribe('select:toc', (content) => {\n this.rendition.display(content.href);\n });\n\n // settings: change background color\n this.events.subscribe('select:background-color', (bgColor) => {\n console.log('select:background-color', bgColor);\n this.book.setStyle(\"background-color\", bgColor);\n this.bgColor = bgColor;\n // adapt toolbar color to background color\n if (bgColor == 'rgb(255, 255, 255)' || bgColor == 'rgb(249, 241, 228)') { // TODO don't hardcode color values, use some metadata\n this.toolbarColor = 'light';\n }\n else {\n this.toolbarColor = 'dark';\n }\n });\n\n // settings: change color\n this.events.subscribe('select:color', (color) => {\n console.log('select:color', color);\n this.book.setStyle(\"color\", color);\n });\n\n // settings: change font\n this.events.subscribe('select:font-family', (family) => {\n console.log('select:font-family', family);\n this.book.setStyle(\"font-family\", family);\n this._updateTotalPages();\n });\n\n // settings: change font size\n this.events.subscribe('select:font-size', (size) => {\n console.log('select:font-size', size);\n this.book.setStyle(\"font-size\", size);\n this._updateTotalPages();\n });\n\n }\n\n _updateCurrentPage() {\n console.log('_updateCurrentPage');\n // Source: https://github.com/futurepress/epub.js/wiki/Tips-and-Tricks#generating-and-getting-page-numbers (bottom)\n let currentLocation = this.book.getCurrentLocationCfi();\n let page = this.book.pagination.pageFromCfi(currentLocation)\n console.log('_updateCurrentPage location =', currentLocation, 'page =', page);\n this.currentPage = page;\n }\n\n //TODO right now no easy way to update total pages in v0.3+\n _updateTotalPages() {\n console.log('_updateTotalPages');\n }\n\n _updatePageTitle() {\n console.log('_updatePageTitle');\n let bookTitle = this.book.metadata.bookTitle;\n let pageTitle = bookTitle; // default to book title\n if (this.book.toc) {\n // Use chapter name\n let chapter = this.book.toc.filter(obj => obj.href == this.book.currentChapter.href)[0]; // TODO What does this code do?\n pageTitle = chapter ? chapter.label : bookTitle; // fallback to book title again\n }\n console.log('_updatePageTitle title =', pageTitle);\n this.pageTitle = pageTitle;\n }\n\n // Navigation\n\n prev() {\n console.log('prev');\n this.rendition.prev();\n }\n\n next() {\n console.log('next');\n this.rendition.next();\n }\n\n toc(ev) {\n console.log('toc');\n let popover = this.popoverCtrl.create(TocPage, {\n toc: this.book.toc\n });\n popover.present({ ev });\n }\n\n settings(ev) {\n console.log('settings');\n let popover = this.popoverCtrl.create(SettingsPage, {\n backgroundColor: this.book.settings.styles['background-color'], // TODO: Color is not needed here?\n fontFamily: this.book.settings.styles['font-family'],\n fontSize: this.book.settings.styles['font-size'],\n });\n popover.present({ ev });\n }\n\n\n // Touchlayer\n\n toggleToolbars() {\n console.log('toggleToolbars');\n this.showToolbars = !this.showToolbars;\n }\n\n changePage(event) {\n console.log('changePage', event);\n if (event.velocityX < 0) { // TODO Best way to do this?\n this.next();\n }\n else {\n this.prev();\n }\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/book/book.ts","import { Component } from '@angular/core';\nimport { NavController, NavParams, Events } from 'ionic-angular';\n\n@Component({\n selector: 'page-toc',\n templateUrl: 'toc.html',\n})\nexport class TocPage {\n private toc: any;\n constructor(public navCtrl: NavController, public navParams: NavParams, public events : Events) {\n this.toc = navParams.data.toc;\n }\n\n selectToc(content){\n this.events.publish('select:toc', content);\n this.navCtrl.pop();\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/toc/toc.ts","import { Component } from '@angular/core';\nimport { NavController, NavParams, Events } from 'ionic-angular';\n\n@Component({\n selector: 'page-settings',\n templateUrl: 'settings.html',\n})\nexport class SettingsPage {\n\n backgroundColor: string;\n fontSize: any;\n fontFamily: any;\n\n colors = { // TODO Don't send color codes back to the book page, make it set classes\n 'white': {\n 'bg': 'rgb(255, 255, 255)',\n 'fg': 'rgb(0, 0, 0)'\n },\n 'tan': {\n 'bg': 'rgb(249, 241, 228)',\n 'fg': 'rgb(0, 0, 0)'\n },\n 'grey': {\n 'bg': 'rgb(76, 75, 80)',\n 'fg': 'rgb(255, 255, 255)'\n },\n 'black': {\n 'bg': 'rgb(0, 0, 0)',\n 'fg': 'rgb(255, 255, 255)'\n },\n };\n\n constructor(\n public navCtrl: NavController,\n public navParams: NavParams,\n public events: Events\n ) {\n if (this.navParams.data) {\n let backgroundColor = this.navParams.data.backgroundColor;\n this.backgroundColor = this._getColorName(backgroundColor);\n this.fontSize = this.navParams.data.fontSize;\n if (this.navParams.data.fontFamily) {\n this.fontFamily = this.navParams.data.fontFamily.replace(/'/g, \"\"); // TODO Huh?\n }\n else {\n //TODO get the default font-family\n }\n }\n }\n\n _getColorName(color) {\n if (!color) return 'white';\n let colorName = 'white';\n for (var key in this.colors) {\n if (this.colors[key].bg == color) {\n colorName = key;\n }\n }\n return colorName;\n }\n\n changeBackground(backgroundColor) {\n this.backgroundColor = backgroundColor;\n this.events.publish('select:background-color', this.colors[backgroundColor].bg);\n this.events.publish('select:color', this.colors[backgroundColor].fg);\n }\n\n changeFontSize(direction) {\n let size = this.fontSize ? this.fontSize : '1em';\n let sizeValue = +size.replace('em', '');\n let newSizeValue = direction == 'larger' ? sizeValue += 0.1 : sizeValue -= 0.1;\n if (newSizeValue >= 0.4 && newSizeValue <= 2) { // TODO this should be visible in the UI (disable button)\n this.fontSize = `${newSizeValue}em`;\n this.events.publish('select:font-size', this.fontSize);\n }\n }\n\n changeFontFamily() {\n if (this.fontFamily) {\n this.events.publish('select:font-family', this.fontFamily);\n }\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/settings/settings.ts","import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/main.ts","import { BrowserModule } from '@angular/platform-browser';\nimport { ErrorHandler, NgModule } from '@angular/core';\nimport { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';\nimport { SplashScreen } from '@ionic-native/splash-screen';\nimport { StatusBar } from '@ionic-native/status-bar';\n\nimport { MyApp } from './app.component';\nimport { HomePage } from '../pages/home/home';\nimport { BookPage } from '../pages/book/book';\nimport { TocPage } from '../pages/toc/toc';\nimport { SettingsPage } from '../pages/settings/settings';\n\n@NgModule({\n declarations: [\n MyApp,\n HomePage,\n BookPage,\n TocPage,\n SettingsPage\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp)\n ],\n bootstrap: [IonicApp],\n entryComponents: [\n MyApp,\n HomePage,\n BookPage,\n TocPage,\n SettingsPage\n ],\n providers: [\n StatusBar,\n SplashScreen,\n {provide: ErrorHandler, useClass: IonicErrorHandler}\n ]\n})\nexport class AppModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","\nimport { Component } from '@angular/core';\nimport { Platform } from 'ionic-angular';\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\n\nimport { HomePage } from '../pages/home/home';\n\n@Component({\n templateUrl: 'app.html'\n})\nexport class MyApp {\n rootPage:any = HomePage;\n\n constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {\n platform.ready().then(() => {\n // Okay, so the platform is ready and our plugins are available.\n // Here you can do any higher level native things you might need.\n statusBar.styleDefault();\n splashScreen.hide();\n });\n }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 38f3258..0662a67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1661,29 +1661,35 @@ } }, "cordova-plugin-console": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cordova-plugin-console/-/cordova-plugin-console-1.0.5.tgz", - "integrity": "sha1-8OKa7pwDyrnp2IOwHRnyLd1chXA=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-console/-/cordova-plugin-console-1.1.0.tgz", + "integrity": "sha1-4vusECkBeeRMtyxf28QQpTHBzW0=" }, "cordova-plugin-device": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-1.1.4.tgz", - "integrity": "sha1-1f50cSBp0D9tOG7wvTIbOr0NONw=" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-1.1.7.tgz", + "integrity": "sha1-/JQRG+aTJijGaGiTjd89yCyfv+Y=" }, "cordova-plugin-splashscreen": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-4.0.3.tgz", - "integrity": "sha1-dzzRNjwfO6y5kBZj6eN5PdPgoZ0=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-4.1.0.tgz", + "integrity": "sha1-gQKKt2Q+YVWT0n8q0CRFYR8ZRrY=" }, "cordova-plugin-statusbar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.2.2.tgz", - "integrity": "sha1-nFM0JqKb0ojnOx86iXLuFkRQ+2s=" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.4.2.tgz", + "integrity": "sha1-/B+9wNjXAzp+jh8ff/FnrJvU+vY=" }, "cordova-plugin-whitelist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.1.tgz", - "integrity": "sha1-n9Hbf9bJVpUdNHcc3Nl/Zs7VFt8=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.3.tgz", + "integrity": "sha1-tehezbv+Wu3tQKG/TuI3LmfZb7Q=" + }, + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -1982,16 +1988,62 @@ } }, "epubjs": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.2.20.tgz", - "integrity": "sha512-71xFoaTV9P1SQEWmTkbx/35vnBYa+oIL1O9p1RZ8qDEGxNypQhM2mr9eA8s22y0FNyGL10EFRB1oBsukWP8wkw==", + "version": "0.3.61", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.61.tgz", + "integrity": "sha512-gDquOk+pD5zb8i4Oe8La1z8AXvySpgjuQwwNBY0vWLWIjtAAGV3afOUgBod5QeNysbfPZ/xtjFeuffAUA9Losw==", "dev": true, "requires": { - "jquery": "2.2.4", - "jszip": "2.6.1", - "localforage": "1.4.3", - "rsvp": "3.6.1", - "screenfull": "2.0.0" + "event-emitter": "0.3.5", + "jszip": "3.1.5", + "lodash": "4.17.5", + "marks-pane": "1.0.7", + "path-webpack": "0.0.3", + "stream-browserify": "2.0.1", + "xmldom": "0.1.27" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "dev": true, + "requires": { + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.6", + "readable-stream": "2.0.6" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "3.0.6" + } + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + } } }, "errno": { @@ -2074,6 +2126,12 @@ "event-emitter": "0.3.5" } }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -2630,7 +2688,6 @@ "debug": { "version": "2.6.8", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "2.0.0" @@ -2680,7 +2737,6 @@ "form-data": { "version": "2.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "asynckit": "0.4.0", @@ -2766,7 +2822,6 @@ "har-validator": { "version": "4.2.1", "bundled": true, - "dev": true, "optional": true, "requires": { "ajv": "4.11.8", @@ -2822,7 +2877,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -2891,20 +2945,17 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true, - "dev": true + "bundled": true }, "mime-types": { "version": "2.1.15", "bundled": true, - "dev": true, "requires": { "mime-db": "1.27.0" } @@ -2912,20 +2963,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } @@ -2933,7 +2981,6 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "node-pre-gyp": { @@ -2976,19 +3023,16 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "oauth-sign": { "version": "0.8.2", "bundled": true, - "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true }, "once": { @@ -3001,7 +3045,6 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "os-tmpdir": { @@ -3998,12 +4041,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=", - "dev": true - }, "js-base64": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", @@ -4126,15 +4163,6 @@ } } }, - "jszip": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.6.1.tgz", - "integrity": "sha1-uI86ey5noqBIFSmCx6N1bZxIKPA=", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4326,6 +4354,12 @@ "object-visit": "1.0.1" } }, + "marks-pane": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.7.tgz", + "integrity": "sha512-mef2u/bdbbzfD0A5wfYoAMD5gsTH2ypIN4qVR/CsM8/WFGP7drxX/PKUqmLuoffOT8fQyXoYrBuWYCgMpCGzIw==", + "dev": true + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -5174,6 +5208,12 @@ "pinkie-promise": "2.0.1" } }, + "path-webpack": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/path-webpack/-/path-webpack-0.0.3.tgz", + "integrity": "sha1-/23sdJ7sWpRgXATV9j/FVgegOhY=", + "dev": true + }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", @@ -5700,12 +5740,6 @@ } } }, - "rsvp": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.1.tgz", - "integrity": "sha1-NPSnrChZ97rMj0l4nFYE8eJq5wI=", - "dev": true - }, "rxjs": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", @@ -5752,12 +5786,6 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "screenfull": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-2.0.0.tgz", - "integrity": "sha1-oAspqT4GsaxXYO2mQsoJLVUYFP4=", - "dev": true - }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", @@ -7780,6 +7808,12 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 6a70230..45cdf80 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,11 @@ "@ionic/storage": "2.1.3", "cordova-android": "7.1.0", "cordova-ios": "4.5.4", - "cordova-plugin-console": "^1.0.5", - "cordova-plugin-device": "^1.1.4", - "cordova-plugin-splashscreen": "^4.0.3", - "cordova-plugin-statusbar": "^2.2.2", - "cordova-plugin-whitelist": "^1.3.1", + "cordova-plugin-console": "^1.1.0", + "cordova-plugin-device": "^1.1.7", + "cordova-plugin-splashscreen": "^4.1.0", + "cordova-plugin-statusbar": "^2.4.2", + "cordova-plugin-whitelist": "^1.3.3", "ionic-angular": "3.9.2", "ionic-plugin-keyboard": "^2.2.1", "ionicons": "3.0.0", @@ -40,7 +40,7 @@ }, "devDependencies": { "@ionic/app-scripts": "3.1.8", - "epubjs": "^0.2.20", + "epubjs": "^0.3.61", "typescript": "2.4.2" }, "description": "An Ionic project", @@ -58,4 +58,4 @@ "android" ] } -} \ No newline at end of file +} diff --git a/src/assets/epubjs/build/epub.js b/src/assets/epubjs/build/epub.js deleted file mode 100644 index f5ad7db..0000000 --- a/src/assets/epubjs/build/epub.js +++ /dev/null @@ -1,9216 +0,0 @@ -/*! - * @overview RSVP - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE - * @version 3.5.0 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.RSVP = global.RSVP || {}))); -}(this, (function (exports) { 'use strict'; - -function indexOf(callbacks, callback) { - for (var i = 0, l = callbacks.length; i < l; i++) { - if (callbacks[i] === callback) { - return i; - } - } - - return -1; -} - -function callbacksFor(object) { - var callbacks = object._promiseCallbacks; - - if (!callbacks) { - callbacks = object._promiseCallbacks = {}; - } - - return callbacks; -} - -/** - @class RSVP.EventTarget -*/ -var EventTarget = { - - /** - `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For - Example: - ```javascript - let object = {}; - RSVP.EventTarget.mixin(object); - object.on('finished', function(event) { - // handle event - }); - object.trigger('finished', { detail: value }); - ``` - `EventTarget.mixin` also works with prototypes: - ```javascript - let Person = function() {}; - RSVP.EventTarget.mixin(Person.prototype); - let yehuda = new Person(); - let tom = new Person(); - yehuda.on('poke', function(event) { - console.log('Yehuda says OW'); - }); - tom.on('poke', function(event) { - console.log('Tom says OW'); - }); - yehuda.trigger('poke'); - tom.trigger('poke'); - ``` - @method mixin - @for RSVP.EventTarget - @private - @param {Object} object object to extend with EventTarget methods - */ - mixin: function mixin(object) { - object['on'] = this['on']; - object['off'] = this['off']; - object['trigger'] = this['trigger']; - object._promiseCallbacks = undefined; - return object; - }, - - /** - Registers a callback to be executed when `eventName` is triggered - ```javascript - object.on('event', function(eventInfo){ - // handle the event - }); - object.trigger('event'); - ``` - @method on - @for RSVP.EventTarget - @private - @param {String} eventName name of the event to listen for - @param {Function} callback function to be called when the event is triggered. - */ - on: function on(eventName, callback) { - if (typeof callback !== 'function') { - throw new TypeError('Callback must be a function'); - } - - var allCallbacks = callbacksFor(this), - callbacks = undefined; - - callbacks = allCallbacks[eventName]; - - if (!callbacks) { - callbacks = allCallbacks[eventName] = []; - } - - if (indexOf(callbacks, callback) === -1) { - callbacks.push(callback); - } - }, - - /** - You can use `off` to stop firing a particular callback for an event: - ```javascript - function doStuff() { // do stuff! } - object.on('stuff', doStuff); - object.trigger('stuff'); // doStuff will be called - // Unregister ONLY the doStuff callback - object.off('stuff', doStuff); - object.trigger('stuff'); // doStuff will NOT be called - ``` - If you don't pass a `callback` argument to `off`, ALL callbacks for the - event will not be executed when the event fires. For example: - ```javascript - let callback1 = function(){}; - let callback2 = function(){}; - object.on('stuff', callback1); - object.on('stuff', callback2); - object.trigger('stuff'); // callback1 and callback2 will be executed. - object.off('stuff'); - object.trigger('stuff'); // callback1 and callback2 will not be executed! - ``` - @method off - @for RSVP.EventTarget - @private - @param {String} eventName event to stop listening to - @param {Function} callback optional argument. If given, only the function - given will be removed from the event's callback queue. If no `callback` - argument is given, all callbacks will be removed from the event's callback - queue. - */ - off: function off(eventName, callback) { - var allCallbacks = callbacksFor(this), - callbacks = undefined, - index = undefined; - - if (!callback) { - allCallbacks[eventName] = []; - return; - } - - callbacks = allCallbacks[eventName]; - - index = indexOf(callbacks, callback); - - if (index !== -1) { - callbacks.splice(index, 1); - } - }, - - /** - Use `trigger` to fire custom events. For example: - ```javascript - object.on('foo', function(){ - console.log('foo event happened!'); - }); - object.trigger('foo'); - // 'foo event happened!' logged to the console - ``` - You can also pass a value as a second argument to `trigger` that will be - passed as an argument to all event listeners for the event: - ```javascript - object.on('foo', function(value){ - console.log(value.name); - }); - object.trigger('foo', { name: 'bar' }); - // 'bar' logged to the console - ``` - @method trigger - @for RSVP.EventTarget - @private - @param {String} eventName name of the event to be triggered - @param {*} options optional value to be passed to any event handlers for - the given `eventName` - */ - trigger: function trigger(eventName, options, label) { - var allCallbacks = callbacksFor(this), - callbacks = undefined, - callback = undefined; - - if (callbacks = allCallbacks[eventName]) { - // Don't cache the callbacks.length since it may grow - for (var i = 0; i < callbacks.length; i++) { - callback = callbacks[i]; - - callback(options, label); - } - } - } -}; - -var config = { - instrument: false -}; - -EventTarget['mixin'](config); - -function configure(name, value) { - if (name === 'onerror') { - // handle for legacy users that expect the actual - // error to be passed to their function added via - // `RSVP.configure('onerror', someFunctionHere);` - config['on']('error', value); - return; - } - - if (arguments.length === 2) { - config[name] = value; - } else { - return config[name]; - } -} - -function objectOrFunction(x) { - return typeof x === 'function' || typeof x === 'object' && x !== null; -} - -function isFunction(x) { - return typeof x === 'function'; -} - -function isMaybeThenable(x) { - return typeof x === 'object' && x !== null; -} - -var _isArray = undefined; -if (!Array.isArray) { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; -} else { - _isArray = Array.isArray; -} - -var isArray = _isArray; - -// Date.now is not available in browsers < IE9 -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility -var now = Date.now || function () { - return new Date().getTime(); -}; - -function F() {} - -var o_create = Object.create || function (o) { - if (arguments.length > 1) { - throw new Error('Second argument not supported'); - } - if (typeof o !== 'object') { - throw new TypeError('Argument must be an object'); - } - F.prototype = o; - return new F(); -}; - -var queue = []; - -function scheduleFlush() { - setTimeout(function () { - for (var i = 0; i < queue.length; i++) { - var entry = queue[i]; - - var payload = entry.payload; - - payload.guid = payload.key + payload.id; - payload.childGuid = payload.key + payload.childId; - if (payload.error) { - payload.stack = payload.error.stack; - } - - config['trigger'](entry.name, entry.payload); - } - queue.length = 0; - }, 50); -} -function instrument$1(eventName, promise, child) { - if (1 === queue.push({ - name: eventName, - payload: { - key: promise._guidKey, - id: promise._id, - eventName: eventName, - detail: promise._result, - childId: child && child._id, - label: promise._label, - timeStamp: now(), - error: config["instrument-with-stack"] ? new Error(promise._label) : null - } })) { - scheduleFlush(); - } -} - -/** - `RSVP.Promise.resolve` returns a promise that will become resolved with the - passed `value`. It is shorthand for the following: - - ```javascript - let promise = new RSVP.Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = RSVP.Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @static - @param {*} object value that the returned promise will be resolved with - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$1(object, label) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - var promise = new Constructor(noop, label); - resolve(promise, object); - return promise; -} - -function withOwnPromise() { - return new TypeError('A promises callback cannot return that same promise.'); -} - -function noop() {} - -var PENDING = void 0; -var FULFILLED = 1; -var REJECTED = 2; - -var GET_THEN_ERROR = new ErrorObject(); - -function getThen(promise) { - try { - return promise.then; - } catch (error) { - GET_THEN_ERROR.error = error; - return GET_THEN_ERROR; - } -} - -function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { - try { - then$$1.call(value, fulfillmentHandler, rejectionHandler); - } catch (e) { - return e; - } -} - -function handleForeignThenable(promise, thenable, then$$1) { - config.async(function (promise) { - var sealed = false; - var error = tryThen(then$$1, thenable, function (value) { - if (sealed) { - return; - } - sealed = true; - if (thenable !== value) { - resolve(promise, value, undefined); - } else { - fulfill(promise, value); - } - }, function (reason) { - if (sealed) { - return; - } - sealed = true; - - reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); - - if (!sealed && error) { - sealed = true; - reject(promise, error); - } - }, promise); -} - -function handleOwnThenable(promise, thenable) { - if (thenable._state === FULFILLED) { - fulfill(promise, thenable._result); - } else if (thenable._state === REJECTED) { - thenable._onError = null; - reject(promise, thenable._result); - } else { - subscribe(thenable, undefined, function (value) { - if (thenable !== value) { - resolve(promise, value, undefined); - } else { - fulfill(promise, value); - } - }, function (reason) { - return reject(promise, reason); - }); - } -} - -function handleMaybeThenable(promise, maybeThenable, then$$1) { - if (maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$1) { - handleOwnThenable(promise, maybeThenable); - } else { - if (then$$1 === GET_THEN_ERROR) { - reject(promise, GET_THEN_ERROR.error); - GET_THEN_ERROR.error = null; - } else if (then$$1 === undefined) { - fulfill(promise, maybeThenable); - } else if (isFunction(then$$1)) { - handleForeignThenable(promise, maybeThenable, then$$1); - } else { - fulfill(promise, maybeThenable); - } - } -} - -function resolve(promise, value) { - if (promise === value) { - fulfill(promise, value); - } else if (objectOrFunction(value)) { - handleMaybeThenable(promise, value, getThen(value)); - } else { - fulfill(promise, value); - } -} - -function publishRejection(promise) { - if (promise._onError) { - promise._onError(promise._result); - } - - publish(promise); -} - -function fulfill(promise, value) { - if (promise._state !== PENDING) { - return; - } - - promise._result = value; - promise._state = FULFILLED; - - if (promise._subscribers.length === 0) { - if (config.instrument) { - instrument$1('fulfilled', promise); - } - } else { - config.async(publish, promise); - } -} - -function reject(promise, reason) { - if (promise._state !== PENDING) { - return; - } - promise._state = REJECTED; - promise._result = reason; - config.async(publishRejection, promise); -} - -function subscribe(parent, child, onFulfillment, onRejection) { - var subscribers = parent._subscribers; - var length = subscribers.length; - - parent._onError = null; - - subscribers[length] = child; - subscribers[length + FULFILLED] = onFulfillment; - subscribers[length + REJECTED] = onRejection; - - if (length === 0 && parent._state) { - config.async(publish, parent); - } -} - -function publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; - - if (config.instrument) { - instrument$1(settled === FULFILLED ? 'fulfilled' : 'rejected', promise); - } - - if (subscribers.length === 0) { - return; - } - - var child = undefined, - callback = undefined, - detail = promise._result; - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - if (child) { - invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } - - promise._subscribers.length = 0; -} - -function ErrorObject() { - this.error = null; -} - -var TRY_CATCH_ERROR = new ErrorObject(); - -function tryCatch(callback, detail) { - try { - return callback(detail); - } catch (e) { - TRY_CATCH_ERROR.error = e; - return TRY_CATCH_ERROR; - } -} - -function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value = undefined, - error = undefined, - succeeded = undefined, - failed = undefined; - - if (hasCallback) { - value = tryCatch(callback, detail); - - if (value === TRY_CATCH_ERROR) { - failed = true; - error = value.error; - value.error = null; // release - } else { - succeeded = true; - } - - if (promise === value) { - reject(promise, withOwnPromise()); - return; - } - } else { - value = detail; - succeeded = true; - } - - if (promise._state !== PENDING) { - // noop - } else if (hasCallback && succeeded) { - resolve(promise, value); - } else if (failed) { - reject(promise, error); - } else if (settled === FULFILLED) { - fulfill(promise, value); - } else if (settled === REJECTED) { - reject(promise, value); - } -} - -function initializePromise(promise, resolver) { - var resolved = false; - try { - resolver(function (value) { - if (resolved) { - return; - } - resolved = true; - resolve(promise, value); - }, function (reason) { - if (resolved) { - return; - } - resolved = true; - reject(promise, reason); - }); - } catch (e) { - reject(promise, e); - } -} - -function then(onFulfillment, onRejection, label) { - var _arguments = arguments; - - var parent = this; - var state = parent._state; - - if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) { - config.instrument && instrument$1('chained', parent, parent); - return parent; - } - - parent._onError = null; - - var child = new parent.constructor(noop, label); - var result = parent._result; - - config.instrument && instrument$1('chained', parent, child); - - if (state) { - (function () { - var callback = _arguments[state - 1]; - config.async(function () { - return invokeCallback(state, child, callback, result); - }); - })(); - } else { - subscribe(parent, child, onFulfillment, onRejection); - } - - return child; -} - -function makeSettledResult(state, position, value) { - if (state === FULFILLED) { - return { - state: 'fulfilled', - value: value - }; - } else { - return { - state: 'rejected', - reason: value - }; - } -} - -function Enumerator(Constructor, input, abortOnReject, label) { - this._instanceConstructor = Constructor; - this.promise = new Constructor(noop, label); - this._abortOnReject = abortOnReject; - - if (this._validateInput(input)) { - this._input = input; - this.length = input.length; - this._remaining = input.length; - - this._init(); - - if (this.length === 0) { - fulfill(this.promise, this._result); - } else { - this.length = this.length || 0; - this._enumerate(); - if (this._remaining === 0) { - fulfill(this.promise, this._result); - } - } - } else { - reject(this.promise, this._validationError()); - } -} - -Enumerator.prototype._validateInput = function (input) { - return isArray(input); -}; - -Enumerator.prototype._validationError = function () { - return new Error('Array Methods must be provided an Array'); -}; - -Enumerator.prototype._init = function () { - this._result = new Array(this.length); -}; - -Enumerator.prototype._enumerate = function () { - var length = this.length; - var promise = this.promise; - var input = this._input; - - for (var i = 0; promise._state === PENDING && i < length; i++) { - this._eachEntry(input[i], i); - } -}; - -Enumerator.prototype._settleMaybeThenable = function (entry, i) { - var c = this._instanceConstructor; - var resolve$$1 = c.resolve; - - if (resolve$$1 === resolve$1) { - var then$$1 = getThen(entry); - - if (then$$1 === then && entry._state !== PENDING) { - entry._onError = null; - this._settledAt(entry._state, i, entry._result); - } else if (typeof then$$1 !== 'function') { - this._remaining--; - this._result[i] = this._makeResult(FULFILLED, i, entry); - } else if (c === Promise$1) { - var promise = new c(noop); - handleMaybeThenable(promise, entry, then$$1); - this._willSettleAt(promise, i); - } else { - this._willSettleAt(new c(function (resolve$$1) { - return resolve$$1(entry); - }), i); - } - } else { - this._willSettleAt(resolve$$1(entry), i); - } -}; - -Enumerator.prototype._eachEntry = function (entry, i) { - if (isMaybeThenable(entry)) { - this._settleMaybeThenable(entry, i); - } else { - this._remaining--; - this._result[i] = this._makeResult(FULFILLED, i, entry); - } -}; - -Enumerator.prototype._settledAt = function (state, i, value) { - var promise = this.promise; - - if (promise._state === PENDING) { - this._remaining--; - - if (this._abortOnReject && state === REJECTED) { - reject(promise, value); - } else { - this._result[i] = this._makeResult(state, i, value); - } - } - - if (this._remaining === 0) { - fulfill(promise, this._result); - } -}; - -Enumerator.prototype._makeResult = function (state, i, value) { - return value; -}; - -Enumerator.prototype._willSettleAt = function (promise, i) { - var enumerator = this; - - subscribe(promise, undefined, function (value) { - return enumerator._settledAt(FULFILLED, i, value); - }, function (reason) { - return enumerator._settledAt(REJECTED, i, reason); - }); -}; - -/** - `RSVP.Promise.all` accepts an array of promises, and returns a new promise which - is fulfilled with an array of fulfillment values for the passed promises, or - rejected with the reason of the first passed promise to be rejected. It casts all - elements of the passed iterable to promises as it runs this algorithm. - - Example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `RSVP.all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error("2")); - let promise3 = RSVP.reject(new Error("3")); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @static - @param {Array} entries array of promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - @static -*/ -function all$1(entries, label) { - return new Enumerator(this, entries, true, /* abort on reject */label).promise; -} - -/** - `RSVP.Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - let promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 2'); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // result === 'promise 2' because it was resolved before promise1 - // was resolved. - }); - ``` - - `RSVP.Promise.race` is deterministic in that only the state of the first - settled promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first settled promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - let promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error('promise 2')); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs - }, function(reason){ - // reason.message === 'promise 2' because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - An example real-world use case is implementing timeouts: - - ```javascript - RSVP.Promise.race([ajax('foo.json'), timeout(5000)]) - ``` - - @method race - @static - @param {Array} entries array of promises to observe - @param {String} label optional string for describing the promise returned. - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. -*/ -function race$1(entries, label) { - /*jshint validthis:true */ - var Constructor = this; - - var promise = new Constructor(noop, label); - - if (!isArray(entries)) { - reject(promise, new TypeError('You must pass an array to race.')); - return promise; - } - - for (var i = 0; promise._state === PENDING && i < entries.length; i++) { - subscribe(Constructor.resolve(entries[i]), undefined, function (value) { - return resolve(promise, value); - }, function (reason) { - return reject(promise, reason); - }); - } - - return promise; -} - -/** - `RSVP.Promise.reject` returns a promise rejected with the passed `reason`. - It is shorthand for the following: - - ```javascript - let promise = new RSVP.Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = RSVP.Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @static - @param {*} reason value that the returned promise will be rejected with. - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$1(reason, label) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop, label); - reject(promise, reason); - return promise; -} - -var guidKey = 'rsvp_' + now() + '-'; -var counter = 0; - -function needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); -} - -function needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); -} - -/** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise’s eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. - - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. - - - Basic Usage: - ------------ - - ```js - let promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - let xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class RSVP.Promise - @param {function} resolver - @param {String} label optional string for labeling the promise. - Useful for tooling. - @constructor -*/ -function Promise$1(resolver, label) { - this._id = counter++; - this._label = label; - this._state = undefined; - this._result = undefined; - this._subscribers = []; - - config.instrument && instrument$1('created', this); - - if (noop !== resolver) { - typeof resolver !== 'function' && needsResolver(); - this instanceof Promise$1 ? initializePromise(this, resolver) : needsNew(); - } -} - -Promise$1.cast = resolve$1; // deprecated -Promise$1.all = all$1; -Promise$1.race = race$1; -Promise$1.resolve = resolve$1; -Promise$1.reject = reject$1; - -Promise$1.prototype = { - constructor: Promise$1, - - _guidKey: guidKey, - - _onError: function _onError(reason) { - var promise = this; - config.after(function () { - if (promise._onError) { - config['trigger']('error', reason, promise._label); - } - }); - }, - - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. - - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - - Chaining - -------- - - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); - - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we\'re unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - - Assimilation - ------------ - - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - - If the assimliated promise rejects, then the downstream promise will also reject. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - - Simple Example - -------------- - - Synchronous Example - - ```javascript - let result; - - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - - Promise Example; - - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` - - Advanced Example - -------------- - - Synchronous Example - - ```javascript - let author, books; - - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - - function foundBooks(books) { - - } - - function failure(reason) { - - } - - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - - Promise Example; - - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` - - @method then - @param {Function} onFulfillment - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - then: then, - - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. - - ```js - function findAuthor(){ - throw new Error('couldn\'t find that author'); - } - - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } - - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` - - @method catch - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'catch': function _catch(onRejection, label) { - return this.then(undefined, onRejection, label); - }, - - /** - `finally` will be invoked regardless of the promise's fate just as native - try/catch/finally behaves - - Synchronous example: - - ```js - findAuthor() { - if (Math.random() > 0.5) { - throw new Error(); - } - return new Author(); - } - - try { - return findAuthor(); // succeed or fail - } catch(error) { - return findOtherAuthor(); - } finally { - // always runs - // doesn't affect the return value - } - ``` - - Asynchronous example: - - ```js - findAuthor().catch(function(reason){ - return findOtherAuthor(); - }).finally(function(){ - // author was either found, or not - }); - ``` - - @method finally - @param {Function} callback - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'finally': function _finally(callback, label) { - var promise = this; - var constructor = promise.constructor; - - return promise.then(function (value) { - return constructor.resolve(callback()).then(function () { - return value; - }); - }, function (reason) { - return constructor.resolve(callback()).then(function () { - throw reason; - }); - }, label); - } -}; - -function Result() { - this.value = undefined; -} - -var ERROR = new Result(); -var GET_THEN_ERROR$1 = new Result(); - -function getThen$1(obj) { - try { - return obj.then; - } catch (error) { - ERROR.value = error; - return ERROR; - } -} - -function tryApply(f, s, a) { - try { - f.apply(s, a); - } catch (error) { - ERROR.value = error; - return ERROR; - } -} - -function makeObject(_, argumentNames) { - var obj = {}; - var length = _.length; - var args = new Array(length); - - for (var x = 0; x < length; x++) { - args[x] = _[x]; - } - - for (var i = 0; i < argumentNames.length; i++) { - var _name = argumentNames[i]; - obj[_name] = args[i + 1]; - } - - return obj; -} - -function arrayResult(_) { - var length = _.length; - var args = new Array(length - 1); - - for (var i = 1; i < length; i++) { - args[i - 1] = _[i]; - } - - return args; -} - -function wrapThenable(_then, promise) { - return { - then: function then(onFulFillment, onRejection) { - return _then.call(promise, onFulFillment, onRejection); - } - }; -} - -/** - `RSVP.denodeify` takes a 'node-style' function and returns a function that - will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the - browser when you'd prefer to use promises over using callbacks. For example, - `denodeify` transforms the following: - - ```javascript - let fs = require('fs'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) return handleError(err); - handleData(data); - }); - ``` - - into: - - ```javascript - let fs = require('fs'); - let readFile = RSVP.denodeify(fs.readFile); - - readFile('myfile.txt').then(handleData, handleError); - ``` - - If the node function has multiple success parameters, then `denodeify` - just returns the first one: - - ```javascript - let request = RSVP.denodeify(require('request')); - - request('http://example.com').then(function(res) { - // ... - }); - ``` - - However, if you need all success parameters, setting `denodeify`'s - second parameter to `true` causes it to return all success parameters - as an array: - - ```javascript - let request = RSVP.denodeify(require('request'), true); - - request('http://example.com').then(function(result) { - // result[0] -> res - // result[1] -> body - }); - ``` - - Or if you pass it an array with names it returns the parameters as a hash: - - ```javascript - let request = RSVP.denodeify(require('request'), ['res', 'body']); - - request('http://example.com').then(function(result) { - // result.res - // result.body - }); - ``` - - Sometimes you need to retain the `this`: - - ```javascript - let app = require('express')(); - let render = RSVP.denodeify(app.render.bind(app)); - ``` - - The denodified function inherits from the original function. It works in all - environments, except IE 10 and below. Consequently all properties of the original - function are available to you. However, any properties you change on the - denodeified function won't be changed on the original function. Example: - - ```javascript - let request = RSVP.denodeify(require('request')), - cookieJar = request.jar(); // <- Inheritance is used here - - request('http://example.com', {jar: cookieJar}).then(function(res) { - // cookieJar.cookies holds now the cookies returned by example.com - }); - ``` - - Using `denodeify` makes it easier to compose asynchronous operations instead - of using callbacks. For example, instead of: - - ```javascript - let fs = require('fs'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) { ... } // Handle error - fs.writeFile('myfile2.txt', data, function(err){ - if (err) { ... } // Handle error - console.log('done') - }); - }); - ``` - - you can chain the operations together using `then` from the returned promise: - - ```javascript - let fs = require('fs'); - let readFile = RSVP.denodeify(fs.readFile); - let writeFile = RSVP.denodeify(fs.writeFile); - - readFile('myfile.txt').then(function(data){ - return writeFile('myfile2.txt', data); - }).then(function(){ - console.log('done') - }).catch(function(error){ - // Handle error - }); - ``` - - @method denodeify - @static - @for RSVP - @param {Function} nodeFunc a 'node-style' function that takes a callback as - its last argument. The callback expects an error to be passed as its first - argument (if an error occurred, otherwise null), and the value from the - operation as its second argument ('function(err, value){ }'). - @param {Boolean|Array} [options] An optional paramter that if set - to `true` causes the promise to fulfill with the callback's success arguments - as an array. This is useful if the node function has multiple success - paramters. If you set this paramter to an array with names, the promise will - fulfill with a hash with these names as keys and the success parameters as - values. - @return {Function} a function that wraps `nodeFunc` to return an - `RSVP.Promise` - @static -*/ -function denodeify$1(nodeFunc, options) { - var fn = function fn() { - var self = this; - var l = arguments.length; - var args = new Array(l + 1); - var promiseInput = false; - - for (var i = 0; i < l; ++i) { - var arg = arguments[i]; - - if (!promiseInput) { - // TODO: clean this up - promiseInput = needsPromiseInput(arg); - if (promiseInput === GET_THEN_ERROR$1) { - var p = new Promise$1(noop); - reject(p, GET_THEN_ERROR$1.value); - return p; - } else if (promiseInput && promiseInput !== true) { - arg = wrapThenable(promiseInput, arg); - } - } - args[i] = arg; - } - - var promise = new Promise$1(noop); - - args[l] = function (err, val) { - if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val); - }; - - if (promiseInput) { - return handlePromiseInput(promise, args, nodeFunc, self); - } else { - return handleValueInput(promise, args, nodeFunc, self); - } - }; - - fn.__proto__ = nodeFunc; - - return fn; -} - -function handleValueInput(promise, args, nodeFunc, self) { - var result = tryApply(nodeFunc, self, args); - if (result === ERROR) { - reject(promise, result.value); - } - return promise; -} - -function handlePromiseInput(promise, args, nodeFunc, self) { - return Promise$1.all(args).then(function (args) { - var result = tryApply(nodeFunc, self, args); - if (result === ERROR) { - reject(promise, result.value); - } - return promise; - }); -} - -function needsPromiseInput(arg) { - if (arg && typeof arg === 'object') { - if (arg.constructor === Promise$1) { - return true; - } else { - return getThen$1(arg); - } - } else { - return false; - } -} - -/** - This is a convenient alias for `RSVP.Promise.all`. - - @method all - @static - @for RSVP - @param {Array} array Array of promises. - @param {String} label An optional label. This is useful - for tooling. -*/ -function all$3(array, label) { - return Promise$1.all(array, label); -} - -function AllSettled(Constructor, entries, label) { - this._superConstructor(Constructor, entries, false, /* don't abort on reject */label); -} - -AllSettled.prototype = o_create(Enumerator.prototype); -AllSettled.prototype._superConstructor = Enumerator; -AllSettled.prototype._makeResult = makeSettledResult; -AllSettled.prototype._validationError = function () { - return new Error('allSettled must be called with an array'); -}; - -/** - `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing - a fail-fast method, it waits until all the promises have returned and - shows you all the results. This is useful if you want to handle multiple - promises' failure states together as a set. - - Returns a promise that is fulfilled when all the given promises have been - settled. The return promise is fulfilled with an array of the states of - the promises passed into the `promises` array argument. - - Each state object will either indicate fulfillment or rejection, and - provide the corresponding value or reason. The states will take one of - the following formats: - - ```javascript - { state: 'fulfilled', value: value } - or - { state: 'rejected', reason: reason } - ``` - - Example: - - ```javascript - let promise1 = RSVP.Promise.resolve(1); - let promise2 = RSVP.Promise.reject(new Error('2')); - let promise3 = RSVP.Promise.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.allSettled(promises).then(function(array){ - // array == [ - // { state: 'fulfilled', value: 1 }, - // { state: 'rejected', reason: Error }, - // { state: 'rejected', reason: Error } - // ] - // Note that for the second item, reason.message will be '2', and for the - // third item, reason.message will be '3'. - }, function(error) { - // Not run. (This block would only be called if allSettled had failed, - // for instance if passed an incorrect argument type.) - }); - ``` - - @method allSettled - @static - @for RSVP - @param {Array} entries - @param {String} label - optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled with an array of the settled - states of the constituent promises. -*/ -function allSettled$1(entries, label) { - return new AllSettled(Promise$1, entries, label).promise; -} - -/** - This is a convenient alias for `RSVP.Promise.race`. - - @method race - @static - @for RSVP - @param {Array} array Array of promises. - @param {String} label An optional label. This is useful - for tooling. - */ -function race$3(array, label) { - return Promise$1.race(array, label); -} - -function PromiseHash(Constructor, object, label) { - this._superConstructor(Constructor, object, true, label); -} - -PromiseHash.prototype = o_create(Enumerator.prototype); -PromiseHash.prototype._superConstructor = Enumerator; -PromiseHash.prototype._init = function () { - this._result = {}; -}; - -PromiseHash.prototype._validateInput = function (input) { - return input && typeof input === 'object'; -}; - -PromiseHash.prototype._validationError = function () { - return new Error('Promise.hash must be called with an object'); -}; - -PromiseHash.prototype._enumerate = function () { - var enumerator = this; - var promise = enumerator.promise; - var input = enumerator._input; - var results = []; - - for (var key in input) { - if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) { - results.push({ - position: key, - entry: input[key] - }); - } - } - - var length = results.length; - enumerator._remaining = length; - var result = undefined; - - for (var i = 0; promise._state === PENDING && i < length; i++) { - result = results[i]; - enumerator._eachEntry(result.entry, result.position); - } -}; - -/** - `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array - for its `promises` argument. - - Returns a promise that is fulfilled when all the given promises have been - fulfilled, or rejected if any of them become rejected. The returned promise - is fulfilled with a hash that has the same key names as the `promises` object - argument. If any of the values in the object are not promises, they will - simply be copied over to the fulfilled object. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.resolve(1), - yourPromise: RSVP.resolve(2), - theirPromise: RSVP.resolve(3), - notAPromise: 4 - }; - - RSVP.hash(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: 1, - // yourPromise: 2, - // theirPromise: 3, - // notAPromise: 4 - // } - }); - ```` - - If any of the `promises` given to `RSVP.hash` are rejected, the first promise - that is rejected will be given as the reason to the rejection handler. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.resolve(1), - rejectedPromise: RSVP.reject(new Error('rejectedPromise')), - anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')), - }; - - RSVP.hash(promises).then(function(hash){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === 'rejectedPromise' - }); - ``` - - An important note: `RSVP.hash` is intended for plain JavaScript objects that - are just a set of keys and values. `RSVP.hash` will NOT preserve prototype - chains. - - Example: - - ```javascript - function MyConstructor(){ - this.example = RSVP.resolve('Example'); - } - - MyConstructor.prototype = { - protoProperty: RSVP.resolve('Proto Property') - }; - - let myObject = new MyConstructor(); - - RSVP.hash(myObject).then(function(hash){ - // protoProperty will not be present, instead you will just have an - // object that looks like: - // { - // example: 'Example' - // } - // - // hash.hasOwnProperty('protoProperty'); // false - // 'undefined' === typeof hash.protoProperty - }); - ``` - - @method hash - @static - @for RSVP - @param {Object} object - @param {String} label optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all properties of `promises` - have been fulfilled, or rejected if any of them become rejected. -*/ -function hash$1(object, label) { - return new PromiseHash(Promise$1, object, label).promise; -} - -function HashSettled(Constructor, object, label) { - this._superConstructor(Constructor, object, false, label); -} - -HashSettled.prototype = o_create(PromiseHash.prototype); -HashSettled.prototype._superConstructor = Enumerator; -HashSettled.prototype._makeResult = makeSettledResult; - -HashSettled.prototype._validationError = function () { - return new Error('hashSettled must be called with an object'); -}; - -/** - `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object - instead of an array for its `promises` argument. - - Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method, - but like `RSVP.allSettled`, `hashSettled` waits until all the - constituent promises have returned and then shows you all the results - with their states and values/reasons. This is useful if you want to - handle multiple promises' failure states together as a set. - - Returns a promise that is fulfilled when all the given promises have been - settled, or rejected if the passed parameters are invalid. - - The returned promise is fulfilled with a hash that has the same key names as - the `promises` object argument. If any of the values in the object are not - promises, they will be copied over to the fulfilled object and marked with state - 'fulfilled'. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.Promise.resolve(1), - yourPromise: RSVP.Promise.resolve(2), - theirPromise: RSVP.Promise.resolve(3), - notAPromise: 4 - }; - - RSVP.hashSettled(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: { state: 'fulfilled', value: 1 }, - // yourPromise: { state: 'fulfilled', value: 2 }, - // theirPromise: { state: 'fulfilled', value: 3 }, - // notAPromise: { state: 'fulfilled', value: 4 } - // } - }); - ``` - - If any of the `promises` given to `RSVP.hash` are rejected, the state will - be set to 'rejected' and the reason for rejection provided. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.Promise.resolve(1), - rejectedPromise: RSVP.Promise.reject(new Error('rejection')), - anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')), - }; - - RSVP.hashSettled(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: { state: 'fulfilled', value: 1 }, - // rejectedPromise: { state: 'rejected', reason: Error }, - // anotherRejectedPromise: { state: 'rejected', reason: Error }, - // } - // Note that for rejectedPromise, reason.message == 'rejection', - // and for anotherRejectedPromise, reason.message == 'more rejection'. - }); - ``` - - An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that - are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype - chains. - - Example: - - ```javascript - function MyConstructor(){ - this.example = RSVP.Promise.resolve('Example'); - } - - MyConstructor.prototype = { - protoProperty: RSVP.Promise.resolve('Proto Property') - }; - - let myObject = new MyConstructor(); - - RSVP.hashSettled(myObject).then(function(hash){ - // protoProperty will not be present, instead you will just have an - // object that looks like: - // { - // example: { state: 'fulfilled', value: 'Example' } - // } - // - // hash.hasOwnProperty('protoProperty'); // false - // 'undefined' === typeof hash.protoProperty - }); - ``` - - @method hashSettled - @for RSVP - @param {Object} object - @param {String} label optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when when all properties of `promises` - have been settled. - @static -*/ -function hashSettled$1(object, label) { - return new HashSettled(Promise$1, object, label).promise; -} - -/** - `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event - loop in order to aid debugging. - - Promises A+ specifies that any exceptions that occur with a promise must be - caught by the promises implementation and bubbled to the last handler. For - this reason, it is recommended that you always specify a second rejection - handler function to `then`. However, `RSVP.rethrow` will throw the exception - outside of the promise, so it bubbles up to your console if in the browser, - or domain/cause uncaught exception in Node. `rethrow` will also throw the - error again so the error can be handled by the promise per the spec. - - ```javascript - function throws(){ - throw new Error('Whoops!'); - } - - let promise = new RSVP.Promise(function(resolve, reject){ - throws(); - }); - - promise.catch(RSVP.rethrow).then(function(){ - // Code here doesn't run because the promise became rejected due to an - // error! - }, function (err){ - // handle the error here - }); - ``` - - The 'Whoops' error will be thrown on the next turn of the event loop - and you can watch for it in your console. You can also handle it using a - rejection handler given to `.then` or `.catch` on the returned promise. - - @method rethrow - @static - @for RSVP - @param {Error} reason reason the promise became rejected. - @throws Error - @static -*/ -function rethrow$1(reason) { - setTimeout(function () { - throw reason; - }); - throw reason; -} - -/** - `RSVP.defer` returns an object similar to jQuery's `$.Deferred`. - `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s - interface. New code should use the `RSVP.Promise` constructor instead. - - The object returned from `RSVP.defer` is a plain object with three properties: - - * promise - an `RSVP.Promise`. - * reject - a function that causes the `promise` property on this object to - become rejected - * resolve - a function that causes the `promise` property on this object to - become fulfilled. - - Example: - - ```javascript - let deferred = RSVP.defer(); - - deferred.resolve("Success!"); - - deferred.promise.then(function(value){ - // value here is "Success!" - }); - ``` - - @method defer - @static - @for RSVP - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Object} - */ -function defer$1(label) { - var deferred = { resolve: undefined, reject: undefined }; - - deferred.promise = new Promise$1(function (resolve, reject) { - deferred.resolve = resolve; - deferred.reject = reject; - }, label); - - return deferred; -} - -/** - `RSVP.map` is similar to JavaScript's native `map` method, except that it - waits for all promises to become fulfilled before running the `mapFn` on - each item in given to `promises`. `RSVP.map` returns a promise that will - become fulfilled with the result of running `mapFn` on the values the promises - become fulfilled with. - - For example: - - ```javascript - - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - let mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(result){ - // result is [ 2, 3, 4 ] - }); - ``` - - If any of the `promises` given to `RSVP.map` are rejected, the first promise - that is rejected will be given as an argument to the returned promise's - rejection handler. For example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error('2')); - let promise3 = RSVP.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - let mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === '2' - }); - ``` - - `RSVP.map` will also wait if a promise is returned from `mapFn`. For example, - say you want to get all comments from a set of blog posts, but you need - the blog posts first because they contain a url to those comments. - - ```javscript - - let mapFn = function(blogPost){ - // getComments does some ajax and returns an RSVP.Promise that is fulfilled - // with some comments data - return getComments(blogPost.comments_url); - }; - - // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled - // with some blog post data - RSVP.map(getBlogPosts(), mapFn).then(function(comments){ - // comments is the result of asking the server for the comments - // of all blog posts returned from getBlogPosts() - }); - ``` - - @method map - @static - @for RSVP - @param {Array} promises - @param {Function} mapFn function to be called on each fulfilled promise. - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled with the result of calling - `mapFn` on each fulfilled promise or value when they become fulfilled. - The promise will be rejected if any of the given `promises` become rejected. - @static -*/ -function map$1(promises, mapFn, label) { - return Promise$1.all(promises, label).then(function (values) { - if (!isFunction(mapFn)) { - throw new TypeError("You must pass a function as map's second argument."); - } - - var length = values.length; - var results = new Array(length); - - for (var i = 0; i < length; i++) { - results[i] = mapFn(values[i]); - } - - return Promise$1.all(results, label); - }); -} - -/** - This is a convenient alias for `RSVP.Promise.resolve`. - - @method resolve - @static - @for RSVP - @param {*} value value that the returned promise will be resolved with - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$3(value, label) { - return Promise$1.resolve(value, label); -} - -/** - This is a convenient alias for `RSVP.Promise.reject`. - - @method reject - @static - @for RSVP - @param {*} reason value that the returned promise will be rejected with. - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$3(reason, label) { - return Promise$1.reject(reason, label); -} - -/** - `RSVP.filter` is similar to JavaScript's native `filter` method, except that it - waits for all promises to become fulfilled before running the `filterFn` on - each item in given to `promises`. `RSVP.filter` returns a promise that will - become fulfilled with the result of running `filterFn` on the values the - promises become fulfilled with. - - For example: - - ```javascript - - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - - let promises = [promise1, promise2, promise3]; - - let filterFn = function(item){ - return item > 1; - }; - - RSVP.filter(promises, filterFn).then(function(result){ - // result is [ 2, 3 ] - }); - ``` - - If any of the `promises` given to `RSVP.filter` are rejected, the first promise - that is rejected will be given as an argument to the returned promise's - rejection handler. For example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error('2')); - let promise3 = RSVP.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - let filterFn = function(item){ - return item > 1; - }; - - RSVP.filter(promises, filterFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === '2' - }); - ``` - - `RSVP.filter` will also wait for any promises returned from `filterFn`. - For instance, you may want to fetch a list of users then return a subset - of those users based on some asynchronous operation: - - ```javascript - - let alice = { name: 'alice' }; - let bob = { name: 'bob' }; - let users = [ alice, bob ]; - - let promises = users.map(function(user){ - return RSVP.resolve(user); - }); - - let filterFn = function(user){ - // Here, Alice has permissions to create a blog post, but Bob does not. - return getPrivilegesForUser(user).then(function(privs){ - return privs.can_create_blog_post === true; - }); - }; - RSVP.filter(promises, filterFn).then(function(users){ - // true, because the server told us only Alice can create a blog post. - users.length === 1; - // false, because Alice is the only user present in `users` - users[0] === bob; - }); - ``` - - @method filter - @static - @for RSVP - @param {Array} promises - @param {Function} filterFn - function to be called on each resolved value to - filter the final results. - @param {String} label optional string describing the promise. Useful for - tooling. - @return {Promise} -*/ - -function resolveAll(promises, label) { - return Promise$1.all(promises, label); -} - -function resolveSingle(promise, label) { - return Promise$1.resolve(promise, label).then(function (promises) { - return resolveAll(promises, label); - }); -} -function filter$1(promises, filterFn, label) { - var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label); - return promise.then(function (values) { - if (!isFunction(filterFn)) { - throw new TypeError("You must pass a function as filter's second argument."); - } - - var length = values.length; - var filtered = new Array(length); - - for (var i = 0; i < length; i++) { - filtered[i] = filterFn(values[i]); - } - - return resolveAll(filtered, label).then(function (filtered) { - var results = new Array(length); - var newLength = 0; - - for (var i = 0; i < length; i++) { - if (filtered[i]) { - results[newLength] = values[i]; - newLength++; - } - } - - results.length = newLength; - - return results; - }); - }); -} - -var len = 0; -var vertxNext = undefined; -function asap$1(callback, arg) { - queue$1[len] = callback; - queue$1[len + 1] = arg; - len += 2; - if (len === 2) { - // If len is 1, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - scheduleFlush$1(); - } -} - -var browserWindow = typeof window !== 'undefined' ? window : undefined; -var browserGlobal = browserWindow || {}; -var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; -var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; - -// test for web worker but not in IE10 -var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; - -// node -function useNextTick() { - var nextTick = process.nextTick; - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // setImmediate should be used instead instead - var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); - if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { - nextTick = setImmediate; - } - return function () { - return nextTick(flush); - }; -} - -// vertx -function useVertxTimer() { - if (typeof vertxNext !== 'undefined') { - return function () { - vertxNext(flush); - }; - } - return useSetTimeout(); -} - -function useMutationObserver() { - var iterations = 0; - var observer = new BrowserMutationObserver(flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); - - return function () { - return node.data = iterations = ++iterations % 2; - }; -} - -// web worker -function useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - return function () { - return channel.port2.postMessage(0); - }; -} - -function useSetTimeout() { - return function () { - return setTimeout(flush, 1); - }; -} - -var queue$1 = new Array(1000); - -function flush() { - for (var i = 0; i < len; i += 2) { - var callback = queue$1[i]; - var arg = queue$1[i + 1]; - - callback(arg); - - queue$1[i] = undefined; - queue$1[i + 1] = undefined; - } - - len = 0; -} - -function attemptVertex() { - try { - var r = require; - var vertx = r('vertx'); - vertxNext = vertx.runOnLoop || vertx.runOnContext; - return useVertxTimer(); - } catch (e) { - return useSetTimeout(); - } -} - -var scheduleFlush$1 = undefined; -// Decide what async method to use to triggering processing of queued callbacks: -if (isNode) { - scheduleFlush$1 = useNextTick(); -} else if (BrowserMutationObserver) { - scheduleFlush$1 = useMutationObserver(); -} else if (isWorker) { - scheduleFlush$1 = useMessageChannel(); -} else if (browserWindow === undefined && typeof require === 'function') { - scheduleFlush$1 = attemptVertex(); -} else { - scheduleFlush$1 = useSetTimeout(); -} - -var platform = undefined; - -/* global self */ -if (typeof self === 'object') { - platform = self; - - /* global global */ -} else if (typeof global === 'object') { - platform = global; - } else { - throw new Error('no global: `self` or `global` found'); - } - -var _async$filter; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -// defaults - -// the default export here is for backwards compat: -// https://github.com/tildeio/rsvp.js/issues/434 -config.async = asap$1; -config.after = function (cb) { - return setTimeout(cb, 0); -}; -var cast = resolve$3; - -var async = function async(callback, arg) { - return config.async(callback, arg); -}; - -function on() { - config['on'].apply(config, arguments); -} - -function off() { - config['off'].apply(config, arguments); -} - -// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` -if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') { - var callbacks = window['__PROMISE_INSTRUMENTATION__']; - configure('instrument', true); - for (var eventName in callbacks) { - if (callbacks.hasOwnProperty(eventName)) { - on(eventName, callbacks[eventName]); - } - } -}var rsvp = (_async$filter = { - asap: asap$1, - cast: cast, - Promise: Promise$1, - EventTarget: EventTarget, - all: all$3, - allSettled: allSettled$1, - race: race$3, - hash: hash$1, - hashSettled: hashSettled$1, - rethrow: rethrow$1, - defer: defer$1, - denodeify: denodeify$1, - configure: configure, - on: on, - off: off, - resolve: resolve$3, - reject: reject$3, - map: map$1 -}, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here... -filter$1), _async$filter); - -exports['default'] = rsvp; -exports.asap = asap$1; -exports.cast = cast; -exports.Promise = Promise$1; -exports.EventTarget = EventTarget; -exports.all = all$3; -exports.allSettled = allSettled$1; -exports.race = race$3; -exports.hash = hash$1; -exports.hashSettled = hashSettled$1; -exports.rethrow = rethrow$1; -exports.defer = defer$1; -exports.denodeify = denodeify$1; -exports.configure = configure; -exports.on = on; -exports.off = off; -exports.resolve = resolve$3; -exports.reject = reject$3; -exports.map = map$1; -exports.async = async; -exports.filter = filter$1; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -// - -'use strict'; - -var EPUBJS = EPUBJS || {}; -EPUBJS.VERSION = "0.2.19"; - -EPUBJS.plugins = EPUBJS.plugins || {}; - -EPUBJS.filePath = EPUBJS.filePath || "/epubjs/"; - -EPUBJS.Render = {}; - -(function(root) { - - var previousEpub = root.ePub || {}; - - var ePub = root.ePub = function() { - var bookPath, options; - - //-- var book = ePub("path/to/book.epub", { restore: true }) - if(typeof(arguments[0]) != 'undefined' && - (typeof arguments[0] === 'string' || arguments[0] instanceof ArrayBuffer)) { - - bookPath = arguments[0]; - - if( arguments[1] && typeof arguments[1] === 'object' ) { - options = arguments[1]; - options.bookPath = bookPath; - } else { - options = { 'bookPath' : bookPath }; - } - - } - - /* - * var book = ePub({ bookPath: "path/to/book.epub", restore: true }); - * - * - OR - - * - * var book = ePub({ restore: true }); - * book.open("path/to/book.epub"); - */ - - if( arguments[0] && typeof arguments[0] === 'object' && !(arguments[0] instanceof ArrayBuffer)) { - options = arguments[0]; - } - - - return new EPUBJS.Book(options); - }; - - //exports to multiple environments - if (typeof define === 'function' && define.amd) { - //AMD - define(['rsvp', 'jszip', 'localforage'], function(RSVP, JSZip, localForage){ return ePub; }); - } else if (typeof module != "undefined" && module.exports) { - //Node - global.RSVP = require('rsvp'); - global.JSZip = require('jszip'); - global.localForage = require('localforage'); - module.exports = ePub; - } - -})(window); - -EPUBJS.Book = function(options){ - - var book = this; - - this.settings = EPUBJS.core.defaults(options || {}, { - bookPath : undefined, - bookKey : undefined, - packageUrl : undefined, - storage: false, //-- true (auto) or false (none) | override: 'ram', 'websqldatabase', 'indexeddb', 'filesystem' - fromStorage : false, - saved : false, - online : true, - contained : false, - width : undefined, - height: undefined, - layoutOveride : undefined, // Default: { spread: 'reflowable', layout: 'auto', orientation: 'auto'} - orientation : undefined, - minSpreadWidth: 768, //-- overridden by spread: none (never) / both (always) - gap: "auto", //-- "auto" or int - version: 1, - restore: false, - reload : false, - goto : false, - styles : {}, - classes : [], - headTags : {}, - withCredentials: false, - render_method: "Iframe", - displayLastPage: false - }); - - this.settings.EPUBJSVERSION = EPUBJS.VERSION; - - this.spinePos = 0; - this.stored = false; - - //-- All Book events for listening - /* - book:ready - book:stored - book:online - book:offline - book:pageChanged - book:loadFailed - book:loadChapterFailed - */ - - //-- Adds Hook methods to the Book prototype - // Hooks will all return before triggering the callback. - // EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - // this.getHooks("beforeChapterDisplay"); - - this.online = this.settings.online || navigator.onLine; - this.networkListeners(); - - this.ready = { - manifest: new RSVP.defer(), - spine: new RSVP.defer(), - metadata: new RSVP.defer(), - cover: new RSVP.defer(), - toc: new RSVP.defer(), - pageList: new RSVP.defer() - }; - - this.readyPromises = [ - this.ready.manifest.promise, - this.ready.spine.promise, - this.ready.metadata.promise, - this.ready.cover.promise, - this.ready.toc.promise - ]; - - this.pageList = []; - this.pagination = new EPUBJS.Pagination(); - this.pageListReady = this.ready.pageList.promise; - - this.ready.all = RSVP.all(this.readyPromises); - - this.ready.all.then(this._ready.bind(this)); - - // Queue for methods used before rendering - this.isRendered = false; - this._q = EPUBJS.core.queue(this); - // Queue for rendering - this._rendering = false; - this._displayQ = EPUBJS.core.queue(this); - // Queue for going to another location - this._moving = false; - this._gotoQ = EPUBJS.core.queue(this); - - /** - * Creates a new renderer. - * The renderer will handle displaying the content using the method provided in the settings - */ - this.renderer = new EPUBJS.Renderer(this.settings.render_method); - //-- Set the width at which to switch from spreads to single pages - this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - this.renderer.setGap(this.settings.gap); - //-- Pass through the renderer events - this.listenToRenderer(this.renderer); - - this.defer_opened = new RSVP.defer(); - this.opened = this.defer_opened.promise; - - this.store = false; //-- False if not using storage; - - //-- Determine storage method - //-- Override options: none | ram | websqldatabase | indexeddb | filesystem - if(this.settings.storage !== false){ - // this.storage = new fileStorage.storage(this.settings.storage); - this.fromStorage(true); - } - - // BookUrl is optional, but if present start loading process - if(typeof this.settings.bookPath === 'string' || this.settings.bookPath instanceof ArrayBuffer) { - this.open(this.settings.bookPath, this.settings.reload); - } - - window.addEventListener("beforeunload", this.unload.bind(this), false); - - //-- Listen for these promises: - //-- book.opened.then() - //-- book.rendered.then() -}; - -//-- Check bookUrl and start parsing book Assets or load them from storage -EPUBJS.Book.prototype.open = function(bookPath, forceReload){ - var book = this, - epubpackage, - opened = new RSVP.defer(); - - this.settings.bookPath = bookPath; - - if(this.settings.contained || this.isContained(bookPath)){ - - this.settings.contained = this.contained = true; - - this.bookUrl = ''; - - epubpackage = this.unarchive(bookPath). - then(function(){ - return book.loadPackage(); - }); - - } else { - //-- Get a absolute URL from the book path - this.bookUrl = this.urlFrom(bookPath); - - epubpackage = this.loadPackage(); - } - - if(this.settings.restore && !forceReload && localStorage){ - //-- Will load previous package json, or re-unpack if error - epubpackage.then(function(packageXml) { - var identifier = book.packageIdentifier(packageXml); - var restored = book.restore(identifier); - - if(!restored) { - book.unpack(packageXml); - } - opened.resolve(); - book.defer_opened.resolve(); - }); - - }else{ - - //-- Get package information from epub opf - epubpackage.then(function(packageXml) { - book.unpack(packageXml); - opened.resolve(); - book.defer_opened.resolve(); - }); - } - - this._registerReplacements(this.renderer); - - return opened.promise; - -}; - -EPUBJS.Book.prototype.loadPackage = function(_containerPath){ - var book = this, - parse = new EPUBJS.Parser(), - containerPath = _containerPath || "META-INF/container.xml", - containerXml, - packageXml; - - if(!this.settings.packageUrl) { //-- provide the packageUrl to skip this step - packageXml = book.loadXml(book.bookUrl + containerPath). - then(function(containerXml){ - return parse.container(containerXml); // Container has path to content - }). - then(function(paths){ - book.settings.contentsPath = book.bookUrl + paths.basePath; - book.settings.packageUrl = book.bookUrl + paths.packagePath; - book.settings.encoding = paths.encoding; - return book.loadXml(book.settings.packageUrl); // Containes manifest, spine and metadata - }); - } else { - packageXml = book.loadXml(book.settings.packageUrl); - } - - packageXml.catch(function(error) { - // handle errors in either of the two requests - console.error("Could not load book at: "+ containerPath); - book.trigger("book:loadFailed", containerPath); - }); - return packageXml; -}; - -EPUBJS.Book.prototype.packageIdentifier = function(packageXml){ - var book = this, - parse = new EPUBJS.Parser(); - - return parse.identifier(packageXml); -}; - -EPUBJS.Book.prototype.unpack = function(packageXml){ - var book = this, - parse = new EPUBJS.Parser(); - - book.contents = parse.packageContents(packageXml, book.settings.contentsPath); // Extract info from contents - - book.manifest = book.contents.manifest; - book.spine = book.contents.spine; - book.spineIndexByURL = book.contents.spineIndexByURL; - book.metadata = book.contents.metadata; - if(!book.settings.bookKey) { - book.settings.bookKey = book.generateBookKey(book.metadata.identifier); - } - - //-- Set Globbal Layout setting based on metadata - book.globalLayoutProperties = book.parseLayoutProperties(book.metadata); - - if(book.contents.coverPath) { - book.cover = book.contents.cover = book.settings.contentsPath + book.contents.coverPath; - } - - book.spineNodeIndex = book.contents.spineNodeIndex; - - book.ready.manifest.resolve(book.contents.manifest); - book.ready.spine.resolve(book.contents.spine); - book.ready.metadata.resolve(book.contents.metadata); - book.ready.cover.resolve(book.contents.cover); - - book.locations = new EPUBJS.Locations(book.spine, book.store, book.settings.withCredentials); - - //-- Load the TOC, optional; either the EPUB3 XHTML Navigation file or the EPUB2 NCX file - if(book.contents.navPath) { - book.settings.navUrl = book.settings.contentsPath + book.contents.navPath; - - book.loadXml(book.settings.navUrl). - then(function(navHtml){ - return parse.nav(navHtml, book.spineIndexByURL, book.spine); // Grab Table of Contents - }).then(function(toc){ - book.toc = book.contents.toc = toc; - book.ready.toc.resolve(book.contents.toc); - }, function(error) { - book.ready.toc.resolve(false); - }); - - // Load the optional pageList - book.loadXml(book.settings.navUrl). - then(function(navHtml){ - return parse.pageList(navHtml, book.spineIndexByURL, book.spine); - }).then(function(pageList){ - var epubcfi = new EPUBJS.EpubCFI(); - var wait = 0; // need to generate a cfi - - // No pageList found - if(pageList.length === 0) { - return; - } - - book.pageList = book.contents.pageList = pageList; - - // Replace HREFs with CFI - book.pageList.forEach(function(pg){ - if(!pg.cfi) { - wait += 1; - epubcfi.generateCfiFromHref(pg.href, book).then(function(cfi){ - pg.cfi = cfi; - pg.packageUrl = book.settings.packageUrl; - - wait -= 1; - if(wait === 0) { - book.pagination.process(book.pageList); - book.ready.pageList.resolve(book.pageList); - } - }); - } - }); - - if(!wait) { - book.pagination.process(book.pageList); - book.ready.pageList.resolve(book.pageList); - } - - }, function(error) { - book.ready.pageList.resolve([]); - }); - } else if(book.contents.tocPath) { - book.settings.tocUrl = book.settings.contentsPath + book.contents.tocPath; - - book.loadXml(book.settings.tocUrl). - then(function(tocXml){ - return parse.toc(tocXml, book.spineIndexByURL, book.spine); // Grab Table of Contents - }, function(err) { - console.error(err); - }).then(function(toc){ - book.toc = book.contents.toc = toc; - book.ready.toc.resolve(book.contents.toc); - }, function(error) { - book.ready.toc.resolve(false); - }); - - } else { - book.ready.toc.resolve(false); - } - -}; - -EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) { - var box = this.element.getBoundingClientRect(); - var width = _width || this.settings.width || box.width; - var height = _height || this.settings.height || box.height; - var hiddenContainer; - var hiddenEl; - renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - renderer.setGap(this.settings.gap); - - this._registerReplacements(renderer); - if(this.settings.forceSingle) { - renderer.forceSingle(true); - } - - hiddenContainer = document.createElement("div"); - hiddenContainer.style.visibility = "hidden"; - hiddenContainer.style.overflow = "hidden"; - hiddenContainer.style.width = "0"; - hiddenContainer.style.height = "0"; - this.element.appendChild(hiddenContainer); - - hiddenEl = document.createElement("div"); - hiddenEl.style.visibility = "hidden"; - hiddenEl.style.overflow = "hidden"; - hiddenEl.style.width = width + "px";//"0"; - hiddenEl.style.height = height +"px"; //"0"; - hiddenContainer.appendChild(hiddenEl); - - renderer.initialize(hiddenEl, this.settings.width, this.settings.height); - return hiddenContainer; -}; - -// Generates the pageList array by loading every chapter and paging through them -EPUBJS.Book.prototype.generatePageList = function(width, height, flag){ - var pageList = []; - var pager = new EPUBJS.Renderer(this.settings.render_method, false); //hidden - var hiddenContainer = this.createHiddenRender(pager, width, height); - var deferred = new RSVP.defer(); - var spinePos = -1; - var spineLength = this.spine.length; - var totalPages = 0; - var currentPage = 0; - var nextChapter = function(deferred){ - var chapter; - var next = spinePos + 1; - var done = deferred || new RSVP.defer(); - var loaded; - if(next >= spineLength) { - done.resolve(); - } else { - if (flag && flag.cancelled) { - pager.remove(); - this.element.removeChild(hiddenContainer); - done.reject(new Error("User cancelled")); - return; - } - - spinePos = next; - chapter = new EPUBJS.Chapter(this.spine[spinePos], this.store); - pager.displayChapter(chapter, this.globalLayoutProperties).then(function(chap){ - pager.pageMap.forEach(function(item){ - currentPage += 1; - pageList.push({ - "cfi" : item.start, - "page" : currentPage - }); - - }); - - if(pager.pageMap.length % 2 > 0 && - pager.spreads) { - currentPage += 1; // Handle Spreads - pageList.push({ - "cfi" : pager.pageMap[pager.pageMap.length - 1].end, - "page" : currentPage - }); - } - - // Load up the next chapter - setTimeout(function(){ - nextChapter(done); - }, 1); - }); - } - return done.promise; - }.bind(this); - - var finished = nextChapter().then(function(){ - pager.remove(); - this.element.removeChild(hiddenContainer); - deferred.resolve(pageList); - }.bind(this), function(reason) { - deferred.reject(reason); - }); - - return deferred.promise; -}; - -// Render out entire book and generate the pagination -// Width and Height are optional and will default to the current dimensions -EPUBJS.Book.prototype.generatePagination = function(width, height, flag) { - var book = this; - var defered = new RSVP.defer(); - - this.ready.spine.promise.then(function(){ - book.generatePageList(width, height, flag).then(function(pageList){ - book.pageList = book.contents.pageList = pageList; - book.pagination.process(pageList); - book.ready.pageList.resolve(book.pageList); - defered.resolve(book.pageList); - }, function(reason) { - defered.reject(reason); - }); - }); - - return defered.promise; -}; - -// Process the pagination from a JSON array containing the pagelist -EPUBJS.Book.prototype.loadPagination = function(pagelistJSON) { - var pageList; - - if (typeof(pagelistJSON) === "string") { - pageList = JSON.parse(pagelistJSON); - } else { - pageList = pagelistJSON; - } - - if(pageList && pageList.length) { - this.pageList = pageList; - this.pagination.process(this.pageList); - this.ready.pageList.resolve(this.pageList); - } - return this.pageList; -}; - -EPUBJS.Book.prototype.getPageList = function() { - return this.ready.pageList.promise; -}; - -EPUBJS.Book.prototype.getMetadata = function() { - return this.ready.metadata.promise; -}; - -EPUBJS.Book.prototype.getToc = function() { - return this.ready.toc.promise; -}; - -/* Private Helpers */ - -//-- Listeners for browser events -EPUBJS.Book.prototype.networkListeners = function(){ - var book = this; - window.addEventListener("offline", function(e) { - book.online = false; - if (book.settings.storage) { - book.fromStorage(true); - } - book.trigger("book:offline"); - }, false); - - window.addEventListener("online", function(e) { - book.online = true; - if (book.settings.storage) { - book.fromStorage(false); - } - book.trigger("book:online"); - }, false); - -}; - -// Listen to all events the renderer triggers and pass them as book events -EPUBJS.Book.prototype.listenToRenderer = function(renderer){ - var book = this; - renderer.Events.forEach(function(eventName){ - renderer.on(eventName, function(e){ - book.trigger(eventName, e); - }); - }); - - renderer.on("renderer:visibleRangeChanged", function(range) { - var startPage, endPage, percent; - var pageRange = []; - - if(this.pageList.length > 0) { - startPage = this.pagination.pageFromCfi(range.start); - percent = this.pagination.percentageFromPage(startPage); - pageRange.push(startPage); - - if(range.end) { - endPage = this.pagination.pageFromCfi(range.end); - //if(startPage != endPage) { - pageRange.push(endPage); - //} - } - this.trigger("book:pageChanged", { - "anchorPage": startPage, - "percentage": percent, - "pageRange" : pageRange - }); - - // TODO: Add event for first and last page. - // (though last is going to be hard, since it could be several reflowed pages long) - } - }.bind(this)); - - renderer.on("render:loaded", this.loadChange.bind(this)); -}; - -// Listens for load events from the Renderer and checks against the current chapter -// Prevents the Render from loading a different chapter when back button is pressed -EPUBJS.Book.prototype.loadChange = function(url){ - var uri = EPUBJS.core.uri(url); - var chapterUri = EPUBJS.core.uri(this.currentChapter.absolute); - var spinePos, chapter; - - if(uri.path != chapterUri.path){ - console.warn("Miss Match", uri.path, this.currentChapter.absolute); - // this.goto(uri.filename); - - // Set the current chapter to what is being displayed - spinePos = this.spineIndexByURL[uri.filename]; - chapter = new EPUBJS.Chapter(this.spine[spinePos], this.store); - this.currentChapter = chapter; - - // setup the renderer with the displayed chapter - this.renderer.currentChapter = chapter; - this.renderer.afterLoad(this.renderer.render.docEl); - this.renderer.beforeDisplay(function () { - this.renderer.afterDisplay(); - }.bind(this)); - - } else if(!this._rendering) { - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.unlistenToRenderer = function(renderer){ - renderer.Events.forEach(function(eventName){ - renderer.off(eventName); - }); -}; - -//-- Returns the cover -EPUBJS.Book.prototype.coverUrl = function(){ - var retrieved = this.ready.cover.promise - .then(function(url) { - if(this.settings.fromStorage) { - return this.store.getUrl(this.contents.cover); - } else if(this.settings.contained) { - return this.zip.getUrl(this.contents.cover); - }else{ - return this.contents.cover; - } - }.bind(this)); - - retrieved.then(function(url) { - this.cover = url; - }.bind(this)); - - return retrieved; -}; - -//-- Choose between a request from store or a request from network -EPUBJS.Book.prototype.loadXml = function(url){ - if(this.settings.fromStorage) { - return this.store.getXml(url, this.settings.encoding); - } else if(this.settings.contained) { - return this.zip.getXml(url, this.settings.encoding); - }else{ - return EPUBJS.core.request(url, 'xml', this.settings.withCredentials); - } -}; - -//-- Turns a url into a absolute url -EPUBJS.Book.prototype.urlFrom = function(bookPath){ - var uri = EPUBJS.core.uri(bookPath), - absolute = uri.protocol, - fromRoot = uri.path[0] == "/", - location = window.location, - //-- Get URL orgin, try for native or combine - origin = location.origin || location.protocol + "//" + location.host, - baseTag = document.getElementsByTagName('base'), - base; - - - //-- Check is Base tag is set - - if(baseTag.length) { - base = baseTag[0].href; - } - - //-- 1. Check if url is absolute - if(uri.protocol){ - return uri.origin + uri.path; - } - - //-- 2. Check if url starts with /, add base url - if(!absolute && fromRoot){ - return (base || origin) + uri.path; - } - - //-- 3. Or find full path to url and add that - if(!absolute && !fromRoot){ - return EPUBJS.core.resolveUrl(base || location.pathname, uri.path); - } - -}; - - -EPUBJS.Book.prototype.unarchive = function(bookPath){ - var book = this, - unarchived; - - //-- Must use storage - // if(this.settings.storage == false ){ - // this.settings.storage = true; - // this.storage = new fileStorage.storage(); - // } - - this.zip = new EPUBJS.Unarchiver(); - this.store = this.zip; // Use zip storaged in ram - return this.zip.open(bookPath); -}; - -//-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub) -EPUBJS.Book.prototype.isContained = function(bookUrl){ - if (bookUrl instanceof ArrayBuffer) { - return true; - } - var uri = EPUBJS.core.uri(bookUrl); - - if(uri.extension && (uri.extension == "epub" || uri.extension == "zip")){ - return true; - } - - return false; -}; - -//-- Checks if the book can be retrieved from localStorage -EPUBJS.Book.prototype.isSaved = function(bookKey) { - var storedSettings; - - if(!localStorage) { - return false; - } - - storedSettings = localStorage.getItem(bookKey); - - if( !localStorage || - storedSettings === null) { - return false; - } else { - return true; - } -}; - -// Generates the Book Key using the identifer in the manifest or other string provided -EPUBJS.Book.prototype.generateBookKey = function(identifier){ - return "epubjs:" + EPUBJS.VERSION + ":" + window.location.host + ":" + identifier; -}; - -EPUBJS.Book.prototype.saveContents = function(){ - if(!localStorage) { - return false; - } - localStorage.setItem(this.settings.bookKey, JSON.stringify(this.contents)); -}; - -EPUBJS.Book.prototype.removeSavedContents = function() { - if(!localStorage) { - return false; - } - localStorage.removeItem(this.settings.bookKey); -}; - - - -//-- Takes a string or a element -EPUBJS.Book.prototype.renderTo = function(elem){ - var book = this, - rendered; - - if(EPUBJS.core.isElement(elem)) { - this.element = elem; - } else if (typeof elem == "string") { - this.element = EPUBJS.core.getEl(elem); - } else { - console.error("Not an Element"); - return; - } - - rendered = this.opened. - then(function(){ - // book.render = new EPUBJS.Renderer[this.settings.renderer](book); - book.renderer.initialize(book.element, book.settings.width, book.settings.height); - - if(book.metadata.direction) { - book.renderer.setDirection(book.metadata.direction); - } - - book._rendered(); - return book.startDisplay(); - }); - - // rendered.then(null, function(error) { console.error(error); }); - - return rendered; -}; - -EPUBJS.Book.prototype.startDisplay = function(){ - var display; - - if(this.settings.goto) { - display = this.goto(this.settings.goto); - }else if(this.settings.previousLocationCfi) { - display = this.gotoCfi(this.settings.previousLocationCfi); - }else{ - display = this.displayChapter(this.spinePos, this.settings.displayLastPage); - } - - return display; -}; - -EPUBJS.Book.prototype.restore = function(identifier){ - - var book = this, - fetch = ['manifest', 'spine', 'metadata', 'cover', 'toc', 'spineNodeIndex', 'spineIndexByURL', 'globalLayoutProperties'], - reject = false, - bookKey = this.generateBookKey(identifier), - fromStore = localStorage.getItem(bookKey), - len = fetch.length, - i; - - if(this.settings.clearSaved) reject = true; - - if(!reject && fromStore != 'undefined' && fromStore !== null){ - book.contents = JSON.parse(fromStore); - - for(i = 0; i < len; i++) { - var item = fetch[i]; - - if(!book.contents[item]) { - reject = true; - break; - } - book[item] = book.contents[item]; - } - } - - if(reject || !fromStore || !this.contents || !this.settings.contentsPath){ - return false; - }else{ - this.settings.bookKey = bookKey; - this.ready.manifest.resolve(this.manifest); - this.ready.spine.resolve(this.spine); - this.ready.metadata.resolve(this.metadata); - this.ready.cover.resolve(this.cover); - this.ready.toc.resolve(this.toc); - return true; - } - -}; - -EPUBJS.Book.prototype.displayChapter = function(chap, end, deferred){ - var book = this, - render, - cfi, - pos, - store, - defer = deferred || new RSVP.defer(); - - var chapter; - - if(!this.isRendered) { - this._q.enqueue("displayChapter", arguments); - // Reject for now. TODO: pass promise to queue - defer.reject({ - message : "Rendering", - stack : new Error().stack - }); - return defer.promise; - } - - - if(this._rendering || this.renderer._moving) { - // Pass along the current defer - this._displayQ.enqueue("displayChapter", [chap, end, defer]); - return defer.promise; - } - - if(EPUBJS.core.isNumber(chap)){ - pos = chap; - }else{ - cfi = new EPUBJS.EpubCFI(chap); - pos = cfi.spinePos; - } - - if(pos < 0 || pos >= this.spine.length){ - console.warn("Not A Valid Location"); - pos = 0; - end = false; - cfi = false; - } - - //-- Create a new chapter - chapter = new EPUBJS.Chapter(this.spine[pos], this.store); - - this._rendering = true; - - if(this._needsAssetReplacement()) { - - chapter.registerHook("beforeChapterRender", [ - EPUBJS.replace.head, - EPUBJS.replace.resources, - EPUBJS.replace.posters, - EPUBJS.replace.svg - ], true); - - } - - book.currentChapter = chapter; - - render = book.renderer.displayChapter(chapter, this.globalLayoutProperties); - if(cfi) { - book.renderer.gotoCfi(cfi); - } else if(end) { - book.renderer.lastPage(); - } - //-- Success, Clear render queue - render.then(function(rendered){ - // var inwait; - //-- Set the book's spine position - book.spinePos = pos; - - defer.resolve(book.renderer); - - if(book.settings.fromStorage === false && - book.settings.contained === false) { - book.preloadNextChapter(); - } - - book._rendering = false; - book._displayQ.dequeue(); - if(book._displayQ.length() === 0) { - book._gotoQ.dequeue(); - } - - }, function(error) { - // handle errors in either of the two requests - console.error("Could not load Chapter: "+ chapter.absolute, error); - book.trigger("book:chapterLoadFailed", chapter.absolute); - book._rendering = false; - defer.reject(error); - }); - - return defer.promise; -}; - -EPUBJS.Book.prototype.nextPage = function(defer){ - var defer = defer || new RSVP.defer(); - - if (!this.isRendered) { - this._q.enqueue("nextPage", [defer]); - return defer.promise; - } - - var next = this.renderer.nextPage(); - if (!next){ - return this.nextChapter(defer); - } - - defer.resolve(true); - return defer.promise; -}; - -EPUBJS.Book.prototype.prevPage = function(defer) { - var defer = defer || new RSVP.defer(); - - if (!this.isRendered) { - this._q.enqueue("prevPage", [defer]); - return defer.promise; - } - - var prev = this.renderer.prevPage(); - if (!prev){ - return this.prevChapter(defer); - } - - defer.resolve(true); - return defer.promise; -}; - -EPUBJS.Book.prototype.nextChapter = function(defer) { - var defer = defer || new RSVP.defer(); - - if (this.spinePos < this.spine.length - 1) { - var next = this.spinePos + 1; - // Skip non linear chapters - while (this.spine[next] && this.spine[next].linear && this.spine[next].linear == 'no') { - next++; - } - if (next < this.spine.length) { - return this.displayChapter(next, false, defer); - } - } - - this.trigger("book:atEnd"); - defer.resolve(true); - return defer.promise; -}; - -EPUBJS.Book.prototype.prevChapter = function(defer) { - var defer = defer || new RSVP.defer(); - - if (this.spinePos > 0) { - var prev = this.spinePos - 1; - while (this.spine[prev] && this.spine[prev].linear && this.spine[prev].linear == 'no') { - prev--; - } - if (prev >= 0) { - return this.displayChapter(prev, true, defer); - } - } - - this.trigger("book:atStart"); - defer.resolve(true); - return defer.promise; -}; - -EPUBJS.Book.prototype.getCurrentLocationCfi = function() { - if(!this.isRendered) return false; - return this.renderer.currentLocationCfi; -}; - -EPUBJS.Book.prototype.goto = function(target){ - - if(target.indexOf("epubcfi(") === 0) { - return this.gotoCfi(target); - } else if(target.indexOf("%") === target.length-1) { - return this.gotoPercentage(parseInt(target.substring(0, target.length-1))/100); - } else if(typeof target === "number" || isNaN(target) === false){ - return this.gotoPage(target); - } else { - return this.gotoHref(target); - } - -}; - -EPUBJS.Book.prototype.gotoCfi = function(cfiString, defer){ - var cfi, - spinePos, - spineItem, - rendered, - promise, - render, - deferred = defer || new RSVP.defer(); - - if(!this.isRendered) { - console.warn("Not yet Rendered"); - this.settings.previousLocationCfi = cfiString; - return false; - } - - // Currently going to a chapter - if(this._moving || this._rendering) { - console.warn("Renderer is moving"); - this._gotoQ.enqueue("gotoCfi", [cfiString, deferred]); - return false; - } - - cfi = new EPUBJS.EpubCFI(cfiString); - spinePos = cfi.spinePos; - - if(spinePos == -1) { - return false; - } - - spineItem = this.spine[spinePos]; - promise = deferred.promise; - this._moving = true; - //-- If same chapter only stay on current chapter - if(this.currentChapter && this.spinePos === spinePos){ - this.renderer.gotoCfi(cfi); - this._moving = false; - deferred.resolve(this.renderer.currentLocationCfi); - } else { - - if(!spineItem || spinePos == -1) { - spinePos = 0; - spineItem = this.spine[spinePos]; - } - - render = this.displayChapter(cfiString); - - render.then(function(rendered){ - this._moving = false; - deferred.resolve(rendered.currentLocationCfi); - }.bind(this), function() { - this._moving = false; - }.bind(this)); - - } - - promise.then(function(){ - this._gotoQ.dequeue(); - }.bind(this)); - - return promise; -}; - -EPUBJS.Book.prototype.gotoHref = function(url, defer){ - var split, chapter, section, relativeURL, spinePos; - var deferred = defer || new RSVP.defer(); - - if(!this.isRendered) { - this.settings.goto = url; - return false; - } - - // Currently going to a chapter - if(this._moving || this._rendering) { - this._gotoQ.enqueue("gotoHref", [url, deferred]); - return false; - } - - split = url.split("#"); - chapter = split[0]; - section = split[1] || false; - if (chapter.search("://") == -1) { - relativeURL = chapter.replace(EPUBJS.core.uri(this.settings.contentsPath).path, ''); - } else { - relativeURL = chapter.replace(this.settings.contentsPath, ''); - } - spinePos = this.spineIndexByURL[relativeURL]; - - //-- If link fragment only stay on current chapter - if(!chapter){ - spinePos = this.currentChapter ? this.currentChapter.spinePos : 0; - } - - //-- Check that URL is present in the index, or stop - if(typeof(spinePos) != "number") return false; - - if(!this.currentChapter || spinePos != this.currentChapter.spinePos){ - //-- Load new chapter if different than current - return this.displayChapter(spinePos).then(function(){ - if(section){ - this.renderer.section(section); - } - deferred.resolve(this.renderer.currentLocationCfi); - }.bind(this)); - }else{ - //-- Goto section - if(section) { - this.renderer.section(section); - } else { - // Or jump to the start - this.renderer.firstPage(); - } - deferred.resolve(this.renderer.currentLocationCfi); - } - - deferred.promise.then(function(){ - this._gotoQ.dequeue(); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Book.prototype.gotoPage = function(pg){ - var cfi = this.pagination.cfiFromPage(pg); - return this.gotoCfi(cfi); -}; - -EPUBJS.Book.prototype.gotoPercentage = function(percent){ - var pg = this.pagination.pageFromPercentage(percent); - return this.gotoPage(pg); -}; - -EPUBJS.Book.prototype.preloadNextChapter = function() { - var next; - var chap = this.spinePos + 1; - - if(chap >= this.spine.length){ - return false; - } - - next = new EPUBJS.Chapter(this.spine[chap]); - if(next) { - EPUBJS.core.request(next.absolute); - } -}; - -EPUBJS.Book.prototype.storeOffline = function() { - var book = this, - assets = EPUBJS.core.values(this.manifest); - - //-- Creates a queue of all items to load - return this.store.put(assets). - then(function(){ - book.settings.stored = true; - book.trigger("book:stored"); - }); -}; - -EPUBJS.Book.prototype.availableOffline = function() { - return this.settings.stored > 0 ? true : false; -}; - -EPUBJS.Book.prototype.toStorage = function () { - var key = this.settings.bookKey; - this.store.isStored(key).then(function(stored) { - - if (stored === true) { - this.settings.stored = true; - return true; - } - - return this.storeOffline() - .then(function() { - this.store.token(key, true); - }.bind(this)); - - }.bind(this)); - -}; -EPUBJS.Book.prototype.fromStorage = function(stored) { - var hooks = [ - EPUBJS.replace.head, - EPUBJS.replace.resources, - EPUBJS.replace.posters, - EPUBJS.replace.svg - ]; - - if(this.contained || this.settings.contained) return; - - //-- If there is network connection, store the books contents - if(this.online){ - this.opened.then(this.toStorage.bind(this)); - } - - if(this.store && this.settings.fromStorage && stored === false){ - this.settings.fromStorage = false; - this.store.off("offline"); - // this.renderer.removeHook("beforeChapterRender", hooks, true); - this.store = false; - }else if(!this.settings.fromStorage){ - - this.store = new EPUBJS.Storage(this.settings.credentials); - this.store.on("offline", function (offline) { - if (!offline) { - // Online - this.offline = false; - this.settings.fromStorage = false; - // this.renderer.removeHook("beforeChapterRender", hooks, true); - this.trigger("book:online"); - } else { - // Offline - this.offline = true; - this.settings.fromStorage = true; - // this.renderer.registerHook("beforeChapterRender", hooks, true); - this.trigger("book:offline"); - } - }.bind(this)); - - } - -}; - -EPUBJS.Book.prototype.setStyle = function(style, val, prefixed) { - var noreflow = ["color", "background", "background-color"]; - - if(!this.isRendered) return this._q.enqueue("setStyle", arguments); - - this.settings.styles[style] = val; - - this.renderer.setStyle(style, val, prefixed); - - if(noreflow.indexOf(style) === -1) { - // clearTimeout(this.reformatTimeout); - // this.reformatTimeout = setTimeout(function(){ - this.renderer.reformat(); - // }.bind(this), 10); - } -}; - -EPUBJS.Book.prototype.removeStyle = function(style) { - if(!this.isRendered) return this._q.enqueue("removeStyle", arguments); - this.renderer.removeStyle(style); - this.renderer.reformat(); - delete this.settings.styles[style]; -}; - -EPUBJS.Book.prototype.resetClasses = function(classes) { - - if(!this.isRendered) return this._q.enqueue("setClasses", arguments); - - if(classes.constructor === String) classes = [ classes ]; - - this.settings.classes = classes; - - this.renderer.setClasses(this.settings.classes); - this.renderer.reformat(); -}; - -EPUBJS.Book.prototype.addClass = function(aClass) { - - if(!this.isRendered) return this._q.enqueue("addClass", arguments); - - if(this.settings.classes.indexOf(aClass) == -1) { - this.settings.classes.push(aClass); - } - - this.renderer.setClasses(this.settings.classes); - this.renderer.reformat(); -}; - -EPUBJS.Book.prototype.removeClass = function(aClass) { - - if(!this.isRendered) return this._q.enqueue("removeClass", arguments); - - var idx = this.settings.classes.indexOf(aClass); - - if(idx != -1) { - - delete this.settings.classes[idx]; - - this.renderer.setClasses(this.settings.classes); - this.renderer.reformat(); - - } - -}; - -EPUBJS.Book.prototype.addHeadTag = function(tag, attrs) { - if(!this.isRendered) return this._q.enqueue("addHeadTag", arguments); - this.settings.headTags[tag] = attrs; -}; - -EPUBJS.Book.prototype.useSpreads = function(use) { - console.warn("useSpreads is deprecated, use forceSingle or set a layoutOveride instead"); - if(use === false) { - this.forceSingle(true); - } else { - this.forceSingle(false); - } -}; - -EPUBJS.Book.prototype.forceSingle = function(_use) { - var force = typeof _use === "undefined" ? true : _use; - - this.renderer.forceSingle(force); - this.settings.forceSingle = force; - if(this.isRendered) { - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.setMinSpreadWidth = function(width) { - this.settings.minSpreadWidth = width; - if(this.isRendered) { - this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth); - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.setGap = function(gap) { - this.settings.gap = gap; - if(this.isRendered) { - this.renderer.setGap(this.settings.gap); - this.renderer.reformat(); - } -}; - -EPUBJS.Book.prototype.chapter = function(path) { - var spinePos = this.spineIndexByURL[path]; - var spineItem; - var chapter; - - if(spinePos){ - spineItem = this.spine[spinePos]; - chapter = new EPUBJS.Chapter(spineItem, this.store, this.settings.withCredentials); - chapter.load(); - } - return chapter; -}; - -EPUBJS.Book.prototype.unload = function(){ - - if(this.settings.restore && localStorage) { - this.saveContents(); - } - - this.unlistenToRenderer(this.renderer); - - this.trigger("book:unload"); -}; - -EPUBJS.Book.prototype.destroy = function() { - - window.removeEventListener("beforeunload", this.unload); - - if(this.currentChapter) this.currentChapter.unload(); - - this.unload(); - - if(this.renderer) this.renderer.remove(); - -}; - -EPUBJS.Book.prototype._ready = function() { - - this.trigger("book:ready"); - -}; - -EPUBJS.Book.prototype._rendered = function(err) { - var book = this; - - this.isRendered = true; - this.trigger("book:rendered"); - - this._q.flush(); -}; - - -EPUBJS.Book.prototype.applyStyles = function(renderer, callback){ - // if(!this.isRendered) return this._q.enqueue("applyStyles", arguments); - renderer.applyStyles(this.settings.styles); - callback(); -}; - -EPUBJS.Book.prototype.applyClasses = function(renderer, callback){ - // if(!this.isRendered) return this._q.enqueue("applyClasses", arguments); - renderer.setClasses(this.settings.classes); - callback(); -}; - -EPUBJS.Book.prototype.applyHeadTags = function(renderer, callback){ - // if(!this.isRendered) return this._q.enqueue("applyHeadTags", arguments); - renderer.applyHeadTags(this.settings.headTags); - callback(); -}; - -EPUBJS.Book.prototype._registerReplacements = function(renderer){ - renderer.registerHook("beforeChapterDisplay", this.applyStyles.bind(this, renderer), true); - renderer.registerHook("beforeChapterDisplay", this.applyHeadTags.bind(this, renderer), true); - renderer.registerHook("beforeChapterDisplay", this.applyClasses.bind(this, renderer), true); - renderer.registerHook("beforeChapterDisplay", EPUBJS.replace.hrefs.bind(this), true); -}; - -EPUBJS.Book.prototype._needsAssetReplacement = function(){ - if(this.settings.fromStorage) { - - //-- Filesystem api links are relative, so no need to replace them - // if(this.storage.getStorageType() == "filesystem") { - // return false; - // } - - return true; - - } else if(this.settings.contained) { - - return true; - - } else { - - return false; - - } -}; - - -//-- http://www.idpf.org/epub/fxl/ -EPUBJS.Book.prototype.parseLayoutProperties = function(metadata){ - var layout = (this.settings.layoutOveride && this.settings.layoutOveride.layout) || metadata.layout || "reflowable"; - var spread = (this.settings.layoutOveride && this.settings.layoutOveride.spread) || metadata.spread || "auto"; - var orientation = (this.settings.layoutOveride && this.settings.layoutOveride.orientation) || metadata.orientation || "auto"; - return { - layout : layout, - spread : spread, - orientation : orientation - }; -}; - -//-- Enable binding events to book -RSVP.EventTarget.mixin(EPUBJS.Book.prototype); - -//-- Handle RSVP Errors -RSVP.on('error', function(event) { - console.error(event); -}); - -RSVP.configure('instrument', true); //-- true | will logging out all RSVP rejections -// RSVP.on('created', listener); -// RSVP.on('chained', listener); -// RSVP.on('fulfilled', listener); -// RSVP.on('rejected', function(event){ -// console.error(event.detail.message, event.detail.stack); -// }); - -EPUBJS.Chapter = function(spineObject, store, credentials){ - this.href = spineObject.href; - this.absolute = spineObject.url; - this.id = spineObject.id; - this.spinePos = spineObject.index; - this.cfiBase = spineObject.cfiBase; - this.properties = spineObject.properties; - this.manifestProperties = spineObject.manifestProperties; - this.linear = spineObject.linear; - this.pages = 1; - this.store = store; - this.credentials = credentials; - this.epubcfi = new EPUBJS.EpubCFI(); - this.deferred = new RSVP.defer(); - this.loaded = this.deferred.promise; - - EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - this.getHooks("beforeChapterRender"); - - // Cached for replacement urls from storage - this.caches = {}; -}; - - -EPUBJS.Chapter.prototype.load = function(_store, _credentials){ - var store = _store || this.store; - var credentials = _credentials || this.credentials; - var promise; - // if(this.store && (!this.book.online || this.book.contained)) - if(store){ - promise = store.getXml(this.absolute); - }else{ - promise = EPUBJS.core.request(this.absolute, false, credentials); - } - - promise.then(function(xml){ - try { - this.setDocument(xml); - this.deferred.resolve(this); - } catch (error) { - this.deferred.reject({ - message : this.absolute + " -> " + error.message, - stack : new Error().stack - }); - } - }.bind(this)); - - return promise; -}; - -EPUBJS.Chapter.prototype.render = function(_store){ - - return this.load().then(function(doc){ - - var head = doc.querySelector('head'); - var base = doc.createElement("base"); - - base.setAttribute("href", this.absolute); - head.insertBefore(base, head.firstChild); - - this.contents = doc; - - return new RSVP.Promise(function (resolve, reject) { - this.triggerHooks("beforeChapterRender", function () { - resolve(doc); - }.bind(this), this); - }.bind(this)); - - }.bind(this)) - .then(function(doc) { - var serializer = new XMLSerializer(); - var contents = serializer.serializeToString(doc); - return contents; - }.bind(this)); -}; - -EPUBJS.Chapter.prototype.url = function(_store){ - var deferred = new RSVP.defer(); - var store = _store || this.store; - var loaded; - var chapter = this; - var url; - - if(store){ - if(!this.tempUrl) { - store.getUrl(this.absolute).then(function(url){ - chapter.tempUrl = url; - deferred.resolve(url); - }); - } else { - url = this.tempUrl; - deferred.resolve(url); - } - }else{ - url = this.absolute; - deferred.resolve(url); - } - - return deferred.promise; -}; - -EPUBJS.Chapter.prototype.setPages = function(num){ - this.pages = num; -}; - -EPUBJS.Chapter.prototype.getPages = function(num){ - return this.pages; -}; - -EPUBJS.Chapter.prototype.getID = function(){ - return this.ID; -}; - -EPUBJS.Chapter.prototype.unload = function(store){ - this.document = null; - if(this.tempUrl && store) { - store.revokeUrl(this.tempUrl); - this.tempUrl = false; - } -}; - -EPUBJS.Chapter.prototype.setDocument = function(_document){ - // var uri = _document.namespaceURI; - // var doctype = _document.doctype; - // - // // Creates an empty document - // this.document = _document.implementation.createDocument( - // uri, - // null, - // null - // ); - // this.contents = this.document.importNode( - // _document.documentElement, //node to import - // true //clone its descendants - // ); - // - // this.document.appendChild(this.contents); - this.document = _document; - this.contents = _document.documentElement; - - // Fix to apply wgxpath to new document in IE - if(!this.document.evaluate && document.evaluate) { - this.document.evaluate = document.evaluate; - } - - // this.deferred.resolve(this.contents); -}; - -EPUBJS.Chapter.prototype.cfiFromRange = function(_range) { - var range; - var startXpath, endXpath; - var startContainer, endContainer; - var cleanTextContent, cleanStartTextContent, cleanEndTextContent; - - // Check for Contents - if(!this.document) return; - - if(typeof document.evaluate != 'undefined') { - - startXpath = EPUBJS.core.getElementXPath(_range.startContainer); - // console.log(startContainer) - endXpath = EPUBJS.core.getElementXPath(_range.endContainer); - - startContainer = this.document.evaluate(startXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(!_range.collapsed) { - endContainer = this.document.evaluate(endXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - } - - range = this.document.createRange(); - // Find Exact Range in original document - if(startContainer) { - try { - range.setStart(startContainer, _range.startOffset); - if(!_range.collapsed && endContainer) { - range.setEnd(endContainer, _range.endOffset); - } - } catch (e) { - console.log("missed"); - startContainer = false; - } - - } - - // Fuzzy Match - if(!startContainer) { - console.log("not found, try fuzzy match"); - cleanStartTextContent = EPUBJS.core.cleanStringForXpath(_range.startContainer.textContent); - startXpath = "//text()[contains(.," + cleanStartTextContent + ")]"; - - startContainer = this.document.evaluate(startXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(startContainer){ - // console.log("Found with Fuzzy"); - range.setStart(startContainer, _range.startOffset); - - if(!_range.collapsed) { - cleanEndTextContent = EPUBJS.core.cleanStringForXpath(_range.endContainer.textContent); - endXpath = "//text()[contains(.," + cleanEndTextContent + ")]"; - endContainer = this.document.evaluate(endXpath, this.document, EPUBJS.core.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - if(endContainer) { - range.setEnd(endContainer, _range.endOffset); - } - } - - } - } - } else { - range = _range; // Just evaluate the current documents range - } - - // Generate the Cfi - return this.epubcfi.generateCfiFromRange(range, this.cfiBase); -}; - -EPUBJS.Chapter.prototype.find = function(_query){ - var chapter = this; - var matches = []; - var query = _query.toLowerCase(); - //var xpath = this.document.evaluate(".//text()[contains(translate(., '"+query.toUpperCase()+"', '"+query+"'),'"+query+"')]", this.document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - var find = function(node){ - // Search String - var text = node.textContent.toLowerCase(); - var range = chapter.document.createRange(); - var cfi; - var pos; - var last = -1; - var excerpt; - var limit = 150; - - while (pos != -1) { - pos = text.indexOf(query, last + 1); - - if(pos != -1) { - // If Found, Create Range - range = chapter.document.createRange(); - range.setStart(node, pos); - range.setEnd(node, pos + query.length); - - //Generate CFI - cfi = chapter.cfiFromRange(range); - - // Generate Excerpt - if(node.textContent.length < limit) { - excerpt = node.textContent; - } else { - excerpt = node.textContent.substring(pos-limit/2,pos+limit/2); - excerpt = "..." + excerpt + "..."; - } - - //Add CFI to list - matches.push({ - cfi: cfi, - excerpt: excerpt - }); - } - - last = pos; - } - - }; - - // Grab text nodes - - /* - for ( var i=0 ; i < xpath.snapshotLength; i++ ) { - find(xpath.snapshotItem(i)); - } - */ - - this.textSprint(this.document, function(node){ - find(node); - }); - - - // Return List of CFIs - return matches; -}; - - -EPUBJS.Chapter.prototype.textSprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: function (node) { - if (node.data && ! /^\s*$/.test(node.data) ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - } - }, false); - var node; - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Chapter.prototype.replace = function(query, func, finished, progress){ - var items = this.contents.querySelectorAll(query), - resources = Array.prototype.slice.call(items), - count = resources.length; - - - if(count === 0) { - finished(false); - return; - } - resources.forEach(function(item){ - var called = false; - var after = function(result, full){ - if(called === false) { - count--; - if(progress) progress(result, full, count); - if(count <= 0 && finished) finished(true); - called = true; - } - }; - - func(item, after); - - }.bind(this)); - -}; - -EPUBJS.Chapter.prototype.replaceWithStored = function(query, attr, func, callback) { - var _oldUrls, - _newUrls = {}, - _store = this.store, - _cache = this.caches[query], - _uri = EPUBJS.core.uri(this.absolute), - _chapterBase = _uri.base, - _attr = attr, - _wait = 5, - progress = function(url, full, count) { - _newUrls[full] = url; - }, - finished = function(notempty) { - if(callback) callback(); - EPUBJS.core.values(_oldUrls).forEach(function(url){ - _store.revokeUrl(url); - }); - - _cache = _newUrls; - }; - - if(!_store) return; - - if(!_cache) _cache = {}; - _oldUrls = EPUBJS.core.clone(_cache); - - this.replace(query, function(link, done){ - var src = link.getAttribute(_attr), - full = EPUBJS.core.resolveUrl(_chapterBase, src); - - var replaceUrl = function(url) { - var timeout; - link.onload = function(){ - clearTimeout(timeout); - done(url, full); - }; - - /* - link.onerror = function(e){ - clearTimeout(timeout); - done(url, full); - console.error(e); - }; - */ - - if(query == "svg image") { - //-- SVG needs this to trigger a load event - link.setAttribute("externalResourcesRequired", "true"); - } - - if(query == "link[href]" && link.getAttribute("rel") !== "stylesheet") { - //-- Only Stylesheet links seem to have a load events, just continue others - done(url, full); - } else { - timeout = setTimeout(function(){ - done(url, full); - }, _wait); - } - - if (url) { - link.setAttribute(_attr, url); - } - - }; - - if(full in _oldUrls){ - replaceUrl(_oldUrls[full]); - _newUrls[full] = _oldUrls[full]; - delete _oldUrls[full]; - }else{ - func(_store, full, replaceUrl, link); - } - - }, finished, progress); -}; - -var EPUBJS = EPUBJS || {}; -EPUBJS.core = {}; - -var ELEMENT_NODE = 1; -var TEXT_NODE = 3; -var COMMENT_NODE = 8; -var DOCUMENT_NODE = 9; - -//-- Get a element for an id -EPUBJS.core.getEl = function(elem) { - return document.getElementById(elem); -}; - -//-- Get all elements for a class -EPUBJS.core.getEls = function(classes) { - return document.getElementsByClassName(classes); -}; - -EPUBJS.core.request = function(url, type, withCredentials) { - var supportsURL = window.URL; - var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; - var deferred = new RSVP.defer(); - var xhr = new XMLHttpRequest(); - var uri; - - //-- Check from PDF.js: - // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js - var xhrPrototype = XMLHttpRequest.prototype; - - var handler = function() { - var r; - - if (this.readyState != this.DONE) return; - - if ((this.status === 200 || this.status === 0) && this.response) { // Android & Firefox reporting 0 for local & blob urls - if (type == 'xml'){ - // If this.responseXML wasn't set, try to parse using a DOMParser from text - if(!this.responseXML) { - r = new DOMParser().parseFromString(this.response, "application/xml"); - } else { - r = this.responseXML; - } - } else if (type == 'xhtml') { - if (!this.responseXML){ - r = new DOMParser().parseFromString(this.response, "application/xhtml+xml"); - } else { - r = this.responseXML; - } - } else if (type == 'html') { - if (!this.responseXML){ - r = new DOMParser().parseFromString(this.response, "text/html"); - } else { - r = this.responseXML; - } - } else if (type == 'json') { - r = JSON.parse(this.response); - } else if (type == 'blob') { - if (supportsURL) { - r = this.response; - } else { - //-- Safari doesn't support responseType blob, so create a blob from arraybuffer - r = new Blob([this.response]); - } - } else { - r = this.response; - } - - deferred.resolve(r); - } else { - deferred.reject({ - message : this.response, - stack : new Error().stack - }); - } - }; - - if (!('overrideMimeType' in xhrPrototype)) { - // IE10 might have response, but not overrideMimeType - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - - xhr.onreadystatechange = handler; - xhr.open("GET", url, true); - - if(withCredentials) { - xhr.withCredentials = true; - } - - // If type isn't set, determine it from the file extension - if(!type) { - uri = EPUBJS.core.uri(url); - type = uri.extension; - type = { - 'htm': 'html' - }[type] || type; - } - - if(type == 'blob'){ - xhr.responseType = BLOB_RESPONSE; - } - - if(type == "json") { - xhr.setRequestHeader("Accept", "application/json"); - } - - if(type == 'xml') { - xhr.responseType = "document"; - xhr.overrideMimeType('text/xml'); // for OPF parsing - } - - if(type == 'xhtml') { - xhr.responseType = "document"; - } - - if(type == 'html') { - xhr.responseType = "document"; - } - - if(type == "binary") { - xhr.responseType = "arraybuffer"; - } - - xhr.send(); - - return deferred.promise; -}; - -EPUBJS.core.toArray = function(obj) { - var arr = []; - - for (var member in obj) { - var newitm; - if ( obj.hasOwnProperty(member) ) { - newitm = obj[member]; - newitm.ident = member; - arr.push(newitm); - } - } - - return arr; -}; - -//-- Parse the different parts of a url, returning a object -EPUBJS.core.uri = function(url){ - var uri = { - protocol : '', - host : '', - path : '', - origin : '', - directory : '', - base : '', - filename : '', - extension : '', - fragment : '', - href : url - }, - blob = url.indexOf('blob:'), - doubleSlash = url.indexOf('://'), - search = url.indexOf('?'), - fragment = url.indexOf("#"), - withoutProtocol, - dot, - firstSlash; - - if(blob === 0) { - uri.protocol = "blob"; - uri.base = url.indexOf(0, fragment); - return uri; - } - - if(fragment != -1) { - uri.fragment = url.slice(fragment + 1); - url = url.slice(0, fragment); - } - - if(search != -1) { - uri.search = url.slice(search + 1); - url = url.slice(0, search); - href = uri.href; - } - - if(doubleSlash != -1) { - uri.protocol = url.slice(0, doubleSlash); - withoutProtocol = url.slice(doubleSlash+3); - firstSlash = withoutProtocol.indexOf('/'); - - if(firstSlash === -1) { - uri.host = uri.path; - uri.path = ""; - } else { - uri.host = withoutProtocol.slice(0, firstSlash); - uri.path = withoutProtocol.slice(firstSlash); - } - - - uri.origin = uri.protocol + "://" + uri.host; - - uri.directory = EPUBJS.core.folder(uri.path); - - uri.base = uri.origin + uri.directory; - // return origin; - } else { - uri.path = url; - uri.directory = EPUBJS.core.folder(url); - uri.base = uri.directory; - } - - //-- Filename - uri.filename = url.replace(uri.base, ''); - dot = uri.filename.lastIndexOf('.'); - if(dot != -1) { - uri.extension = uri.filename.slice(dot+1); - } - return uri; -}; - -//-- Parse out the folder, will return everything before the last slash - -EPUBJS.core.folder = function(url){ - - var lastSlash = url.lastIndexOf('/'); - - if(lastSlash == -1) var folder = ''; - - folder = url.slice(0, lastSlash + 1); - - return folder; - -}; - -//-- https://github.com/ebidel/filer.js/blob/master/src/filer.js#L128 -EPUBJS.core.dataURLToBlob = function(dataURL) { - var BASE64_MARKER = ';base64,', - parts, contentType, raw, rawLength, uInt8Array; - - if (dataURL.indexOf(BASE64_MARKER) == -1) { - parts = dataURL.split(','); - contentType = parts[0].split(':')[1]; - raw = parts[1]; - - return new Blob([raw], {type: contentType}); - } - - parts = dataURL.split(BASE64_MARKER); - contentType = parts[0].split(':')[1]; - raw = window.atob(parts[1]); - rawLength = raw.length; - - uInt8Array = new Uint8Array(rawLength); - - for (var i = 0; i < rawLength; ++i) { - uInt8Array[i] = raw.charCodeAt(i); - } - - return new Blob([uInt8Array], {type: contentType}); -}; - -//-- Load scripts async: http://stackoverflow.com/questions/7718935/load-scripts-asynchronously -EPUBJS.core.addScript = function(src, callback, target) { - var s, r; - r = false; - s = document.createElement('script'); - s.type = 'text/javascript'; - s.async = false; - s.src = src; - s.onload = s.onreadystatechange = function() { - if ( !r && (!this.readyState || this.readyState == 'complete') ) { - r = true; - if(callback) callback(); - } - }; - target = target || document.body; - target.appendChild(s); -}; - -EPUBJS.core.addScripts = function(srcArr, callback, target) { - var total = srcArr.length, - curr = 0, - cb = function(){ - curr++; - if(total == curr){ - if(callback) callback(); - }else{ - EPUBJS.core.addScript(srcArr[curr], cb, target); - } - }; - - EPUBJS.core.addScript(srcArr[curr], cb, target); -}; - -EPUBJS.core.addCss = function(src, callback, target) { - var s, r; - r = false; - s = document.createElement('link'); - s.type = 'text/css'; - s.rel = "stylesheet"; - s.href = src; - s.onload = s.onreadystatechange = function() { - if ( !r && (!this.readyState || this.readyState == 'complete') ) { - r = true; - if(callback) callback(); - } - }; - target = target || document.body; - target.appendChild(s); -}; - -EPUBJS.core.prefixed = function(unprefixed) { - var vendors = ["Webkit", "Moz", "O", "ms" ], - prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'], - upper = unprefixed[0].toUpperCase() + unprefixed.slice(1), - length = vendors.length; - - if (typeof(document.documentElement.style[unprefixed]) != 'undefined') { - return unprefixed; - } - - for ( var i=0; i < length; i++ ) { - if (typeof(document.documentElement.style[vendors[i] + upper]) != 'undefined') { - return vendors[i] + upper; - } - } - - return unprefixed; -}; - -EPUBJS.core.resolveUrl = function(base, path) { - var url, - segments = [], - uri = EPUBJS.core.uri(path), - folders = base.split("/"), - paths; - - if(uri.host) { - return path; - } - - folders.pop(); - - paths = path.split("/"); - paths.forEach(function(p){ - if(p === ".."){ - folders.pop(); - }else{ - segments.push(p); - } - }); - - url = folders.concat(segments); - - return url.join("/"); -}; - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -EPUBJS.core.uuid = function() { - var d = new Date().getTime(); - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x7|0x8)).toString(16); - }); - return uuid; -}; - -// Fast quicksort insert for sorted array -- based on: -// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers -EPUBJS.core.insert = function(item, array, compareFunction) { - var location = EPUBJS.core.locationOf(item, array, compareFunction); - array.splice(location, 0, item); - - return location; -}; - -EPUBJS.core.locationOf = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return pivot; - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared > 0 ? pivot : pivot + 1; - } - - if(compared === 0) { - return pivot; - } - if(compared === -1) { - return EPUBJS.core.locationOf(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.locationOf(item, array, compareFunction, start, pivot); - } -}; - -EPUBJS.core.indexOfSorted = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return -1; // Not found - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared === 0 ? pivot : -1; - } - if(compared === 0) { - return pivot; // Found - } - if(compared === -1) { - return EPUBJS.core.indexOfSorted(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.indexOfSorted(item, array, compareFunction, start, pivot); - } -}; - - -EPUBJS.core.queue = function(_scope){ - var _q = []; - var scope = _scope; - // Add an item to the queue - var enqueue = function(funcName, args, context) { - _q.push({ - "funcName" : funcName, - "args" : args, - "context" : context - }); - return _q; - }; - // Run one item - var dequeue = function(){ - var inwait; - if(_q.length) { - inwait = _q.shift(); - // Defer to any current tasks - // setTimeout(function(){ - scope[inwait.funcName].apply(inwait.context || scope, inwait.args); - // }, 0); - } - }; - - // Run All - var flush = function(){ - while(_q.length) { - dequeue(); - } - }; - // Clear all items in wait - var clear = function(){ - _q = []; - }; - - var length = function(){ - return _q.length; - }; - - return { - "enqueue" : enqueue, - "dequeue" : dequeue, - "flush" : flush, - "clear" : clear, - "length" : length - }; -}; - -// From: https://code.google.com/p/fbug/source/browse/branches/firebug1.10/content/firebug/lib/xpath.js -/** - * Gets an XPath for an element which describes its hierarchical location. - */ -EPUBJS.core.getElementXPath = function(element) { - if (element && element.id) { - return '//*[@id="' + element.id + '"]'; - } else { - return EPUBJS.core.getElementTreeXPath(element); - } -}; - -EPUBJS.core.getElementTreeXPath = function(element) { - var paths = []; - var isXhtml = (element.ownerDocument.documentElement.getAttribute('xmlns') === "http://www.w3.org/1999/xhtml"); - var index, nodeName, tagName, pathIndex; - - if(element.nodeType === Node.TEXT_NODE){ - // index = Array.prototype.indexOf.call(element.parentNode.childNodes, element) + 1; - index = EPUBJS.core.indexOfTextNode(element) + 1; - - paths.push("text()["+index+"]"); - element = element.parentNode; - } - - // Use nodeName (instead of localName) so namespace prefix is included (if any). - for (; element && element.nodeType == 1; element = element.parentNode) - { - index = 0; - for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling) - { - // Ignore document type declaration. - if (sibling.nodeType == Node.DOCUMENT_TYPE_NODE) { - continue; - } - if (sibling.nodeName == element.nodeName) { - ++index; - } - } - nodeName = element.nodeName.toLowerCase(); - tagName = (isXhtml ? "xhtml:" + nodeName : nodeName); - pathIndex = (index ? "[" + (index+1) + "]" : ""); - paths.splice(0, 0, tagName + pathIndex); - } - - return paths.length ? "./" + paths.join("/") : null; -}; - -EPUBJS.core.nsResolver = function(prefix) { - var ns = { - 'xhtml' : 'http://www.w3.org/1999/xhtml', - 'epub': 'http://www.idpf.org/2007/ops' - }; - return ns[prefix] || null; -}; - -//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496 -EPUBJS.core.cleanStringForXpath = function(str) { - var parts = str.match(/[^'"]+|['"]/g); - parts = parts.map(function(part){ - if (part === "'") { - return '\"\'\"'; // output "'" - } - - if (part === '"') { - return "\'\"\'"; // output '"' - } - return "\'" + part + "\'"; - }); - return "concat(\'\'," + parts.join(",") + ")"; -}; - -EPUBJS.core.indexOfTextNode = function(textNode){ - var parent = textNode.parentNode; - var children = parent.childNodes; - var sib; - var index = -1; - for (var i = 0; i < children.length; i++) { - sib = children[i]; - if(sib.nodeType === Node.TEXT_NODE){ - index++; - } - if(sib == textNode) break; - } - - return index; -}; - -// Underscore -EPUBJS.core.defaults = function(obj) { - for (var i = 1, length = arguments.length; i < length; i++) { - var source = arguments[i]; - for (var prop in source) { - if (obj[prop] === void 0) obj[prop] = source[prop]; - } - } - return obj; -}; - -EPUBJS.core.extend = function(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - if(!source) return; - Object.getOwnPropertyNames(source).forEach(function(propName) { - Object.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName)); - }); - }); - return target; -}; - -EPUBJS.core.clone = function(obj) { - return EPUBJS.core.isArray(obj) ? obj.slice() : EPUBJS.core.extend({}, obj); -}; - -EPUBJS.core.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); -}; - -EPUBJS.core.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -}; - -EPUBJS.core.isString = function(str) { - return (typeof str === 'string' || str instanceof String); -}; - -EPUBJS.core.isArray = Array.isArray || function(obj) { - return Object.prototype.toString.call(obj) === '[object Array]'; -}; - -// Lodash -EPUBJS.core.values = function(object) { - var index = -1; - var props, length, result; - - if(!object) return []; - - props = Object.keys(object); - length = props.length; - result = Array(length); - - while (++index < length) { - result[index] = object[props[index]]; - } - return result; -}; - -EPUBJS.core.indexOfNode = function(node, typeId) { - var parent = node.parentNode; - var children = parent.childNodes; - var sib; - var index = -1; - for (var i = 0; i < children.length; i++) { - sib = children[i]; - if (sib.nodeType === typeId) { - index++; - } - if (sib == node) break; - } - - return index; -} - -EPUBJS.core.indexOfTextNode = function(textNode) { - return EPUBJS.core.indexOfNode(textNode, TEXT_NODE); -} - -EPUBJS.core.indexOfElementNode = function(elementNode) { - return EPUBJS.core.indexOfNode(elementNode, ELEMENT_NODE); -} - -EPUBJS.EpubCFI = function(cfiStr){ - if(cfiStr) return this.parse(cfiStr); -}; - -EPUBJS.EpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) { - var pos = parseInt(_pos), - spineNodeIndex = (_spineNodeIndex + 1) * 2, - cfi = '/'+spineNodeIndex+'/'; - - cfi += (pos + 1) * 2; - - if(id) cfi += "[" + id + "]"; - - //cfi += "!"; - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.generatePathComponent = function(steps) { - return steps.map(function(part) { - return (part.index + 1) * 2 + (part.id ? '[' + part.id + ']' : ''); - }).join('/'); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromElement = function(element, chapter) { - var steps = this.pathTo(element); - var path = this.generatePathComponent(steps); - if(!path.length) { - // Start of Chapter - return "epubcfi(" + chapter + "!/4/)"; - } else { - // First Text Node - return "epubcfi(" + chapter + "!/" + path + "/1:0)"; - } -}; - -EPUBJS.EpubCFI.prototype.pathTo = function(node) { - var stack = [], - children; - - while(node && node.parentNode !== null && node.parentNode.nodeType != 9) { - children = node.parentNode.children; - - stack.unshift({ - 'id' : node.id, - // 'classList' : node.classList, - 'tagName' : node.tagName, - 'index' : children ? Array.prototype.indexOf.call(children, node) : 0 - }); - - node = node.parentNode; - } - - return stack; -}; - -EPUBJS.EpubCFI.prototype.getChapterComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - - return splitStr[0]; -}; - -EPUBJS.EpubCFI.prototype.getPathComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - var pathComponent = splitStr[1] ? splitStr[1].split(":") : ''; - - return pathComponent[0]; -}; - -EPUBJS.EpubCFI.prototype.getCharecterOffsetComponent = // backwards-compat -EPUBJS.EpubCFI.prototype.getCharacterOffsetComponent = function(cfiStr) { - var splitStr = cfiStr.split(":"); - return splitStr[1] || ''; -}; - - -EPUBJS.EpubCFI.prototype.parse = function(cfiStr) { - var cfi = {}, - chapSegment, - chapterComponent, - pathComponent, - characterOffsetComponent, - assertion, - chapId, - path, - end, - endInt, - text, - parseStep = function(part){ - var type, index, has_brackets, id; - - type = "element"; - index = parseInt(part) / 2 - 1; - has_brackets = part.match(/\[(.*)\]/); - if(has_brackets && has_brackets[1]){ - id = has_brackets[1]; - } - - return { - "type" : type, - 'index' : index, - 'id' : id || false - }; - }; - - if(typeof cfiStr !== "string") { - return {spinePos: -1}; - } - - cfi.str = cfiStr; - - if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { - // Remove intial epubcfi( and ending ) - cfiStr = cfiStr.slice(8, cfiStr.length-1); - } - - chapterComponent = this.getChapterComponent(cfiStr); - pathComponent = this.getPathComponent(cfiStr) || ''; - characterOffsetComponent = this.getCharacterOffsetComponent(cfiStr); - // Make sure this is a valid cfi or return - if(!chapterComponent) { - return {spinePos: -1}; - } - - // Chapter segment is always the second one - chapSegment = chapterComponent.split("/")[2] || ''; - if(!chapSegment) return {spinePos:-1}; - - cfi.spinePos = (parseInt(chapSegment) / 2 - 1 ) || 0; - - chapId = chapSegment.match(/\[(.*)\]/); - - cfi.spineId = chapId ? chapId[1] : false; - - if(pathComponent.indexOf(',') != -1) { - // Handle ranges -- not supported yet - console.warn("CFI Ranges are not supported"); - } - - path = pathComponent.split('/'); - end = path.pop(); - - cfi.steps = []; - - path.forEach(function(part){ - var step; - - if(part) { - step = parseStep(part); - cfi.steps.push(step); - } - }); - - //-- Check if END is a text node or element - endInt = parseInt(end); - if(!isNaN(endInt)) { - - if(endInt % 2 === 0) { // Even = is an element - cfi.steps.push(parseStep(end)); - } else { - cfi.steps.push({ - "type" : "text", - 'index' : (endInt - 1 ) / 2 - }); - } - - } - - assertion = characterOffsetComponent.match(/\[(.*)\]/); - if(assertion && assertion[1]){ - cfi.characterOffset = parseInt(characterOffsetComponent.split('[')[0]); - // We arent handling these assertions yet - cfi.textLocationAssertion = assertion[1]; - } else { - cfi.characterOffset = parseInt(characterOffsetComponent); - } - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.addMarker = function(cfi, _doc, _marker) { - var doc = _doc || document; - var marker = _marker || this.createMarker(doc); - var parent; - var lastStep; - var text; - var split; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - // Find the CFI elements parent - parent = this.findParent(cfi, doc); - - if(!parent) { - // CFI didn't return an element - // Maybe it isnt in the current chapter? - return false; - } - - if(lastStep && lastStep.type === "text") { - text = parent.childNodes[lastStep.index]; - if(cfi.characterOffset){ - split = text.splitText(cfi.characterOffset); - marker.classList.add("EPUBJS-CFI-SPLIT"); - parent.insertBefore(marker, split); - } else { - parent.insertBefore(marker, text); - } - } else { - parent.insertBefore(marker, parent.firstChild); - } - - return marker; -}; - -EPUBJS.EpubCFI.prototype.createMarker = function(_doc) { - var doc = _doc || document; - var element = doc.createElement('span'); - element.id = "EPUBJS-CFI-MARKER:"+ EPUBJS.core.uuid(); - element.classList.add("EPUBJS-CFI-MARKER"); - - return element; -}; - -EPUBJS.EpubCFI.prototype.removeMarker = function(marker, _doc) { - var doc = _doc || document; - // var id = marker.id; - - // Cleanup textnodes if they were split - if(marker.classList.contains("EPUBJS-CFI-SPLIT")){ - nextSib = marker.nextSibling; - prevSib = marker.previousSibling; - if(nextSib && - prevSib && - nextSib.nodeType === 3 && - prevSib.nodeType === 3){ - - prevSib.textContent += nextSib.textContent; - marker.parentNode.removeChild(nextSib); - } - marker.parentNode.removeChild(marker); - } else if(marker.classList.contains("EPUBJS-CFI-MARKER")) { - // Remove only elements added as markers - marker.parentNode.removeChild(marker); - } - -}; - -EPUBJS.EpubCFI.prototype.findParent = function(cfi, _doc) { - var doc = _doc || document, - element = doc.getElementsByTagName('html')[0], - children = Array.prototype.slice.call(element.children), - num, index, part, sections, - text, textBegin, textEnd; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - sections = cfi.steps.slice(0); // Clone steps array - if(!sections.length) { - return doc.getElementsByTagName('body')[0]; - } - - while(sections && sections.length > 0) { - part = sections.shift(); - // Find textNodes Parent - if(part.type === "text") { - text = element.childNodes[part.index]; - element = text.parentNode || element; - // Find element by id if present - } else if(part.id){ - element = doc.getElementById(part.id); - // Find element in parent - }else{ - element = children[part.index]; - } - // Element can't be found - if(!element || typeof element === "undefined") { - console.error("No Element For", part, cfi.str); - return false; - } - // Get current element children and continue through steps - children = Array.prototype.slice.call(element.children); - } - - return element; -}; - -EPUBJS.EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { - if(typeof cfiOne === 'string') { - cfiOne = new EPUBJS.EpubCFI(cfiOne); - } - if(typeof cfiTwo === 'string') { - cfiTwo = new EPUBJS.EpubCFI(cfiTwo); - } - // Compare Spine Positions - if(cfiOne.spinePos > cfiTwo.spinePos) { - return 1; - } - if(cfiOne.spinePos < cfiTwo.spinePos) { - return -1; - } - - - // Compare Each Step in the First item - for (var i = 0; i < cfiOne.steps.length; i++) { - if(!cfiTwo.steps[i]) { - return 1; - } - if(cfiOne.steps[i].index > cfiTwo.steps[i].index) { - return 1; - } - if(cfiOne.steps[i].index < cfiTwo.steps[i].index) { - return -1; - } - // Otherwise continue checking - } - - // All steps in First present in Second - if(cfiOne.steps.length < cfiTwo.steps.length) { - return -1; - } - - // Compare the character offset of the text node - if(cfiOne.characterOffset > cfiTwo.characterOffset) { - return 1; - } - if(cfiOne.characterOffset < cfiTwo.characterOffset) { - return -1; - } - - // CFI's are equal - return 0; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromHref = function(href, book) { - var uri = EPUBJS.core.uri(href); - var path = uri.path; - var fragment = uri.fragment; - var spinePos = book.spineIndexByURL[path]; - var loaded; - var deferred = new RSVP.defer(); - var epubcfi = new EPUBJS.EpubCFI(); - var spineItem; - - if(typeof spinePos !== "undefined"){ - spineItem = book.spine[spinePos]; - loaded = book.loadXml(spineItem.url); - loaded.then(function(doc){ - var element = doc.getElementById(fragment); - var cfi; - cfi = epubcfi.generateCfiFromElement(element, spineItem.cfiBase); - deferred.resolve(cfi); - }); - } - - return deferred.promise; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromTextNode = function(anchor, offset, base) { - var parent = anchor.parentNode; - var steps = this.pathTo(parent); - var path = this.generatePathComponent(steps); - var index = 1 + (2 * Array.prototype.indexOf.call(parent.childNodes, anchor)); - return "epubcfi(" + base + "!/" + path + "/"+index+":"+(offset || 0)+")"; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRangeAnchor = function(range, base) { - var anchor = range.anchorNode; - var offset = range.anchorOffset; - return this.generateCfiFromTextNode(anchor, offset, base); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRange = function(range, base) { - var start, startElement, startSteps, startPath, startOffset, startIndex; - var end, endElement, endSteps, endPath, endOffset, endIndex; - - start = range.startContainer; - - if(start.nodeType === 3) { // text node - startElement = start.parentNode; - //startIndex = 1 + (2 * Array.prototype.indexOf.call(startElement.childNodes, start)); - startIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(start)); - startSteps = this.pathTo(startElement); - } else if(range.collapsed) { - return this.generateCfiFromElement(start, base); // single element - } else { - startSteps = this.pathTo(start); - } - - startPath = this.generatePathComponent(startSteps); - startOffset = range.startOffset; - - if(!range.collapsed) { - end = range.endContainer; - - if(end.nodeType === 3) { // text node - endElement = end.parentNode; - // endIndex = 1 + (2 * Array.prototype.indexOf.call(endElement.childNodes, end)); - endIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(end)); - - endSteps = this.pathTo(endElement); - } else { - endSteps = this.pathTo(end); - } - - endPath = this.generatePathComponent(endSteps); - endOffset = range.endOffset; - - // Remove steps present in startPath - endPath = endPath.replace(startPath, ''); - - if (endPath.length) { - endPath = endPath + "/"; - } - - return "epubcfi(" + base + "!/" + startPath + "/" + startIndex + ":" + startOffset + "," + endPath + endIndex + ":" + endOffset + ")"; - - } else { - return "epubcfi(" + base + "!/" + startPath + "/"+ startIndex +":"+ startOffset +")"; - } -}; - -EPUBJS.EpubCFI.prototype.generateXpathFromSteps = function(steps) { - var xpath = [".", "*"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - xpath.push("*[position()=" + position + " and @id='" + step.id + "']"); - } else if(step.type === "text") { - xpath.push("text()[" + position + "]"); - } else { - xpath.push("*[" + position + "]"); - } - }); - - return xpath.join("/"); -}; - -EPUBJS.EpubCFI.prototype.generateQueryFromSteps = function(steps) { - var query = ["html"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - query.push("#" + step.id); - } else if(step.type === "text") { - // unsupported in querySelector - // query.push("text()[" + position + "]"); - } else { - query.push("*:nth-child(" + position + ")"); - } - }); - - return query.join(">"); -}; - - -EPUBJS.EpubCFI.prototype.generateRangeFromCfi = function(cfi, _doc) { - var doc = _doc || document; - var range = doc.createRange(); - var lastStep; - var xpath; - var startContainer; - var textLength; - var query; - var startContainerParent; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - - if(typeof document.evaluate != 'undefined') { - xpath = this.generateXpathFromSteps(cfi.steps); - startContainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - } else { - // Get the query string - query = this.generateQueryFromSteps(cfi.steps); - // Find the containing element - startContainerParent = doc.querySelector(query); - // Find the text node within that element - if(startContainerParent && lastStep.type == "text") { - startContainer = startContainerParent.childNodes[lastStep.index]; - } - } - - if(!startContainer) { - return null; - } - - if(startContainer && cfi.characterOffset >= 0) { - textLength = startContainer.length; - - if(cfi.characterOffset < textLength) { - range.setStart(startContainer, cfi.characterOffset); - range.setEnd(startContainer, textLength ); - } else { - console.debug("offset greater than length:", cfi.characterOffset, textLength); - range.setStart(startContainer, textLength - 1 ); - range.setEnd(startContainer, textLength ); - } - } else if(startContainer) { - range.selectNode(startContainer); - } - // doc.defaultView.getSelection().addRange(range); - return range; -}; - -EPUBJS.EpubCFI.prototype.isCfiString = function(target) { - return typeof target === 'string' && target.indexOf('epubcfi(') === 0; -}; - -EPUBJS.Events = function(obj, el){ - - this.events = {}; - - if(!el){ - this.el = document.createElement('div'); - }else{ - this.el = el; - } - - obj.createEvent = this.createEvent; - obj.tell = this.tell; - obj.listen = this.listen; - obj.deafen = this.deafen; - obj.listenUntil = this.listenUntil; - - return this; -}; - -EPUBJS.Events.prototype.createEvent = function(evt){ - var e = new CustomEvent(evt); - this.events[evt] = e; - return e; -}; - -EPUBJS.Events.prototype.tell = function(evt, msg){ - var e; - - if(!this.events[evt]){ - console.warn("No event:", evt, "defined yet, creating."); - e = this.createEvent(evt); - }else{ - e = this.events[evt]; - } - - if(msg) e.msg = msg; - this.el.dispatchEvent(e); - -}; - -EPUBJS.Events.prototype.listen = function(evt, func, bindto){ - if(!this.events[evt]){ - console.warn("No event:", evt, "defined yet, creating."); - this.createEvent(evt); - return; - } - - if(bindto){ - this.el.addEventListener(evt, func.bind(bindto), false); - }else{ - this.el.addEventListener(evt, func, false); - } - -}; - -EPUBJS.Events.prototype.deafen = function(evt, func){ - this.el.removeEventListener(evt, func, false); -}; - -EPUBJS.Events.prototype.listenUntil = function(OnEvt, OffEvt, func, bindto){ - this.listen(OnEvt, func, bindto); - - function unlisten(){ - this.deafen(OnEvt, func); - this.deafen(OffEvt, unlisten); - } - - this.listen(OffEvt, unlisten, this); -}; -EPUBJS.hooks = {}; -EPUBJS.Hooks = (function(){ - function hooks(){} - - //-- Get pre-registered hooks - hooks.prototype.getHooks = function(){ - var plugs; - this.hooks = {}; - Array.prototype.slice.call(arguments).forEach(function(arg){ - this.hooks[arg] = []; - }, this); - - for (var plugType in this.hooks) { - plugs = EPUBJS.core.values(EPUBJS.hooks[plugType]); - - plugs.forEach(function(hook){ - this.registerHook(plugType, hook); - }, this); - } - }; - - //-- Hooks allow for injecting async functions that must all complete before continuing - // Functions must have a callback as their first argument. - hooks.prototype.registerHook = function(type, toAdd, toFront){ - - if(typeof(this.hooks[type]) != "undefined"){ - - if(typeof(toAdd) === "function"){ - if(toFront) { - this.hooks[type].unshift(toAdd); - }else{ - this.hooks[type].push(toAdd); - } - }else if(Array.isArray(toAdd)){ - toAdd.forEach(function(hook){ - if(toFront) { - this.hooks[type].unshift(hook); - }else{ - this.hooks[type].push(hook); - } - }, this); - } - }else{ - //-- Allows for undefined hooks - this.hooks[type] = [toAdd]; - - if(typeof(toAdd) === "function"){ - this.hooks[type] = [toAdd]; - }else if(Array.isArray(toAdd)){ - this.hooks[type] = []; - toAdd.forEach(function(hook){ - this.hooks[type].push(hook); - }, this); - } - - } - }; - - hooks.prototype.removeHook = function(type, toRemove){ - var index; - - if(typeof(this.hooks[type]) != "undefined"){ - - if(typeof(toRemove) === "function"){ - index = this.hooks[type].indexOf(toRemove); - if (index > -1) { - this.hooks[type].splice(index, 1); - } - }else if(Array.isArray(toRemove)){ - toRemove.forEach(function(hook){ - index = this.hooks[type].indexOf(hook); - if (index > -1) { - this.hooks[type].splice(index, 1); - } - }, this); - } - } - }; - - hooks.prototype.triggerHooks = function(type, callback, passed){ - var hooks, count; - - if(typeof(this.hooks[type]) == "undefined") return false; - - hooks = this.hooks[type]; - - count = hooks.length; - if(count === 0 && callback) { - callback(); - } - - function countdown(){ - count--; - if(count <= 0 && callback) callback(); - } - - hooks.forEach(function(hook){ - hook(countdown, passed); - }); - }; - - return { - register: function(name) { - if(EPUBJS.hooks[name] === undefined) { EPUBJS.hooks[name] = {}; } - if(typeof EPUBJS.hooks[name] !== 'object') { throw "Already registered: "+name; } - return EPUBJS.hooks[name]; - }, - mixin: function(object) { - for (var prop in hooks.prototype) { - object[prop] = hooks.prototype[prop]; - } - } - }; -})(); - -EPUBJS.Layout = EPUBJS.Layout || {}; - -// EPUB2 documents won't provide us with "rendition:layout", so this is used to -// duck type the documents instead. -EPUBJS.Layout.isFixedLayout = function (documentElement) { - var viewport = documentElement.querySelector("[name=viewport]"); - if (!viewport || !viewport.hasAttribute("content")) { - return false; - } - var content = viewport.getAttribute("content"); - return (/width=(\d+)/.test(content) && /height=(\d+)/.test(content)); -}; - -EPUBJS.Layout.Reflowable = function(){ - this.documentElement = null; - this.spreadWidth = null; -}; - -EPUBJS.Layout.Reflowable.prototype.format = function(documentElement, _width, _height, _gap){ - // Get the prefixed CSS commands - var columnAxis = EPUBJS.core.prefixed('columnAxis'); - var columnGap = EPUBJS.core.prefixed('columnGap'); - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var columnFill = EPUBJS.core.prefixed('columnFill'); - - //-- Check the width and create even width columns - var width = Math.floor(_width); - // var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 0; // Not needed for single - var section = Math.floor(width / 8); - var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1); - this.documentElement = documentElement; - //-- Single Page - this.spreadWidth = (width + gap); - - - documentElement.style.overflow = "hidden"; - - // Must be set to the new calculated width or the columns will be off - documentElement.style.width = width + "px"; - - //-- Adjust height - documentElement.style.height = _height + "px"; - - //-- Add columns - documentElement.style[columnAxis] = "horizontal"; - documentElement.style[columnFill] = "auto"; - documentElement.style[columnWidth] = width+"px"; - documentElement.style[columnGap] = gap+"px"; - this.colWidth = width; - this.gap = gap; - - return { - pageWidth : this.spreadWidth, - pageHeight : _height - }; -}; - -EPUBJS.Layout.Reflowable.prototype.calculatePages = function() { - var totalWidth, displayedPages; - this.documentElement.style.width = "auto"; //-- reset width for calculations - totalWidth = this.documentElement.scrollWidth; - displayedPages = Math.ceil(totalWidth / this.spreadWidth); - - return { - displayedPages : displayedPages, - pageCount : displayedPages - }; -}; - -EPUBJS.Layout.ReflowableSpreads = function(){ - this.documentElement = null; - this.spreadWidth = null; -}; - -EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _width, _height, _gap){ - var columnAxis = EPUBJS.core.prefixed('columnAxis'); - var columnGap = EPUBJS.core.prefixed('columnGap'); - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var columnFill = EPUBJS.core.prefixed('columnFill'); - - var divisor = 2, - cutoff = 800; - - //-- Check the width and create even width columns - var fullWidth = Math.floor(_width); - var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 1; - - var section = Math.floor(width / 8); - var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1); - - //-- Double Page - var colWidth = Math.floor((width - gap) / divisor); - - this.documentElement = documentElement; - this.spreadWidth = (colWidth + gap) * divisor; - - - documentElement.style.overflow = "hidden"; - - // Must be set to the new calculated width or the columns will be off - documentElement.style.width = width + "px"; - - //-- Adjust height - documentElement.style.height = _height + "px"; - - //-- Add columns - documentElement.style[columnAxis] = "horizontal"; - documentElement.style[columnFill] = "auto"; - documentElement.style[columnGap] = gap+"px"; - documentElement.style[columnWidth] = colWidth+"px"; - - this.colWidth = colWidth; - this.gap = gap; - return { - pageWidth : this.spreadWidth, - pageHeight : _height - }; -}; - -EPUBJS.Layout.ReflowableSpreads.prototype.calculatePages = function() { - var totalWidth = this.documentElement.scrollWidth; - var displayedPages = Math.ceil(totalWidth / this.spreadWidth); - - //-- Add a page to the width of the document to account an for odd number of pages - this.documentElement.style.width = ((displayedPages * this.spreadWidth) - this.gap) + "px"; - - return { - displayedPages : displayedPages, - pageCount : displayedPages * 2 - }; -}; - -EPUBJS.Layout.Fixed = function(){ - this.documentElement = null; -}; - -EPUBJS.Layout.Fixed.prototype.format = function(documentElement, _width, _height, _gap){ - var columnWidth = EPUBJS.core.prefixed('columnWidth'); - var transform = EPUBJS.core.prefixed('transform'); - var transformOrigin = EPUBJS.core.prefixed('transformOrigin'); - var viewport = documentElement.querySelector("[name=viewport]"); - var content; - var contents; - var width, height; - this.documentElement = documentElement; - /** - * check for the viewport size - * - */ - if(viewport && viewport.hasAttribute("content")) { - content = viewport.getAttribute("content"); - contents = content.split(','); - if(contents[0]){ - width = contents[0].replace("width=", ''); - } - if(contents[1]){ - height = contents[1].replace("height=", ''); - } - } - - //-- Scale fixed documents so their contents don't overflow, and - // vertically and horizontally center the contents - var widthScale = _width / width; - var heightScale = _height / height; - var scale = widthScale < heightScale ? widthScale : heightScale; - documentElement.style.position = "absolute"; - documentElement.style.top = "50%"; - documentElement.style.left = "50%"; - documentElement.style[transform] = "scale(" + scale + ") translate(-50%, -50%)"; - documentElement.style[transformOrigin] = "0px 0px 0px"; - - //-- Adjust width and height - documentElement.style.width = width + "px" || "auto"; - documentElement.style.height = height + "px" || "auto"; - - //-- Remove columns - documentElement.style[columnWidth] = "auto"; - - //-- Scroll - documentElement.style.overflow = "auto"; - - this.colWidth = width; - this.gap = 0; - - return { - pageWidth : width, - pageHeight : height - }; - -}; - -EPUBJS.Layout.Fixed.prototype.calculatePages = function(){ - return { - displayedPages : 1, - pageCount : 1 - }; -}; - -EPUBJS.Locations = function(spine, store, credentials) { - this.spine = spine; - this.store = store; - this.credentials = credentials; - - this.epubcfi = new EPUBJS.EpubCFI(); - - this._locations = []; - this.total = 0; - - this.break = 150; - - this._current = 0; - -}; - -EPUBJS.Locations.prototype.generate = function(chars) { - var deferred = new RSVP.defer(); - var spinePos = -1; - var spineLength = this.spine.length; - var finished; - var nextChapter = function(deferred){ - var chapter; - var next = spinePos + 1; - var done = deferred || new RSVP.defer(); - var loaded; - if(next >= spineLength) { - done.resolve(); - } else { - spinePos = next; - chapter = new EPUBJS.Chapter(this.spine[spinePos], this.store, this.credentials); - - this.process(chapter).then(function() { - // Load up the next chapter - setTimeout(function(){ - nextChapter(done); - }, 1); - - }); - } - return done.promise; - }.bind(this); - - if(typeof chars === 'number') { - this.break = chars; - } - - finished = nextChapter().then(function(){ - this.total = this._locations.length-1; - - if (this._currentCfi) { - this.currentLocation = this._currentCfi; - } - deferred.resolve(this._locations); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Locations.prototype.process = function(chapter) { - return chapter.load() - .then(function(_doc) { - - var range; - var doc = _doc; - var contents = doc.documentElement.querySelector("body"); - var counter = 0; - var prev; - var cfi; - - this.sprint(contents, function(node) { - var len = node.length; - var dist; - var pos = 0; - - // Start range - if (counter === 0) { - range = doc.createRange(); - range.setStart(node, 0); - } - - dist = this.break - counter; - - // Node is smaller than a break - if(dist > len){ - counter += len; - pos = len; - } - - while (pos < len) { - counter = this.break; - pos += this.break; - - // Gone over - if(pos >= len){ - // Continue counter for next node - counter = len - (pos - this.break); - - // At End - } else { - // End the previous range - range.setEnd(node, pos); - cfi = chapter.cfiFromRange(range); - this._locations.push(cfi); - counter = 0; - - // Start new range - pos += 1; - range = doc.createRange(); - range.setStart(node, pos); - } - - } - - prev = node; - - }.bind(this)); - - // Close remaining - if (range) { - range.setEnd(prev, prev.length); - cfi = chapter.cfiFromRange(range); - this._locations.push(cfi); - counter = 0; - } - - }.bind(this)); - -}; - -EPUBJS.Locations.prototype.sprint = function(root, func) { - var node; - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false); - - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Locations.prototype.locationFromCfi = function(cfi){ - // Check if the location has not been set yet - if(this._locations.length === 0) { - return -1; - } - - return EPUBJS.core.locationOf(cfi, this._locations, this.epubcfi.compare); -}; - -EPUBJS.Locations.prototype.percentageFromCfi = function(cfi) { - // Find closest cfi - var loc = this.locationFromCfi(cfi); - // Get percentage in total - return this.percentageFromLocation(loc); -}; - -EPUBJS.Locations.prototype.percentageFromLocation = function(loc) { - if (!loc || !this.total) { - return 0; - } - return (loc / this.total); -}; - -EPUBJS.Locations.prototype.cfiFromLocation = function(loc){ - var cfi = -1; - // check that pg is an int - if(typeof loc != "number"){ - loc = parseInt(loc); - } - - if(loc >= 0 && loc < this._locations.length) { - cfi = this._locations[loc]; - } - - return cfi; -}; - -EPUBJS.Locations.prototype.cfiFromPercentage = function(value){ - var percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1 - var loc = Math.ceil(this.total * percentage); - - return this.cfiFromLocation(loc); -}; - -EPUBJS.Locations.prototype.load = function(locations){ - this._locations = JSON.parse(locations); - this.total = this._locations.length-1; - return this._locations; -}; - -EPUBJS.Locations.prototype.save = function(json){ - return JSON.stringify(this._locations); -}; - -EPUBJS.Locations.prototype.getCurrent = function(json){ - return this._current; -}; - -EPUBJS.Locations.prototype.setCurrent = function(curr){ - var loc; - - if(typeof curr == "string"){ - this._currentCfi = curr; - } else if (typeof curr == "number") { - this._current = curr; - } else { - return; - } - - if(this._locations.length === 0) { - return; - } - - if(typeof curr == "string"){ - loc = this.locationFromCfi(curr); - this._current = loc; - } else { - loc = curr; - } - - this.trigger("changed", { - percentage: this.percentageFromLocation(loc) - }); -}; - -Object.defineProperty(EPUBJS.Locations.prototype, 'currentLocation', { - get: function () { - return this._current; - }, - set: function (curr) { - this.setCurrent(curr); - } -}); - -RSVP.EventTarget.mixin(EPUBJS.Locations.prototype); - -EPUBJS.Pagination = function(pageList) { - this.pages = []; - this.locations = []; - this.epubcfi = new EPUBJS.EpubCFI(); - if(pageList && pageList.length) { - this.process(pageList); - } -}; - -EPUBJS.Pagination.prototype.process = function(pageList){ - pageList.forEach(function(item){ - this.pages.push(item.page); - this.locations.push(item.cfi); - }, this); - - this.pageList = pageList; - this.firstPage = parseInt(this.pages[0]); - this.lastPage = parseInt(this.pages[this.pages.length-1]); - this.totalPages = this.lastPage - this.firstPage; -}; - -EPUBJS.Pagination.prototype.pageFromCfi = function(cfi){ - var pg = -1; - - // Check if the pageList has not been set yet - if(this.locations.length === 0) { - return -1; - } - - // TODO: check if CFI is valid? - - // check if the cfi is in the location list - // var index = this.locations.indexOf(cfi); - var index = EPUBJS.core.indexOfSorted(cfi, this.locations, this.epubcfi.compare); - if(index != -1) { - pg = this.pages[index]; - } else { - // Otherwise add it to the list of locations - // Insert it in the correct position in the locations page - //index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare); - index = EPUBJS.core.locationOf(cfi, this.locations, this.epubcfi.compare); - // Get the page at the location just before the new one, or return the first - pg = index-1 >= 0 ? this.pages[index-1] : this.pages[0]; - if(pg !== undefined) { - // Add the new page in so that the locations and page array match up - //this.pages.splice(index, 0, pg); - } else { - pg = -1; - } - - } - return pg; -}; - -EPUBJS.Pagination.prototype.cfiFromPage = function(pg){ - var cfi = -1; - // check that pg is an int - if(typeof pg != "number"){ - pg = parseInt(pg); - } - - // check if the cfi is in the page list - // Pages could be unsorted. - var index = this.pages.indexOf(pg); - if(index != -1) { - cfi = this.locations[index]; - } - // TODO: handle pages not in the list - return cfi; -}; - -EPUBJS.Pagination.prototype.pageFromPercentage = function(percent){ - var pg = Math.round(this.totalPages * percent); - return pg; -}; - -// Returns a value between 0 - 1 corresponding to the location of a page -EPUBJS.Pagination.prototype.percentageFromPage = function(pg){ - var percentage = (pg - this.firstPage) / this.totalPages; - return Math.round(percentage * 1000) / 1000; -}; - -// Returns a value between 0 - 1 corresponding to the location of a cfi -EPUBJS.Pagination.prototype.percentageFromCfi = function(cfi){ - var pg = this.pageFromCfi(cfi); - var percentage = this.percentageFromPage(pg); - return percentage; -}; -EPUBJS.Parser = function(baseUrl){ - this.baseUrl = baseUrl || ''; -}; - -EPUBJS.Parser.prototype.container = function(containerXml){ - //-- - var rootfile, fullpath, folder, encoding; - - if(!containerXml) { - console.error("Container File Not Found"); - return; - } - - rootfile = containerXml.querySelector("rootfile"); - - if(!rootfile) { - console.error("No RootFile Found"); - return; - } - - fullpath = rootfile.getAttribute('full-path'); - folder = EPUBJS.core.uri(fullpath).directory; - encoding = containerXml.xmlEncoding; - - //-- Now that we have the path we can parse the contents - return { - 'packagePath' : fullpath, - 'basePath' : folder, - 'encoding' : encoding - }; -}; - -EPUBJS.Parser.prototype.identifier = function(packageXml){ - var metadataNode; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - return this.getElementText(metadataNode, "identifier"); -}; - -EPUBJS.Parser.prototype.packageContents = function(packageXml, baseUrl){ - var parse = this; - var metadataNode, manifestNode, spineNode; - var manifest, navPath, tocPath, coverPath; - var spineNodeIndex; - var spine; - var spineIndexByURL; - var metadata; - - if(baseUrl) this.baseUrl = baseUrl; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - manifestNode = packageXml.querySelector("manifest"); - if(!manifestNode) { - console.error("No Manifest Found"); - return; - } - - spineNode = packageXml.querySelector("spine"); - if(!spineNode) { - console.error("No Spine Found"); - return; - } - - manifest = parse.manifest(manifestNode); - navPath = parse.findNavPath(manifestNode); - tocPath = parse.findTocPath(manifestNode, spineNode); - coverPath = parse.findCoverPath(packageXml); - - spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode); - - spine = parse.spine(spineNode, manifest); - - spineIndexByURL = {}; - spine.forEach(function(item){ - spineIndexByURL[item.href] = item.index; - }); - - metadata = parse.metadata(metadataNode); - - metadata.direction = spineNode.getAttribute("page-progression-direction"); - - return { - 'metadata' : metadata, - 'spine' : spine, - 'manifest' : manifest, - 'navPath' : navPath, - 'tocPath' : tocPath, - 'coverPath': coverPath, - 'spineNodeIndex' : spineNodeIndex, - 'spineIndexByURL' : spineIndexByURL - }; -}; - -//-- Find TOC NAV -EPUBJS.Parser.prototype.findNavPath = function(manifestNode){ - // Find item with property 'nav' - // Should catch nav irregardless of order - var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Find TOC NCX: media-type="application/x-dtbncx+xml" href="toc.ncx" -EPUBJS.Parser.prototype.findTocPath = function(manifestNode, spineNode){ - var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); - var tocId; - - // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as - // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, - // "The item that describes the NCX must be referenced by the spine toc attribute." - if (!node) { - tocId = spineNode.getAttribute("toc"); - if(tocId) { - node = manifestNode.querySelector("item[id='" + tocId + "']"); - } - } - - return node ? node.getAttribute('href') : false; -}; - -//-- Expanded to match Readium web components -EPUBJS.Parser.prototype.metadata = function(xml){ - var metadata = {}, - p = this; - - metadata.bookTitle = p.getElementText(xml, 'title'); - metadata.creator = p.getElementText(xml, 'creator'); - metadata.description = p.getElementText(xml, 'description'); - - metadata.pubdate = p.getElementText(xml, 'date'); - - metadata.publisher = p.getElementText(xml, 'publisher'); - - metadata.identifier = p.getElementText(xml, "identifier"); - metadata.language = p.getElementText(xml, "language"); - metadata.rights = p.getElementText(xml, "rights"); - - metadata.modified_date = p.querySelectorText(xml, "meta[property='dcterms:modified']"); - metadata.layout = p.querySelectorText(xml, "meta[property='rendition:layout']"); - metadata.orientation = p.querySelectorText(xml, "meta[property='rendition:orientation']"); - metadata.spread = p.querySelectorText(xml, "meta[property='rendition:spread']"); - - return metadata; -}; - -//-- Find Cover: -//-- Fallback for Epub 2.0 -EPUBJS.Parser.prototype.findCoverPath = function(packageXml){ - - var epubVersion = packageXml.querySelector('package').getAttribute('version'); - if (epubVersion === '2.0') { - var metaCover = packageXml.querySelector('meta[name="cover"]'); - if (metaCover) { - var coverId = metaCover.getAttribute('content'); - var cover = packageXml.querySelector("item[id='" + coverId + "']"); - return cover ? cover.getAttribute('href') : false; - } - else { - return false; - } - } - else { - var node = packageXml.querySelector("item[properties='cover-image']"); - return node ? node.getAttribute('href') : false; - } -}; - -EPUBJS.Parser.prototype.getElementText = function(xml, tag){ - var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag), - el; - - if(!found || found.length === 0) return ''; - - el = found[0]; - - if(el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; - -}; - -EPUBJS.Parser.prototype.querySelectorText = function(xml, q){ - var el = xml.querySelector(q); - - if(el && el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; -}; - -EPUBJS.Parser.prototype.manifest = function(manifestXml){ - var baseUrl = this.baseUrl, - manifest = {}; - - //-- Turn items into an array - var selected = manifestXml.querySelectorAll("item"), - items = Array.prototype.slice.call(selected); - - //-- Create an object with the id as key - items.forEach(function(item){ - var id = item.getAttribute('id'), - href = item.getAttribute('href') || '', - type = item.getAttribute('media-type') || '', - properties = item.getAttribute('properties') || ''; - - manifest[id] = { - 'href' : href, - 'url' : baseUrl + href, //-- Absolute URL for loading with a web worker - 'type' : type, - 'properties' : properties - }; - - }); - - return manifest; - -}; - -EPUBJS.Parser.prototype.spine = function(spineXml, manifest){ - var selected = spineXml.getElementsByTagName("itemref"), - items = Array.prototype.slice.call(selected); - - // var spineNodeIndex = Array.prototype.indexOf.call(spineXml.parentNode.childNodes, spineXml); - var spineNodeIndex = EPUBJS.core.indexOfElementNode(spineXml); - - var epubcfi = new EPUBJS.EpubCFI(); - - //-- Add to array to mantain ordering and cross reference with manifest - return items.map(function(item, index) { - var Id = item.getAttribute('idref'); - var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); - var props = item.getAttribute('properties') || ''; - var propArray = props.length ? props.split(' ') : []; - var manifestProps = manifest[Id].properties; - var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : []; - return { - 'id' : Id, - 'linear' : item.getAttribute('linear') || '', - 'properties' : propArray, - 'manifestProperties' : manifestPropArray, - 'href' : manifest[Id].href, - 'url' : manifest[Id].url, - 'index' : index, - 'cfiBase' : cfiBase, - 'cfi' : "epubcfi(" + cfiBase + ")" - }; - }); -}; - -EPUBJS.Parser.prototype.querySelectorByType = function(html, element, type){ - var query = html.querySelector(element+'[*|type="'+type+'"]'); - // Handle IE not supporting namespaced epub:type in querySelector - if(query === null || query.length === 0) { - query = html.querySelectorAll(element); - for (var i = 0; i < query.length; i++) { - if(query[i].getAttributeNS("http://www.idpf.org/2007/ops", "type") === type) { - return query[i]; - } - } - } else { - return query; - } -}; - -EPUBJS.Parser.prototype.nav = function (navHtml, spineIndexByURL, bookSpine) { - var toc = this.querySelectorByType(navHtml, 'nav', 'toc'); - return this.navItems(toc, spineIndexByURL, bookSpine); -}; - -EPUBJS.Parser.prototype.navItems = function (navNode, spineIndexByURL, bookSpine) { - if (!navNode) return []; - - var list = navNode.querySelector('ol'); - if (!list) return []; - - var items = list.childNodes, - result = []; - - Array.prototype.forEach.call(items, function (item) { - if (item.tagName !== 'li') return; - - var content = item.querySelector('a, span'), - href = content.getAttribute('href') || '', - label = content.textContent || '', - split = href.split('#'), - baseUrl = split[0], - spinePos = spineIndexByURL[baseUrl], - spineItem = bookSpine[spinePos], - cfi = spineItem ? spineItem.cfi : '', - subitems = this.navItems(item, spineIndexByURL, bookSpine); - - result.push({ - href: href, - label: label, - spinePos: spinePos, - subitems: subitems, - cfi: cfi - }); - }.bind(this)); - - return result; -}; - -EPUBJS.Parser.prototype.toc = function(tocXml, spineIndexByURL, bookSpine){ - var navPoints = tocXml.querySelectorAll("navMap navPoint"); - var length = navPoints.length; - var i; - var toc = {}; - var list = []; - var item, parent; - - if(!navPoints || length === 0) return list; - - for (i = 0; i < length; ++i) { - item = this.tocItem(navPoints[i], spineIndexByURL, bookSpine); - toc[item.id] = item; - if(!item.parent) { - list.push(item); - } else { - parent = toc[item.parent]; - parent.subitems.push(item); - } - } - - return list; -}; - -EPUBJS.Parser.prototype.tocItem = function(item, spineIndexByURL, bookSpine){ - var id = item.getAttribute('id') || false, - content = item.querySelector("content"), - src = content.getAttribute('src'), - navLabel = item.querySelector("navLabel"), - text = navLabel.textContent ? navLabel.textContent : "", - split = src.split("#"), - baseUrl = split[0], - spinePos = spineIndexByURL[baseUrl], - spineItem = bookSpine[spinePos], - subitems = [], - parentNode = item.parentNode, - parent, - cfi = spineItem ? spineItem.cfi : ''; - - if(parentNode && parentNode.nodeName === "navPoint") { - parent = parentNode.getAttribute('id'); - } - - if(!id) { - if(spinePos) { - spineItem = bookSpine[spinePos]; - id = spineItem.id; - cfi = spineItem.cfi; - } else { - id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid(); - item.setAttribute('id', id); - } - } - - return { - "id": id, - "href": src, - "label": text, - "spinePos": spinePos, - "subitems" : subitems, - "parent" : parent, - "cfi" : cfi - }; -}; - - -EPUBJS.Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){ - var navElement = this.querySelectorByType(navHtml, "nav", "page-list"); - var navItems = navElement ? navElement.querySelectorAll("ol li") : []; - var length = navItems.length; - var i; - var toc = {}; - var list = []; - var item; - - if(!navItems || length === 0) return list; - - for (i = 0; i < length; ++i) { - item = this.pageListItem(navItems[i], spineIndexByURL, bookSpine); - list.push(item); - } - - return list; -}; - -EPUBJS.Parser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){ - var id = item.getAttribute('id') || false, - content = item.querySelector("a"), - href = content.getAttribute('href') || '', - text = content.textContent || "", - page = parseInt(text), - isCfi = href.indexOf("epubcfi"), - split, - packageUrl, - cfi; - - if(isCfi != -1) { - split = href.split("#"); - packageUrl = split[0]; - cfi = split.length > 1 ? split[1] : false; - return { - "cfi" : cfi, - "href" : href, - "packageUrl" : packageUrl, - "page" : page - }; - } else { - return { - "href" : href, - "page" : page - }; - } -}; - -EPUBJS.Render.Iframe = function() { - this.iframe = null; - this.document = null; - this.window = null; - this.docEl = null; - this.bodyEl = null; - - this.leftPos = 0; - this.pageWidth = 0; - this.id = EPUBJS.core.uuid(); -}; - -//-- Build up any html needed -EPUBJS.Render.Iframe.prototype.create = function(){ - this.element = document.createElement('div'); - this.element.id = "epubjs-view:" + this.id; - - this.isMobile = navigator.userAgent.match(/(iPad|iPhone|iPod|Mobile|Android)/g); - this.transform = EPUBJS.core.prefixed('transform'); - - return this.element; -}; - -EPUBJS.Render.Iframe.prototype.addIframe = function(){ - this.iframe = document.createElement('iframe'); - this.iframe.id = "epubjs-iframe:" + this.id; - this.iframe.scrolling = this.scrolling || "no"; - this.iframe.seamless = "seamless"; - // Back up if seamless isn't supported - this.iframe.style.border = "none"; - - this.iframe.addEventListener("load", this.loaded.bind(this), false); - - if (this._width || this._height) { - this.iframe.height = this._height; - this.iframe.width = this._width; - } - return this.iframe; -}; - -/** -* Sets the source of the iframe with the given URL string -* Takes: Document Contents String -* Returns: promise with document element -*/ -EPUBJS.Render.Iframe.prototype.load = function(contents, url){ - var render = this, - deferred = new RSVP.defer(); - - if(this.window) { - this.unload(); - } - - if (this.iframe) { - this.element.removeChild(this.iframe); - } - - this.iframe = this.addIframe(); - this.element.appendChild(this.iframe); - - - this.iframe.onload = function(e) { - var title; - - render.document = render.iframe.contentDocument; - render.docEl = render.document.documentElement; - render.headEl = render.document.head; - render.bodyEl = render.document.body || render.document.querySelector("body"); - render.window = render.iframe.contentWindow; - - render.window.addEventListener("resize", render.resized.bind(render), false); - - // Reset the scroll position - render.leftPos = 0; - render.setLeft(0); - - //-- Clear Margins - if(render.bodyEl) { - render.bodyEl.style.margin = "0"; - } - - deferred.resolve(render.docEl); - }; - - this.iframe.onerror = function(e) { - //console.error("Error Loading Contents", e); - deferred.reject({ - message : "Error Loading Contents: " + e, - stack : new Error().stack - }); - }; - - // this.iframe.contentWindow.location.replace(url); - this.document = this.iframe.contentDocument; - - if(!this.document) { - deferred.reject(new Error("No Document Available")); - return deferred.promise; - } - - this.iframe.contentDocument.open(); - this.iframe.contentDocument.write(contents); - this.iframe.contentDocument.close(); - - return deferred.promise; -}; - - -EPUBJS.Render.Iframe.prototype.loaded = function(v){ - var url = this.iframe.contentWindow.location.href; - var baseEl, base; - - this.document = this.iframe.contentDocument; - this.docEl = this.document.documentElement; - this.headEl = this.document.head; - this.bodyEl = this.document.body || this.document.querySelector("body"); - this.window = this.iframe.contentWindow; - this.window.focus(); - - if(url != "about:blank"){ - baseEl = this.iframe.contentDocument.querySelector("base"); - base = baseEl.getAttribute('href'); - this.trigger("render:loaded", base); - } - -}; - -// Resize the iframe to the given width and height -EPUBJS.Render.Iframe.prototype.resize = function(width, height){ - var iframeBox; - - if(!this.element) return; - - this.element.style.height = height; - - - if(!isNaN(width) && width % 2 !== 0){ - width += 1; //-- Prevent cutting off edges of text in columns - } - - this.element.style.width = width; - - if (this.iframe) { - this.iframe.height = height; - this.iframe.width = width; - } - - // Set the width for the iframe - this._height = height; - this._width = width; - - // Get the fractional height and width of the iframe - // Default to orginal if bounding rect is 0 - this.width = this.element.getBoundingClientRect().width || width; - this.height = this.element.getBoundingClientRect().height || height; - -}; - - -EPUBJS.Render.Iframe.prototype.resized = function(e){ - // Get the fractional height and width of the iframe - this.width = this.iframe.getBoundingClientRect().width; - this.height = this.iframe.getBoundingClientRect().height; -}; - -EPUBJS.Render.Iframe.prototype.totalWidth = function(){ - return this.docEl.scrollWidth; -}; - -EPUBJS.Render.Iframe.prototype.totalHeight = function(){ - return this.docEl.scrollHeight; -}; - -EPUBJS.Render.Iframe.prototype.setPageDimensions = function(pageWidth, pageHeight){ - this.pageWidth = pageWidth; - this.pageHeight = pageHeight; - //-- Add a page to the width of the document to account an for odd number of pages - // this.docEl.style.width = this.docEl.scrollWidth + pageWidth + "px"; -}; - -EPUBJS.Render.Iframe.prototype.setDirection = function(direction){ - - this.direction = direction; - - // Undo previous changes if needed - if(this.docEl && this.docEl.dir == "rtl"){ - this.docEl.dir = "rtl"; - if (this.layout !== "pre-paginated") { - this.docEl.style.position = "static"; - this.docEl.style.right = "auto"; - } - } - -}; - -EPUBJS.Render.Iframe.prototype.setLeft = function(leftPos){ - // this.bodyEl.style.marginLeft = -leftPos + "px"; - // this.docEl.style.marginLeft = -leftPos + "px"; - // this.docEl.style[EPUBJS.Render.Iframe.transform] = 'translate('+ (-leftPos) + 'px, 0)'; - - if (this.isMobile) { - this.docEl.style[this.transform] = 'translate('+ (-leftPos) + 'px, 0)'; - } else { - this.document.defaultView.scrollTo(leftPos, 0); - } - -}; - -EPUBJS.Render.Iframe.prototype.setLayout = function (layout) { - this.layout = layout; -}; - -EPUBJS.Render.Iframe.prototype.setStyle = function(style, val, prefixed){ - if(prefixed) { - style = EPUBJS.core.prefixed(style); - } - - if(this.bodyEl) this.bodyEl.style[style] = val; -}; - -EPUBJS.Render.Iframe.prototype.removeStyle = function(style){ - - if(this.bodyEl) this.bodyEl.style[style] = ''; - -}; - -EPUBJS.Render.Iframe.prototype.setClasses = function(classes){ - if(this.bodyEl) this.bodyEl.className = classes.join(" "); -}; - -EPUBJS.Render.Iframe.prototype.addHeadTag = function(tag, attrs, _doc) { - var doc = _doc || this.document; - var tagEl = doc.createElement(tag); - var headEl = doc.head; - - for(var attr in attrs) { - tagEl.setAttribute(attr, attrs[attr]); - } - - if(headEl) headEl.insertBefore(tagEl, headEl.firstChild); -}; - -EPUBJS.Render.Iframe.prototype.page = function(pg){ - this.leftPos = this.pageWidth * (pg-1); //-- pages start at 1 - - // Reverse for rtl langs - if(this.direction === "rtl"){ - this.leftPos = this.leftPos * -1; - } - - this.setLeft(this.leftPos); -}; - -//-- Show the page containing an Element -EPUBJS.Render.Iframe.prototype.getPageNumberByElement = function(el){ - var left, pg; - if(!el) return; - - left = this.leftPos + el.getBoundingClientRect().left; //-- Calculate left offset compaired to scrolled position - - pg = Math.floor(left / this.pageWidth) + 1; //-- pages start at 1 - - return pg; -}; - -//-- Show the page containing an Element -EPUBJS.Render.Iframe.prototype.getPageNumberByRect = function(boundingClientRect){ - var left, pg; - - left = this.leftPos + boundingClientRect.left; //-- Calculate left offset compaired to scrolled position - pg = Math.floor(left / this.pageWidth) + 1; //-- pages start at 1 - - return pg; -}; - -// Return the root element of the content -EPUBJS.Render.Iframe.prototype.getBaseElement = function(){ - return this.bodyEl; -}; - -// Return the document element -EPUBJS.Render.Iframe.prototype.getDocumentElement = function(){ - return this.docEl; -}; - -// Checks if an element is on the screen -EPUBJS.Render.Iframe.prototype.isElementVisible = function(el){ - var rect; - var left; - - if(el && typeof el.getBoundingClientRect === 'function'){ - rect = el.getBoundingClientRect(); - left = rect.left; //+ rect.width; - if( rect.width !== 0 && - rect.height !== 0 && // Element not visible - left >= 0 && - left < this.pageWidth ) { - return true; - } - } - - return false; -}; - - -EPUBJS.Render.Iframe.prototype.scroll = function(bool){ - if(bool) { - // this.iframe.scrolling = "yes"; - this.scrolling = "yes"; - } else { - this.scrolling = "no"; - // this.iframe.scrolling = "no"; - } -}; - -// Cleanup event listeners -EPUBJS.Render.Iframe.prototype.unload = function(){ - this.window.removeEventListener("resize", this.resized); - this.iframe.removeEventListener("load", this.loaded); -}; - -//-- Enable binding events to Render -RSVP.EventTarget.mixin(EPUBJS.Render.Iframe.prototype); - -EPUBJS.Renderer = function(renderMethod, hidden) { - // Dom events to listen for - this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click"]; - this.upEvent = "mouseup"; - this.downEvent = "mousedown"; - if('ontouchstart' in document.documentElement) { - this.listenedEvents.push("touchstart", "touchend"); - this.upEvent = "touchend"; - this.downEvent = "touchstart"; - } - /** - * Setup a render method. - * Options are: Iframe - */ - if(renderMethod && typeof(EPUBJS.Render[renderMethod]) != "undefined"){ - this.render = new EPUBJS.Render[renderMethod](); - } else { - console.error("Not a Valid Rendering Method"); - } - - // Listen for load events - this.render.on("render:loaded", this.loaded.bind(this)); - - // Cached for replacement urls from storage - this.caches = {}; - - // Blank Cfi for Parsing - this.epubcfi = new EPUBJS.EpubCFI(); - - this.spreads = true; - this.isForcedSingle = false; - this.resized = this.onResized.bind(this); - - this.layoutSettings = {}; - - this.hidden = hidden || false; - //-- Adds Hook methods to the Book prototype - // Hooks will all return before triggering the callback. - EPUBJS.Hooks.mixin(this); - //-- Get pre-registered hooks for events - this.getHooks("beforeChapterDisplay"); - - //-- Queue up page changes if page map isn't ready - this._q = EPUBJS.core.queue(this); - - this._moving = false; - -}; - -//-- Renderer events for listening -EPUBJS.Renderer.prototype.Events = [ - "renderer:keydown", - "renderer:keyup", - "renderer:keypressed", - "renderer:mouseup", - "renderer:mousedown", - "renderer:click", - "renderer:touchstart", - "renderer:touchend", - "renderer:selected", - "renderer:chapterUnload", - "renderer:chapterUnloaded", - "renderer:chapterDisplayed", - "renderer:locationChanged", - "renderer:visibleLocationChanged", - "renderer:visibleRangeChanged", - "renderer:resized", - "renderer:spreads", - "renderer:beforeResize" -]; - -/** -* Creates an element to render to. -* Resizes to passed width and height or to the elements size -*/ -EPUBJS.Renderer.prototype.initialize = function(element, width, height){ - this.container = element; - this.element = this.render.create(); - - this.initWidth = width; - this.initHeight = height; - - this.width = width || this.container.clientWidth; - this.height = height || this.container.clientHeight; - - this.container.appendChild(this.element); - - if(width && height){ - this.render.resize(this.width, this.height); - } else { - this.render.resize('100%', '100%'); - } - - document.addEventListener("orientationchange", this.onResized.bind(this)); -}; - -/** -* Display a chapter -* Takes: chapter object, global layout settings -* Returns: Promise with passed Renderer after pages has loaded -*/ -EPUBJS.Renderer.prototype.displayChapter = function(chapter, globalLayout){ - var store = false; - if(this._moving) { - console.warning("Rendering In Progress"); - var deferred = new RSVP.defer(); - deferred.reject({ - message : "Rendering In Progress", - stack : new Error().stack - }); - return deferred.promise; - } - this._moving = true; - // Get the url string from the chapter (may be from storage) - return chapter.render(). - then(function(contents) { - - // Unload the previous chapter listener - if(this.currentChapter) { - this.trigger("renderer:chapterUnload"); - this.currentChapter.unload(); // Remove stored blobs - - if(this.render.window){ - this.render.window.removeEventListener("resize", this.resized); - } - - this.removeEventListeners(); - this.removeSelectionListeners(); - this.trigger("renderer:chapterUnloaded"); - this.contents = null; - this.doc = null; - this.pageMap = null; - } - - this.currentChapter = chapter; - - this.chapterPos = 1; - - this.currentChapterCfiBase = chapter.cfiBase; - - this.layoutSettings = this.reconcileLayoutSettings(globalLayout, chapter.properties); - - return this.load(contents, chapter.href); - - }.bind(this), function() { - this._moving = false; - }.bind(this)); - -}; - -/** -* Loads a url (string) and renders it, -* attaching event listeners and triggering hooks. -* Returns: Promise with the rendered contents. -*/ - -EPUBJS.Renderer.prototype.load = function(contents, url){ - var deferred = new RSVP.defer(); - var loaded; - - // Switch to the required layout method for the settings - this.layoutMethod = this.determineLayout(this.layoutSettings); - this.layout = new EPUBJS.Layout[this.layoutMethod](); - - this.visible(false); - - this.render.load(contents, url).then(function(contents) { - - // Duck-type fixed layout books. - if (EPUBJS.Layout.isFixedLayout(contents)) { - this.layoutSettings.layout = "pre-paginated"; - this.layoutMethod = this.determineLayout(this.layoutSettings); - this.layout = new EPUBJS.Layout[this.layoutMethod](); - } - this.render.setLayout(this.layoutSettings.layout); - - // HTML element must have direction set if RTL or columnns will - // not be in the correct direction in Firefox - // Firefox also need the html element to be position right - if(this.render.direction == "rtl" && this.render.docEl.dir != "rtl"){ - this.render.docEl.dir = "rtl"; - if (this.render.layout !== "pre-paginated") { - this.render.docEl.style.position = "absolute"; - this.render.docEl.style.right = "0"; - } - } - - this.afterLoad(contents); - - //-- Trigger registered hooks before displaying - this.beforeDisplay(function(){ - - this.afterDisplay(); - - this.visible(true); - - - deferred.resolve(this); //-- why does this return the renderer? - - }.bind(this)); - - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Renderer.prototype.afterLoad = function(contents) { - var formated; - // this.currentChapter.setDocument(this.render.document); - this.contents = contents; - this.doc = this.render.document; - - // Format the contents using the current layout method - this.formated = this.layout.format(contents, this.render.width, this.render.height, this.gap); - this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight); - - // window.addEventListener("orientationchange", this.onResized.bind(this), false); - if(!this.initWidth && !this.initHeight){ - this.render.window.addEventListener("resize", this.resized, false); - } - - this.addEventListeners(); - this.addSelectionListeners(); - -}; - -EPUBJS.Renderer.prototype.afterDisplay = function(contents) { - - var pages = this.layout.calculatePages(); - var msg = this.currentChapter; - var queued = this._q.length(); - this._moving = false; - - this.updatePages(pages); - - this.visibleRangeCfi = this.getVisibleRangeCfi(); - this.currentLocationCfi = this.visibleRangeCfi.start; - - if(queued === 0) { - this.trigger("renderer:locationChanged", this.currentLocationCfi); - this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi); - } - - msg.cfi = this.currentLocationCfi; //TODO: why is this cfi passed to chapterDisplayed - this.trigger("renderer:chapterDisplayed", msg); - -}; - -EPUBJS.Renderer.prototype.loaded = function(url){ - this.trigger("render:loaded", url); - // var uri = EPUBJS.core.uri(url); - // var relative = uri.path.replace(book.bookUrl, ''); - // console.log(url, uri, relative); -}; - -/** -* Reconciles the current chapters layout properies with -* the global layout properities. -* Takes: global layout settings object, chapter properties string -* Returns: Object with layout properties -*/ -EPUBJS.Renderer.prototype.reconcileLayoutSettings = function(global, chapter){ - var settings = {}; - - //-- Get the global defaults - for (var attr in global) { - if (global.hasOwnProperty(attr)){ - settings[attr] = global[attr]; - } - } - //-- Get the chapter's display type - chapter.forEach(function(prop){ - var rendition = prop.replace("rendition:", ''); - var split = rendition.indexOf("-"); - var property, value; - - if(split != -1){ - property = rendition.slice(0, split); - value = rendition.slice(split+1); - - settings[property] = value; - } - }); - return settings; -}; - -/** -* Uses the settings to determine which Layout Method is needed -* Triggers events based on the method choosen -* Takes: Layout settings object -* Returns: String of appropriate for EPUBJS.Layout function -*/ -EPUBJS.Renderer.prototype.determineLayout = function(settings){ - // Default is layout: reflowable & spread: auto - var spreads = this.determineSpreads(this.minSpreadWidth); - var layoutMethod = spreads ? "ReflowableSpreads" : "Reflowable"; - var scroll = false; - - if(settings.layout === "pre-paginated") { - layoutMethod = "Fixed"; - scroll = true; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "none") { - layoutMethod = "Reflowable"; - scroll = false; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "both") { - layoutMethod = "ReflowableSpreads"; - scroll = false; - spreads = true; - } - - this.spreads = spreads; - this.render.scroll(scroll); - this.trigger("renderer:spreads", spreads); - return layoutMethod; -}; - -// Shortcut to trigger the hook before displaying the chapter -EPUBJS.Renderer.prototype.beforeDisplay = function(callback, renderer){ - this.triggerHooks("beforeChapterDisplay", callback, this); -}; - -// Update the renderer with the information passed by the layout -EPUBJS.Renderer.prototype.updatePages = function(layout){ - this.pageMap = this.mapPage(); - // this.displayedPages = layout.displayedPages; - - if (this.spreads) { - this.displayedPages = Math.ceil(this.pageMap.length / 2); - } else { - this.displayedPages = this.pageMap.length; - } - - this.currentChapter.pages = this.pageMap.length; - - this._q.flush(); -}; - -// Apply the layout again and jump back to the previous cfi position -EPUBJS.Renderer.prototype.reformat = function(){ - var renderer = this; - var formated, pages; - var spreads; - - if(!this.contents) return; - - spreads = this.determineSpreads(this.minSpreadWidth); - - // Only re-layout if the spreads have switched - if(spreads != this.spreads){ - this.spreads = spreads; - this.layoutMethod = this.determineLayout(this.layoutSettings); - this.layout = new EPUBJS.Layout[this.layoutMethod](); - } - - // Reset pages - this.chapterPos = 1; - - this.render.page(this.chapterPos); - // Give the css styles time to update - // clearTimeout(this.timeoutTillCfi); - // this.timeoutTillCfi = setTimeout(function(){ - renderer.formated = renderer.layout.format(renderer.render.docEl, renderer.render.width, renderer.render.height, renderer.gap); - renderer.render.setPageDimensions(renderer.formated.pageWidth, renderer.formated.pageHeight); - - pages = renderer.layout.calculatePages(); - renderer.updatePages(pages); - - //-- Go to current page after formating - if(renderer.currentLocationCfi){ - renderer.gotoCfi(renderer.currentLocationCfi); - } - // renderer.timeoutTillCfi = null; - -}; - -// Hide and show the render's container . -EPUBJS.Renderer.prototype.visible = function(bool){ - if(typeof(bool) === "undefined") { - return this.element.style.visibility; - } - - if(bool === true && !this.hidden){ - this.element.style.visibility = "visible"; - }else if(bool === false){ - this.element.style.visibility = "hidden"; - } -}; - -// Remove the render element and clean up listeners -EPUBJS.Renderer.prototype.remove = function() { - if(this.render.window) { - this.render.unload(); - this.render.window.removeEventListener("resize", this.resized); - this.removeEventListeners(); - this.removeSelectionListeners(); - } - - // clean container content - //this.container.innerHtml = ""; // not safe - this.container.removeChild(this.element); -}; - -//-- STYLES - -EPUBJS.Renderer.prototype.applyStyles = function(styles) { - for (var style in styles) { - this.render.setStyle(style, styles[style]); - } -}; - -EPUBJS.Renderer.prototype.setStyle = function(style, val, prefixed){ - this.render.setStyle(style, val, prefixed); -}; - -EPUBJS.Renderer.prototype.removeStyle = function(style){ - this.render.removeStyle(style); -}; - -EPUBJS.Renderer.prototype.setClasses = function(classes){ - this.render.setClasses(classes); -}; - -//-- HEAD TAGS -EPUBJS.Renderer.prototype.applyHeadTags = function(headTags) { - for ( var headTag in headTags ) { - this.render.addHeadTag(headTag, headTags[headTag]); - } -}; - -//-- NAVIGATION - -EPUBJS.Renderer.prototype.page = function(pg){ - if(!this.pageMap) { - console.warn("pageMap not set, queuing"); - this._q.enqueue("page", arguments); - return true; - } - - if(pg >= 1 && pg <= this.displayedPages){ - this.chapterPos = pg; - - this.render.page(pg); - this.visibleRangeCfi = this.getVisibleRangeCfi(); - this.currentLocationCfi = this.visibleRangeCfi.start; - this.trigger("renderer:locationChanged", this.currentLocationCfi); - this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi); - - return true; - } - //-- Return false if page is greater than the total - return false; -}; - -// Short cut to find next page's cfi starting at the last visible element -/* -EPUBJS.Renderer.prototype.nextPage = function(){ - var pg = this.chapterPos + 1; - if(pg <= this.displayedPages){ - this.chapterPos = pg; - - this.render.page(pg); - - this.currentLocationCfi = this.getPageCfi(this.visibileEl); - this.trigger("renderer:locationChanged", this.currentLocationCfi); - - return true; - } - //-- Return false if page is greater than the total - return false; -}; -*/ -EPUBJS.Renderer.prototype.nextPage = function(){ - return this.page(this.chapterPos + 1); -}; - -EPUBJS.Renderer.prototype.prevPage = function(){ - return this.page(this.chapterPos - 1); -}; - -//-- Show the page containing an Element -EPUBJS.Renderer.prototype.pageByElement = function(el){ - var pg; - if(!el) return; - - pg = this.render.getPageNumberByElement(el); - this.page(pg); -}; - -// Jump to the last page of the chapter -EPUBJS.Renderer.prototype.lastPage = function(){ - if(this._moving) { - return this._q.enqueue("lastPage", arguments); - } - - this.page(this.displayedPages); -}; - -// Jump to the first page of the chapter -EPUBJS.Renderer.prototype.firstPage = function(){ - if(this._moving) { - return this._q.enqueue("firstPage", arguments); - } - - this.page(1); -}; - -//-- Find a section by fragement id -EPUBJS.Renderer.prototype.section = function(fragment){ - var el = this.doc.getElementById(fragment); - - if(el){ - this.pageByElement(el); - } - -}; - -EPUBJS.Renderer.prototype.firstElementisTextNode = function(node) { - var children = node.childNodes; - var leng = children.length; - - if(leng && - children[0] && // First Child - children[0].nodeType === 3 && // This is a textNodes - children[0].textContent.trim().length) { // With non whitespace or return characters - return true; - } - return false; -}; - -EPUBJS.Renderer.prototype.isGoodNode = function(node) { - var embeddedElements = ["audio", "canvas", "embed", "iframe", "img", "math", "object", "svg", "video"]; - if (embeddedElements.indexOf(node.tagName.toLowerCase()) !== -1) { - // Embedded elements usually do not have a text node as first element, but are also good nodes - return true; - } - return this.firstElementisTextNode(node); -}; - -// Walk the node tree from a start element to next visible element -EPUBJS.Renderer.prototype.walk = function(node, x, y) { - var r, children, leng, - startNode = node, - prevNode, - stack = [startNode]; - - var STOP = 10000, ITER=0; - - while(!r && stack.length) { - node = stack.shift(); - if( this.containsPoint(node, x, y) && this.isGoodNode(node)) { - r = node; - } - - if(!r && node && node.childElementCount > 0){ - children = node.children; - if (children && children.length) { - leng = children.length ? children.length : 0; - } else { - return r; - } - for (var i = leng-1; i >= 0; i--) { - if(children[i] != prevNode) stack.unshift(children[i]); - } - } - - if(!r && stack.length === 0 && startNode && startNode.parentNode !== null){ - stack.push(startNode.parentNode); - prevNode = startNode; - startNode = startNode.parentNode; - } - - - ITER++; - if(ITER > STOP) { - console.error("ENDLESS LOOP"); - break; - } - - } - - return r; -}; - -// Checks if an element is on the screen -EPUBJS.Renderer.prototype.containsPoint = function(el, x, y){ - var rect; - var left; - if(el && typeof el.getBoundingClientRect === 'function'){ - rect = el.getBoundingClientRect(); - // console.log(el, rect, x, y); - - if( rect.width !== 0 && - rect.height !== 0 && // Element not visible - rect.left >= x && - x <= rect.left + rect.width) { - return true; - } - } - - return false; -}; - -EPUBJS.Renderer.prototype.textSprint = function(root, func) { - var filterEmpty = function(node){ - if ( ! /^\s*$/.test(node.data) ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - }; - var treeWalker; - var node; - - try { - treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: filterEmpty - }, false); - while ((node = treeWalker.nextNode())) { - func(node); - } - } catch (e) { - // IE doesn't accept the object, just wants a function - // https://msdn.microsoft.com/en-us/library/ff974820(v=vs.85).aspx - treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, filterEmpty, false); - while ((node = treeWalker.nextNode())) { - func(node); - } - } - - - -}; - -EPUBJS.Renderer.prototype.sprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null, false); - var node; - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -EPUBJS.Renderer.prototype.mapPage = function(){ - var renderer = this; - var map = []; - var root = this.render.getBaseElement(); - var page = 1; - var width = this.layout.colWidth + this.layout.gap; - var offset = this.formated.pageWidth * (this.chapterPos-1); - var limit = (width * page) - offset;// (width * page) - offset; - var elLimit = 0; - var prevRange; - var prevRanges; - var cfi; - var lastChildren = null; - var prevElement; - var startRange, endRange; - var startCfi, endCfi; - var check = function(node) { - var elPos; - var elRange; - var found; - if (node.nodeType == Node.TEXT_NODE) { - - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - - if(!elPos || (elPos.width === 0 && elPos.height === 0)) { - return; - } - - //-- Element starts new Col - if(elPos.left > elLimit) { - found = checkText(node); - } - - //-- Element Spans new Col - if(elPos.right > elLimit) { - found = checkText(node); - } - - prevElement = node; - - if (found) { - prevRange = null; - } - } - - }; - var checkText = function(node){ - var result; - var ranges = renderer.splitTextNodeIntoWordsRanges(node); - - ranges.forEach(function(range){ - var pos = range.getBoundingClientRect(); - - if(!pos || (pos.width === 0 && pos.height === 0)) { - return; - } - if(pos.left + pos.width < limit) { - if(!map[page-1]){ - range.collapse(true); - cfi = renderer.currentChapter.cfiFromRange(range); - // map[page-1].start = cfi; - result = map.push({ start: cfi, end: null }); - } - } else { - // Previous Range is null since we already found our last map pair - // Use that last walked textNode - if(!prevRange && prevElement) { - prevRanges = renderer.splitTextNodeIntoWordsRanges(prevElement); - prevRange = prevRanges[prevRanges.length-1]; - } - - if(prevRange && map.length){ - prevRange.collapse(false); - cfi = renderer.currentChapter.cfiFromRange(prevRange); - if (map[map.length-1]) { - map[map.length-1].end = cfi; - } - } - - range.collapse(true); - cfi = renderer.currentChapter.cfiFromRange(range); - result = map.push({ - start: cfi, - end: null - }); - - page += 1; - limit = (width * page) - offset; - elLimit = limit; - } - - prevRange = range; - }); - - return result; - }; - var docEl = this.render.getDocumentElement(); - var dir = docEl.dir; - - // Set back to ltr before sprinting to get correct order - if(dir == "rtl") { - docEl.dir = "ltr"; - if (this.layoutSettings.layout !== "pre-paginated") { - docEl.style.position = "static"; - } - } - - this.textSprint(root, check); - - // Reset back to previous RTL settings - if(dir == "rtl") { - docEl.dir = dir; - if (this.layoutSettings.layout !== "pre-paginated") { - docEl.style.left = "auto"; - docEl.style.right = "0"; - } - } - - // Check the remaining children that fit on this page - // to ensure the end is correctly calculated - if(!prevRange && prevElement) { - prevRanges = renderer.splitTextNodeIntoWordsRanges(prevElement); - prevRange = prevRanges[prevRanges.length-1]; - } - - if(prevRange){ - prevRange.collapse(false); - cfi = renderer.currentChapter.cfiFromRange(prevRange); - map[map.length-1].end = cfi; - } - - // Handle empty map - if(!map.length) { - startRange = this.doc.createRange(); - startRange.selectNodeContents(root); - startRange.collapse(true); - startCfi = renderer.currentChapter.cfiFromRange(startRange); - - endRange = this.doc.createRange(); - endRange.selectNodeContents(root); - endRange.collapse(false); - endCfi = renderer.currentChapter.cfiFromRange(endRange); - - - map.push({ start: startCfi, end: endCfi }); - - } - - // clean up - prevRange = null; - prevRanges = undefined; - startRange = null; - endRange = null; - root = null; - - return map; -}; - - -EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) { - var whiteCharacters = "\x2D\x20\t\r\n\b\f"; - // '-' \x2D - // ' ' \x20 - - if (! startPosition) { - startPosition = 0; - } - - for (var i = startPosition; i < text.length; i++) { - if (whiteCharacters.indexOf(text.charAt(i)) != -1) { - return i; - } - } - - return -1; -}; - - -EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ - var ranges = []; - var text = node.textContent.trim(); - var range; - var rect; - var list; - - // Usage of indexOf() function for space character as word delimiter - // is not sufficient in case of other breakable characters like \r\n- etc - var pos = this.indexOfBreakableChar(text); - - if(pos === -1) { - range = this.doc.createRange(); - range.selectNodeContents(node); - return [range]; - } - - range = this.doc.createRange(); - range.setStart(node, 0); - range.setEnd(node, pos); - ranges.push(range); - - // there was a word miss in case of one letter words - range = this.doc.createRange(); - range.setStart(node, pos+1); - - while ( pos != -1 ) { - - pos = this.indexOfBreakableChar(text, pos + 1); - if(pos > 0) { - - if(range) { - range.setEnd(node, pos); - ranges.push(range); - } - - range = this.doc.createRange(); - range.setStart(node, pos+1); - } - } - - if(range) { - range.setEnd(node, text.length); - ranges.push(range); - } - - return ranges; -}; - -EPUBJS.Renderer.prototype.rangePosition = function(range){ - var rect; - var list; - - list = range.getClientRects(); - - if(list.length) { - rect = list[0]; - return rect; - } - - return null; -}; - -/* -// Get the cfi of the current page -EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){ - var range = this.doc.createRange(); - var position; - // TODO : this might need to take margin / padding into account? - var x = 1;//this.formated.pageWidth/2; - var y = 1;//;this.formated.pageHeight/2; - - range = this.getRange(x, y); - - // var test = this.doc.defaultView.getSelection(); - // var r = this.doc.createRange(); - // test.removeAllRanges(); - // r.setStart(range.startContainer, range.startOffset); - // r.setEnd(range.startContainer, range.startOffset + 1); - // test.addRange(r); - - return this.currentChapter.cfiFromRange(range); -}; -*/ - -// Get the cfi of the current page -EPUBJS.Renderer.prototype.getPageCfi = function(){ - var pg = (this.chapterPos * 2)-1; - return this.pageMap[pg].start; -}; - -EPUBJS.Renderer.prototype.getRange = function(x, y, forceElement){ - var range = this.doc.createRange(); - var position; - forceElement = true; // temp override - if(typeof document.caretPositionFromPoint !== "undefined" && !forceElement){ - position = this.doc.caretPositionFromPoint(x, y); - range.setStart(position.offsetNode, position.offset); - } else if(typeof document.caretRangeFromPoint !== "undefined" && !forceElement){ - range = this.doc.caretRangeFromPoint(x, y); - } else { - this.visibileEl = this.findElementAfter(x, y); - range.setStart(this.visibileEl, 1); - } - - // var test = this.doc.defaultView.getSelection(); - // var r = this.doc.createRange(); - // test.removeAllRanges(); - // r.setStart(range.startContainer, range.startOffset); - // r.setEnd(range.startContainer, range.startOffset + 1); - // test.addRange(r); - return range; -}; - -/* -EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){ - var startX = 0; - var startY = 0; - var endX = this.width-1; - var endY = this.height-1; - var startRange = this.getRange(startX, startY); - var endRange = this.getRange(endX, endY); //fix if carret not avail - var startCfi = this.currentChapter.cfiFromRange(startRange); - var endCfi; - if(endRange) { - endCfi = this.currentChapter.cfiFromRange(endRange); - } - - return { - start: startCfi, - end: endCfi || false - }; -}; -*/ - -EPUBJS.Renderer.prototype.pagesInCurrentChapter = function() { - var pgs; - var length; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - length = this.pageMap.length; - - // if(this.spreads){ - // pgs = Math.ceil(length / 2); - // } else { - // pgs = length; - // } - - return length; -}; - -EPUBJS.Renderer.prototype.currentRenderedPage = function(){ - var pg; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - if (this.spreads && this.pageMap.length > 1) { - pg = (this.chapterPos*2) - 1; - } else { - pg = this.chapterPos; - } - - return pg; -}; - -EPUBJS.Renderer.prototype.getRenderedPagesLeft = function(){ - var pg; - var lastPage; - var pagesLeft; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - lastPage = this.pageMap.length; - - if (this.spreads) { - pg = (this.chapterPos*2) - 1; - } else { - pg = this.chapterPos; - } - - pagesLeft = lastPage - pg; - return pagesLeft; - -}; - -EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(){ - var pg; - var startRange, endRange; - - if(!this.pageMap) { - console.warn("page map not loaded"); - return false; - } - - if (this.spreads) { - pg = this.chapterPos*2; - startRange = this.pageMap[pg-2]; - endRange = startRange; - - if(this.pageMap.length > 1 && this.pageMap.length > pg-1) { - endRange = this.pageMap[pg-1]; - } - } else { - pg = this.chapterPos; - startRange = this.pageMap[pg-1]; - endRange = startRange; - } - - if(!startRange) { - console.warn("page range miss:", pg, this.pageMap); - startRange = this.pageMap[this.pageMap.length-1]; - endRange = startRange; - } - - return { - start: startRange.start, - end: endRange.end - }; -}; - -// Goto a cfi position in the current chapter -EPUBJS.Renderer.prototype.gotoCfi = function(cfi){ - var pg; - var marker; - var range; - - if(this._moving){ - return this._q.enqueue("gotoCfi", arguments); - } - - if(EPUBJS.core.isString(cfi)){ - cfi = this.epubcfi.parse(cfi); - } - - if(typeof document.evaluate === 'undefined') { - marker = this.epubcfi.addMarker(cfi, this.doc); - if(marker) { - pg = this.render.getPageNumberByElement(marker); - // Must Clean up Marker before going to page - this.epubcfi.removeMarker(marker, this.doc); - this.page(pg); - } - } else { - range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); - if(range) { - // jaroslaw.bielski@7bulls.com - // It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter. - // It is always reproductible if few consecutive chapters have only one page. - // NOTE: This is only workaround and the issue needs an deeper investigation. - // NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T). - var rect = range.getBoundingClientRect(); - if (rect) { - pg = this.render.getPageNumberByRect(rect); - - } else { - // Goto first page in chapter - pg = 1; - } - - this.page(pg); - - // Reset the current location cfi to requested cfi - this.currentLocationCfi = cfi.str; - } else { - // Failed to find a range, go to first page - this.page(1); - } - } -}; - -// Walk nodes until a visible element is found -EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ - var el = startEl || this.render.getBaseElement(); - var found; - // kgolunski@7bulls.com - // Looks like an old API usage - // Set x and y as 0 to fullfill walk method API. - found = this.walk(el, 0, 0); - - if(found) { - return found; - }else{ - return startEl; - } - -}; -// TODO: remove me - unsused -EPUBJS.Renderer.prototype.findElementAfter = function(x, y, startEl){ - var el = startEl || this.render.getBaseElement(); - var found; - found = this.walk(el, x, y); - if(found) { - return found; - }else{ - return el; - } - -}; - -/* -EPUBJS.Renderer.prototype.route = function(hash, callback){ - var location = window.location.hash.replace('#/', ''); - if(this.useHash && location.length && location != this.prevLocation){ - this.show(location, callback); - this.prevLocation = location; - return true; - } - return false; -} - -EPUBJS.Renderer.prototype.hideHashChanges = function(){ - this.useHash = false; -} - -*/ - -EPUBJS.Renderer.prototype.resize = function(width, height, setSize){ - var spreads; - - this.width = width; - this.height = height; - - if(setSize !== false) { - this.render.resize(this.width, this.height); - } - - - - if(this.contents){ - this.reformat(); - } - - this.trigger("renderer:resized", { - width: this.width, - height: this.height - }); -}; - -//-- Listeners for events in the frame - -EPUBJS.Renderer.prototype.onResized = function(e) { - this.trigger('renderer:beforeResize'); - - var width = this.container.clientWidth; - var height = this.container.clientHeight; - - this.resize(width, height, false); -}; - -EPUBJS.Renderer.prototype.addEventListeners = function(){ - if(!this.render.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.render.document.addEventListener(eventName, this.triggerEvent.bind(this), false); - }, this); - -}; - -EPUBJS.Renderer.prototype.removeEventListeners = function(){ - if(!this.render.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.render.document.removeEventListener(eventName, this.triggerEvent, false); - }, this); - -}; - -// Pass browser events -EPUBJS.Renderer.prototype.triggerEvent = function(e){ - this.trigger("renderer:"+e.type, e); -}; - -EPUBJS.Renderer.prototype.addSelectionListeners = function(){ - this.render.document.addEventListener("selectionchange", this.onSelectionChange.bind(this), false); -}; - -EPUBJS.Renderer.prototype.removeSelectionListeners = function(){ - if(!this.render.document) { - return; - } - this.doc.removeEventListener("selectionchange", this.onSelectionChange, false); -}; - -EPUBJS.Renderer.prototype.onSelectionChange = function(e){ - if (this.selectionEndTimeout) { - clearTimeout(this.selectionEndTimeout); - } - this.selectionEndTimeout = setTimeout(function() { - this.selectedRange = this.render.window.getSelection(); - this.trigger("renderer:selected", this.selectedRange); - }.bind(this), 500); -}; - - -//-- Spreads - -EPUBJS.Renderer.prototype.setMinSpreadWidth = function(width){ - this.minSpreadWidth = width; - this.spreads = this.determineSpreads(width); -}; - -EPUBJS.Renderer.prototype.determineSpreads = function(cutoff){ - if(this.isForcedSingle || !cutoff || this.width < cutoff) { - return false; //-- Single Page - }else{ - return true; //-- Double Page - } -}; - -EPUBJS.Renderer.prototype.forceSingle = function(bool){ - if(bool) { - this.isForcedSingle = true; - // this.spreads = false; - } else { - this.isForcedSingle = false; - // this.spreads = this.determineSpreads(this.minSpreadWidth); - } -}; - -EPUBJS.Renderer.prototype.setGap = function(gap){ - this.gap = gap; //-- False == auto gap -}; - -EPUBJS.Renderer.prototype.setDirection = function(direction){ - this.direction = direction; - this.render.setDirection(this.direction); -}; - -//-- Content Replacements - -EPUBJS.Renderer.prototype.replace = function(query, func, finished, progress){ - var items = this.contents.querySelectorAll(query), - resources = Array.prototype.slice.call(items), - count = resources.length; - - - if(count === 0) { - finished(false); - return; - } - resources.forEach(function(item){ - var called = false; - var after = function(result, full){ - if(called === false) { - count--; - if(progress) progress(result, full, count); - if(count <= 0 && finished) finished(true); - called = true; - } - }; - - func(item, after); - - }.bind(this)); - -}; - -//-- Enable binding events to Renderer -RSVP.EventTarget.mixin(EPUBJS.Renderer.prototype); - -var EPUBJS = EPUBJS || {}; -EPUBJS.replace = {}; - -//-- Replaces the relative links within the book to use our internal page changer -EPUBJS.replace.hrefs = function(callback, renderer){ - var book = this; - var replacments = function(link, done){ - var href = link.getAttribute("href"), - isRelative = href.search("://"), - directory, - relative, - location, - base, - uri, - url; - - if(href.indexOf("mailto:") === 0){ - done(); - return; - } - - if(isRelative != -1){ - - link.setAttribute("target", "_blank"); - - }else{ - // Links may need to be resolved, such as ../chp1.xhtml - base = renderer.render.docEl.querySelector('base'); - url = base.getAttribute("href"); - uri = EPUBJS.core.uri(url); - directory = uri.directory; - - if (href.indexOf("#") === 0) { - href = uri.filename + href; - } - - if(directory) { - // We must ensure that the file:// protocol is preserved for - // local file links, as in certain contexts (such as under - // Titanium), file links without the file:// protocol will not - // work - if (uri.protocol === "file") { - relative = EPUBJS.core.resolveUrl(uri.base, href); - } else { - relative = EPUBJS.core.resolveUrl(directory, href); - } - } else { - relative = href; - } - - link.onclick = function(){ - book.trigger("book:linkClicked", href); - book.goto(relative); - return false; - }; - - } - done(); - - }; - - renderer.replace("a[href]", replacments, callback); - -}; - -EPUBJS.replace.head = function(callback, renderer) { - - renderer.replaceWithStored("link[href]", "href", EPUBJS.replace.links, callback); - -}; - - -//-- Replaces assets src's to point to stored version if browser is offline -EPUBJS.replace.resources = function(callback, renderer){ - //srcs = this.doc.querySelectorAll('[src]'); - renderer.replaceWithStored("[src]", "src", EPUBJS.replace.srcs, callback); - -}; - -EPUBJS.replace.posters = function(callback, renderer){ - - renderer.replaceWithStored("[poster]", "poster", EPUBJS.replace.srcs, callback); - -}; - -EPUBJS.replace.svg = function(callback, renderer) { - - renderer.replaceWithStored("svg image", "xlink:href", function(_store, full, done){ - _store.getUrl(full).then(done); - }, callback); - -}; - -EPUBJS.replace.srcs = function(_store, full, done){ - - var isRelative = (full.search("://") === -1); - - if (isRelative) { - _store.getUrl(full).then(done); - } else { - done(); - } - -}; - -//-- Replaces links in head, such as stylesheets - link[href] -EPUBJS.replace.links = function(_store, full, done, link){ - //-- Handle replacing urls in CSS - if(link.getAttribute("rel") === "stylesheet") { - EPUBJS.replace.stylesheets(_store, full).then(function(url, full){ - // done - done(url, full); - }, function(reason) { - // we were unable to replace the style sheets - done(null); - }); - }else{ - _store.getUrl(full).then(done, function(reason) { - // we were unable to get the url, signal to upper layer - done(null); - }); - } -}; - -EPUBJS.replace.stylesheets = function(_store, full) { - var deferred = new RSVP.defer(); - - if(!_store) return; - - _store.getText(full).then(function(text){ - var url; - - EPUBJS.replace.cssImports(_store, full, text).then(function (importText) { - - text = importText + text; - - EPUBJS.replace.cssUrls(_store, full, text).then(function(newText){ - var _URL = window.URL || window.webkitURL || window.mozURL; - - var blob = new Blob([newText], { "type" : "text\/css" }), - url = _URL.createObjectURL(blob); - - deferred.resolve(url); - - }, function(reason) { - deferred.reject(reason); - }); - - },function(reason) { - deferred.reject(reason); - }); - - }, function(reason) { - deferred.reject(reason); - }); - - return deferred.promise; -}; - -EPUBJS.replace.cssImports = function (_store, base, text) { - var deferred = new RSVP.defer(); - if(!_store) return; - - // check for css @import - var importRegex = /@import\s+(?:url\()?\'?\"?((?!data:)[^\'|^\"^\)]*)\'?\"?\)?/gi; - var importMatches, importFiles = [], allImportText = ''; - - while (importMatches = importRegex.exec(text)) { - importFiles.push(importMatches[1]); - } - - if (importFiles.length === 0) { - deferred.resolve(allImportText); - } - - importFiles.forEach(function (fileUrl) { - var full = EPUBJS.core.resolveUrl(base, fileUrl); - full = EPUBJS.core.uri(full).path; - _store.getText(full).then(function(importText){ - allImportText += importText; - if (importFiles.indexOf(fileUrl) === importFiles.length - 1) { - deferred.resolve(allImportText); - } - }, function(reason) { - deferred.reject(reason); - }); - }); - - return deferred.promise; - -}; - - -EPUBJS.replace.cssUrls = function(_store, base, text){ - var deferred = new RSVP.defer(), - matches = text.match(/url\(\'?\"?((?!data:)[^\'|^\"^\)]*)\'?\"?\)/g); - - if(!_store) return; - - if(!matches){ - deferred.resolve(text); - return deferred.promise; - } - - var promises = matches.map(function(str) { - var full = EPUBJS.core.resolveUrl(base, str.replace(/url\(|[|\)|\'|\"]|\?.*$/g, '')); - return _store.getUrl(full).then(function(url) { - text = text.replace(str, 'url("'+url+'")'); - }, function(reason) { - deferred.reject(reason); - }); - }); - - RSVP.all(promises).then(function(){ - deferred.resolve(text); - }); - - return deferred.promise; -}; - - -EPUBJS.Storage = function(withCredentials){ - - this.checkRequirements(); - this.urlCache = {}; - this.withCredentials = withCredentials; - this.URL = window.URL || window.webkitURL || window.mozURL; - this.offline = false; -}; - -//-- Load the zip lib and set the workerScriptsPath -EPUBJS.Storage.prototype.checkRequirements = function(callback){ - if(typeof(localforage) == "undefined") console.error("localForage library not loaded"); -}; - -EPUBJS.Storage.prototype.put = function(assets, store) { - var deferred = new RSVP.defer(); - var count = assets.length; - var current = 0; - var next = function(deferred){ - var done = deferred || new RSVP.defer(); - var url; - var encodedUrl; - - if(current >= count) { - done.resolve(); - } else { - url = assets[current].url; - encodedUrl = window.encodeURIComponent(url); - - EPUBJS.core.request(url, "binary") - .then(function (data) { - return localforage.setItem(encodedUrl, data); - }) - .then(function(data){ - current++; - // Load up the next - setTimeout(function(){ - next(done); - }, 1); - - }); - } - return done.promise; - }.bind(this); - - if(!Array.isArray(assets)) { - assets = [assets]; - } - - next().then(function(){ - deferred.resolve(); - }.bind(this)); - - return deferred.promise; -}; - -EPUBJS.Storage.prototype.token = function(url, value){ - var encodedUrl = window.encodeURIComponent(url); - return localforage.setItem(encodedUrl, value) - .then(function (result) { - if (result === null) { - return false; - } else { - return true; - } - }); -}; - -EPUBJS.Storage.prototype.isStored = function(url){ - var encodedUrl = window.encodeURIComponent(url); - return localforage.getItem(encodedUrl) - .then(function (result) { - if (result === null) { - return false; - } else { - return true; - } - }); -}; - -EPUBJS.Storage.prototype.getText = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return buffer; - }.bind(this)) - .then(function(data) { - var deferred = new RSVP.defer(); - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - deferred.resolve(reader.result); - }); - reader.readAsText(blob, mimeType); - return deferred.promise; - }) - .catch(function() { - - var deferred = new RSVP.defer(); - var entry = localforage.getItem(encodedUrl); - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - deferred.resolve(reader.result); - }); - reader.readAsText(blob, mimeType); - }); - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.getUrl = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return url; - }.bind(this)) - .catch(function() { - var deferred = new RSVP.defer(); - var entry; - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(encodedUrl in this.urlCache) { - deferred.resolve(this.urlCache[encodedUrl]); - return deferred.promise; - } - - entry = localforage.getItem(encodedUrl); - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var blob = new Blob([data], {type : EPUBJS.core.getMimeType(url)}); - tempUrl = _URL.createObjectURL(blob); - deferred.resolve(tempUrl); - this.urlCache[encodedUrl] = tempUrl; - }.bind(this)); - - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.getXml = function(url){ - var encodedUrl = window.encodeURIComponent(url); - - return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials) - .then(function(buffer){ - if(this.offline){ - this.offline = false; - this.trigger("offline", false); - } - localforage.setItem(encodedUrl, buffer); - return buffer; - }.bind(this)) - .then(function(data) { - var deferred = new RSVP.defer(); - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - var parser = new DOMParser(); - var doc = parser.parseFromString(reader.result, "text/xml"); - deferred.resolve(doc); - }); - reader.readAsText(blob, mimeType); - return deferred.promise; - }) - .catch(function() { - var deferred = new RSVP.defer(); - var entry = localforage.getItem(encodedUrl); - - if(!this.offline){ - this.offline = true; - this.trigger("offline", true); - } - - if(!entry) { - deferred.reject({ - message : "File not found in the storage: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - entry.then(function(data) { - var mimeType = EPUBJS.core.getMimeType(url); - var blob = new Blob([data], {type : mimeType}); - var reader = new FileReader(); - reader.addEventListener("loadend", function() { - var parser = new DOMParser(); - var doc = parser.parseFromString(reader.result, "text/xml"); - deferred.resolve(doc); - }); - reader.readAsText(blob, mimeType); - }); - - return deferred.promise; - }.bind(this)); -}; - -EPUBJS.Storage.prototype.revokeUrl = function(url){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var fromCache = this.urlCache[url]; - if(fromCache) _URL.revokeObjectURL(fromCache); -}; - -EPUBJS.Storage.prototype.failed = function(error){ - console.error(error); -}; - -RSVP.EventTarget.mixin(EPUBJS.Storage.prototype); - -EPUBJS.Unarchiver = function(url){ - - this.checkRequirements(); - this.urlCache = {}; - -}; - -//-- Load the zip lib and set the workerScriptsPath -EPUBJS.Unarchiver.prototype.checkRequirements = function(callback){ - if(typeof(JSZip) == "undefined") console.error("JSZip lib not loaded"); -}; - -EPUBJS.Unarchiver.prototype.open = function(zipUrl, callback){ - if (zipUrl instanceof ArrayBuffer) { - this.zip = new JSZip(zipUrl); - var deferred = new RSVP.defer(); - deferred.resolve(); - return deferred.promise; - } else { - return EPUBJS.core.request(zipUrl, "binary").then(function(data){ - this.zip = new JSZip(data); - }.bind(this)); - } -}; - -EPUBJS.Unarchiver.prototype.getXml = function(url, encoding){ - var decodededUrl = window.decodeURIComponent(url); - return this.getText(decodededUrl, encoding). - then(function(text){ - var parser = new DOMParser(); - var mimeType = EPUBJS.core.getMimeType(url); - - // Remove byte order mark before parsing - // https://www.w3.org/International/questions/qa-byte-order-mark - if(text.charCodeAt(0) === 0xFEFF) { - text = text.slice(1); - } - - return parser.parseFromString(text, mimeType); - }); - -}; - -EPUBJS.Unarchiver.prototype.getUrl = function(url, mime){ - var unarchiver = this; - var deferred = new RSVP.defer(); - var decodededUrl = window.decodeURIComponent(url); - var entry = this.zip.file(decodededUrl); - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - var blob; - - if(!entry) { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - if(url in this.urlCache) { - deferred.resolve(this.urlCache[url]); - return deferred.promise; - } - - blob = new Blob([entry.asUint8Array()], {type : EPUBJS.core.getMimeType(entry.name)}); - - tempUrl = _URL.createObjectURL(blob); - deferred.resolve(tempUrl); - unarchiver.urlCache[url] = tempUrl; - - return deferred.promise; -}; - -EPUBJS.Unarchiver.prototype.getText = function(url, encoding){ - var unarchiver = this; - var deferred = new RSVP.defer(); - var decodededUrl = window.decodeURIComponent(url); - var entry = this.zip.file(decodededUrl); - var text; - - if(!entry) { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - return deferred.promise; - } - - text = entry.asText(); - deferred.resolve(text); - - return deferred.promise; -}; - -EPUBJS.Unarchiver.prototype.revokeUrl = function(url){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var fromCache = this.urlCache[url]; - if(fromCache) _URL.revokeObjectURL(fromCache); -}; - -EPUBJS.Unarchiver.prototype.failed = function(error){ - console.error(error); -}; - -EPUBJS.Unarchiver.prototype.afterSaved = function(error){ - this.callback(); -}; - -EPUBJS.Unarchiver.prototype.toStorage = function(entries){ - var timeout = 0, - delay = 20, - that = this, - count = entries.length; - - function callback(){ - count--; - if(count === 0) that.afterSaved(); - } - - entries.forEach(function(entry){ - - setTimeout(function(entry){ - that.saveEntryFileToStorage(entry, callback); - }, timeout, entry); - - timeout += delay; - }); - - console.log("time", timeout); - - //entries.forEach(this.saveEntryFileToStorage.bind(this)); -}; - -// EPUBJS.Unarchiver.prototype.saveEntryFileToStorage = function(entry, callback){ -// var that = this; -// entry.getData(new zip.BlobWriter(), function(blob) { -// EPUBJS.storage.save(entry.filename, blob, callback); -// }); -// }; - -/* - From Zip.js, by Gildas Lormeau - */ - -(function() { - "use strict"; - var table = { - "application" : { - "ecmascript" : [ "es", "ecma" ], - "javascript" : "js", - "ogg" : "ogx", - "pdf" : "pdf", - "postscript" : [ "ps", "ai", "eps", "epsi", "epsf", "eps2", "eps3" ], - "rdf+xml" : "rdf", - "smil" : [ "smi", "smil" ], - "xhtml+xml" : [ "xhtml", "xht" ], - "xml" : [ "xml", "xsl", "xsd", "opf", "ncx" ], - "zip" : "zip", - "x-httpd-eruby" : "rhtml", - "x-latex" : "latex", - "x-maker" : [ "frm", "maker", "frame", "fm", "fb", "book", "fbdoc" ], - "x-object" : "o", - "x-shockwave-flash" : [ "swf", "swfl" ], - "x-silverlight" : "scr", - "epub+zip" : "epub", - "font-tdpfr" : "pfr", - "inkml+xml" : [ "ink", "inkml" ], - "json" : "json", - "jsonml+json" : "jsonml", - "mathml+xml" : "mathml", - "metalink+xml" : "metalink", - "mp4" : "mp4s", - // "oebps-package+xml" : "opf", - "omdoc+xml" : "omdoc", - "oxps" : "oxps", - "vnd.amazon.ebook" : "azw", - "widget" : "wgt", - // "x-dtbncx+xml" : "ncx", - "x-dtbook+xml" : "dtb", - "x-dtbresource+xml" : "res", - "x-font-bdf" : "bdf", - "x-font-ghostscript" : "gsf", - "x-font-linux-psf" : "psf", - "x-font-otf" : "otf", - "x-font-pcf" : "pcf", - "x-font-snf" : "snf", - "x-font-ttf" : [ "ttf", "ttc" ], - "x-font-type1" : [ "pfa", "pfb", "pfm", "afm" ], - "x-font-woff" : "woff", - "x-mobipocket-ebook" : [ "prc", "mobi" ], - "x-mspublisher" : "pub", - "x-nzb" : "nzb", - "x-tgif" : "obj", - "xaml+xml" : "xaml", - "xml-dtd" : "dtd", - "xproc+xml" : "xpl", - "xslt+xml" : "xslt", - "internet-property-stream" : "acx", - "x-compress" : "z", - "x-compressed" : "tgz", - "x-gzip" : "gz", - }, - "audio" : { - "flac" : "flac", - "midi" : [ "mid", "midi", "kar", "rmi" ], - "mpeg" : [ "mpga", "mpega", "mp2", "mp3", "m4a", "mp2a", "m2a", "m3a" ], - "mpegurl" : "m3u", - "ogg" : [ "oga", "ogg", "spx" ], - "x-aiff" : [ "aif", "aiff", "aifc" ], - "x-ms-wma" : "wma", - "x-wav" : "wav", - "adpcm" : "adp", - "mp4" : "mp4a", - "webm" : "weba", - "x-aac" : "aac", - "x-caf" : "caf", - "x-matroska" : "mka", - "x-pn-realaudio-plugin" : "rmp", - "xm" : "xm", - "mid" : [ "mid", "rmi" ] - }, - "image" : { - "gif" : "gif", - "ief" : "ief", - "jpeg" : [ "jpeg", "jpg", "jpe" ], - "pcx" : "pcx", - "png" : "png", - "svg+xml" : [ "svg", "svgz" ], - "tiff" : [ "tiff", "tif" ], - "x-icon" : "ico", - "bmp" : "bmp", - "webp" : "webp", - "x-pict" : [ "pic", "pct" ], - "x-tga" : "tga", - "cis-cod" : "cod", - }, - "message" : { - "rfc822" : [ "eml", "mime", "mht", "mhtml", "nws" ] - }, - "text" : { - "cache-manifest" : [ "manifest", "appcache" ], - "calendar" : [ "ics", "icz", "ifb" ], - "css" : "css", - "csv" : "csv", - "h323" : "323", - "html" : [ "html", "htm", "shtml", "stm" ], - "iuls" : "uls", - "mathml" : "mml", - "plain" : [ "txt", "text", "brf", "conf", "def", "list", "log", "in", "bas" ], - "richtext" : "rtx", - "tab-separated-values" : "tsv", - "x-bibtex" : "bib", - "x-dsrc" : "d", - "x-diff" : [ "diff", "patch" ], - "x-haskell" : "hs", - "x-java" : "java", - "x-literate-haskell" : "lhs", - "x-moc" : "moc", - "x-pascal" : [ "p", "pas" ], - "x-pcs-gcd" : "gcd", - "x-perl" : [ "pl", "pm" ], - "x-python" : "py", - "x-scala" : "scala", - "x-setext" : "etx", - "x-tcl" : [ "tcl", "tk" ], - "x-tex" : [ "tex", "ltx", "sty", "cls" ], - "x-vcard" : "vcf", - "sgml" : [ "sgml", "sgm" ], - "x-c" : [ "c", "cc", "cxx", "cpp", "h", "hh", "dic" ], - "x-fortran" : [ "f", "for", "f77", "f90" ], - "x-opml" : "opml", - "x-nfo" : "nfo", - "x-sfv" : "sfv", - "x-uuencode" : "uu", - "webviewhtml" : "htt" - }, - "video" : { - "mpeg" : [ "mpeg", "mpg", "mpe", "m1v", "m2v", "mp2", "mpa", "mpv2" ], - "mp4" : [ "mp4", "mp4v", "mpg4" ], - "quicktime" : [ "qt", "mov" ], - "ogg" : "ogv", - "vnd.mpegurl" : [ "mxu", "m4u" ], - "x-flv" : "flv", - "x-la-asf" : [ "lsf", "lsx" ], - "x-mng" : "mng", - "x-ms-asf" : [ "asf", "asx", "asr" ], - "x-ms-wm" : "wm", - "x-ms-wmv" : "wmv", - "x-ms-wmx" : "wmx", - "x-ms-wvx" : "wvx", - "x-msvideo" : "avi", - "x-sgi-movie" : "movie", - "x-matroska" : [ "mpv", "mkv", "mk3d", "mks" ], - "3gpp2" : "3g2", - "h261" : "h261", - "h263" : "h263", - "h264" : "h264", - "jpeg" : "jpgv", - "jpm" : [ "jpm", "jpgm" ], - "mj2" : [ "mj2", "mjp2" ], - "vnd.ms-playready.media.pyv" : "pyv", - "vnd.uvvu.mp4" : [ "uvu", "uvvu" ], - "vnd.vivo" : "viv", - "webm" : "webm", - "x-f4v" : "f4v", - "x-m4v" : "m4v", - "x-ms-vob" : "vob", - "x-smv" : "smv" - } - }; - - var mimeTypes = (function() { - var type, subtype, val, index, mimeTypes = {}; - for (type in table) { - if (table.hasOwnProperty(type)) { - for (subtype in table[type]) { - if (table[type].hasOwnProperty(subtype)) { - val = table[type][subtype]; - if (typeof val == "string") { - mimeTypes[val] = type + "/" + subtype; - } else { - for (index = 0; index < val.length; index++) { - mimeTypes[val[index]] = type + "/" + subtype; - } - } - } - } - } - } - return mimeTypes; - })(); - - EPUBJS.core.getMimeType = function(filename) { - var defaultValue = "text/plain";//"application/octet-stream"; - return filename && mimeTypes[filename.split(".").pop().toLowerCase()] || defaultValue; - }; - -})(); - -//# sourceMappingURL=epub.js.map \ No newline at end of file diff --git a/src/assets/epubjs/build/epub.js.map b/src/assets/epubjs/build/epub.js.map deleted file mode 100644 index a3f6aa0..0000000 --- a/src/assets/epubjs/build/epub.js.map +++ /dev/null @@ -1,103 +0,0 @@ -{ - "version": 3, - "file": "epub.js", - "sources": [ - "node_modules/rsvp/dist/config/versionTemplate.txt", - "node_modules/rsvp/dist/lib/rsvp/events.js", - "node_modules/rsvp/dist/lib/rsvp/config.js", - "node_modules/rsvp/dist/lib/rsvp/utils.js", - "node_modules/rsvp/dist/lib/rsvp/instrument.js", - "node_modules/rsvp/dist/lib/rsvp/promise/resolve.js", - "node_modules/rsvp/dist/lib/rsvp/-internal.js", - "node_modules/rsvp/dist/lib/rsvp/then.js", - "node_modules/rsvp/dist/lib/rsvp/enumerator.js", - "node_modules/rsvp/dist/lib/rsvp/promise/all.js", - "node_modules/rsvp/dist/lib/rsvp/promise/race.js", - "node_modules/rsvp/dist/lib/rsvp/promise/reject.js", - "node_modules/rsvp/dist/lib/rsvp/promise.js", - "node_modules/rsvp/dist/lib/rsvp/node.js", - "node_modules/rsvp/dist/lib/rsvp/all.js", - "node_modules/rsvp/dist/lib/rsvp/all-settled.js", - "node_modules/rsvp/dist/lib/rsvp/race.js", - "node_modules/rsvp/dist/lib/rsvp/promise-hash.js", - "node_modules/rsvp/dist/lib/rsvp/hash.js", - "node_modules/rsvp/dist/lib/rsvp/hash-settled.js", - "node_modules/rsvp/dist/lib/rsvp/rethrow.js", - "node_modules/rsvp/dist/lib/rsvp/defer.js", - "node_modules/rsvp/dist/lib/rsvp/map.js", - "node_modules/rsvp/dist/lib/rsvp/resolve.js", - "node_modules/rsvp/dist/lib/rsvp/reject.js", - "node_modules/rsvp/dist/lib/rsvp/filter.js", - "node_modules/rsvp/dist/lib/rsvp/asap.js", - "node_modules/rsvp/dist/lib/rsvp/platform.js", - "node_modules/rsvp/dist/lib/rsvp.js", - "src/base.js", - "src/book.js", - "src/chapter.js", - "src/core.js", - "src/epubcfi.js", - "src/events.js", - "src/hooks.js", - "src/layout.js", - "src/locations.js", - "src/pagination.js", - "src/parser.js", - "src/render_iframe.js", - "src/renderer.js", - "src/replace.js", - "src/storage.js", - "src/unarchiver.js", - "libs/mime-types/mime-types.js" - ], - "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACJA;AAAsC;AACc;AACjB;AACpB;AACV;AACF;AAAA;AAES;AACX;AAED;AAA8B;AACa;AAAA;AAEzB;AAC4B;AAC3C;AAAA;AAEgB;AAClB;AAAA;AAAA;AAAA;AAKD;AAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCiB;AACF;AACE;AACQ;AACC;AACvB;AACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBoC;AACC;AACiB;AACpD;AAAA;AAEoC;AACX;AAAA;AAEU;AAAA;AAEpB;AAC2B;AAC1C;AAAA;AAEwC;AACd;AAC1B;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCsC;AACA;AACZ;AACH;AAAA;AAEP;AACgB;AACtB;AACR;AAAA;AAEmC;AAAA;AAEC;AAAA;AAEnB;AACW;AAC5B;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BoD;AACd;AACZ;AACA;AAAA;AAEgB;AAAA;AAEI;AACjB;AAAA;AAEC;AAC1B;AACF;AACF;AACF;ACvLD;AAAa;AACM;AACjB;AAEF;AAA6B;AAE7B;AAAgC;AACN;AAAA;AAAA;AAAA;AAIO;AACtB;AACR;AAAA;AAE2B;AACL;AAChB;AACe;AACrB;AAGH;ACpBA;AAA6B;AAC2C;AACvE;AAED;AAAuB;AACU;AAChC;AAED;AAA4B;AACiB;AAC5C;AAED;AACA;AAAoB;AACM;AACwC;AAC9D;AACG;AACoB;AAC1B;AAED;AAAuB;AAEvB;AACA;AAEA;AAAkC;AACJ;AAC5B;AAEF;AACe;AAEf;AAA6C;AACjB;AACyB;AAClD;AAC0B;AACyB;AACnD;AACe;AACD;AAEjB;AC3CA;AAAe;AAEf;AAAyB;AACA;AACkB;AAChB;AAAA;AAEO;AAAA;AAEY;AACU;AAC/B;AACmB;AACrC;AAAA;AAE4C;AAC9C;AACgB;AACZ;AAET;AAA+C;AACxB;AACJ;AACN;AACc;AACN;AACK;AACG;AACI;AACN;AACL;AACyD;AACrE;AACU;AACjB;AAAA;ACnCH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCA;AAAgC;AAAA;AAEP;AAAA;AAEyD;AAChE;AACf;AAAA;AAE0C;AACjB;AACX;AAAA;AC1BjB;AAA0B;AACqD;AAC9E;AAED;AAAkB;AAElB;AACA;AAEA;AACiB;AAGjB;AAAuC;AAEvC;AAA0B;AACpB;AACkB;AACN;AACe;AACP;AACvB;AACF;AAED;AAAoE;AAC9D;AACqD;AAC7C;AACD;AACV;AACF;AAED;AAAwD;AACtB;AACX;AACkC;AACvC;AACH;AACR;AACa;AACU;AACa;AAC9B;AACmB;AACzB;AACkB;AACP;AACH;AACR;AACa;AAAA;AAEU;AAC8B;AAAA;AAElC;AACN;AACS;AACxB;AACS;AACb;AAED;AAA8C;AACT;AACE;AACI;AACd;AACS;AAC7B;AAC2C;AACtB;AACa;AAC9B;AACmB;AACzB;AACkB;AACY;AAC9B;AACJ;AACF;AAED;AAA2D;AAC0E;AACvF;AACrC;AACwB;AACW;AACV;AACC;AACG;AACL;AACyB;AAC/C;AAC2B;AACjC;AACF;AACF;AAED;AAAiC;AACR;AACG;AACU;AACkB;AAC/C;AACmB;AACzB;AACF;AAED;AAAmC;AACX;AACc;AACnC;AAAA;AAEgB;AAClB;AAED;AAAiC;AACC;AACvB;AACR;AAAA;AAEuB;AACG;AAAA;AAEY;AACd;AACY;AAClC;AACI;AAC0B;AAChC;AACF;AAED;AAAiC;AACC;AACvB;AACR;AACyB;AACD;AACe;AACzC;AAED;AAA8D;AACtB;AACN;AAAA;AAET;AAAA;AAEK;AACoB;AACH;AAAA;AAEV;AACH;AAC/B;AACF;AAED;AAA0B;AACe;AACV;AAAA;AAEN;AACiD;AACvE;AAAA;AAE6B;AACrB;AACR;AAAA;AAEoB;AACG;AACK;AAAA;AAEmB;AACvB;AACa;AAAA;AAEzB;AACwC;AAC5C;AACY;AAClB;AACF;AAAA;AAE+B;AACjC;AAED;AAAuB;AACH;AACnB;AAED;AAAwC;AAExC;AAAoC;AAC9B;AACsB;AACd;AACgB;AACH;AACxB;AACF;AAED;AAA4D;AACpB;AACjB;AACA;AACI;AACF;AAAA;AAEN;AACoB;AAAA;AAEJ;AACf;AACM;AACD;AACd;AACc;AAClB;AAAA;AAEoB;AACa;AAC3B;AACR;AACI;AACU;AACE;AAClB;AAAA;AAE+B;AAAA;AAEK;AACT;AACP;AACM;AACS;AACR;AACO;AACR;AACxB;AACJ;AAED;AAA8C;AACvB;AACjB;AACwB;AACV;AACL;AACR;AACe;AACQ;AACL;AACL;AACL;AACR;AACe;AACQ;AACvB;AACO;AACS;AACpB;AAAA;AClRH;AAAiD;AACpB;AAAA;AAET;AACQ;AAAA;AAEuD;AACpB;AAC7C;AACf;AAAA;AAEsB;AAAA;AAEyB;AACpB;AAAA;AAE8B;AAAA;AAE/C;AACI;AAC0B;AACZ;AAC+B;AACrD;AACA;AACA;AACgD;AACtD;AAAA;AAEY;AAAA;ACxBf;AAAmD;AACxB;AAChB;AACa;AACN;AACZ;AACG;AACE;AACY;AACJ;AACb;AACH;AACF;AAED;AAA8D;AACpB;AACI;AACR;AAAA;AAEJ;AACV;AACO;AACI;AAAA;AAElB;AAAA;AAEU;AACe;AAC/B;AAC0B;AACb;AACS;AACW;AACrC;AACF;AAC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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoMS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BmC;AACK;AACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0C6C;AACzB;AACmB;AAAA;AAED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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/4CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A", - "sourceRoot": "../", - "sourcesContent": [ - "/*!\n * @overview RSVP - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE\n * @version 3.5.0\n */\n", - "'use strict';\n\nfunction indexOf(callbacks, callback) {\n for (var i = 0, l = callbacks.length; i < l; i++) {\n if (callbacks[i] === callback) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction callbacksFor(object) {\n var callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n}\n\n/**\n @class RSVP.EventTarget\n*/\nexport default {\n\n /**\n `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n Example:\n ```javascript\n let object = {};\n RSVP.EventTarget.mixin(object);\n object.on('finished', function(event) {\n // handle event\n });\n object.trigger('finished', { detail: value });\n ```\n `EventTarget.mixin` also works with prototypes:\n ```javascript\n let Person = function() {};\n RSVP.EventTarget.mixin(Person.prototype);\n let yehuda = new Person();\n let tom = new Person();\n yehuda.on('poke', function(event) {\n console.log('Yehuda says OW');\n });\n tom.on('poke', function(event) {\n console.log('Tom says OW');\n });\n yehuda.trigger('poke');\n tom.trigger('poke');\n ```\n @method mixin\n @for RSVP.EventTarget\n @private\n @param {Object} object object to extend with EventTarget methods\n */\n mixin: function mixin(object) {\n object['on'] = this['on'];\n object['off'] = this['off'];\n object['trigger'] = this['trigger'];\n object._promiseCallbacks = undefined;\n return object;\n },\n\n /**\n Registers a callback to be executed when `eventName` is triggered\n ```javascript\n object.on('event', function(eventInfo){\n // handle the event\n });\n object.trigger('event');\n ```\n @method on\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to listen for\n @param {Function} callback function to be called when the event is triggered.\n */\n on: function on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n var allCallbacks = callbacksFor(this),\n callbacks = undefined;\n\n callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (indexOf(callbacks, callback) === -1) {\n callbacks.push(callback);\n }\n },\n\n /**\n You can use `off` to stop firing a particular callback for an event:\n ```javascript\n function doStuff() { // do stuff! }\n object.on('stuff', doStuff);\n object.trigger('stuff'); // doStuff will be called\n // Unregister ONLY the doStuff callback\n object.off('stuff', doStuff);\n object.trigger('stuff'); // doStuff will NOT be called\n ```\n If you don't pass a `callback` argument to `off`, ALL callbacks for the\n event will not be executed when the event fires. For example:\n ```javascript\n let callback1 = function(){};\n let callback2 = function(){};\n object.on('stuff', callback1);\n object.on('stuff', callback2);\n object.trigger('stuff'); // callback1 and callback2 will be executed.\n object.off('stuff');\n object.trigger('stuff'); // callback1 and callback2 will not be executed!\n ```\n @method off\n @for RSVP.EventTarget\n @private\n @param {String} eventName event to stop listening to\n @param {Function} callback optional argument. If given, only the function\n given will be removed from the event's callback queue. If no `callback`\n argument is given, all callbacks will be removed from the event's callback\n queue.\n */\n off: function off(eventName, callback) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n index = undefined;\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n callbacks = allCallbacks[eventName];\n\n index = indexOf(callbacks, callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n\n /**\n Use `trigger` to fire custom events. For example:\n ```javascript\n object.on('foo', function(){\n console.log('foo event happened!');\n });\n object.trigger('foo');\n // 'foo event happened!' logged to the console\n ```\n You can also pass a value as a second argument to `trigger` that will be\n passed as an argument to all event listeners for the event:\n ```javascript\n object.on('foo', function(value){\n console.log(value.name);\n });\n object.trigger('foo', { name: 'bar' });\n // 'bar' logged to the console\n ```\n @method trigger\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to be triggered\n @param {*} options optional value to be passed to any event handlers for\n the given `eventName`\n */\n trigger: function trigger(eventName, options, label) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n callback = undefined;\n\n if (callbacks = allCallbacks[eventName]) {\n // Don't cache the callbacks.length since it may grow\n for (var i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n\n callback(options, label);\n }\n }\n }\n};", - "'use strict';\n\nimport EventTarget from './events';\n\nvar config = {\n instrument: false\n};\n\nEventTarget['mixin'](config);\n\nfunction configure(name, value) {\n if (name === 'onerror') {\n // handle for legacy users that expect the actual\n // error to be passed to their function added via\n // `RSVP.configure('onerror', someFunctionHere);`\n config['on']('error', value);\n return;\n }\n\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n}\n\nexport { config, configure };", - "'use strict';\n\nexport { objectOrFunction };\nexport { isFunction };\nexport { isMaybeThenable };\n\nfunction objectOrFunction(x) {\n return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\nfunction isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n} else {\n _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\n\nexport { isArray };\n// Date.now is not available in browsers < IE9\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility\nvar now = Date.now || function () {\n return new Date().getTime();\n};\n\nexport { now };\nfunction F() {}\n\nvar o_create = Object.create || function (o) {\n if (arguments.length > 1) {\n throw new Error('Second argument not supported');\n }\n if (typeof o !== 'object') {\n throw new TypeError('Argument must be an object');\n }\n F.prototype = o;\n return new F();\n};\nexport { o_create };", - "'use strict';\n\nexport default instrument;\nimport { config } from './config';\nimport { now } from './utils';\n\nvar queue = [];\n\nfunction scheduleFlush() {\n setTimeout(function () {\n for (var i = 0; i < queue.length; i++) {\n var entry = queue[i];\n\n var payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n}\nfunction instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: now(),\n error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n}", - "'use strict';\n\nexport default resolve;\nimport { noop, resolve as _resolve } from '../-internal';\n\n/**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop, label);\n _resolve(promise, object);\n return promise;\n}", - "'use strict';\n\nexport { noop };\nexport { getThen };\nexport { handleMaybeThenable };\nexport { resolve };\nexport { publishRejection };\nexport { fulfill };\nexport { reject };\nexport { subscribe };\nexport { publish };\nexport { invokeCallback };\nexport { initializePromise };\nimport { objectOrFunction, isFunction } from './utils';\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\nimport instrument from './instrument';\n\nimport { config } from './config';\nimport Promise from './promise';\n\nfunction withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction noop() {}\n\nvar PENDING = void 0;\nexport { PENDING };\nvar FULFILLED = 1;\nexport { FULFILLED };\nvar REJECTED = 2;\n\nexport { REJECTED };\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n config.async(function (promise) {\n var sealed = false;\n var error = tryThen(then, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n if (maybeThenable.constructor === promise.constructor && then === originalThen && promise.constructor.resolve === originalResolve) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then)) {\n handleForeignThenable(promise, maybeThenable, then);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (config.instrument) {\n instrument('fulfilled', promise);\n }\n } else {\n config.async(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n config.async(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n config.async(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (config.instrument) {\n instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = undefined,\n callback = undefined,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = undefined,\n error = undefined,\n succeeded = undefined,\n failed = undefined;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null; // release\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, withOwnPromise());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n var resolved = false;\n try {\n resolver(function (value) {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(promise, value);\n }, function (reason) {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}", - "'use strict';\n\nexport default then;\nimport { config } from './config';\nimport instrument from './instrument';\nimport { noop, subscribe, FULFILLED, REJECTED, invokeCallback } from './-internal';\nfunction then(onFulfillment, onRejection, label) {\n var _arguments = arguments;\n\n var parent = this;\n var state = parent._state;\n\n if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n config.instrument && instrument('chained', parent, parent);\n return parent;\n }\n\n parent._onError = null;\n\n var child = new parent.constructor(noop, label);\n var result = parent._result;\n\n config.instrument && instrument('chained', parent, child);\n\n if (state) {\n (function () {\n var callback = _arguments[state - 1];\n config.async(function () {\n return invokeCallback(state, child, callback, result);\n });\n })();\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}", - "'use strict';\n\nexport { makeSettledResult };\nimport { isArray, isMaybeThenable } from './utils';\n\nimport { noop, resolve, handleMaybeThenable, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, getThen } from './-internal';\n\nimport Promise from './promise';\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nfunction makeSettledResult(state, position, value) {\n if (state === FULFILLED) {\n return {\n state: 'fulfilled',\n value: value\n };\n } else {\n return {\n state: 'rejected',\n reason: value\n };\n }\n}\n\nfunction Enumerator(Constructor, input, abortOnReject, label) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop, label);\n this._abortOnReject = abortOnReject;\n\n if (this._validateInput(input)) {\n this._input = input;\n this.length = input.length;\n this._remaining = input.length;\n\n this._init();\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate();\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, this._validationError());\n }\n}\n\nexport default Enumerator;\n\nEnumerator.prototype._validateInput = function (input) {\n return isArray(input);\n};\n\nEnumerator.prototype._validationError = function () {\n return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._init = function () {\n this._result = new Array(this.length);\n};\n\nEnumerator.prototype._enumerate = function () {\n var length = this.length;\n var promise = this.promise;\n var input = this._input;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n this._eachEntry(input[i], i);\n }\n};\n\nEnumerator.prototype._settleMaybeThenable = function (entry, i) {\n var c = this._instanceConstructor;\n var resolve = c.resolve;\n\n if (resolve === originalResolve) {\n var then = getThen(entry);\n\n if (then === originalThen && entry._state !== PENDING) {\n entry._onError = null;\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof then !== 'function') {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n } else if (c === Promise) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve) {\n return resolve(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve(entry), i);\n }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n if (isMaybeThenable(entry)) {\n this._settleMaybeThenable(entry, i);\n } else {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n var promise = this.promise;\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (this._abortOnReject && state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = this._makeResult(state, i, value);\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n};\n\nEnumerator.prototype._makeResult = function (state, i, value) {\n return value;\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n};", - "'use strict';\n\nexport default all;\nimport Enumerator from '../enumerator';\n\n/**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error(\"2\"));\n let promise3 = RSVP.reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries, label) {\n return new Enumerator(this, entries, true, /* abort on reject */label).promise;\n}", - "'use strict';\n\nexport default race;\nimport { isArray } from \"../utils\";\n\nimport { noop, resolve, reject, subscribe, PENDING } from '../-internal';\n\n/**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(noop, label);\n\n if (!isArray(entries)) {\n reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n for (var i = 0; promise._state === PENDING && i < entries.length; i++) {\n subscribe(Constructor.resolve(entries[i]), undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n\n return promise;\n}", - "'use strict';\n\nexport default reject;\nimport { noop, reject as _reject } from '../-internal';\n\n/**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop, label);\n _reject(promise, reason);\n return promise;\n}", - "'use strict';\n\nexport default Promise;\n\nimport { config } from './config';\nimport instrument from './instrument';\nimport then from './then';\nimport { isFunction, now } from './utils';\n\nimport { noop, initializePromise } from './-internal';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\n\nvar guidKey = 'rsvp_' + now() + '-';\nvar counter = 0;\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n*/\nfunction Promise(resolver, label) {\n this._id = counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n config.instrument && instrument('created', this);\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n}\n\nPromise.cast = Resolve; // deprecated\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\n\nPromise.prototype = {\n constructor: Promise,\n\n _guidKey: guidKey,\n\n _onError: function _onError(reason) {\n var promise = this;\n config.after(function () {\n if (promise._onError) {\n config['trigger']('error', reason, promise._label);\n }\n });\n },\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we\\'re unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: then,\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn\\'t find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function _catch(onRejection, label) {\n return this.then(undefined, onRejection, label);\n },\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuthor();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuthor();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'finally': function _finally(callback, label) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n }, label);\n }\n};", - "'use strict';\n\nexport default denodeify;\n\nimport Promise from './promise';\nimport { noop, resolve, reject } from './-internal';\nimport { isArray } from './utils';\n\nfunction Result() {\n this.value = undefined;\n}\n\nvar ERROR = new Result();\nvar GET_THEN_ERROR = new Result();\n\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction makeObject(_, argumentNames) {\n var obj = {};\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (var i = 0; i < argumentNames.length; i++) {\n var _name = argumentNames[i];\n obj[_name] = args[i + 1];\n }\n\n return obj;\n}\n\nfunction arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n}\n\nfunction wrapThenable(_then, promise) {\n return {\n then: function then(onFulFillment, onRejection) {\n return _then.call(promise, onFulFillment, onRejection);\n }\n };\n}\n\n/**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n\n into:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n\n readFile('myfile.txt').then(handleData, handleError);\n ```\n\n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n\n ```javascript\n let request = RSVP.denodeify(require('request'));\n\n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n\n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), true);\n\n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n\n Or if you pass it an array with names it returns the parameters as a hash:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), ['res', 'body']);\n\n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n\n Sometimes you need to retain the `this`:\n\n ```javascript\n let app = require('express')();\n let render = RSVP.denodeify(app.render.bind(app));\n ```\n\n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n\n ```javascript\n let request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n\n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n\n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n\n you can chain the operations together using `then` from the returned promise:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n let writeFile = RSVP.denodeify(fs.writeFile);\n\n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n\n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n*/\nfunction denodeify(nodeFunc, options) {\n var fn = function fn() {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n var arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === GET_THEN_ERROR) {\n var p = new Promise(noop);\n reject(p, GET_THEN_ERROR.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new Promise(noop);\n\n args[l] = function (err, val) {\n if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val);\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n fn.__proto__ = nodeFunc;\n\n return fn;\n}\n\nfunction handleValueInput(promise, args, nodeFunc, self) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n}\n\nfunction handlePromiseInput(promise, args, nodeFunc, self) {\n return Promise.all(args).then(function (args) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n });\n}\n\nfunction needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === Promise) {\n return true;\n } else {\n return getThen(arg);\n }\n } else {\n return false;\n }\n}", - "\"use strict\";\n\nexport default all;\nimport Promise from \"./promise\";\n\n/**\n This is a convenient alias for `RSVP.Promise.all`.\n\n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n*/\nfunction all(array, label) {\n return Promise.all(array, label);\n}", - "'use strict';\n\nexport default allSettled;\nimport { default as Enumerator, makeSettledResult } from './enumerator';\nimport Promise from './promise';\nimport { o_create } from './utils';\n\nfunction AllSettled(Constructor, entries, label) {\n this._superConstructor(Constructor, entries, false, /* don't abort on reject */label);\n}\n\nAllSettled.prototype = o_create(Enumerator.prototype);\nAllSettled.prototype._superConstructor = Enumerator;\nAllSettled.prototype._makeResult = makeSettledResult;\nAllSettled.prototype._validationError = function () {\n return new Error('allSettled must be called with an array');\n};\n\n/**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n\n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n\n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n\n Example:\n\n ```javascript\n let promise1 = RSVP.Promise.resolve(1);\n let promise2 = RSVP.Promise.reject(new Error('2'));\n let promise3 = RSVP.Promise.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n\n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n*/\nfunction allSettled(entries, label) {\n return new AllSettled(Promise, entries, label).promise;\n}", - "'use strict';\n\nexport default race;\nimport Promise from './promise';\n\n/**\n This is a convenient alias for `RSVP.Promise.race`.\n\n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\nfunction race(array, label) {\n return Promise.race(array, label);\n}", - "'use strict';\n\nimport Enumerator from './enumerator';\nimport { PENDING } from './-internal';\nimport { o_create } from './utils';\n\nfunction PromiseHash(Constructor, object, label) {\n this._superConstructor(Constructor, object, true, label);\n}\n\nexport default PromiseHash;\n\nPromiseHash.prototype = o_create(Enumerator.prototype);\nPromiseHash.prototype._superConstructor = Enumerator;\nPromiseHash.prototype._init = function () {\n this._result = {};\n};\n\nPromiseHash.prototype._validateInput = function (input) {\n return input && typeof input === 'object';\n};\n\nPromiseHash.prototype._validationError = function () {\n return new Error('Promise.hash must be called with an object');\n};\n\nPromiseHash.prototype._enumerate = function () {\n var enumerator = this;\n var promise = enumerator.promise;\n var input = enumerator._input;\n var results = [];\n\n for (var key in input) {\n if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n enumerator._remaining = length;\n var result = undefined;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n result = results[i];\n enumerator._eachEntry(result.entry, result.position);\n }\n};", - "'use strict';\n\nexport default hash;\nimport Promise from './promise';\nimport PromiseHash from './promise-hash';\n\n/**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n\n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n\n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n\n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n\n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n*/\nfunction hash(object, label) {\n return new PromiseHash(Promise, object, label).promise;\n}", - "'use strict';\n\nexport default hashSettled;\nimport Promise from './promise';\nimport { default as Enumerator, makeSettledResult } from './enumerator';\nimport PromiseHash from './promise-hash';\nimport { o_create } from './utils';\n\nfunction HashSettled(Constructor, object, label) {\n this._superConstructor(Constructor, object, false, label);\n}\n\nHashSettled.prototype = o_create(PromiseHash.prototype);\nHashSettled.prototype._superConstructor = Enumerator;\nHashSettled.prototype._makeResult = makeSettledResult;\n\nHashSettled.prototype._validationError = function () {\n return new Error('hashSettled must be called with an object');\n};\n\n/**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n\n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n\n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n\n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n\n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n*/\nfunction hashSettled(object, label) {\n return new HashSettled(Promise, object, label).promise;\n}", - "/**\n `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event\n loop in order to aid debugging.\n\n Promises A+ specifies that any exceptions that occur with a promise must be\n caught by the promises implementation and bubbled to the last handler. For\n this reason, it is recommended that you always specify a second rejection\n handler function to `then`. However, `RSVP.rethrow` will throw the exception\n outside of the promise, so it bubbles up to your console if in the browser,\n or domain/cause uncaught exception in Node. `rethrow` will also throw the\n error again so the error can be handled by the promise per the spec.\n\n ```javascript\n function throws(){\n throw new Error('Whoops!');\n }\n\n let promise = new RSVP.Promise(function(resolve, reject){\n throws();\n });\n\n promise.catch(RSVP.rethrow).then(function(){\n // Code here doesn't run because the promise became rejected due to an\n // error!\n }, function (err){\n // handle the error here\n });\n ```\n\n The 'Whoops' error will be thrown on the next turn of the event loop\n and you can watch for it in your console. You can also handle it using a\n rejection handler given to `.then` or `.catch` on the returned promise.\n\n @method rethrow\n @static\n @for RSVP\n @param {Error} reason reason the promise became rejected.\n @throws Error\n @static\n*/\n\"use strict\";\n\nexport default rethrow;\n\nfunction rethrow(reason) {\n setTimeout(function () {\n throw reason;\n });\n throw reason;\n}", - "\"use strict\";\n\nexport default defer;\nimport Promise from \"./promise\";\n\n/**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n\n The object returned from `RSVP.defer` is a plain object with three properties:\n\n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n\n Example:\n\n ```javascript\n let deferred = RSVP.defer();\n\n deferred.resolve(\"Success!\");\n\n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n\n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\nfunction defer(label) {\n var deferred = { resolve: undefined, reject: undefined };\n\n deferred.promise = new Promise(function (resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n}", - "'use strict';\n\nexport default map;\nimport Promise from './promise';\nimport { isFunction } from './utils';\n\n/**\n `RSVP.map` is similar to JavaScript's native `map` method, except that it\n waits for all promises to become fulfilled before running the `mapFn` on\n each item in given to `promises`. `RSVP.map` returns a promise that will\n become fulfilled with the result of running `mapFn` on the values the promises\n become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n\n ```javscript\n\n let mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n\n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n\n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n*/\nfunction map(promises, mapFn, label) {\n return Promise.all(promises, label).then(function (values) {\n if (!isFunction(mapFn)) {\n throw new TypeError(\"You must pass a function as map's second argument.\");\n }\n\n var length = values.length;\n var results = new Array(length);\n\n for (var i = 0; i < length; i++) {\n results[i] = mapFn(values[i]);\n }\n\n return Promise.all(results, label);\n });\n}", - "'use strict';\n\nexport default resolve;\nimport Promise from './promise';\n\n/**\n This is a convenient alias for `RSVP.Promise.resolve`.\n\n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve(value, label) {\n return Promise.resolve(value, label);\n}", - "'use strict';\n\nexport default reject;\nimport Promise from './promise';\n\n/**\n This is a convenient alias for `RSVP.Promise.reject`.\n\n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason, label) {\n return Promise.reject(reason, label);\n}", - "'use strict';\n\nexport default filter;\nimport Promise from './promise';\nimport { isFunction, isArray } from './utils';\n\n/**\n `RSVP.filter` is similar to JavaScript's native `filter` method, except that it\n waits for all promises to become fulfilled before running the `filterFn` on\n each item in given to `promises`. `RSVP.filter` returns a promise that will\n become fulfilled with the result of running `filterFn` on the values the\n promises become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n\n let promises = [promise1, promise2, promise3];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n\n ```javascript\n\n let alice = { name: 'alice' };\n let bob = { name: 'bob' };\n let users = [ alice, bob ];\n\n let promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n\n let filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n\n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n*/\n\nfunction resolveAll(promises, label) {\n return Promise.all(promises, label);\n}\n\nfunction resolveSingle(promise, label) {\n return Promise.resolve(promise, label).then(function (promises) {\n return resolveAll(promises, label);\n });\n}\nfunction filter(promises, filterFn, label) {\n var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label);\n return promise.then(function (values) {\n if (!isFunction(filterFn)) {\n throw new TypeError(\"You must pass a function as filter's second argument.\");\n }\n\n var length = values.length;\n var filtered = new Array(length);\n\n for (var i = 0; i < length; i++) {\n filtered[i] = filterFn(values[i]);\n }\n\n return resolveAll(filtered, label).then(function (filtered) {\n var results = new Array(length);\n var newLength = 0;\n\n for (var i = 0; i < length; i++) {\n if (filtered[i]) {\n results[newLength] = values[i];\n newLength++;\n }\n }\n\n results.length = newLength;\n\n return results;\n });\n });\n}", - "'use strict';\n\nexport default asap;\n\nvar len = 0;\nvar toString = ({}).toString;\nvar vertxNext = undefined;\nfunction asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush();\n }\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function () {\n return nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n return node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n return function () {\n return setTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\n\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertex();\n} else {\n scheduleFlush = useSetTimeout();\n}", - "'use strict';\n\nvar platform = undefined;\n\n/* global self */\nif (typeof self === 'object') {\n platform = self;\n\n /* global global */\n} else if (typeof global === 'object') {\n platform = global;\n } else {\n throw new Error('no global: `self` or `global` found');\n }\n\nexport default platform;", - "'use strict';\n\nvar _async$filter;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport Promise from './rsvp/promise';\nimport EventTarget from './rsvp/events';\nimport denodeify from './rsvp/node';\nimport all from './rsvp/all';\nimport allSettled from './rsvp/all-settled';\nimport race from './rsvp/race';\nimport hash from './rsvp/hash';\nimport hashSettled from './rsvp/hash-settled';\nimport rethrow from './rsvp/rethrow';\nimport defer from './rsvp/defer';\nimport { config, configure } from './rsvp/config';\nimport map from './rsvp/map';\nimport resolve from './rsvp/resolve';\nimport reject from './rsvp/reject';\nimport filter from './rsvp/filter';\nimport asap from './rsvp/asap';\n\n// defaults\n\nimport platform from './rsvp/platform';\n// the default export here is for backwards compat:\n// https://github.com/tildeio/rsvp.js/issues/434\nconfig.async = asap;\nconfig.after = function (cb) {\n return setTimeout(cb, 0);\n};\nvar cast = resolve;\n\nvar async = function async(callback, arg) {\n return config.async(callback, arg);\n};\n\nfunction on() {\n config['on'].apply(config, arguments);\n}\n\nfunction off() {\n config['off'].apply(config, arguments);\n}\n\n// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\nif (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n configure('instrument', true);\n for (var eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n}export default (_async$filter = {\n asap: asap,\n cast: cast,\n Promise: Promise,\n EventTarget: EventTarget,\n all: all,\n allSettled: allSettled,\n race: race,\n hash: hash,\n hashSettled: hashSettled,\n rethrow: rethrow,\n defer: defer,\n denodeify: denodeify,\n configure: configure,\n on: on,\n off: off,\n resolve: resolve,\n reject: reject,\n map: map\n}, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here...\nfilter), _async$filter);\n\nexport { asap, cast, Promise, EventTarget, all, allSettled, race, hash, hashSettled, rethrow, defer, denodeify, configure, on, off, resolve, reject, map, async, filter };", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ] -} \ No newline at end of file diff --git a/src/assets/epubjs/build/epub.min.js b/src/assets/epubjs/build/epub.min.js deleted file mode 100644 index 7c266be..0000000 --- a/src/assets/epubjs/build/epub.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * @overview RSVP - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE - * @version 3.5.0 - */ -"use strict";!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.RSVP=a.RSVP||{})}(this,function(a){function b(a,b){for(var c=0,d=a.length;c1)throw new Error("Second argument not supported");if("object"!=typeof a)throw new TypeError("Argument must be an object");return h.prototype=a,new h},Aa=[],Ba=void 0,Ca=1,Da=2,Ea=new y,Fa=new y;E.prototype._validateInput=function(a){return xa(a)},E.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},E.prototype._init=function(){this._result=new Array(this.length)},E.prototype._enumerate=function(){for(var a=this.length,b=this.promise,c=this._input,d=0;b._state===Ba&&d=i)l.resolve();else{if(c&&c.cancelled)return e.remove(),this.element.removeChild(f),void l.reject(new Error("User cancelled"));h=g,b=new EPUBJS.Chapter(this.spine[h],this.store),e.displayChapter(b,this.globalLayoutProperties).then(function(a){e.pageMap.forEach(function(a){j+=1,d.push({cfi:a.start,page:j})}),e.pageMap.length%2>0&&e.spreads&&(j+=1,d.push({cfi:e.pageMap[e.pageMap.length-1].end,page:j})),setTimeout(function(){k(l)},1)})}return l.promise}.bind(this);k().then(function(){e.remove(),this.element.removeChild(f),g.resolve(d)}.bind(this),function(a){g.reject(a)});return g.promise},EPUBJS.Book.prototype.generatePagination=function(a,b,c){var d=this,e=new RSVP.defer;return this.ready.spine.promise.then(function(){d.generatePageList(a,b,c).then(function(a){d.pageList=d.contents.pageList=a,d.pagination.process(a),d.ready.pageList.resolve(d.pageList),e.resolve(d.pageList)},function(a){e.reject(a)})}),e.promise},EPUBJS.Book.prototype.loadPagination=function(a){var b;return b="string"==typeof a?JSON.parse(a):a,b&&b.length&&(this.pageList=b,this.pagination.process(this.pageList),this.ready.pageList.resolve(this.pageList)),this.pageList},EPUBJS.Book.prototype.getPageList=function(){return this.ready.pageList.promise},EPUBJS.Book.prototype.getMetadata=function(){return this.ready.metadata.promise},EPUBJS.Book.prototype.getToc=function(){return this.ready.toc.promise},EPUBJS.Book.prototype.networkListeners=function(){var a=this;window.addEventListener("offline",function(b){a.online=!1,a.settings.storage&&a.fromStorage(!0),a.trigger("book:offline")},!1),window.addEventListener("online",function(b){a.online=!0,a.settings.storage&&a.fromStorage(!1),a.trigger("book:online")},!1)},EPUBJS.Book.prototype.listenToRenderer=function(a){var b=this;a.Events.forEach(function(c){a.on(c,function(a){b.trigger(c,a)})}),a.on("renderer:visibleRangeChanged",function(a){var b,c,d,e=[];this.pageList.length>0&&(b=this.pagination.pageFromCfi(a.start),d=this.pagination.percentageFromPage(b),e.push(b),a.end&&(c=this.pagination.pageFromCfi(a.end),e.push(c)),this.trigger("book:pageChanged",{anchorPage:b,percentage:d,pageRange:e}))}.bind(this)),a.on("render:loaded",this.loadChange.bind(this))},EPUBJS.Book.prototype.loadChange=function(a){var b,c,d=EPUBJS.core.uri(a),e=EPUBJS.core.uri(this.currentChapter.absolute);d.path!=e.path?(console.warn("Miss Match",d.path,this.currentChapter.absolute),b=this.spineIndexByURL[d.filename],c=new EPUBJS.Chapter(this.spine[b],this.store),this.currentChapter=c,this.renderer.currentChapter=c,this.renderer.afterLoad(this.renderer.render.docEl),this.renderer.beforeDisplay(function(){this.renderer.afterDisplay()}.bind(this))):this._rendering||this.renderer.reformat()},EPUBJS.Book.prototype.unlistenToRenderer=function(a){a.Events.forEach(function(b){a.off(b)})},EPUBJS.Book.prototype.coverUrl=function(){var a=this.ready.cover.promise.then(function(a){return this.settings.fromStorage?this.store.getUrl(this.contents.cover):this.settings.contained?this.zip.getUrl(this.contents.cover):this.contents.cover}.bind(this));return a.then(function(a){this.cover=a}.bind(this)),a},EPUBJS.Book.prototype.loadXml=function(a){return this.settings.fromStorage?this.store.getXml(a,this.settings.encoding):this.settings.contained?this.zip.getXml(a,this.settings.encoding):EPUBJS.core.request(a,"xml",this.settings.withCredentials)},EPUBJS.Book.prototype.urlFrom=function(a){var b,c=EPUBJS.core.uri(a),d=c.protocol,e="/"==c.path[0],f=window.location,g=f.origin||f.protocol+"//"+f.host,h=document.getElementsByTagName("base");return h.length&&(b=h[0].href),c.protocol?c.origin+c.path:!d&&e?(b||g)+c.path:d||e?void 0:EPUBJS.core.resolveUrl(b||f.pathname,c.path)},EPUBJS.Book.prototype.unarchive=function(a){return this.zip=new EPUBJS.Unarchiver,this.store=this.zip,this.zip.open(a)},EPUBJS.Book.prototype.isContained=function(a){if(a instanceof ArrayBuffer)return!0;var b=EPUBJS.core.uri(a);return!(!b.extension||"epub"!=b.extension&&"zip"!=b.extension)},EPUBJS.Book.prototype.isSaved=function(a){var b;return!!localStorage&&(b=localStorage.getItem(a),!(!localStorage||null===b))},EPUBJS.Book.prototype.generateBookKey=function(a){return"epubjs:"+EPUBJS.VERSION+":"+window.location.host+":"+a},EPUBJS.Book.prototype.saveContents=function(){if(!localStorage)return!1;localStorage.setItem(this.settings.bookKey,JSON.stringify(this.contents))},EPUBJS.Book.prototype.removeSavedContents=function(){if(!localStorage)return!1;localStorage.removeItem(this.settings.bookKey)},EPUBJS.Book.prototype.renderTo=function(a){var b=this;if(EPUBJS.core.isElement(a))this.element=a;else{if("string"!=typeof a)return void console.error("Not an Element");this.element=EPUBJS.core.getEl(a)}return this.opened.then(function(){return b.renderer.initialize(b.element,b.settings.width,b.settings.height),b.metadata.direction&&b.renderer.setDirection(b.metadata.direction),b._rendered(),b.startDisplay()})},EPUBJS.Book.prototype.startDisplay=function(){return this.settings.goto?this.goto(this.settings.goto):this.settings.previousLocationCfi?this.gotoCfi(this.settings.previousLocationCfi):this.displayChapter(this.spinePos,this.settings.displayLastPage)},EPUBJS.Book.prototype.restore=function(a){var b,c=this,d=["manifest","spine","metadata","cover","toc","spineNodeIndex","spineIndexByURL","globalLayoutProperties"],e=!1,f=this.generateBookKey(a),g=localStorage.getItem(f),h=d.length;if(this.settings.clearSaved&&(e=!0),!e&&"undefined"!=g&&null!==g)for(c.contents=JSON.parse(g),b=0;b=this.spine.length)&&(console.warn("Not A Valid Location"),f=0,b=!1,e=!1),g=new EPUBJS.Chapter(this.spine[f],this.store),this._rendering=!0,this._needsAssetReplacement()&&g.registerHook("beforeChapterRender",[EPUBJS.replace.head,EPUBJS.replace.resources,EPUBJS.replace.posters,EPUBJS.replace.svg],!0),h.currentChapter=g,d=h.renderer.displayChapter(g,this.globalLayoutProperties),e?h.renderer.gotoCfi(e):b&&h.renderer.lastPage(),d.then(function(a){h.spinePos=f,i.resolve(h.renderer),h.settings.fromStorage===!1&&h.settings.contained===!1&&h.preloadNextChapter(),h._rendering=!1,h._displayQ.dequeue(),0===h._displayQ.length()&&h._gotoQ.dequeue()},function(a){console.error("Could not load Chapter: "+g.absolute,a),h.trigger("book:chapterLoadFailed",g.absolute),h._rendering=!1,i.reject(a)}),i.promise):(this._q.enqueue("displayChapter",arguments),i.reject({message:"Rendering",stack:(new Error).stack}),i.promise)},EPUBJS.Book.prototype.nextPage=function(a){var a=a||new RSVP.defer;return this.isRendered?this.renderer.nextPage()?(a.resolve(!0),a.promise):this.nextChapter(a):(this._q.enqueue("nextPage",[a]),a.promise)},EPUBJS.Book.prototype.prevPage=function(a){var a=a||new RSVP.defer;return this.isRendered?this.renderer.prevPage()?(a.resolve(!0),a.promise):this.prevChapter(a):(this._q.enqueue("prevPage",[a]),a.promise)},EPUBJS.Book.prototype.nextChapter=function(a){var a=a||new RSVP.defer;if(this.spinePos0){for(var b=this.spinePos-1;this.spine[b]&&this.spine[b].linear&&"no"==this.spine[b].linear;)b--;if(b>=0)return this.displayChapter(b,!0,a)}return this.trigger("book:atStart"),a.resolve(!0),a.promise},EPUBJS.Book.prototype.getCurrentLocationCfi=function(){return!!this.isRendered&&this.renderer.currentLocationCfi},EPUBJS.Book.prototype.goto=function(a){return 0===a.indexOf("epubcfi(")?this.gotoCfi(a):a.indexOf("%")===a.length-1?this.gotoPercentage(parseInt(a.substring(0,a.length-1))/100):"number"==typeof a||isNaN(a)===!1?this.gotoPage(a):this.gotoHref(a)},EPUBJS.Book.prototype.gotoCfi=function(a,b){var c,d,e,f,g,h=b||new RSVP.defer;return this.isRendered?this._moving||this._rendering?(console.warn("Renderer is moving"),this._gotoQ.enqueue("gotoCfi",[a,h]),!1):(c=new EPUBJS.EpubCFI(a),(d=c.spinePos)!=-1&&(e=this.spine[d],f=h.promise,this._moving=!0,this.currentChapter&&this.spinePos===d?(this.renderer.gotoCfi(c),this._moving=!1,h.resolve(this.renderer.currentLocationCfi)):(e&&d!=-1||(d=0,e=this.spine[d]),g=this.displayChapter(a),g.then(function(a){this._moving=!1,h.resolve(a.currentLocationCfi)}.bind(this),function(){this._moving=!1}.bind(this))),f.then(function(){this._gotoQ.dequeue()}.bind(this)),f)):(console.warn("Not yet Rendered"),this.settings.previousLocationCfi=a,!1)},EPUBJS.Book.prototype.gotoHref=function(a,b){var c,d,e,f,g,h=b||new RSVP.defer;return this.isRendered?this._moving||this._rendering?(this._gotoQ.enqueue("gotoHref",[a,h]),!1):(c=a.split("#"),d=c[0],e=c[1]||!1,f=d.search("://")==-1?d.replace(EPUBJS.core.uri(this.settings.contentsPath).path,""):d.replace(this.settings.contentsPath,""),g=this.spineIndexByURL[f],d||(g=this.currentChapter?this.currentChapter.spinePos:0),"number"==typeof g&&(this.currentChapter&&g==this.currentChapter.spinePos?(e?this.renderer.section(e):this.renderer.firstPage(),h.resolve(this.renderer.currentLocationCfi),h.promise.then(function(){this._gotoQ.dequeue()}.bind(this)),h.promise):this.displayChapter(g).then(function(){e&&this.renderer.section(e),h.resolve(this.renderer.currentLocationCfi)}.bind(this)))):(this.settings.goto=a,!1)},EPUBJS.Book.prototype.gotoPage=function(a){var b=this.pagination.cfiFromPage(a);return this.gotoCfi(b)},EPUBJS.Book.prototype.gotoPercentage=function(a){var b=this.pagination.pageFromPercentage(a);return this.gotoPage(b)},EPUBJS.Book.prototype.preloadNextChapter=function(){var a,b=this.spinePos+1;if(b>=this.spine.length)return!1;(a=new EPUBJS.Chapter(this.spine[b]))&&EPUBJS.core.request(a.absolute)},EPUBJS.Book.prototype.storeOffline=function(){var a=this,b=EPUBJS.core.values(this.manifest);return this.store.put(b).then(function(){a.settings.stored=!0,a.trigger("book:stored")})},EPUBJS.Book.prototype.availableOffline=function(){return this.settings.stored>0},EPUBJS.Book.prototype.toStorage=function(){var a=this.settings.bookKey;this.store.isStored(a).then(function(b){return b===!0?(this.settings.stored=!0,!0):this.storeOffline().then(function(){this.store.token(a,!0)}.bind(this))}.bind(this))},EPUBJS.Book.prototype.fromStorage=function(a){EPUBJS.replace.head,EPUBJS.replace.resources,EPUBJS.replace.posters,EPUBJS.replace.svg;this.contained||this.settings.contained||(this.online&&this.opened.then(this.toStorage.bind(this)),this.store&&this.settings.fromStorage&&a===!1?(this.settings.fromStorage=!1,this.store.off("offline"),this.store=!1):this.settings.fromStorage||(this.store=new EPUBJS.Storage(this.settings.credentials),this.store.on("offline",function(a){a?(this.offline=!0,this.settings.fromStorage=!0,this.trigger("book:offline")):(this.offline=!1,this.settings.fromStorage=!1,this.trigger("book:online"))}.bind(this))))},EPUBJS.Book.prototype.setStyle=function(a,b,c){var d=["color","background","background-color"];if(!this.isRendered)return this._q.enqueue("setStyle",arguments);this.settings.styles[a]=b,this.renderer.setStyle(a,b,c),d.indexOf(a)===-1&&this.renderer.reformat()},EPUBJS.Book.prototype.removeStyle=function(a){if(!this.isRendered)return this._q.enqueue("removeStyle",arguments);this.renderer.removeStyle(a),this.renderer.reformat(),delete this.settings.styles[a]},EPUBJS.Book.prototype.resetClasses=function(a){if(!this.isRendered)return this._q.enqueue("setClasses",arguments);a.constructor===String&&(a=[a]),this.settings.classes=a,this.renderer.setClasses(this.settings.classes),this.renderer.reformat()},EPUBJS.Book.prototype.addClass=function(a){if(!this.isRendered)return this._q.enqueue("addClass",arguments);this.settings.classes.indexOf(a)==-1&&this.settings.classes.push(a),this.renderer.setClasses(this.settings.classes),this.renderer.reformat()},EPUBJS.Book.prototype.removeClass=function(a){if(!this.isRendered)return this._q.enqueue("removeClass",arguments);var b=this.settings.classes.indexOf(a);b!=-1&&(delete this.settings.classes[b],this.renderer.setClasses(this.settings.classes),this.renderer.reformat())},EPUBJS.Book.prototype.addHeadTag=function(a,b){if(!this.isRendered)return this._q.enqueue("addHeadTag",arguments);this.settings.headTags[a]=b},EPUBJS.Book.prototype.useSpreads=function(a){console.warn("useSpreads is deprecated, use forceSingle or set a layoutOveride instead"),a===!1?this.forceSingle(!0):this.forceSingle(!1)},EPUBJS.Book.prototype.forceSingle=function(a){var b=void 0===a||a;this.renderer.forceSingle(b),this.settings.forceSingle=b,this.isRendered&&this.renderer.reformat()},EPUBJS.Book.prototype.setMinSpreadWidth=function(a){this.settings.minSpreadWidth=a,this.isRendered&&(this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth),this.renderer.reformat())},EPUBJS.Book.prototype.setGap=function(a){this.settings.gap=a,this.isRendered&&(this.renderer.setGap(this.settings.gap),this.renderer.reformat())},EPUBJS.Book.prototype.chapter=function(a){var b,c,d=this.spineIndexByURL[a];return d&&(b=this.spine[d],c=new EPUBJS.Chapter(b,this.store,this.settings.withCredentials),c.load()),c},EPUBJS.Book.prototype.unload=function(){this.settings.restore&&localStorage&&this.saveContents(),this.unlistenToRenderer(this.renderer),this.trigger("book:unload")},EPUBJS.Book.prototype.destroy=function(){window.removeEventListener("beforeunload",this.unload),this.currentChapter&&this.currentChapter.unload(),this.unload(),this.renderer&&this.renderer.remove()},EPUBJS.Book.prototype._ready=function(){this.trigger("book:ready")},EPUBJS.Book.prototype._rendered=function(a){this.isRendered=!0,this.trigger("book:rendered"),this._q.flush()},EPUBJS.Book.prototype.applyStyles=function(a,b){a.applyStyles(this.settings.styles),b()},EPUBJS.Book.prototype.applyClasses=function(a,b){a.setClasses(this.settings.classes),b()},EPUBJS.Book.prototype.applyHeadTags=function(a,b){a.applyHeadTags(this.settings.headTags),b()},EPUBJS.Book.prototype._registerReplacements=function(a){a.registerHook("beforeChapterDisplay",this.applyStyles.bind(this,a),!0),a.registerHook("beforeChapterDisplay",this.applyHeadTags.bind(this,a),!0),a.registerHook("beforeChapterDisplay",this.applyClasses.bind(this,a),!0),a.registerHook("beforeChapterDisplay",EPUBJS.replace.hrefs.bind(this),!0)},EPUBJS.Book.prototype._needsAssetReplacement=function(){return!!this.settings.fromStorage||!!this.settings.contained},EPUBJS.Book.prototype.parseLayoutProperties=function(a){return{layout:this.settings.layoutOveride&&this.settings.layoutOveride.layout||a.layout||"reflowable",spread:this.settings.layoutOveride&&this.settings.layoutOveride.spread||a.spread||"auto",orientation:this.settings.layoutOveride&&this.settings.layoutOveride.orientation||a.orientation||"auto"}},RSVP.EventTarget.mixin(EPUBJS.Book.prototype),RSVP.on("error",function(a){console.error(a)}),RSVP.configure("instrument",!0),EPUBJS.Chapter=function(a,b,c){this.href=a.href,this.absolute=a.url,this.id=a.id,this.spinePos=a.index,this.cfiBase=a.cfiBase,this.properties=a.properties,this.manifestProperties=a.manifestProperties,this.linear=a.linear,this.pages=1,this.store=b,this.credentials=c,this.epubcfi=new EPUBJS.EpubCFI,this.deferred=new RSVP.defer,this.loaded=this.deferred.promise,EPUBJS.Hooks.mixin(this),this.getHooks("beforeChapterRender"),this.caches={}},EPUBJS.Chapter.prototype.load=function(a,b){var c,d=a||this.store,e=b||this.credentials;return c=d?d.getXml(this.absolute):EPUBJS.core.request(this.absolute,!1,e),c.then(function(a){try{this.setDocument(a),this.deferred.resolve(this)}catch(a){this.deferred.reject({message:this.absolute+" -> "+a.message,stack:(new Error).stack})}}.bind(this)),c},EPUBJS.Chapter.prototype.render=function(a){return this.load().then(function(a){var b=a.querySelector("head"),c=a.createElement("base");return c.setAttribute("href",this.absolute),b.insertBefore(c,b.firstChild),this.contents=a,new RSVP.Promise(function(b,c){this.triggerHooks("beforeChapterRender",function(){b(a)}.bind(this),this)}.bind(this))}.bind(this)).then(function(a){return(new XMLSerializer).serializeToString(a)}.bind(this))},EPUBJS.Chapter.prototype.url=function(a){var b,c=new RSVP.defer,d=a||this.store,e=this;return d?this.tempUrl?(b=this.tempUrl,c.resolve(b)):d.getUrl(this.absolute).then(function(a){e.tempUrl=a,c.resolve(a)}):(b=this.absolute,c.resolve(b)),c.promise},EPUBJS.Chapter.prototype.setPages=function(a){this.pages=a},EPUBJS.Chapter.prototype.getPages=function(a){return this.pages},EPUBJS.Chapter.prototype.getID=function(){return this.ID},EPUBJS.Chapter.prototype.unload=function(a){this.document=null,this.tempUrl&&a&&(a.revokeUrl(this.tempUrl),this.tempUrl=!1)},EPUBJS.Chapter.prototype.setDocument=function(a){this.document=a,this.contents=a.documentElement,!this.document.evaluate&&document.evaluate&&(this.document.evaluate=document.evaluate)},EPUBJS.Chapter.prototype.cfiFromRange=function(a){var b,c,d,e,f,g,h;if(this.document){if(void 0!==document.evaluate){if(c=EPUBJS.core.getElementXPath(a.startContainer),d=EPUBJS.core.getElementXPath(a.endContainer),e=this.document.evaluate(c,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,a.collapsed||(f=this.document.evaluate(d,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue),b=this.document.createRange(),e)try{b.setStart(e,a.startOffset),!a.collapsed&&f&&b.setEnd(f,a.endOffset)}catch(a){console.log("missed"),e=!1}e||(console.log("not found, try fuzzy match"),g=EPUBJS.core.cleanStringForXpath(a.startContainer.textContent),c="//text()[contains(.,"+g+")]",(e=this.document.evaluate(c,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue)&&(b.setStart(e,a.startOffset),a.collapsed||(h=EPUBJS.core.cleanStringForXpath(a.endContainer.textContent),d="//text()[contains(.,"+h+")]",(f=this.document.evaluate(d,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue)&&b.setEnd(f,a.endOffset))))}else b=a;return this.epubcfi.generateCfiFromRange(b,this.cfiBase)}},EPUBJS.Chapter.prototype.find=function(a){var b=this,c=[],d=a.toLowerCase(),e=function(a){for(var e,f,g,h=a.textContent.toLowerCase(),i=b.document.createRange(),j=-1,k=150;f!=-1;)f=h.indexOf(d,j+1),f!=-1&&(i=b.document.createRange(),i.setStart(a,f),i.setEnd(a,f+d.length),e=b.cfiFromRange(i),a.textContent.lengthb?1:a0?i:i+1:0===f?i:f===-1?EPUBJS.core.locationOf(a,b,c,i,h):EPUBJS.core.locationOf(a,b,c,g,i))},EPUBJS.core.indexOfSorted=function(a,b,c,d,e){var f,g=d||0,h=e||b.length,i=parseInt(g+(h-g)/2);return c||(c=function(a,b){return a>b?1:a0;){if(c=d.shift(),"text"===c.type?(e=g.childNodes[c.index],g=e.parentNode||g):g=c.id?f.getElementById(c.id):h[c.index],!g||void 0===g)return console.error("No Element For",c,a.str),!1;h=Array.prototype.slice.call(g.children)}return g},EPUBJS.EpubCFI.prototype.compare=function(a,b){if("string"==typeof a&&(a=new EPUBJS.EpubCFI(a)),"string"==typeof b&&(b=new EPUBJS.EpubCFI(b)),a.spinePos>b.spinePos)return 1;if(a.spinePosb.steps[c].index)return 1;if(a.steps[c].indexb.characterOffset?1:a.characterOffset")},EPUBJS.EpubCFI.prototype.generateRangeFromCfi=function(a,b){var c,d,e,f,g,h,i=b||document,j=i.createRange();return"string"==typeof a&&(a=this.parse(a)),a.spinePos!==-1&&(c=a.steps[a.steps.length-1],void 0!==document.evaluate?(d=this.generateXpathFromSteps(a.steps),e=i.evaluate(d,i,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue):(g=this.generateQueryFromSteps(a.steps),(h=i.querySelector(g))&&"text"==c.type&&(e=h.childNodes[c.index])),e?(e&&a.characterOffset>=0?(f=e.length,a.characterOffset-1&&this.hooks[a].splice(c,1):Array.isArray(b)&&b.forEach(function(b){(c=this.hooks[a].indexOf(b))>-1&&this.hooks[a].splice(c,1)},this))},a.prototype.triggerHooks=function(a,b,c){function d(){--f<=0&&b&&b()}var e,f;if(void 0===this.hooks[a])return!1;e=this.hooks[a],f=e.length,0===f&&b&&b(),e.forEach(function(a){a(d,c)})},{register:function(a){if(void 0===EPUBJS.hooks[a]&&(EPUBJS.hooks[a]={}),"object"!=typeof EPUBJS.hooks[a])throw"Already registered: "+a;return EPUBJS.hooks[a]},mixin:function(b){for(var c in a.prototype)b[c]=a.prototype[c]}}}(),EPUBJS.Layout=EPUBJS.Layout||{},EPUBJS.Layout.isFixedLayout=function(a){var b=a.querySelector("[name=viewport]");if(!b||!b.hasAttribute("content"))return!1;var c=b.getAttribute("content");return/width=(\d+)/.test(c)&&/height=(\d+)/.test(c)},EPUBJS.Layout.Reflowable=function(){this.documentElement=null,this.spreadWidth=null},EPUBJS.Layout.Reflowable.prototype.format=function(a,b,c,d){var e=EPUBJS.core.prefixed("columnAxis"),f=EPUBJS.core.prefixed("columnGap"),g=EPUBJS.core.prefixed("columnWidth"),h=EPUBJS.core.prefixed("columnFill"),i=Math.floor(b),j=Math.floor(i/8),k=d>=0?d:j%2==0?j:j-1;return this.documentElement=a,this.spreadWidth=i+k,a.style.overflow="hidden",a.style.width=i+"px",a.style.height=c+"px",a.style[e]="horizontal",a.style[h]="auto",a.style[g]=i+"px",a.style[f]=k+"px",this.colWidth=i,this.gap=k,{pageWidth:this.spreadWidth,pageHeight:c}},EPUBJS.Layout.Reflowable.prototype.calculatePages=function(){var a,b;return this.documentElement.style.width="auto",a=this.documentElement.scrollWidth,b=Math.ceil(a/this.spreadWidth),{displayedPages:b,pageCount:b}},EPUBJS.Layout.ReflowableSpreads=function(){this.documentElement=null,this.spreadWidth=null},EPUBJS.Layout.ReflowableSpreads.prototype.format=function(a,b,c,d){var e=EPUBJS.core.prefixed("columnAxis"),f=EPUBJS.core.prefixed("columnGap"),g=EPUBJS.core.prefixed("columnWidth"),h=EPUBJS.core.prefixed("columnFill"),i=2,j=Math.floor(b),k=j%2==0?j:j-1,l=Math.floor(k/8),m=d>=0?d:l%2==0?l:l-1,n=Math.floor((k-m)/i);return this.documentElement=a,this.spreadWidth=(n+m)*i,a.style.overflow="hidden",a.style.width=k+"px",a.style.height=c+"px",a.style[e]="horizontal",a.style[h]="auto",a.style[f]=m+"px",a.style[g]=n+"px",this.colWidth=n,this.gap=m,{pageWidth:this.spreadWidth,pageHeight:c}},EPUBJS.Layout.ReflowableSpreads.prototype.calculatePages=function(){var a=this.documentElement.scrollWidth,b=Math.ceil(a/this.spreadWidth);return this.documentElement.style.width=b*this.spreadWidth-this.gap+"px",{displayedPages:b,pageCount:2*b}},EPUBJS.Layout.Fixed=function(){this.documentElement=null},EPUBJS.Layout.Fixed.prototype.format=function(a,b,c,d){var e,f,g,h,i=EPUBJS.core.prefixed("columnWidth"),j=EPUBJS.core.prefixed("transform"),k=EPUBJS.core.prefixed("transformOrigin"),l=a.querySelector("[name=viewport]");this.documentElement=a,l&&l.hasAttribute("content")&&(e=l.getAttribute("content"),f=e.split(","),f[0]&&(g=f[0].replace("width=","")),f[1]&&(h=f[1].replace("height=","")));var m=b/g,n=c/h,o=m=d?g.resolve():(c=f,b=new EPUBJS.Chapter(this.spine[c],this.store,this.credentials),this.process(b).then(function(){setTimeout(function(){e(g)},1)})),g.promise}.bind(this);return"number"==typeof a&&(this.break=a),e().then(function(){this.total=this._locations.length-1,this._currentCfi&&(this.currentLocation=this._currentCfi),b.resolve(this._locations)}.bind(this)),b.promise},EPUBJS.Locations.prototype.process=function(a){return a.load().then(function(b){var c,d,e,f=b,g=f.documentElement.querySelector("body"),h=0;this.sprint(g,function(b){var g,i=b.length,j=0;for(0===h&&(c=f.createRange(),c.setStart(b,0)),g=this.break-h,g>i&&(h+=i,j=i);j=i?h=i-(j-this.break):(c.setEnd(b,j),e=a.cfiFromRange(c),this._locations.push(e),h=0,j+=1,c=f.createRange(),c.setStart(b,j));d=b}.bind(this)),c&&(c.setEnd(d,d.length),e=a.cfiFromRange(c),this._locations.push(e),h=0)}.bind(this))},EPUBJS.Locations.prototype.sprint=function(a,b){for(var c,d=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);c=d.nextNode();)b(c)},EPUBJS.Locations.prototype.locationFromCfi=function(a){return 0===this._locations.length?-1:EPUBJS.core.locationOf(a,this._locations,this.epubcfi.compare)},EPUBJS.Locations.prototype.percentageFromCfi=function(a){var b=this.locationFromCfi(a);return this.percentageFromLocation(b)},EPUBJS.Locations.prototype.percentageFromLocation=function(a){return a&&this.total?a/this.total:0},EPUBJS.Locations.prototype.cfiFromLocation=function(a){var b=-1;return"number"!=typeof a&&(a=parseInt(a)),a>=0&&a1?a/100:a,c=Math.ceil(this.total*b);return this.cfiFromLocation(c)},EPUBJS.Locations.prototype.load=function(a){return this._locations=JSON.parse(a),this.total=this._locations.length-1,this._locations},EPUBJS.Locations.prototype.save=function(a){return JSON.stringify(this._locations)},EPUBJS.Locations.prototype.getCurrent=function(a){return this._current},EPUBJS.Locations.prototype.setCurrent=function(a){var b;if("string"==typeof a)this._currentCfi=a;else{if("number"!=typeof a)return;this._current=a}0!==this._locations.length&&("string"==typeof a?(b=this.locationFromCfi(a),this._current=b):b=a,this.trigger("changed",{percentage:this.percentageFromLocation(b)}))},Object.defineProperty(EPUBJS.Locations.prototype,"currentLocation",{get:function(){return this._current},set:function(a){this.setCurrent(a)}}),RSVP.EventTarget.mixin(EPUBJS.Locations.prototype),EPUBJS.Pagination=function(a){this.pages=[],this.locations=[],this.epubcfi=new EPUBJS.EpubCFI,a&&a.length&&this.process(a)},EPUBJS.Pagination.prototype.process=function(a){a.forEach(function(a){this.pages.push(a.page),this.locations.push(a.cfi)},this),this.pageList=a,this.firstPage=parseInt(this.pages[0]),this.lastPage=parseInt(this.pages[this.pages.length-1]),this.totalPages=this.lastPage-this.firstPage},EPUBJS.Pagination.prototype.pageFromCfi=function(a){var b=-1;if(0===this.locations.length)return-1;var c=EPUBJS.core.indexOfSorted(a,this.locations,this.epubcfi.compare);return c!=-1?b=this.pages[c]:(c=EPUBJS.core.locationOf(a,this.locations,this.epubcfi.compare),void 0!==(b=c-1>=0?this.pages[c-1]:this.pages[0])||(b=-1)),b},EPUBJS.Pagination.prototype.cfiFromPage=function(a){var b=-1;"number"!=typeof a&&(a=parseInt(a));var c=this.pages.indexOf(a);return c!=-1&&(b=this.locations[c]),b},EPUBJS.Pagination.prototype.pageFromPercentage=function(a){return Math.round(this.totalPages*a)},EPUBJS.Pagination.prototype.percentageFromPage=function(a){var b=(a-this.firstPage)/this.totalPages;return Math.round(1e3*b)/1e3},EPUBJS.Pagination.prototype.percentageFromCfi=function(a){var b=this.pageFromCfi(a);return this.percentageFromPage(b)},EPUBJS.Parser=function(a){this.baseUrl=a||""},EPUBJS.Parser.prototype.container=function(a){var b,c,d,e;return a?(b=a.querySelector("rootfile"))?(c=b.getAttribute("full-path"),d=EPUBJS.core.uri(c).directory,e=a.xmlEncoding,{packagePath:c,basePath:d,encoding:e}):void console.error("No RootFile Found"):void console.error("Container File Not Found")},EPUBJS.Parser.prototype.identifier=function(a){var b;return a?(b=a.querySelector("metadata"),b?this.getElementText(b,"identifier"):void console.error("No Metadata Found")):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.packageContents=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=this;return b&&(this.baseUrl=b),a?(c=a.querySelector("metadata"))?(d=a.querySelector("manifest"))?(e=a.querySelector("spine"))?(f=n.manifest(d),g=n.findNavPath(d),h=n.findTocPath(d,e),i=n.findCoverPath(a),j=Array.prototype.indexOf.call(e.parentNode.childNodes,e),k=n.spine(e,f),l={},k.forEach(function(a){l[a.href]=a.index}),m=n.metadata(c),m.direction=e.getAttribute("page-progression-direction"),{metadata:m,spine:k,manifest:f,navPath:g,tocPath:h,coverPath:i,spineNodeIndex:j,spineIndexByURL:l}):void console.error("No Spine Found"):void console.error("No Manifest Found"):void console.error("No Metadata Found"):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.findNavPath=function(a){var b=a.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']");return!!b&&b.getAttribute("href")},EPUBJS.Parser.prototype.findTocPath=function(a,b){var c,d=a.querySelector("item[media-type='application/x-dtbncx+xml']");return d||(c=b.getAttribute("toc"))&&(d=a.querySelector("item[id='"+c+"']")),!!d&&d.getAttribute("href")},EPUBJS.Parser.prototype.metadata=function(a){var b={},c=this;return b.bookTitle=c.getElementText(a,"title"),b.creator=c.getElementText(a,"creator"),b.description=c.getElementText(a,"description"),b.pubdate=c.getElementText(a,"date"),b.publisher=c.getElementText(a,"publisher"),b.identifier=c.getElementText(a,"identifier"),b.language=c.getElementText(a,"language"),b.rights=c.getElementText(a,"rights"),b.modified_date=c.querySelectorText(a,"meta[property='dcterms:modified']"),b.layout=c.querySelectorText(a,"meta[property='rendition:layout']"),b.orientation=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.spread=c.querySelectorText(a,"meta[property='rendition:spread']"),b},EPUBJS.Parser.prototype.findCoverPath=function(a){if("2.0"===a.querySelector("package").getAttribute("version")){var b=a.querySelector('meta[name="cover"]');if(b){var c=b.getAttribute("content"),d=a.querySelector("item[id='"+c+"']");return!!d&&d.getAttribute("href")}return!1}var e=a.querySelector("item[properties='cover-image']");return!!e&&e.getAttribute("href")},EPUBJS.Parser.prototype.getElementText=function(a,b){var c,d=a.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",b);return d&&0!==d.length?(c=d[0],c.childNodes.length?c.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(a,b){var c=a.querySelector(b);return c&&c.childNodes.length?c.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(a){var b=this.baseUrl,c={},d=a.querySelectorAll("item");return Array.prototype.slice.call(d).forEach(function(a){var d=a.getAttribute("id"),e=a.getAttribute("href")||"",f=a.getAttribute("media-type")||"",g=a.getAttribute("properties")||"";c[d]={href:e,url:b+e,type:f,properties:g}}),c},EPUBJS.Parser.prototype.spine=function(a,b){var c=a.getElementsByTagName("itemref"),d=Array.prototype.slice.call(c),e=EPUBJS.core.indexOfElementNode(a),f=new EPUBJS.EpubCFI;return d.map(function(a,c){var d=a.getAttribute("idref"),g=f.generateChapterComponent(e,c,d),h=a.getAttribute("properties")||"",i=h.length?h.split(" "):[],j=b[d].properties,k=j.length?j.split(" "):[];return{id:d,linear:a.getAttribute("linear")||"",properties:i,manifestProperties:k,href:b[d].href,url:b[d].url,index:c,cfiBase:g,cfi:"epubcfi("+g+")"}})},EPUBJS.Parser.prototype.querySelectorByType=function(a,b,c){var d=a.querySelector(b+'[*|type="'+c+'"]');if(null!==d&&0!==d.length)return d;d=a.querySelectorAll(b);for(var e=0;e1&&d[1],{cfi:f,href:h,packageUrl:e,page:j}):{href:h,page:j}},EPUBJS.Render.Iframe=function(){this.iframe=null,this.document=null,this.window=null,this.docEl=null,this.bodyEl=null,this.leftPos=0,this.pageWidth=0,this.id=EPUBJS.core.uuid()},EPUBJS.Render.Iframe.prototype.create=function(){return this.element=document.createElement("div"),this.element.id="epubjs-view:"+this.id,this.isMobile=navigator.userAgent.match(/(iPad|iPhone|iPod|Mobile|Android)/g),this.transform=EPUBJS.core.prefixed("transform"),this.element},EPUBJS.Render.Iframe.prototype.addIframe=function(){return this.iframe=document.createElement("iframe"),this.iframe.id="epubjs-iframe:"+this.id,this.iframe.scrolling=this.scrolling||"no",this.iframe.seamless="seamless",this.iframe.style.border="none",this.iframe.addEventListener("load",this.loaded.bind(this),!1),(this._width||this._height)&&(this.iframe.height=this._height,this.iframe.width=this._width),this.iframe},EPUBJS.Render.Iframe.prototype.load=function(a,b){var c=this,d=new RSVP.defer;return this.window&&this.unload(),this.iframe&&this.element.removeChild(this.iframe),this.iframe=this.addIframe(),this.element.appendChild(this.iframe),this.iframe.onload=function(a){c.document=c.iframe.contentDocument,c.docEl=c.document.documentElement,c.headEl=c.document.head,c.bodyEl=c.document.body||c.document.querySelector("body"),c.window=c.iframe.contentWindow,c.window.addEventListener("resize",c.resized.bind(c),!1),c.leftPos=0,c.setLeft(0),c.bodyEl&&(c.bodyEl.style.margin="0"),d.resolve(c.docEl)},this.iframe.onerror=function(a){d.reject({message:"Error Loading Contents: "+a,stack:(new Error).stack})},this.document=this.iframe.contentDocument,this.document?(this.iframe.contentDocument.open(),this.iframe.contentDocument.write(a),this.iframe.contentDocument.close(),d.promise):(d.reject(new Error("No Document Available")),d.promise)},EPUBJS.Render.Iframe.prototype.loaded=function(a){var b,c,d=this.iframe.contentWindow.location.href;this.document=this.iframe.contentDocument,this.docEl=this.document.documentElement,this.headEl=this.document.head,this.bodyEl=this.document.body||this.document.querySelector("body"),this.window=this.iframe.contentWindow,this.window.focus(),"about:blank"!=d&&(b=this.iframe.contentDocument.querySelector("base"),c=b.getAttribute("href"),this.trigger("render:loaded",c))},EPUBJS.Render.Iframe.prototype.resize=function(a,b){this.element&&(this.element.style.height=b,isNaN(a)||a%2==0||(a+=1),this.element.style.width=a,this.iframe&&(this.iframe.height=b,this.iframe.width=a),this._height=b,this._width=a,this.width=this.element.getBoundingClientRect().width||a,this.height=this.element.getBoundingClientRect().height||b)},EPUBJS.Render.Iframe.prototype.resized=function(a){this.width=this.iframe.getBoundingClientRect().width,this.height=this.iframe.getBoundingClientRect().height},EPUBJS.Render.Iframe.prototype.totalWidth=function(){return this.docEl.scrollWidth},EPUBJS.Render.Iframe.prototype.totalHeight=function(){return this.docEl.scrollHeight},EPUBJS.Render.Iframe.prototype.setPageDimensions=function(a,b){this.pageWidth=a,this.pageHeight=b},EPUBJS.Render.Iframe.prototype.setDirection=function(a){this.direction=a,this.docEl&&"rtl"==this.docEl.dir&&(this.docEl.dir="rtl","pre-paginated"!==this.layout&&(this.docEl.style.position="static",this.docEl.style.right="auto"))},EPUBJS.Render.Iframe.prototype.setLeft=function(a){this.isMobile?this.docEl.style[this.transform]="translate("+-a+"px, 0)":this.document.defaultView.scrollTo(a,0)},EPUBJS.Render.Iframe.prototype.setLayout=function(a){this.layout=a},EPUBJS.Render.Iframe.prototype.setStyle=function(a,b,c){c&&(a=EPUBJS.core.prefixed(a)),this.bodyEl&&(this.bodyEl.style[a]=b)},EPUBJS.Render.Iframe.prototype.removeStyle=function(a){this.bodyEl&&(this.bodyEl.style[a]="")},EPUBJS.Render.Iframe.prototype.setClasses=function(a){this.bodyEl&&(this.bodyEl.className=a.join(" "))},EPUBJS.Render.Iframe.prototype.addHeadTag=function(a,b,c){var d=c||this.document,e=d.createElement(a),f=d.head;for(var g in b)e.setAttribute(g,b[g]);f&&f.insertBefore(e,f.firstChild)},EPUBJS.Render.Iframe.prototype.page=function(a){this.leftPos=this.pageWidth*(a-1),"rtl"===this.direction&&(this.leftPos=this.leftPos*-1),this.setLeft(this.leftPos)},EPUBJS.Render.Iframe.prototype.getPageNumberByElement=function(a){var b;if(a)return b=this.leftPos+a.getBoundingClientRect().left,Math.floor(b/this.pageWidth)+1},EPUBJS.Render.Iframe.prototype.getPageNumberByRect=function(a){var b;return b=this.leftPos+a.left,Math.floor(b/this.pageWidth)+1},EPUBJS.Render.Iframe.prototype.getBaseElement=function(){return this.bodyEl},EPUBJS.Render.Iframe.prototype.getDocumentElement=function(){return this.docEl},EPUBJS.Render.Iframe.prototype.isElementVisible=function(a){var b,c;return!!(a&&"function"==typeof a.getBoundingClientRect&&(b=a.getBoundingClientRect(),c=b.left,0!==b.width&&0!==b.height&&c>=0&&c=1&&a<=this.displayedPages&&(this.chapterPos=a,this.render.page(a),this.visibleRangeCfi=this.getVisibleRangeCfi(),this.currentLocationCfi=this.visibleRangeCfi.start,this.trigger("renderer:locationChanged",this.currentLocationCfi),this.trigger("renderer:visibleRangeChanged",this.visibleRangeCfi),!0):(console.warn("pageMap not set, queuing"),this._q.enqueue("page",arguments),!0)},EPUBJS.Renderer.prototype.nextPage=function(){return this.page(this.chapterPos+1)},EPUBJS.Renderer.prototype.prevPage=function(){return this.page(this.chapterPos-1)},EPUBJS.Renderer.prototype.pageByElement=function(a){var b;a&&(b=this.render.getPageNumberByElement(a),this.page(b))},EPUBJS.Renderer.prototype.lastPage=function(){if(this._moving)return this._q.enqueue("lastPage",arguments);this.page(this.displayedPages)},EPUBJS.Renderer.prototype.firstPage=function(){if(this._moving)return this._q.enqueue("firstPage",arguments);this.page(1)},EPUBJS.Renderer.prototype.section=function(a){var b=this.doc.getElementById(a);b&&this.pageByElement(b)},EPUBJS.Renderer.prototype.firstElementisTextNode=function(a){var b=a.childNodes;return!!(b.length&&b[0]&&3===b[0].nodeType&&b[0].textContent.trim().length)},EPUBJS.Renderer.prototype.isGoodNode=function(a){return["audio","canvas","embed","iframe","img","math","object","svg","video"].indexOf(a.tagName.toLowerCase())!==-1||this.firstElementisTextNode(a)},EPUBJS.Renderer.prototype.walk=function(a,b,c){for(var d,e,f,g,h=a,i=[h],j=1e4,k=0;!d&&i.length;){if(a=i.shift(),this.containsPoint(a,b,c)&&this.isGoodNode(a)&&(d=a),!d&&a&&a.childElementCount>0){if(!(e=a.children)||!e.length)return d;f=e.length?e.length:0;for(var l=f-1;l>=0;l--)e[l]!=g&&i.unshift(e[l])}if(!d&&0===i.length&&h&&null!==h.parentNode&&(i.push(h.parentNode),g=h,h=h.parentNode),++k>j){console.error("ENDLESS LOOP");break}}return d},EPUBJS.Renderer.prototype.containsPoint=function(a,b,c){var d;return!!(a&&"function"==typeof a.getBoundingClientRect&&(d=a.getBoundingClientRect(),0!==d.width&&0!==d.height&&d.left>=b&&b<=d.left+d.width))},EPUBJS.Renderer.prototype.textSprint=function(a,b){var c,d,e=function(a){return/^\s*$/.test(a.data)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT};try{for(c=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,{acceptNode:e},!1);d=c.nextNode();)b(d)}catch(f){for(c=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,e,!1);d=c.nextNode();)b(d)}},EPUBJS.Renderer.prototype.sprint=function(a,b){for(var c,d=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT,null,!1);c=d.nextNode();)b(c)},EPUBJS.Renderer.prototype.mapPage=function(){var a,b,c,d,e,f,g,h,i=this,j=[],k=this.render.getBaseElement(),l=1,m=this.layout.colWidth+this.layout.gap,n=this.formated.pageWidth*(this.chapterPos-1),o=m*l-n,p=0,q=function(b){var c,e,f;if(b.nodeType==Node.TEXT_NODE){if(e=document.createRange(),e.selectNodeContents(b),!(c=e.getBoundingClientRect())||0===c.width&&0===c.height)return;c.left>p&&(f=r(b)),c.right>p&&(f=r(b)),d=b,f&&(a=null)}},r=function(e){var f;return i.splitTextNodeIntoWordsRanges(e).forEach(function(e){var g=e.getBoundingClientRect();!g||0===g.width&&0===g.height||(g.left+g.width0&&(b&&(b.setEnd(a,e),c.push(b)),b=this.doc.createRange(),b.setStart(a,e+1));return b&&(b.setEnd(a,d.length),c.push(b)),c},EPUBJS.Renderer.prototype.rangePosition=function(a){var b;return b=a.getClientRects(),b.length?b[0]:null},EPUBJS.Renderer.prototype.getPageCfi=function(){var a=2*this.chapterPos-1;return this.pageMap[a].start},EPUBJS.Renderer.prototype.getRange=function(a,b,c){var d,e=this.doc.createRange();return c=!0,void 0===document.caretPositionFromPoint||c?void 0===document.caretRangeFromPoint||c?(this.visibileEl=this.findElementAfter(a,b),e.setStart(this.visibileEl,1)):e=this.doc.caretRangeFromPoint(a,b):(d=this.doc.caretPositionFromPoint(a,b),e.setStart(d.offsetNode,d.offset)),e},EPUBJS.Renderer.prototype.pagesInCurrentChapter=function(){return this.pageMap?this.pageMap.length:(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.currentRenderedPage=function(){return this.pageMap?this.spreads&&this.pageMap.length>1?2*this.chapterPos-1:this.chapterPos:(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.getRenderedPagesLeft=function(){var a,b;return this.pageMap?(b=this.pageMap.length,a=this.spreads?2*this.chapterPos-1:this.chapterPos,b-a):(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.getVisibleRangeCfi=function(){var a,b,c;return this.pageMap?(this.spreads?(a=2*this.chapterPos,b=this.pageMap[a-2],c=b,this.pageMap.length>1&&this.pageMap.length>a-1&&(c=this.pageMap[a-1])):(a=this.chapterPos,b=this.pageMap[a-1],c=b),b||(console.warn("page range miss:",a,this.pageMap),b=this.pageMap[this.pageMap.length-1],c=b),{start:b.start,end:c.end}):(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.gotoCfi=function(a){var b,c,d;if(this._moving)return this._q.enqueue("gotoCfi",arguments);if(EPUBJS.core.isString(a)&&(a=this.epubcfi.parse(a)),void 0===document.evaluate)(c=this.epubcfi.addMarker(a,this.doc))&&(b=this.render.getPageNumberByElement(c),this.epubcfi.removeMarker(c,this.doc),this.page(b));else if(d=this.epubcfi.generateRangeFromCfi(a,this.doc)){var e=d.getBoundingClientRect();b=e?this.render.getPageNumberByRect(e):1,this.page(b),this.currentLocationCfi=a.str}else this.page(1)},EPUBJS.Renderer.prototype.findFirstVisible=function(a){var b,c=a||this.render.getBaseElement();return b=this.walk(c,0,0),b?b:a},EPUBJS.Renderer.prototype.findElementAfter=function(a,b,c){var d,e=c||this.render.getBaseElement();return d=this.walk(e,a,b),d?d:e},EPUBJS.Renderer.prototype.resize=function(a,b,c){this.width=a,this.height=b,c!==!1&&this.render.resize(this.width,this.height),this.contents&&this.reformat(),this.trigger("renderer:resized",{width:this.width,height:this.height})},EPUBJS.Renderer.prototype.onResized=function(a){this.trigger("renderer:beforeResize");var b=this.container.clientWidth,c=this.container.clientHeight;this.resize(b,c,!1)},EPUBJS.Renderer.prototype.addEventListeners=function(){this.render.document&&this.listenedEvents.forEach(function(a){this.render.document.addEventListener(a,this.triggerEvent.bind(this),!1)},this)},EPUBJS.Renderer.prototype.removeEventListeners=function(){this.render.document&&this.listenedEvents.forEach(function(a){this.render.document.removeEventListener(a,this.triggerEvent,!1)},this)},EPUBJS.Renderer.prototype.triggerEvent=function(a){this.trigger("renderer:"+a.type,a)},EPUBJS.Renderer.prototype.addSelectionListeners=function(){this.render.document.addEventListener("selectionchange",this.onSelectionChange.bind(this),!1)},EPUBJS.Renderer.prototype.removeSelectionListeners=function(){this.render.document&&this.doc.removeEventListener("selectionchange",this.onSelectionChange,!1)},EPUBJS.Renderer.prototype.onSelectionChange=function(a){this.selectionEndTimeout&&clearTimeout(this.selectionEndTimeout),this.selectionEndTimeout=setTimeout(function(){this.selectedRange=this.render.window.getSelection(),this.trigger("renderer:selected",this.selectedRange)}.bind(this),500)},EPUBJS.Renderer.prototype.setMinSpreadWidth=function(a){this.minSpreadWidth=a,this.spreads=this.determineSpreads(a)},EPUBJS.Renderer.prototype.determineSpreads=function(a){return!(this.isForcedSingle||!a||this.width=d?h.resolve():(c=a[e].url,g=window.encodeURIComponent(c),EPUBJS.core.request(c,"binary").then(function(a){return localforage.setItem(g,a)}).then(function(a){e++,setTimeout(function(){f(h)},1)})),h.promise}.bind(this);return Array.isArray(a)||(a=[a]),f().then(function(){c.resolve()}.bind(this)),c.promise},EPUBJS.Storage.prototype.token=function(a,b){var c=window.encodeURIComponent(a);return localforage.setItem(c,b).then(function(a){return null!==a})},EPUBJS.Storage.prototype.isStored=function(a){var b=window.encodeURIComponent(a);return localforage.getItem(b).then(function(a){return null!==a})},EPUBJS.Storage.prototype.getText=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(a){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,a),a}.bind(this)).then(function(b){var c=new RSVP.defer,d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;return f.addEventListener("loadend",function(){c.resolve(f.result)}),f.readAsText(e,d),c.promise}).catch(function(){var c=new RSVP.defer,d=localforage.getItem(b);return this.offline||(this.offline=!0,this.trigger("offline",!0)),d?(d.then(function(b){var d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;f.addEventListener("loadend",function(){c.resolve(f.result)}),f.readAsText(e,d)}),c.promise):(c.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),c.promise)}.bind(this))},EPUBJS.Storage.prototype.getUrl=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(c){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,c),a}.bind(this)).catch(function(){var c,d,e=new RSVP.defer,f=window.URL||window.webkitURL||window.mozURL;return this.offline||(this.offline=!0,this.trigger("offline",!0)),b in this.urlCache?(e.resolve(this.urlCache[b]),e.promise):(c=localforage.getItem(b))?(c.then(function(c){var g=new Blob([c],{type:EPUBJS.core.getMimeType(a)});d=f.createObjectURL(g),e.resolve(d),this.urlCache[b]=d}.bind(this)),e.promise):(e.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),e.promise)}.bind(this))},EPUBJS.Storage.prototype.getXml=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(a){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,a),a}.bind(this)).then(function(b){var c=new RSVP.defer,d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;return f.addEventListener("loadend",function(){var a=new DOMParser,b=a.parseFromString(f.result,"text/xml");c.resolve(b)}),f.readAsText(e,d),c.promise}).catch(function(){var c=new RSVP.defer,d=localforage.getItem(b);return this.offline||(this.offline=!0,this.trigger("offline",!0)),d?(d.then(function(b){var d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;f.addEventListener("loadend",function(){var a=new DOMParser,b=a.parseFromString(f.result,"text/xml");c.resolve(b)}),f.readAsText(e,d)}),c.promise):(c.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),c.promise)}.bind(this))},EPUBJS.Storage.prototype.revokeUrl=function(a){var b=window.URL||window.webkitURL||window.mozURL,c=this.urlCache[a];c&&b.revokeObjectURL(c)},EPUBJS.Storage.prototype.failed=function(a){console.error(a)},RSVP.EventTarget.mixin(EPUBJS.Storage.prototype),EPUBJS.Unarchiver=function(a){this.checkRequirements(),this.urlCache={}},EPUBJS.Unarchiver.prototype.checkRequirements=function(a){"undefined"==typeof JSZip&&console.error("JSZip lib not loaded")},EPUBJS.Unarchiver.prototype.open=function(a,b){if(a instanceof ArrayBuffer){this.zip=new JSZip(a);var c=new RSVP.defer;return c.resolve(),c.promise}return EPUBJS.core.request(a,"binary").then(function(a){this.zip=new JSZip(a)}.bind(this))},EPUBJS.Unarchiver.prototype.getXml=function(a,b){var c=window.decodeURIComponent(a);return this.getText(c,b).then(function(b){var c=new DOMParser,d=EPUBJS.core.getMimeType(a);return 65279===b.charCodeAt(0)&&(b=b.slice(1)),c.parseFromString(b,d)})},EPUBJS.Unarchiver.prototype.getUrl=function(a,b){var c,d,e=this,f=new RSVP.defer,g=window.decodeURIComponent(a),h=this.zip.file(g),i=window.URL||window.webkitURL||window.mozURL;return h?a in this.urlCache?(f.resolve(this.urlCache[a]),f.promise):(d=new Blob([h.asUint8Array()],{type:EPUBJS.core.getMimeType(h.name)}),c=i.createObjectURL(d),f.resolve(c),e.urlCache[a]=c,f.promise):(f.reject({message:"File not found in the epub: "+a,stack:(new Error).stack}),f.promise)},EPUBJS.Unarchiver.prototype.getText=function(a,b){var c,d=new RSVP.defer,e=window.decodeURIComponent(a),f=this.zip.file(e);return f?(c=f.asText(),d.resolve(c),d.promise):(d.reject({message:"File not found in the epub: "+a,stack:(new Error).stack}),d.promise)},EPUBJS.Unarchiver.prototype.revokeUrl=function(a){var b=window.URL||window.webkitURL||window.mozURL,c=this.urlCache[a];c&&b.revokeObjectURL(c)},EPUBJS.Unarchiver.prototype.failed=function(a){console.error(a)},EPUBJS.Unarchiver.prototype.afterSaved=function(a){this.callback()},EPUBJS.Unarchiver.prototype.toStorage=function(a){function b(){0===--e&&d.afterSaved()}var c=0,d=this,e=a.length;a.forEach(function(a){setTimeout(function(a){d.saveEntryFileToStorage(a,b)},c,a),c+=20}),console.log("time",c)},function(){var a={application:{ecmascript:["es","ecma"],javascript:"js",ogg:"ogx",pdf:"pdf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],"rdf+xml":"rdf",smil:["smi","smil"],"xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","opf","ncx"],zip:"zip","x-httpd-eruby":"rhtml","x-latex":"latex","x-maker":["frm","maker","frame","fm","fb","book","fbdoc"],"x-object":"o","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","epub+zip":"epub","font-tdpfr":"pfr","inkml+xml":["ink","inkml"],json:"json","jsonml+json":"jsonml","mathml+xml":"mathml","metalink+xml":"metalink",mp4:"mp4s","omdoc+xml":"omdoc",oxps:"oxps","vnd.amazon.ebook":"azw",widget:"wgt","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-otf":"otf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-font-woff":"woff","x-mobipocket-ebook":["prc","mobi"],"x-mspublisher":"pub","x-nzb":"nzb","x-tgif":"obj","xaml+xml":"xaml","xml-dtd":"dtd","xproc+xml":"xpl","xslt+xml":"xslt","internet-property-stream":"acx","x-compress":"z","x-compressed":"tgz","x-gzip":"gz"},audio:{flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp2","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"x-aiff":["aif","aiff","aifc"],"x-ms-wma":"wma","x-wav":"wav",adpcm:"adp",mp4:"mp4a",webm:"weba","x-aac":"aac","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",mid:["mid","rmi"]},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"x-icon":"ico",bmp:"bmp",webp:"webp","x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",mathml:"mml",plain:["txt","text","brf","conf","def","list","log","in","bas"],richtext:"rtx","tab-separated-values":"tsv","x-bibtex":"bib","x-dsrc":"d","x-diff":["diff","patch"],"x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas"],"x-pcs-gcd":"gcd","x-perl":["pl","pm"],"x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcard":"vcf",sgml:["sgml","sgm"],"x-c":["c","cc","cxx","cpp","h","hh","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt"},video:{mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv"}},b=function(){var b,c,d,e,f={};for(b in a)if(a.hasOwnProperty(b))for(c in a[b])if(a[b].hasOwnProperty(c))if("string"==typeof(d=a[b][c]))f[d]=b+"/"+c;else for(e=0;e iheight / 2.5) { - maxHeight = iheight / 2.5; - pop_content.style.maxHeight = maxHeight + "px"; - } - - //-- switch above / below - if(popRect.height + top >= iheight - 25) { - pop.style.top = top - popRect.height + "px"; - pop.classList.add("above"); - }else{ - pop.classList.remove("above"); - } - - //-- switch left - if(left - popRect.width <= 0) { - pop.style.left = left + "px"; - pop.classList.add("left"); - }else{ - pop.classList.remove("left"); - } - - //-- switch right - if(left + popRect.width / 2 >= iwidth) { - //-- TEMP MOVE: 300 - pop.style.left = left - 300 + "px"; - - popRect = pop.getBoundingClientRect(); - pop.style.left = left - popRect.width + "px"; - //-- switch above / below again - if(popRect.height + top >= iheight - 25) { - pop.style.top = top - popRect.height + "px"; - pop.classList.add("above"); - }else{ - pop.classList.remove("above"); - } - - pop.classList.add("right"); - }else{ - pop.classList.remove("right"); - } - - - } - - function onPop(){ - popups[id].classList.add("on"); - } - - function offPop(){ - popups[id].classList.remove("on"); - } - - function hidePop(){ - setTimeout(function(){ - popups[id].classList.remove("show"); - }, 100); - } - - }); - - - if(callback) callback(); - -} - -EPUBJS.Hooks.register("beforeChapterDisplay").mathml = function(callback, renderer){ - - // check of currentChapter properties contains 'mathml' - if(renderer.currentChapter.manifestProperties.indexOf("mathml") !== -1 ){ - - // Assign callback to be inside iframe window - renderer.render.iframe.contentWindow.mathmlCallback = callback; - - // add MathJax config script tag to the renderer body - var s = document.createElement("script"); - s.type = 'text/x-mathjax-config'; - s.innerHTML = '\ - MathJax.Hub.Register.StartupHook("End",function () { \ - window.mathmlCallback(); \ - });\ - MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); \ - '; - renderer.doc.body.appendChild(s); - // add MathJax.js to renderer head - EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML", null, renderer.doc.head); - - } else { - if(callback) callback(); - } -} - -EPUBJS.Hooks.register("beforeChapterDisplay").smartimages = function(callback, renderer){ - var images = renderer.contents.querySelectorAll('img'), - items = Array.prototype.slice.call(images), - iheight = renderer.height,//chapter.bodyEl.clientHeight,//chapter.doc.body.getBoundingClientRect().height, - oheight; - - if(renderer.layoutSettings.layout != "reflowable") { - callback(); - return; //-- Only adjust images for reflowable text - } - - items.forEach(function(item){ - - var size = function() { - var itemRect = item.getBoundingClientRect(), - rectHeight = itemRect.height, - top = itemRect.top, - oHeight = item.getAttribute('data-height'), - height = oHeight || rectHeight, - newHeight, - fontSize = Number(getComputedStyle(item, "").fontSize.match(/(\d*(\.\d*)?)px/)[1]), - fontAdjust = fontSize ? fontSize / 2 : 0; - - iheight = renderer.contents.clientHeight; - if(top < 0) top = 0; - - item.style.maxWidth = "100%"; - - if(height + top >= iheight) { - - if(top < iheight/2) { - // Remove top and half font-size from height to keep container from overflowing - newHeight = iheight - top - fontAdjust; - item.style.maxHeight = newHeight + "px"; - item.style.width= "auto"; - }else{ - if(height > iheight) { - item.style.maxHeight = iheight + "px"; - item.style.width= "auto"; - itemRect = item.getBoundingClientRect(); - height = itemRect.height; - } - item.style.display = "block"; - item.style["WebkitColumnBreakBefore"] = "always"; - item.style["breakBefore"] = "column"; - - } - - item.setAttribute('data-height', newHeight); - - }else{ - item.style.removeProperty('max-height'); - item.style.removeProperty('margin-top'); - } - } - - var unloaded = function(){ - // item.removeEventListener('load', size); // crashes in IE - renderer.off("renderer:resized", size); - renderer.off("renderer:chapterUnload", this); - }; - - item.addEventListener('load', size, false); - - renderer.on("renderer:resized", size); - - renderer.on("renderer:chapterUnload", unloaded); - - size(); - - }); - - if(callback) callback(); - -} - -EPUBJS.Hooks.register("beforeChapterDisplay").transculsions = function(callback, renderer){ - /* - - */ - - var trans = renderer.contents.querySelectorAll('[transclusion]'), - items = Array.prototype.slice.call(trans); - - items.forEach(function(item){ - var src = item.getAttribute("ref"), - iframe = document.createElement('iframe'), - orginal_width = item.getAttribute("width"), - orginal_height = item.getAttribute("height"), - parent = item.parentNode, - width = orginal_width, - height = orginal_height, - ratio; - - - function size() { - width = orginal_width; - height = orginal_height; - - if(width > chapter.colWidth){ - ratio = chapter.colWidth / width; - - width = chapter.colWidth; - height = height * ratio; - } - - iframe.width = width; - iframe.height = height; - } - - - size(); - - //-- resize event - - - renderer.listenUntil("renderer:resized", "renderer:chapterUnloaded", size); - - iframe.src = src; - - // - parent.replaceChild(iframe, item); - - - }); - - - - - if(callback) callback(); - - -} - -//# sourceMappingURL=hooks.js.map \ No newline at end of file diff --git a/src/assets/epubjs/build/hooks.js.map b/src/assets/epubjs/build/hooks.js.map deleted file mode 100644 index 6438735..0000000 --- a/src/assets/epubjs/build/hooks.js.map +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": 3, - "file": "hooks.js", - "sources": [ - "hooks/default/endnotes.js", - "hooks/default/mathml.js", - "hooks/default/smartimages.js", - "hooks/default/transculsions.js" - ], - "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A", - "sourceRoot": "../", - "sourcesContent": [ - null, - null, - null, - null - ] -} \ No newline at end of file diff --git a/src/assets/epubjs/build/hooks.min.js b/src/assets/epubjs/build/hooks.min.js deleted file mode 100644 index 6961bc0..0000000 --- a/src/assets/epubjs/build/hooks.min.js +++ /dev/null @@ -1 +0,0 @@ -EPUBJS.Hooks.register("beforeChapterDisplay").endnotes=function(a,b){var c=b.contents.querySelectorAll("a[href]"),d=Array.prototype.slice.call(c),e=EPUBJS.core.folder(location.pathname),f=(EPUBJS.cssPath,{});EPUBJS.core.addCss(EPUBJS.cssPath+"popup.css",!1,b.render.document.head),d.forEach(function(a){function c(){var c,h,n=b.height,o=b.width,p=225;m||(c=j.cloneNode(!0),m=c.querySelector("p")),f[i]||(f[i]=document.createElement("div"),f[i].setAttribute("class","popup"),pop_content=document.createElement("div"),f[i].appendChild(pop_content),pop_content.appendChild(m),pop_content.setAttribute("class","pop_content"),b.render.document.body.appendChild(f[i]),f[i].addEventListener("mouseover",d,!1),f[i].addEventListener("mouseout",e,!1),b.on("renderer:pageChanged",g,this),b.on("renderer:pageChanged",e,this)),c=f[i],h=a.getBoundingClientRect(),k=h.left,l=h.top,c.classList.add("show"),popRect=c.getBoundingClientRect(),c.style.left=k-popRect.width/2+"px",c.style.top=l+"px",p>n/2.5&&(p=n/2.5,pop_content.style.maxHeight=p+"px"),popRect.height+l>=n-25?(c.style.top=l-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),k-popRect.width<=0?(c.style.left=k+"px",c.classList.add("left")):c.classList.remove("left"),k+popRect.width/2>=o?(c.style.left=k-300+"px",popRect=c.getBoundingClientRect(),c.style.left=k-popRect.width+"px",popRect.height+l>=n-25?(c.style.top=l-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),c.classList.add("right")):c.classList.remove("right")}function d(){f[i].classList.add("on")}function e(){f[i].classList.remove("on")}function g(){setTimeout(function(){f[i].classList.remove("show")},100)}var h,i,j,k,l,m;"noteref"==a.getAttribute("epub:type")&&(h=a.getAttribute("href"),i=h.replace("#",""),j=b.render.document.getElementById(i),a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",g,!1))}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").mathml=function(a,b){if(b.currentChapter.manifestProperties.indexOf("mathml")!==-1){b.render.iframe.contentWindow.mathmlCallback=a;var c=document.createElement("script");c.type="text/x-mathjax-config",c.innerHTML=' MathJax.Hub.Register.StartupHook("End",function () { window.mathmlCallback(); }); MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); ',b.doc.body.appendChild(c),EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML",null,b.doc.head)}else a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").smartimages=function(a,b){var c=b.contents.querySelectorAll("img"),d=Array.prototype.slice.call(c),e=b.height;if("reflowable"!=b.layoutSettings.layout)return void a();d.forEach(function(a){var c=function(){var c,d=a.getBoundingClientRect(),f=d.height,g=d.top,h=a.getAttribute("data-height"),i=h||f,j=Number(getComputedStyle(a,"").fontSize.match(/(\d*(\.\d*)?)px/)[1]),k=j?j/2:0;e=b.contents.clientHeight,g<0&&(g=0),a.style.maxWidth="100%",i+g>=e?(ge&&(a.style.maxHeight=e+"px",a.style.width="auto",d=a.getBoundingClientRect(),i=d.height),a.style.display="block",a.style.WebkitColumnBreakBefore="always",a.style.breakBefore="column"),a.setAttribute("data-height",c)):(a.style.removeProperty("max-height"),a.style.removeProperty("margin-top"))},d=function(){b.off("renderer:resized",c),b.off("renderer:chapterUnload",this)};a.addEventListener("load",c,!1),b.on("renderer:resized",c),b.on("renderer:chapterUnload",d),c()}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").transculsions=function(a,b){var c=b.contents.querySelectorAll("[transclusion]");Array.prototype.slice.call(c).forEach(function(a){function c(){j=g,k=h,j>chapter.colWidth&&(d=chapter.colWidth/j,j=chapter.colWidth,k*=d),f.width=j,f.height=k}var d,e=a.getAttribute("ref"),f=document.createElement("iframe"),g=a.getAttribute("width"),h=a.getAttribute("height"),i=a.parentNode,j=g,k=h;c(),b.listenUntil("renderer:resized","renderer:chapterUnloaded",c),f.src=e,i.replaceChild(f,a)}),a&&a()}; \ No newline at end of file diff --git a/src/assets/epubjs/build/hooks.min.map b/src/assets/epubjs/build/hooks.min.map deleted file mode 100644 index 20deb18..0000000 --- a/src/assets/epubjs/build/hooks.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"hooks.min.js","sources":["../hooks/default/endnotes.js","../hooks/default/mathml.js","../hooks/default/smartimages.js","../hooks/default/transculsions.js"],"names":["EPUBJS","Hooks","register","endnotes","callback","renderer","notes","contents","querySelectorAll","items","Array","prototype","slice","call","attr","type","folder","core","location","pathname","popups","cssPath","addCss","render","document","head","forEach","item","showPop","pop","itemRect","iheight","height","iwidth","width","maxHeight","txt","el","cloneNode","querySelector","id","createElement","setAttribute","pop_content","appendChild","body","addEventListener","onPop","offPop","on","hidePop","this","getBoundingClientRect","left","top","classList","add","popRect","style","remove","setTimeout","href","epubType","getAttribute","replace","getElementById","mathml","currentChapter","manifestProperties","indexOf","iframe","contentWindow","mathmlCallback","s","innerHTML","doc","addScript","smartimages","images","layoutSettings","layout","size","newHeight","rectHeight","oHeight","fontSize","Number","getComputedStyle","match","fontAdjust","clientHeight","display","removeProperty","unloaded","off","transculsions","trans","orginal_width","orginal_height","chapter","colWidth","ratio","src","parent","parentNode","listenUntil","replaceChild"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/epubjs/build/libs/localforage.min.js b/src/assets/epubjs/build/libs/localforage.min.js deleted file mode 100644 index b26ff00..0000000 --- a/src/assets/epubjs/build/libs/localforage.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - localForage -- Offline Storage, Improved - Version 1.5.0 - https://localforage.github.io/localForage - (c) 2013-2017 Mozilla, Apache License 2.0 -*/ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof ha?ja.resolve(ha):m(a).then(function(a){return ha=a})}function o(a){var b=ia[a.name],c={};c.promise=new ja(function(a){c.resolve=a}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ia[a.name],c=b.deferredOperations.pop();c&&c.resolve()}function q(a,b){return new ja(function(c,d){if(a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ga.open.apply(ga,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(ka)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function r(a){return q(a,!1)}function s(a){return q(a,!0)}function t(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function u(a){return new ja(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function v(a){var b=l(atob(a.data));return i([b],{type:a.type})}function w(a){return a&&a.__local_forage_encoded_blob}function x(a){var b=this,c=b._initReady().then(function(){var a=ia[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return k(c,a,a),c}function y(a){function b(){return ja.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];ia||(ia={});var f=ia[d.name];f||(f={forages:[],db:null,dbReady:null,deferredOperations:[]},ia[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=x);for(var g=[],h=0;h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function I(a){var b,c=new Uint8Array(a),d="";for(b=0;b>2],d+=na[(3&c[b])<<4|c[b+1]>>4],d+=na[(15&c[b+1])<<2|c[b+2]>>6],d+=na[63&c[b+2]];return c.length%3===2?d=d.substring(0,d.length-1)+"=":c.length%3===1&&(d=d.substring(0,d.length-2)+"=="),d}function J(a,b){var c="";if(a&&(c=Ea.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ea.call(a.buffer))){var d,e=qa;a instanceof ArrayBuffer?(d=a,e+=sa):(d=a.buffer,"[object Int8Array]"===c?e+=ua:"[object Uint8Array]"===c?e+=va:"[object Uint8ClampedArray]"===c?e+=wa:"[object Int16Array]"===c?e+=xa:"[object Uint16Array]"===c?e+=za:"[object Int32Array]"===c?e+=ya:"[object Uint32Array]"===c?e+=Aa:"[object Float32Array]"===c?e+=Ba:"[object Float64Array]"===c?e+=Ca:b(new Error("Failed to get type for BinaryArray"))),b(e+I(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=oa+a.type+"~"+I(this.result);b(qa+ta+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function K(a){if(a.substring(0,ra)!==qa)return JSON.parse(a);var b,c=a.substring(Da),d=a.substring(ra,Da);if(d===ta&&pa.test(c)){var e=c.match(pa);b=e[1],c=c.substring(e[0].length)}var f=H(c);switch(d){case sa:return f;case ta:return i([f],{type:b});case ua:return new Int8Array(f);case va:return new Uint8Array(f);case wa:return new Uint8ClampedArray(f);case xa:return new Int16Array(f);case za:return new Uint16Array(f);case ya:return new Int32Array(f);case Aa:return new Uint32Array(f);case Ba:return new Float32Array(f);case Ca:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function L(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new ja(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){e.executeSql("CREATE TABLE IF NOT EXISTS "+c.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){b._dbInfo=c,a()},function(a,b){d(b)})})});return c.serializer=Fa,e}function M(a,b){var c=this;"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a));var d=new ja(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return j(d,b),d}function N(a,b){var c=this,d=new ja(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h0)return void f(O.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return j(f,c),f}function P(a,b,c){return O.apply(this,[a,b,c,1])}function Q(a,b){var c=this;"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a));var d=new ja(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return j(d,b),d}function R(a){var b=this,c=new ja(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return j(c,a),c}function S(a){var b=this,c=new ja(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return j(c,a),c}function T(a,b){var c=this,d=new ja(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return j(d,b),d}function U(a){var b=this,c=new ja(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return j(c,a),c}function X(a,b){var c=this;"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a));var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return j(d,b),d}function Y(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h - -(c) 2009-2014 Stuart Knightley -Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. - -JSZip uses the library pako released under the MIT license : -https://github.com/nodeca/pako/blob/master/LICENSE -*/ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.lengtha)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a,b){return e.deflateRaw(a,{level:b.level||-1})},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;gc;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a0?a.substring(0,b):""},x=function(a){return"/"!=a.slice(-1)&&(a+="/"),a},y=function(a,b){return b="undefined"!=typeof b?b:!1,a=x(a),this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},z=function(a,b,c){var f,g=new j;return a._data instanceof j?(g.uncompressedSize=a._data.uncompressedSize,g.crc32=a._data.crc32,0===g.uncompressedSize||a.dir?(b=i.STORE,g.compressedContent="",g.crc32=0):a._data.compressionMethod===b.magic?g.compressedContent=a._data.getCompressedContent():(f=a._data.getContent(),g.compressedContent=b.compress(d.transformTo(b.compressInputType,f),c))):(f=p(a),(!f||0===f.length||a.dir)&&(b=i.STORE,f=""),g.uncompressedSize=f.length,g.crc32=e(f),g.compressedContent=b.compress(d.transformTo(b.compressInputType,f),c)),g.compressedSize=g.compressedContent.length,g.compressionMethod=b.magic,g},A=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},B=function(a){return 63&(a||0)},C=function(a,b,c,g,h){var i,j,k,m,n=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),o=b.comment||"",p=d.transformTo("string",l.utf8encode(o)),q=n.length!==b.name.length,r=p.length!==o.length,t=b.options,u="",v="",w="";k=b._initialMetadata.dir!==b.dir?b.dir:t.dir,m=b._initialMetadata.date!==b.date?b.date:t.date;var x=0,y=0;k&&(x|=16),"UNIX"===h?(y=798,x|=A(b.unixPermissions,k)):(y=20,x|=B(b.dosPermissions,k)),i=m.getHours(),i<<=6,i|=m.getMinutes(),i<<=5,i|=m.getSeconds()/2,j=m.getFullYear()-1980,j<<=4,j|=m.getMonth()+1,j<<=5,j|=m.getDate(),q&&(v=s(1,1)+s(e(n),4)+n,u+="up"+s(v.length,2)+v),r&&(w=s(1,1)+s(this.crc32(p),4)+p,u+="uc"+s(w.length,2)+w);var z="";z+="\n\x00",z+=q||r?"\x00\b":"\x00\x00",z+=c.compressionMethod,z+=s(i,2),z+=s(j,2),z+=s(c.crc32,4),z+=s(c.compressedSize,4),z+=s(c.uncompressedSize,4),z+=s(n.length,2),z+=s(u.length,2);var C=f.LOCAL_FILE_HEADER+z+n+u,D=f.CENTRAL_FILE_HEADER+s(y,2)+z+s(p.length,2)+"\x00\x00\x00\x00"+s(x,4)+s(g,4)+n+u+p;return{fileRecord:C,dirRecord:D,compressedObject:c}},D={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=y.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;cg&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;cb?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a>8;this.dir=16&this.externalFileAttributes?!0:!1,a===h&&(this.dosPermissions=63&this.externalFileAttributes),a===i&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileName.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header)};s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead=hb&&(a.ins_h=(a.ins_h<=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=hb&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<q&&(p+=B[f++]<>>=w,q-=w),15>q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<q&&(p+=B[f++]<q&&(p+=B[f++]<k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whaven;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<n;){if(0===i)break a;i--,m+=e[g++]<>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.haven;){if(0===i)break a;i--,m+=e[g++]<>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1); -break}for(c.back=0;Ab=c.lencode[m&(1<>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<n;){if(0===i)break a;i--,m+=e[g++]<=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++hh?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++jj){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)}); \ No newline at end of file diff --git a/src/assets/epubjs/build/libs/zip.min.map b/src/assets/epubjs/build/libs/zip.min.map deleted file mode 100644 index f7f73f0..0000000 --- a/src/assets/epubjs/build/libs/zip.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"zip.min.js","sources":["../../node_modules/jszip/lib/base64.js","../../node_modules/jszip/lib/compressedObject.js","../../node_modules/jszip/lib/dataReader.js","../../node_modules/jszip/lib/index.js","../../node_modules/jszip/lib/nodeBufferReader.js","../../node_modules/jszip/lib/stringReader.js","../../node_modules/jszip/lib/uint8ArrayReader.js","../../node_modules/jszip/lib/utils.js","../../node_modules/jszip/lib/zipEntries.js","../../node_modules/jszip/lib/zipEntry.js","../../node_modules/jszip/lib/compressions.js","../../node_modules/jszip/lib/crc32.js","../../node_modules/jszip/lib/defaults.js","../../node_modules/jszip/lib/deprecatedPublicUtils.js","../../node_modules/jszip/lib/flate.js","../../node_modules/jszip/lib/load.js","../../node_modules/jszip/lib/nodeBuffer.js","../../node_modules/jszip/lib/object.js","../../node_modules/jszip/lib/signature.js","../../node_modules/jszip/lib/stringWriter.js","../../node_modules/jszip/lib/support.js","../../node_modules/jszip/lib/uint8ArrayWriter.js","../../node_modules/jszip/lib/utf8.js"],"names":["CompressedObject","this","compressedSize","uncompressedSize","crc32","compressionMethod","compressedContent","DataReader","data","length","index","JSZip","options","files","comment","root","load","clone","newObj","i","NodeBufferReader","StringReader","optimizedBinaryString","utils","string2binary","Uint8ArrayReader","identity","input","stringToArrayLike","str","array","charCodeAt","arrayLikeToString","chunk","result","len","type","exports","getTypeOf","k","canUseApply","String","fromCharCode","apply","Uint8Array","nodeBuffer","e","resultStr","push","slice","Math","min","subarray","floor","join","arrayLikeToArrayLike","arrayFrom","arrayTo","ZipEntries","loadOptions","ZipEntry","_keyStr","encode","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","isNaN","charAt","decode","replace","indexOf","prototype","getContent","getCompressedContent","module","STORE","magic","compress","content","uncompress","compressInputType","uncompressInputType","DEFLATE","require","table","crc","isArray","x","y","b","iTop","checkOffset","offset","checkIndex","newIndex","Error","setIndex","skip","n","byteAt","readInt","size","readString","transformTo","readData","lastIndexOfSignature","readDate","dostime","Date","base64","binary","dir","createFolders","date","compression","compressionOptions","unixPermissions","dosPermissions","string2Uint8Array","uint8Array2String","string2Blob","buffer","arrayBuffer2Blob","outputType","checkSupport","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","findCompression","isRegExp","object","USE_TYPEDARRAY","Uint16Array","Uint32Array","pako","deflateRaw","level","inflateRaw","support","defaults","compressions","zipEntries","file","fileName","decompressed","fileComment","zipComment","encoding","Buffer","test","isBuffer","signature","utf8","StringWriter","Uint8ArrayWriter","getRawData","_data","copy","set","getBinaryData","nodebuffer","asBinary","dataToString","asUTF8","out","utf8decode","utf8encode","ZipObject","name","_initialMetadata","asText","call","asNodeBuffer","asUint8Array","asArrayBuffer","decToHex","dec","bytes","hex","extend","attr","arguments","hasOwnProperty","prepareFileAttrs","o","undefined","toUpperCase","fileAdd","parent","dataType","parseInt","forceTrailingSlash","parentFolder","folderAdd","path","substring","lastSlash","lastIndexOf","generateCompressedObjectFrom","generateUnixExternalFileAttr","isDir","generateDosExternalFileAttr","generateZipParts","compressedObject","platform","dosTime","dosDate","utfEncodedFileName","utfEncodedComment","useUTF8ForFileName","useUTF8ForComment","extraFields","unicodePathExtraField","unicodeCommentExtraField","extFileAttr","versionMadeBy","getHours","getMinutes","getSeconds","getFullYear","getMonth","getDate","header","fileRecord","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","filter","search","filename","relativePath","fileClone","regexp","folder","arg","newFolder","ret","remove","kids","generate","mimeType","writer","zipData","localDirLength","centralDirLength","compressionName","zipPart","dirEnd","CENTRAL_DIRECTORY_END","typeName","toLowerCase","append","zip","finalize","string","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","DATA_DESCRIPTOR","sig","arraybuffer","ArrayBuffer","uint8array","blob","Blob","Builder","window","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","builder","getBlob","sig0","sig1","sig2","sig3","_utf8len","Array","string2buf","buf","c","c2","m_pos","str_len","buf_len","utf8border","max","pos","buf2string","c_len","utf16buf","applyFromCharCode","toString","nextBoundary","transform","byteLength","inputType","Object","supported","code","res","method","jszipProto","checkSignature","expectedSignature","reader","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","versionNeeded","zip64ExtensibleData","extraFieldId","extraFieldLength","extraFieldValue","extraDataSize","id","value","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","processAttributes","readCentralDir","zip64","readCentralPart","readEndOfCentral","isGarbage","prepareReader","MADE_BY_DOS","MADE_BY_UNIX","isEncrypted","bitFlag","useUTF8","prepareCompressedContent","from","previousIndex","compressedFileData","prepareContent","uncompressedFileData","localExtraFieldsLength","fileNameLength","checkCRC32","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","madeBy","extraReader","start","upath","findExtraFieldUnicodePath","ucomment","findExtraFieldUnicodeComment","upathField","ucommentField"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/epubjs/build/reader.js b/src/assets/epubjs/build/reader.js deleted file mode 100644 index 2562413..0000000 --- a/src/assets/epubjs/build/reader.js +++ /dev/null @@ -1,1146 +0,0 @@ -EPUBJS.reader = {}; -EPUBJS.reader.plugins = {}; //-- Attach extra Controllers as plugins (like search?) - -(function(root, $) { - - var previousReader = root.ePubReader || {}; - - var ePubReader = root.ePubReader = function(path, options) { - return new EPUBJS.Reader(path, options); - }; - - //exports to multiple environments - if (typeof define === 'function' && define.amd) { - //AMD - define(function(){ return Reader; }); - } else if (typeof module != "undefined" && module.exports) { - //Node - module.exports = ePubReader; - } - -})(window, jQuery); - -EPUBJS.Reader = function(bookPath, _options) { - var reader = this; - var book; - var plugin; - var $viewer = $("#viewer"); - var search = window.location.search; - var parameters; - - this.settings = EPUBJS.core.defaults(_options || {}, { - bookPath : bookPath, - restore : false, - reload : false, - bookmarks : undefined, - annotations : undefined, - contained : undefined, - bookKey : undefined, - styles : undefined, - sidebarReflow: false, - generatePagination: false, - history: true - }); - - // Overide options with search parameters - if(search) { - parameters = search.slice(1).split("&"); - parameters.forEach(function(p){ - var split = p.split("="); - var name = split[0]; - var value = split[1] || ''; - reader.settings[name] = decodeURIComponent(value); - }); - } - - this.setBookKey(this.settings.bookPath); //-- This could be username + path or any unique string - - if(this.settings.restore && this.isSaved()) { - this.applySavedSettings(); - } - - this.settings.styles = this.settings.styles || { - fontSize : "100%" - }; - - this.book = book = new EPUBJS.Book(this.settings); - - if(this.settings.previousLocationCfi) { - book.gotoCfi(this.settings.previousLocationCfi); - } - - this.offline = false; - this.sidebarOpen = false; - if(!this.settings.bookmarks) { - this.settings.bookmarks = []; - } - - if(!this.settings.annotations) { - this.settings.annotations = []; - } - - if(this.settings.generatePagination) { - book.generatePagination($viewer.width(), $viewer.height()); - } - - book.renderTo("viewer"); - - reader.ReaderController = EPUBJS.reader.ReaderController.call(reader, book); - reader.SettingsController = EPUBJS.reader.SettingsController.call(reader, book); - reader.ControlsController = EPUBJS.reader.ControlsController.call(reader, book); - reader.SidebarController = EPUBJS.reader.SidebarController.call(reader, book); - reader.BookmarksController = EPUBJS.reader.BookmarksController.call(reader, book); - reader.NotesController = EPUBJS.reader.NotesController.call(reader, book); - - // Call Plugins - for(plugin in EPUBJS.reader.plugins) { - if(EPUBJS.reader.plugins.hasOwnProperty(plugin)) { - reader[plugin] = EPUBJS.reader.plugins[plugin].call(reader, book); - } - } - - book.ready.all.then(function() { - reader.ReaderController.hideLoader(); - }); - - book.getMetadata().then(function(meta) { - reader.MetaController = EPUBJS.reader.MetaController.call(reader, meta); - }); - - book.getToc().then(function(toc) { - reader.TocController = EPUBJS.reader.TocController.call(reader, toc); - }); - - window.addEventListener("beforeunload", this.unload.bind(this), false); - - window.addEventListener("hashchange", this.hashChanged.bind(this), false); - - document.addEventListener('keydown', this.adjustFontSize.bind(this), false); - - book.on("renderer:keydown", this.adjustFontSize.bind(this)); - book.on("renderer:keydown", reader.ReaderController.arrowKeys.bind(this)); - - book.on("renderer:selected", this.selectedRange.bind(this)); - - return this; -}; - -EPUBJS.Reader.prototype.adjustFontSize = function(e) { - var fontSize; - var interval = 2; - var PLUS = 187; - var MINUS = 189; - var ZERO = 48; - var MOD = (e.ctrlKey || e.metaKey ); - - if(!this.settings.styles) return; - - if(!this.settings.styles.fontSize) { - this.settings.styles.fontSize = "100%"; - } - - fontSize = parseInt(this.settings.styles.fontSize.slice(0, -1)); - - if(MOD && e.keyCode == PLUS) { - e.preventDefault(); - this.book.setStyle("fontSize", (fontSize + interval) + "%"); - - } - - if(MOD && e.keyCode == MINUS){ - - e.preventDefault(); - this.book.setStyle("fontSize", (fontSize - interval) + "%"); - } - - if(MOD && e.keyCode == ZERO){ - e.preventDefault(); - this.book.setStyle("fontSize", "100%"); - } -}; - -EPUBJS.Reader.prototype.addBookmark = function(cfi) { - var present = this.isBookmarked(cfi); - if(present > -1 ) return; - - this.settings.bookmarks.push(cfi); - - this.trigger("reader:bookmarked", cfi); -}; - -EPUBJS.Reader.prototype.removeBookmark = function(cfi) { - var bookmark = this.isBookmarked(cfi); - if( bookmark === -1 ) return; - - this.settings.bookmarks.splice(bookmark, 1); - - this.trigger("reader:unbookmarked", bookmark); -}; - -EPUBJS.Reader.prototype.isBookmarked = function(cfi) { - var bookmarks = this.settings.bookmarks; - - return bookmarks.indexOf(cfi); -}; - -/* -EPUBJS.Reader.prototype.searchBookmarked = function(cfi) { - var bookmarks = this.settings.bookmarks, - len = bookmarks.length, - i; - - for(i = 0; i < len; i++) { - if (bookmarks[i]['cfi'] === cfi) return i; - } - return -1; -}; -*/ - -EPUBJS.Reader.prototype.clearBookmarks = function() { - this.settings.bookmarks = []; -}; - -//-- Notes -EPUBJS.Reader.prototype.addNote = function(note) { - this.settings.annotations.push(note); -}; - -EPUBJS.Reader.prototype.removeNote = function(note) { - var index = this.settings.annotations.indexOf(note); - if( index === -1 ) return; - - delete this.settings.annotations[index]; - -}; - -EPUBJS.Reader.prototype.clearNotes = function() { - this.settings.annotations = []; -}; - -//-- Settings -EPUBJS.Reader.prototype.setBookKey = function(identifier){ - if(!this.settings.bookKey) { - this.settings.bookKey = "epubjsreader:" + EPUBJS.VERSION + ":" + window.location.host + ":" + identifier; - } - return this.settings.bookKey; -}; - -//-- Checks if the book setting can be retrieved from localStorage -EPUBJS.Reader.prototype.isSaved = function(bookPath) { - var storedSettings; - - if(!localStorage) { - return false; - } - - storedSettings = localStorage.getItem(this.settings.bookKey); - - if(storedSettings === null) { - return false; - } else { - return true; - } -}; - -EPUBJS.Reader.prototype.removeSavedSettings = function() { - if(!localStorage) { - return false; - } - - localStorage.removeItem(this.settings.bookKey); -}; - -EPUBJS.Reader.prototype.applySavedSettings = function() { - var stored; - - if(!localStorage) { - return false; - } - - try { - stored = JSON.parse(localStorage.getItem(this.settings.bookKey)); - } catch (e) { // parsing error of localStorage - return false; - } - - if(stored) { - // Merge styles - if(stored.styles) { - this.settings.styles = EPUBJS.core.defaults(this.settings.styles || {}, stored.styles); - } - // Merge the rest - this.settings = EPUBJS.core.defaults(this.settings, stored); - return true; - } else { - return false; - } -}; - -EPUBJS.Reader.prototype.saveSettings = function(){ - if(this.book) { - this.settings.previousLocationCfi = this.book.getCurrentLocationCfi(); - } - - if(!localStorage) { - return false; - } - - localStorage.setItem(this.settings.bookKey, JSON.stringify(this.settings)); -}; - -EPUBJS.Reader.prototype.unload = function(){ - if(this.settings.restore && localStorage) { - this.saveSettings(); - } -}; - - -EPUBJS.Reader.prototype.hashChanged = function(){ - var hash = window.location.hash.slice(1); - this.book.goto(hash); -}; - -EPUBJS.Reader.prototype.selectedRange = function(range){ - var epubcfi = new EPUBJS.EpubCFI(); - var cfi = epubcfi.generateCfiFromRangeAnchor(range, this.book.renderer.currentChapter.cfiBase); - var cfiFragment = "#"+cfi; - - // Update the History Location - if(this.settings.history && - window.location.hash != cfiFragment) { - // Add CFI fragment to the history - history.pushState({}, '', cfiFragment); - this.currentLocationCfi = cfi; - } -}; - -//-- Enable binding events to reader -RSVP.EventTarget.mixin(EPUBJS.Reader.prototype); -EPUBJS.reader.BookmarksController = function() { - var reader = this; - var book = this.book; - - var $bookmarks = $("#bookmarksView"), - $list = $bookmarks.find("#bookmarks"); - - var docfrag = document.createDocumentFragment(); - - var show = function() { - $bookmarks.show(); - }; - - var hide = function() { - $bookmarks.hide(); - }; - - var counter = 0; - - var createBookmarkItem = function(cfi) { - var listitem = document.createElement("li"), - link = document.createElement("a"); - - listitem.id = "bookmark-"+counter; - listitem.classList.add('list_item'); - - //-- TODO: Parse Cfi - link.textContent = cfi; - link.href = cfi; - - link.classList.add('bookmark_link'); - - link.addEventListener("click", function(event){ - var cfi = this.getAttribute('href'); - book.gotoCfi(cfi); - event.preventDefault(); - }, false); - - listitem.appendChild(link); - - counter++; - - return listitem; - }; - - this.settings.bookmarks.forEach(function(cfi) { - var bookmark = createBookmarkItem(cfi); - docfrag.appendChild(bookmark); - }); - - $list.append(docfrag); - - this.on("reader:bookmarked", function(cfi) { - var item = createBookmarkItem(cfi); - $list.append(item); - }); - - this.on("reader:unbookmarked", function(index) { - var $item = $("#bookmark-"+index); - $item.remove(); - }); - - return { - "show" : show, - "hide" : hide - }; -}; -EPUBJS.reader.ControlsController = function(book) { - var reader = this; - - var $store = $("#store"), - $fullscreen = $("#fullscreen"), - $fullscreenicon = $("#fullscreenicon"), - $cancelfullscreenicon = $("#cancelfullscreenicon"), - $slider = $("#slider"), - $main = $("#main"), - $sidebar = $("#sidebar"), - $settings = $("#setting"), - $bookmark = $("#bookmark"); - - var goOnline = function() { - reader.offline = false; - // $store.attr("src", $icon.data("save")); - }; - - var goOffline = function() { - reader.offline = true; - // $store.attr("src", $icon.data("saved")); - }; - - var fullscreen = false; - - book.on("book:online", goOnline); - book.on("book:offline", goOffline); - - $slider.on("click", function () { - if(reader.sidebarOpen) { - reader.SidebarController.hide(); - $slider.addClass("icon-menu"); - $slider.removeClass("icon-right"); - } else { - reader.SidebarController.show(); - $slider.addClass("icon-right"); - $slider.removeClass("icon-menu"); - } - }); - - if(typeof screenfull !== 'undefined') { - $fullscreen.on("click", function() { - screenfull.toggle($('#container')[0]); - }); - if(screenfull.raw) { - document.addEventListener(screenfull.raw.fullscreenchange, function() { - fullscreen = screenfull.isFullscreen; - if(fullscreen) { - $fullscreen - .addClass("icon-resize-small") - .removeClass("icon-resize-full"); - } else { - $fullscreen - .addClass("icon-resize-full") - .removeClass("icon-resize-small"); - } - }); - } - } - - $settings.on("click", function() { - reader.SettingsController.show(); - }); - - $bookmark.on("click", function() { - var cfi = reader.book.getCurrentLocationCfi(); - var bookmarked = reader.isBookmarked(cfi); - - if(bookmarked === -1) { //-- Add bookmark - reader.addBookmark(cfi); - $bookmark - .addClass("icon-bookmark") - .removeClass("icon-bookmark-empty"); - } else { //-- Remove Bookmark - reader.removeBookmark(cfi); - $bookmark - .removeClass("icon-bookmark") - .addClass("icon-bookmark-empty"); - } - - }); - - book.on('renderer:locationChanged', function(cfi){ - var cfiFragment = "#" + cfi; - //-- Check if bookmarked - var bookmarked = reader.isBookmarked(cfi); - if(bookmarked === -1) { //-- Not bookmarked - $bookmark - .removeClass("icon-bookmark") - .addClass("icon-bookmark-empty"); - } else { //-- Bookmarked - $bookmark - .addClass("icon-bookmark") - .removeClass("icon-bookmark-empty"); - } - - reader.currentLocationCfi = cfi; - - // Update the History Location - if(reader.settings.history && - window.location.hash != cfiFragment) { - // Add CFI fragment to the history - history.pushState({}, '', cfiFragment); - } - }); - - book.on('book:pageChanged', function(location){ - // console.log("page", location.page, location.percentage) - }); - - return { - - }; -}; - -EPUBJS.reader.MetaController = function(meta) { - var title = meta.bookTitle, - author = meta.creator; - - var $title = $("#book-title"), - $author = $("#chapter-title"), - $dash = $("#title-seperator"); - - document.title = title+" – "+author; - - $title.html(title); - $author.html(author); - $dash.show(); -}; -EPUBJS.reader.NotesController = function() { - var book = this.book; - var reader = this; - var $notesView = $("#notesView"); - var $notes = $("#notes"); - var $text = $("#note-text"); - var $anchor = $("#note-anchor"); - var annotations = reader.settings.annotations; - var renderer = book.renderer; - var popups = []; - var epubcfi = new EPUBJS.EpubCFI(); - - var show = function() { - $notesView.show(); - }; - - var hide = function() { - $notesView.hide(); - } - - var insertAtPoint = function(e) { - var range; - var textNode; - var offset; - var doc = book.renderer.doc; - var cfi; - var annotation; - - // standard - if (doc.caretPositionFromPoint) { - range = doc.caretPositionFromPoint(e.clientX, e.clientY); - textNode = range.offsetNode; - offset = range.offset; - // WebKit - } else if (doc.caretRangeFromPoint) { - range = doc.caretRangeFromPoint(e.clientX, e.clientY); - textNode = range.startContainer; - offset = range.startOffset; - } - - if (textNode.nodeType !== 3) { - for (var i=0; i < textNode.childNodes.length; i++) { - if (textNode.childNodes[i].nodeType == 3) { - textNode = textNode.childNodes[i]; - break; - } - } - } - - // Find the end of the sentance - offset = textNode.textContent.indexOf(".", offset); - if(offset === -1){ - offset = textNode.length; // Last item - } else { - offset += 1; // After the period - } - - cfi = epubcfi.generateCfiFromTextNode(textNode, offset, book.renderer.currentChapter.cfiBase); - - annotation = { - annotatedAt: new Date(), - anchor: cfi, - body: $text.val() - } - - // add to list - reader.addNote(annotation); - - // attach - addAnnotation(annotation); - placeMarker(annotation); - - // clear - $text.val(''); - $anchor.text("Attach"); - $text.prop("disabled", false); - - book.off("renderer:click", insertAtPoint); - - }; - - var addAnnotation = function(annotation){ - var note = document.createElement("li"); - var link = document.createElement("a"); - - note.innerHTML = annotation.body; - // note.setAttribute("ref", annotation.anchor); - link.innerHTML = " context »"; - link.href = "#"+annotation.anchor; - link.onclick = function(){ - book.gotoCfi(annotation.anchor); - return false; - }; - - note.appendChild(link); - $notes.append(note); - - }; - - var placeMarker = function(annotation){ - var doc = book.renderer.doc; - var marker = document.createElement("span"); - var mark = document.createElement("a"); - marker.classList.add("footnotesuperscript", "reader_generated"); - - marker.style.verticalAlign = "super"; - marker.style.fontSize = ".75em"; - // marker.style.position = "relative"; - marker.style.lineHeight = "1em"; - - // mark.style.display = "inline-block"; - mark.style.padding = "2px"; - mark.style.backgroundColor = "#fffa96"; - mark.style.borderRadius = "5px"; - mark.style.cursor = "pointer"; - - marker.id = "note-"+EPUBJS.core.uuid(); - mark.innerHTML = annotations.indexOf(annotation) + 1 + "[Reader]"; - - marker.appendChild(mark); - epubcfi.addMarker(annotation.anchor, doc, marker); - - markerEvents(marker, annotation.body); - } - - var markerEvents = function(item, txt){ - var id = item.id; - - var showPop = function(){ - var poppos, - iheight = renderer.height, - iwidth = renderer.width, - tip, - pop, - maxHeight = 225, - itemRect, - left, - top, - pos; - - - //-- create a popup with endnote inside of it - if(!popups[id]) { - popups[id] = document.createElement("div"); - popups[id].setAttribute("class", "popup"); - - pop_content = document.createElement("div"); - - popups[id].appendChild(pop_content); - - pop_content.innerHTML = txt; - pop_content.setAttribute("class", "pop_content"); - - renderer.render.document.body.appendChild(popups[id]); - - //-- TODO: will these leak memory? - Fred - popups[id].addEventListener("mouseover", onPop, false); - popups[id].addEventListener("mouseout", offPop, false); - - //-- Add hide on page change - renderer.on("renderer:locationChanged", hidePop, this); - renderer.on("renderer:locationChanged", offPop, this); - // chapter.book.on("renderer:chapterDestroy", hidePop, this); - } - - pop = popups[id]; - - - //-- get location of item - itemRect = item.getBoundingClientRect(); - left = itemRect.left; - top = itemRect.top; - - //-- show the popup - pop.classList.add("show"); - - //-- locations of popup - popRect = pop.getBoundingClientRect(); - - //-- position the popup - pop.style.left = left - popRect.width / 2 + "px"; - pop.style.top = top + "px"; - - - //-- Adjust max height - if(maxHeight > iheight / 2.5) { - maxHeight = iheight / 2.5; - pop_content.style.maxHeight = maxHeight + "px"; - } - - //-- switch above / below - if(popRect.height + top >= iheight - 25) { - pop.style.top = top - popRect.height + "px"; - pop.classList.add("above"); - }else{ - pop.classList.remove("above"); - } - - //-- switch left - if(left - popRect.width <= 0) { - pop.style.left = left + "px"; - pop.classList.add("left"); - }else{ - pop.classList.remove("left"); - } - - //-- switch right - if(left + popRect.width / 2 >= iwidth) { - //-- TEMP MOVE: 300 - pop.style.left = left - 300 + "px"; - - popRect = pop.getBoundingClientRect(); - pop.style.left = left - popRect.width + "px"; - //-- switch above / below again - if(popRect.height + top >= iheight - 25) { - pop.style.top = top - popRect.height + "px"; - pop.classList.add("above"); - }else{ - pop.classList.remove("above"); - } - - pop.classList.add("right"); - }else{ - pop.classList.remove("right"); - } - - } - - var onPop = function(){ - popups[id].classList.add("on"); - } - - var offPop = function(){ - popups[id].classList.remove("on"); - } - - var hidePop = function(){ - setTimeout(function(){ - popups[id].classList.remove("show"); - }, 100); - } - - var openSidebar = function(){ - reader.ReaderController.slideOut(); - show(); - }; - - item.addEventListener("mouseover", showPop, false); - item.addEventListener("mouseout", hidePop, false); - item.addEventListener("click", openSidebar, false); - - } - $anchor.on("click", function(e){ - - $anchor.text("Cancel"); - $text.prop("disabled", "true"); - // listen for selection - book.on("renderer:click", insertAtPoint); - - }); - - annotations.forEach(function(note) { - addAnnotation(note); - }); - - - renderer.registerHook("beforeChapterDisplay", function(callback, renderer){ - var chapter = renderer.currentChapter; - annotations.forEach(function(note) { - var cfi = epubcfi.parse(note.anchor); - if(cfi.spinePos === chapter.spinePos) { - try { - placeMarker(note); - } catch(e) { - console.log("anchoring failed", note.anchor); - } - } - }); - callback(); - }, true); - - - return { - "show" : show, - "hide" : hide - }; -}; -EPUBJS.reader.ReaderController = function(book) { - var $main = $("#main"), - $divider = $("#divider"), - $loader = $("#loader"), - $next = $("#next"), - $prev = $("#prev"); - var reader = this; - var book = this.book; - var slideIn = function() { - var currentPosition = book.getCurrentLocationCfi(); - if (reader.settings.sidebarReflow){ - $main.removeClass('single'); - $main.one("transitionend", function(){ - book.gotoCfi(currentPosition); - }); - } else { - $main.removeClass("closed"); - } - }; - - var slideOut = function() { - var currentPosition = book.getCurrentLocationCfi(); - if (reader.settings.sidebarReflow){ - $main.addClass('single'); - $main.one("transitionend", function(){ - book.gotoCfi(currentPosition); - }); - } else { - $main.addClass("closed"); - } - }; - - var showLoader = function() { - $loader.show(); - hideDivider(); - }; - - var hideLoader = function() { - $loader.hide(); - - //-- If the book is using spreads, show the divider - // if(book.settings.spreads) { - // showDivider(); - // } - }; - - var showDivider = function() { - $divider.addClass("show"); - }; - - var hideDivider = function() { - $divider.removeClass("show"); - }; - - var keylock = false; - - var arrowKeys = function(e) { - if(e.keyCode == 37) { - - if(book.metadata.direction === "rtl") { - book.nextPage(); - } else { - book.prevPage(); - } - - $prev.addClass("active"); - - keylock = true; - setTimeout(function(){ - keylock = false; - $prev.removeClass("active"); - }, 100); - - e.preventDefault(); - } - if(e.keyCode == 39) { - - if(book.metadata.direction === "rtl") { - book.prevPage(); - } else { - book.nextPage(); - } - - $next.addClass("active"); - - keylock = true; - setTimeout(function(){ - keylock = false; - $next.removeClass("active"); - }, 100); - - e.preventDefault(); - } - } - - document.addEventListener('keydown', arrowKeys, false); - - $next.on("click", function(e){ - - if(book.metadata.direction === "rtl") { - book.prevPage(); - } else { - book.nextPage(); - } - - e.preventDefault(); - }); - - $prev.on("click", function(e){ - - if(book.metadata.direction === "rtl") { - book.nextPage(); - } else { - book.prevPage(); - } - - e.preventDefault(); - }); - - book.on("renderer:spreads", function(bool){ - if(bool) { - showDivider(); - } else { - hideDivider(); - } - }); - - // book.on("book:atStart", function(){ - // $prev.addClass("disabled"); - // }); - // - // book.on("book:atEnd", function(){ - // $next.addClass("disabled"); - // }); - - return { - "slideOut" : slideOut, - "slideIn" : slideIn, - "showLoader" : showLoader, - "hideLoader" : hideLoader, - "showDivider" : showDivider, - "hideDivider" : hideDivider, - "arrowKeys" : arrowKeys - }; -}; -EPUBJS.reader.SettingsController = function() { - var book = this.book; - var reader = this; - var $settings = $("#settings-modal"), - $overlay = $(".overlay"); - - var show = function() { - $settings.addClass("md-show"); - }; - - var hide = function() { - $settings.removeClass("md-show"); - }; - - var $sidebarReflowSetting = $('#sidebarReflow'); - - $sidebarReflowSetting.on('click', function() { - reader.settings.sidebarReflow = !reader.settings.sidebarReflow; - }); - - $settings.find(".closer").on("click", function() { - hide(); - }); - - $overlay.on("click", function() { - hide(); - }); - - return { - "show" : show, - "hide" : hide - }; -}; -EPUBJS.reader.SidebarController = function(book) { - var reader = this; - - var $sidebar = $("#sidebar"), - $panels = $("#panels"); - - var activePanel = "Toc"; - - var changePanelTo = function(viewName) { - var controllerName = viewName + "Controller"; - - if(activePanel == viewName || typeof reader[controllerName] === 'undefined' ) return; - reader[activePanel+ "Controller"].hide(); - reader[controllerName].show(); - activePanel = viewName; - - $panels.find('.active').removeClass("active"); - $panels.find("#show-" + viewName ).addClass("active"); - }; - - var getActivePanel = function() { - return activePanel; - }; - - var show = function() { - reader.sidebarOpen = true; - reader.ReaderController.slideOut(); - $sidebar.addClass("open"); - } - - var hide = function() { - reader.sidebarOpen = false; - reader.ReaderController.slideIn(); - $sidebar.removeClass("open"); - } - - $panels.find(".show_view").on("click", function(event) { - var view = $(this).data("view"); - - changePanelTo(view); - event.preventDefault(); - }); - - return { - 'show' : show, - 'hide' : hide, - 'getActivePanel' : getActivePanel, - 'changePanelTo' : changePanelTo - }; -}; -EPUBJS.reader.TocController = function(toc) { - var book = this.book; - - var $list = $("#tocView"), - docfrag = document.createDocumentFragment(); - - var currentChapter = false; - - var generateTocItems = function(toc, level) { - var container = document.createElement("ul"); - - if(!level) level = 1; - - toc.forEach(function(chapter) { - var listitem = document.createElement("li"), - link = document.createElement("a"); - toggle = document.createElement("a"); - - var subitems; - - listitem.id = "toc-"+chapter.id; - listitem.classList.add('list_item'); - - link.textContent = chapter.label; - link.href = chapter.href; - - link.classList.add('toc_link'); - - listitem.appendChild(link); - - if(chapter.subitems.length > 0) { - level++; - subitems = generateTocItems(chapter.subitems, level); - toggle.classList.add('toc_toggle'); - - listitem.insertBefore(toggle, link); - listitem.appendChild(subitems); - } - - - container.appendChild(listitem); - - }); - - return container; - }; - - var onShow = function() { - $list.show(); - }; - - var onHide = function() { - $list.hide(); - }; - - var chapterChange = function(e) { - var id = e.id, - $item = $list.find("#toc-"+id), - $current = $list.find(".currentChapter"), - $open = $list.find('.openChapter'); - - if($item.length){ - - if($item != $current && $item.has(currentChapter).length > 0) { - $current.removeClass("currentChapter"); - } - - $item.addClass("currentChapter"); - - // $open.removeClass("openChapter"); - $item.parents('li').addClass("openChapter"); - } - }; - - book.on('renderer:chapterDisplayed', chapterChange); - - var tocitems = generateTocItems(toc); - - docfrag.appendChild(tocitems); - - $list.append(docfrag); - $list.find(".toc_link").on("click", function(event){ - var url = this.getAttribute('href'); - - event.preventDefault(); - - //-- Provide the Book with the url to show - // The Url must be found in the books manifest - book.goto(url); - - $list.find(".currentChapter") - .addClass("openChapter") - .removeClass("currentChapter"); - - $(this).parent('li').addClass("currentChapter"); - - }); - - $list.find(".toc_toggle").on("click", function(event){ - var $el = $(this).parent('li'), - open = $el.hasClass("openChapter"); - - event.preventDefault(); - if(open){ - $el.removeClass("openChapter"); - } else { - $el.addClass("openChapter"); - } - }); - - return { - "show" : onShow, - "hide" : onHide - }; -}; - -//# sourceMappingURL=reader.js.map \ No newline at end of file diff --git a/src/assets/epubjs/build/reader.js.map b/src/assets/epubjs/build/reader.js.map deleted file mode 100644 index c233345..0000000 --- a/src/assets/epubjs/build/reader.js.map +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 3, - "file": "reader.js", - "sources": [ - "reader_src/reader.js", - "reader_src/controllers/bookmarks_controller.js", - "reader_src/controllers/controls_controller.js", - "reader_src/controllers/meta_controller.js", - "reader_src/controllers/notes_controller.js", - "reader_src/controllers/reader_controller.js", - "reader_src/controllers/settings_controller.js", - "reader_src/controllers/sidebar_controller.js", - "reader_src/controllers/toc_controller.js" - ], - "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gD;AC7TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A", - "sourceRoot": "../", - "sourcesContent": [ - null, - null, - null, - null, - null, - null, - null, - null, - null - ] -} \ No newline at end of file diff --git a/src/assets/epubjs/build/reader.min.js b/src/assets/epubjs/build/reader.min.js deleted file mode 100644 index 72ffc5f..0000000 --- a/src/assets/epubjs/build/reader.min.js +++ /dev/null @@ -1 +0,0 @@ -EPUBJS.reader={},EPUBJS.reader.plugins={},function(a,b){var c=(a.ePubReader,a.ePubReader=function(a,b){return new EPUBJS.Reader(a,b)});"function"==typeof define&&define.amd?define(function(){return Reader}):"undefined"!=typeof module&&module.exports&&(module.exports=c)}(window,jQuery),EPUBJS.Reader=function(a,b){var c,d,e,f=this,g=$("#viewer"),h=window.location.search;this.settings=EPUBJS.core.defaults(b||{},{bookPath:a,restore:!1,reload:!1,bookmarks:void 0,annotations:void 0,contained:void 0,bookKey:void 0,styles:void 0,sidebarReflow:!1,generatePagination:!1,history:!0}),h&&(e=h.slice(1).split("&"),e.forEach(function(a){var b=a.split("="),c=b[0],d=b[1]||"";f.settings[c]=decodeURIComponent(d)})),this.setBookKey(this.settings.bookPath),this.settings.restore&&this.isSaved()&&this.applySavedSettings(),this.settings.styles=this.settings.styles||{fontSize:"100%"},this.book=c=new EPUBJS.Book(this.settings),this.settings.previousLocationCfi&&c.gotoCfi(this.settings.previousLocationCfi),this.offline=!1,this.sidebarOpen=!1,this.settings.bookmarks||(this.settings.bookmarks=[]),this.settings.annotations||(this.settings.annotations=[]),this.settings.generatePagination&&c.generatePagination(g.width(),g.height()),c.renderTo("viewer"),f.ReaderController=EPUBJS.reader.ReaderController.call(f,c),f.SettingsController=EPUBJS.reader.SettingsController.call(f,c),f.ControlsController=EPUBJS.reader.ControlsController.call(f,c),f.SidebarController=EPUBJS.reader.SidebarController.call(f,c),f.BookmarksController=EPUBJS.reader.BookmarksController.call(f,c),f.NotesController=EPUBJS.reader.NotesController.call(f,c);for(d in EPUBJS.reader.plugins)EPUBJS.reader.plugins.hasOwnProperty(d)&&(f[d]=EPUBJS.reader.plugins[d].call(f,c));return c.ready.all.then(function(){f.ReaderController.hideLoader()}),c.getMetadata().then(function(a){f.MetaController=EPUBJS.reader.MetaController.call(f,a)}),c.getToc().then(function(a){f.TocController=EPUBJS.reader.TocController.call(f,a)}),window.addEventListener("beforeunload",this.unload.bind(this),!1),window.addEventListener("hashchange",this.hashChanged.bind(this),!1),document.addEventListener("keydown",this.adjustFontSize.bind(this),!1),c.on("renderer:keydown",this.adjustFontSize.bind(this)),c.on("renderer:keydown",f.ReaderController.arrowKeys.bind(this)),c.on("renderer:selected",this.selectedRange.bind(this)),this},EPUBJS.Reader.prototype.adjustFontSize=function(a){var b,c=2,d=a.ctrlKey||a.metaKey;this.settings.styles&&(this.settings.styles.fontSize||(this.settings.styles.fontSize="100%"),b=parseInt(this.settings.styles.fontSize.slice(0,-1)),d&&187==a.keyCode&&(a.preventDefault(),this.book.setStyle("fontSize",b+c+"%")),d&&189==a.keyCode&&(a.preventDefault(),this.book.setStyle("fontSize",b-c+"%")),d&&48==a.keyCode&&(a.preventDefault(),this.book.setStyle("fontSize","100%")))},EPUBJS.Reader.prototype.addBookmark=function(a){this.isBookmarked(a)>-1||(this.settings.bookmarks.push(a),this.trigger("reader:bookmarked",a))},EPUBJS.Reader.prototype.removeBookmark=function(a){var b=this.isBookmarked(a);b!==-1&&(this.settings.bookmarks.splice(b,1),this.trigger("reader:unbookmarked",b))},EPUBJS.Reader.prototype.isBookmarked=function(a){return this.settings.bookmarks.indexOf(a)},EPUBJS.Reader.prototype.clearBookmarks=function(){this.settings.bookmarks=[]},EPUBJS.Reader.prototype.addNote=function(a){this.settings.annotations.push(a)},EPUBJS.Reader.prototype.removeNote=function(a){var b=this.settings.annotations.indexOf(a);b!==-1&&delete this.settings.annotations[b]},EPUBJS.Reader.prototype.clearNotes=function(){this.settings.annotations=[]},EPUBJS.Reader.prototype.setBookKey=function(a){return this.settings.bookKey||(this.settings.bookKey="epubjsreader:"+EPUBJS.VERSION+":"+window.location.host+":"+a),this.settings.bookKey},EPUBJS.Reader.prototype.isSaved=function(a){return!!localStorage&&null!==localStorage.getItem(this.settings.bookKey)},EPUBJS.Reader.prototype.removeSavedSettings=function(){if(!localStorage)return!1;localStorage.removeItem(this.settings.bookKey)},EPUBJS.Reader.prototype.applySavedSettings=function(){var a;if(!localStorage)return!1;try{a=JSON.parse(localStorage.getItem(this.settings.bookKey))}catch(a){return!1}return!!a&&(a.styles&&(this.settings.styles=EPUBJS.core.defaults(this.settings.styles||{},a.styles)),this.settings=EPUBJS.core.defaults(this.settings,a),!0)},EPUBJS.Reader.prototype.saveSettings=function(){if(this.book&&(this.settings.previousLocationCfi=this.book.getCurrentLocationCfi()),!localStorage)return!1;localStorage.setItem(this.settings.bookKey,JSON.stringify(this.settings))},EPUBJS.Reader.prototype.unload=function(){this.settings.restore&&localStorage&&this.saveSettings()},EPUBJS.Reader.prototype.hashChanged=function(){var a=window.location.hash.slice(1);this.book.goto(a)},EPUBJS.Reader.prototype.selectedRange=function(a){var b=new EPUBJS.EpubCFI,c=b.generateCfiFromRangeAnchor(a,this.book.renderer.currentChapter.cfiBase),d="#"+c;this.settings.history&&window.location.hash!=d&&(history.pushState({},"",d),this.currentLocationCfi=c)},RSVP.EventTarget.mixin(EPUBJS.Reader.prototype),EPUBJS.reader.BookmarksController=function(){var a=this.book,b=$("#bookmarksView"),c=b.find("#bookmarks"),d=document.createDocumentFragment(),e=function(){b.show()},f=function(){b.hide()},g=0,h=function(b){var c=document.createElement("li"),d=document.createElement("a");return c.id="bookmark-"+g,c.classList.add("list_item"),d.textContent=b,d.href=b,d.classList.add("bookmark_link"),d.addEventListener("click",function(b){var c=this.getAttribute("href");a.gotoCfi(c),b.preventDefault()},!1),c.appendChild(d),g++,c};return this.settings.bookmarks.forEach(function(a){var b=h(a);d.appendChild(b)}),c.append(d),this.on("reader:bookmarked",function(a){var b=h(a);c.append(b)}),this.on("reader:unbookmarked",function(a){$("#bookmark-"+a).remove()}),{show:e,hide:f}},EPUBJS.reader.ControlsController=function(a){var b=this,c=($("#store"),$("#fullscreen")),d=($("#fullscreenicon"),$("#cancelfullscreenicon"),$("#slider")),e=($("#main"),$("#sidebar"),$("#setting")),f=$("#bookmark"),g=function(){b.offline=!1},h=function(){b.offline=!0},i=!1;return a.on("book:online",g),a.on("book:offline",h),d.on("click",function(){b.sidebarOpen?(b.SidebarController.hide(),d.addClass("icon-menu"),d.removeClass("icon-right")):(b.SidebarController.show(),d.addClass("icon-right"),d.removeClass("icon-menu"))}),"undefined"!=typeof screenfull&&(c.on("click",function(){screenfull.toggle($("#container")[0])}),screenfull.raw&&document.addEventListener(screenfull.raw.fullscreenchange,function(){i=screenfull.isFullscreen,i?c.addClass("icon-resize-small").removeClass("icon-resize-full"):c.addClass("icon-resize-full").removeClass("icon-resize-small")})),e.on("click",function(){b.SettingsController.show()}),f.on("click",function(){var a=b.book.getCurrentLocationCfi();b.isBookmarked(a)===-1?(b.addBookmark(a),f.addClass("icon-bookmark").removeClass("icon-bookmark-empty")):(b.removeBookmark(a),f.removeClass("icon-bookmark").addClass("icon-bookmark-empty"))}),a.on("renderer:locationChanged",function(a){var c="#"+a;b.isBookmarked(a)===-1?f.removeClass("icon-bookmark").addClass("icon-bookmark-empty"):f.addClass("icon-bookmark").removeClass("icon-bookmark-empty"),b.currentLocationCfi=a,b.settings.history&&window.location.hash!=c&&history.pushState({},"",c)}),a.on("book:pageChanged",function(a){}),{}},EPUBJS.reader.MetaController=function(a){var b=a.bookTitle,c=a.creator,d=$("#book-title"),e=$("#chapter-title"),f=$("#title-seperator");document.title=b+" – "+c,d.html(b),e.html(c),f.show()},EPUBJS.reader.NotesController=function(){var a=this.book,b=this,c=$("#notesView"),d=$("#notes"),e=$("#note-text"),f=$("#note-anchor"),g=b.settings.annotations,h=a.renderer,i=[],j=new EPUBJS.EpubCFI,k=function(){c.show()},l=function(){c.hide()},m=function(c){var d,g,h,i,k,l=a.renderer.doc;if(l.caretPositionFromPoint?(d=l.caretPositionFromPoint(c.clientX,c.clientY),g=d.offsetNode,h=d.offset):l.caretRangeFromPoint&&(d=l.caretRangeFromPoint(c.clientX,c.clientY),g=d.startContainer,h=d.startOffset),3!==g.nodeType)for(var p=0;pm/2.5&&(o=m/2.5,pop_content.style.maxHeight=o+"px"),popRect.height+l>=m-25?(b.style.top=l-popRect.height+"px",b.classList.add("above")):b.classList.remove("above"),k-popRect.width<=0?(b.style.left=k+"px",b.classList.add("left")):b.classList.remove("left"),k+popRect.width/2>=n?(b.style.left=k-300+"px",popRect=b.getBoundingClientRect(),b.style.left=k-popRect.width+"px",popRect.height+l>=m-25?(b.style.top=l-popRect.height+"px",b.classList.add("above")):b.classList.remove("above"),b.classList.add("right")):b.classList.remove("right")},f=function(){i[d].classList.add("on")},g=function(){i[d].classList.remove("on")},j=function(){setTimeout(function(){i[d].classList.remove("show")},100)},l=function(){b.ReaderController.slideOut(),k()};a.addEventListener("mouseover",e,!1),a.addEventListener("mouseout",j,!1),a.addEventListener("click",l,!1)};return f.on("click",function(b){f.text("Cancel"),e.prop("disabled","true"),a.on("renderer:click",m)}),g.forEach(function(a){n(a)}),h.registerHook("beforeChapterDisplay",function(a,b){var c=b.currentChapter;g.forEach(function(a){if(j.parse(a.anchor).spinePos===c.spinePos)try{o(a)}catch(b){console.log("anchoring failed",a.anchor)}}),a()},!0),{show:k,hide:l}},EPUBJS.reader.ReaderController=function(a){var b=$("#main"),c=$("#divider"),d=$("#loader"),e=$("#next"),f=$("#prev"),g=this,a=this.book,h=function(){var c=a.getCurrentLocationCfi();g.settings.sidebarReflow?(b.removeClass("single"),b.one("transitionend",function(){a.gotoCfi(c)})):b.removeClass("closed")},i=function(){var c=a.getCurrentLocationCfi();g.settings.sidebarReflow?(b.addClass("single"),b.one("transitionend",function(){a.gotoCfi(c)})):b.addClass("closed")},j=function(){d.show(),m()},k=function(){d.hide()},l=function(){c.addClass("show")},m=function(){c.removeClass("show")},n=!1,o=function(b){37==b.keyCode&&("rtl"===a.metadata.direction?a.nextPage():a.prevPage(),f.addClass("active"),n=!0,setTimeout(function(){n=!1,f.removeClass("active")},100),b.preventDefault()),39==b.keyCode&&("rtl"===a.metadata.direction?a.prevPage():a.nextPage(),e.addClass("active"),n=!0,setTimeout(function(){n=!1,e.removeClass("active")},100),b.preventDefault())};return document.addEventListener("keydown",o,!1),e.on("click",function(b){"rtl"===a.metadata.direction?a.prevPage():a.nextPage(),b.preventDefault()}),f.on("click",function(b){"rtl"===a.metadata.direction?a.nextPage():a.prevPage(),b.preventDefault()}),a.on("renderer:spreads",function(a){a?l():m()}),{slideOut:i,slideIn:h,showLoader:j,hideLoader:k,showDivider:l,hideDivider:m,arrowKeys:o}},EPUBJS.reader.SettingsController=function(){var a=(this.book,this),b=$("#settings-modal"),c=$(".overlay"),d=function(){b.addClass("md-show")},e=function(){b.removeClass("md-show")};return $("#sidebarReflow").on("click",function(){a.settings.sidebarReflow=!a.settings.sidebarReflow}),b.find(".closer").on("click",function(){e()}),c.on("click",function(){e()}),{show:d,hide:e}},EPUBJS.reader.SidebarController=function(a){var b=this,c=$("#sidebar"),d=$("#panels"),e="Toc",f=function(a){var c=a+"Controller";e!=a&&void 0!==b[c]&&(b[e+"Controller"].hide(),b[c].show(),e=a,d.find(".active").removeClass("active"),d.find("#show-"+a).addClass("active"))},g=function(){return e},h=function(){b.sidebarOpen=!0,b.ReaderController.slideOut(),c.addClass("open")},i=function(){b.sidebarOpen=!1,b.ReaderController.slideIn(),c.removeClass("open")};return d.find(".show_view").on("click",function(a){f($(this).data("view")),a.preventDefault()}),{show:h,hide:i,getActivePanel:g,changePanelTo:f}},EPUBJS.reader.TocController=function(a){var b=this.book,c=$("#tocView"),d=document.createDocumentFragment(),e=!1,f=function(a,b){var c=document.createElement("ul");return b||(b=1),a.forEach(function(a){var d=document.createElement("li"),e=document.createElement("a");toggle=document.createElement("a");var g;d.id="toc-"+a.id,d.classList.add("list_item"),e.textContent=a.label,e.href=a.href,e.classList.add("toc_link"),d.appendChild(e),a.subitems.length>0&&(b++,g=f(a.subitems,b),toggle.classList.add("toc_toggle"),d.insertBefore(toggle,e),d.appendChild(g)),c.appendChild(d)}),c},g=function(){c.show()},h=function(){c.hide()},i=function(a){var b=a.id,d=c.find("#toc-"+b),f=c.find(".currentChapter");c.find(".openChapter");d.length&&(d!=f&&d.has(e).length>0&&f.removeClass("currentChapter"),d.addClass("currentChapter"),d.parents("li").addClass("openChapter"))};b.on("renderer:chapterDisplayed",i);var j=f(a);return d.appendChild(j),c.append(d),c.find(".toc_link").on("click",function(a){var d=this.getAttribute("href");a.preventDefault(),b.goto(d),c.find(".currentChapter").addClass("openChapter").removeClass("currentChapter"),$(this).parent("li").addClass("currentChapter")}),c.find(".toc_toggle").on("click",function(a){var b=$(this).parent("li"),c=b.hasClass("openChapter");a.preventDefault(),c?b.removeClass("openChapter"):b.addClass("openChapter")}),{show:g,hide:h}}; \ No newline at end of file diff --git a/src/assets/epubjs/build/reader.min.map b/src/assets/epubjs/build/reader.min.map deleted file mode 100644 index 269e310..0000000 --- a/src/assets/epubjs/build/reader.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reader.min.js","sources":["../reader_src/reader.js","../reader_src/controllers/bookmarks_controller.js","../reader_src/controllers/controls_controller.js","../reader_src/controllers/meta_controller.js","../reader_src/controllers/notes_controller.js","../reader_src/controllers/reader_controller.js","../reader_src/controllers/settings_controller.js","../reader_src/controllers/sidebar_controller.js","../reader_src/controllers/toc_controller.js"],"names":["EPUBJS","reader","plugins","root","ePubReader","path","options","Reader","define","amd","module","exports","window","jQuery","bookPath","_options","book","plugin","parameters","this","$viewer","$","search","location","settings","core","defaults","restore","reload","bookmarks","undefined","annotations","contained","bookKey","styles","sidebarReflow","generatePagination","history","slice","split","forEach","p","name","value","decodeURIComponent","setBookKey","isSaved","applySavedSettings","fontSize","Book","previousLocationCfi","gotoCfi","offline","sidebarOpen","width","height","renderTo","ReaderController","call","SettingsController","ControlsController","SidebarController","BookmarksController","NotesController","hasOwnProperty","ready","all","then","hideLoader","getMetadata","meta","MetaController","getToc","toc","TocController","addEventListener","unload","bind","hashChanged","document","adjustFontSize","on","arrowKeys","selectedRange","prototype","e","interval","PLUS","MINUS","ZERO","MOD","ctrlKey","metaKey","parseInt","keyCode","preventDefault","setStyle","addBookmark","cfi","present","isBookmarked","push","trigger","removeBookmark","bookmark","splice","indexOf","clearBookmarks","addNote","note","removeNote","index","clearNotes","identifier","VERSION","host","storedSettings","localStorage","getItem","removeSavedSettings","removeItem","stored","JSON","parse","saveSettings","getCurrentLocationCfi","setItem","stringify","hash","goto","range","epubcfi","EpubCFI","generateCfiFromRangeAnchor","renderer","currentChapter","cfiBase","cfiFragment","pushState","currentLocationCfi","RSVP","EventTarget","mixin","$bookmarks","$list","find","docfrag","createDocumentFragment","show","hide","counter","createBookmarkItem","listitem","createElement","link","id","classList","add","textContent","href","event","getAttribute","appendChild","append","item","$item","remove","$fullscreen","$slider","$settings","$bookmark","goOnline","goOffline","fullscreen","addClass","removeClass","screenfull","toggle","raw","fullscreenchange","isFullscreen","bookmarked","title","bookTitle","author","creator","$title","$author","$dash","html","$notesView","$notes","$text","$anchor","popups","insertAtPoint","textNode","offset","annotation","doc","caretPositionFromPoint","clientX","clientY","offsetNode","caretRangeFromPoint","startContainer","startOffset","nodeType","i","childNodes","length","generateCfiFromTextNode","annotatedAt","Date","anchor","body","val","addAnnotation","placeMarker","text","prop","off","innerHTML","onclick","marker","mark","style","verticalAlign","lineHeight","padding","backgroundColor","borderRadius","cursor","uuid","addMarker","markerEvents","txt","showPop","pop","itemRect","left","top","iheight","iwidth","maxHeight","setAttribute","pop_content","render","onPop","offPop","hidePop","getBoundingClientRect","popRect","setTimeout","openSidebar","slideOut","registerHook","callback","chapter","spinePos","console","log","$main","$divider","$loader","$next","$prev","slideIn","currentPosition","one","showLoader","hideDivider","showDivider","keylock","metadata","direction","nextPage","prevPage","bool","$overlay","$sidebarReflowSetting","$sidebar","$panels","activePanel","changePanelTo","viewName","controllerName","getActivePanel","view","data","generateTocItems","level","container","subitems","label","insertBefore","onShow","onHide","chapterChange","$current","has","parents","tocitems","url","parent","$el","open","hasClass"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/epubjs/epub.min.js b/src/assets/epubjs/epub.min.js new file mode 100644 index 0000000..68051d4 --- /dev/null +++ b/src/assets/epubjs/epub.min.js @@ -0,0 +1 @@ +(function(e,t){'object'==typeof exports&&'object'==typeof module?module.exports=t(require('xmldom'),function(){try{return require('jszip')}catch(t){}}()):'function'==typeof define&&define.amd?define(['xmldom','jszip'],t):'object'==typeof exports?exports.ePub=t(require('xmldom'),function(){try{return require('jszip')}catch(t){}}()):e.ePub=t(e.xmldom,e.jszip)})(this,function(e,t){var n=String.prototype,a=Math.ceil,i=Math.round,o=Math.max,s=Math.floor;return function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var n=e&&e.__esModule?function(){return e['default']}:function(){return e};return t.d(n,'a',n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p='/dist/',t(t.s=25)}([function(e,t,n){'use strict';function a(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')}function i(){var e=new Date().getTime(),t='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(t){var n=0|(e+16*Math.random())%16;return e=s(e/16),('x'==t?n:8|7&n).toString(16)});return t}function r(e){return!isNaN(parseFloat(e))&&isFinite(e)}function l(e,t,n,a,i){var o=a||0,s=i||t.length,r=parseInt(o+(s-o)/2),d;return(n||(n=function(e,t){return e>t?1:e=s-o)?r:(d=n(t[r],e),1==s-o?0<=d?r:r+1:0===d?r:-1===d?l(e,t,n,r,s):l(e,t,n,o,r))}function d(e,t,n,a,i){var o=a||0,s=i||t.length,r=parseInt(o+(s-o)/2),l;return(n||(n=function(e,t){return e>t?1:e=s-o)?-1:(l=n(t[r],e),1==s-o?0===l?r:-1:0===l?r:-1===l?d(e,t,n,r,s):d(e,t,n,o,r))}function u(e,t){for(var n=e.parentNode,a=n.childNodes,o=-1,s=0,i;sn.spinePos)return 1;if(t.spinePoso[d].index)return 1;if(a[d].indexr.offset?1:s.offset')}},{key:'textNodes',value:function(e,t){return Array.prototype.slice.call(e.childNodes).filter(function(e){return e.nodeType===l||t&&e.classList.contains(t)})}},{key:'walkToNode',value:function(e,t,n){var a=t||document,o=a.documentElement,r=e.length,l,d,u;for(u=0;uc)t-=c;else{i=u.nodeType===r?u.childNodes[0]:u;break}}return{container:i,offset:t}}},{key:'toRange',value:function(e,t){var n=e||document,a=this,i=!!t&&null!=n.querySelector('.'+t),o,r,l,d,u,c,p,h;if(o='undefined'==typeof n.createRange?new s.RangeObject:n.createRange(),a.range?(r=a.start,c=a.path.steps.concat(r.steps),d=this.findNode(c,n,i?t:null),l=a.end,p=a.path.steps.concat(l.steps),u=this.findNode(p,n,i?t:null)):(r=a.path,c=a.path.steps,d=this.findNode(a.path.steps,n,i?t:null)),d)try{null==r.terminal.offset?o.setStart(d,0):o.setStart(d,r.terminal.offset)}catch(a){h=this.fixMiss(c,r.terminal.offset,n,i?t:null),o.setStart(h.container,h.offset)}else return console.log('No startContainer found for',this.toString()),null;if(u)try{null==l.terminal.offset?o.setEnd(u,0):o.setEnd(u,l.terminal.offset)}catch(s){h=this.fixMiss(p,a.end.terminal.offset,n,i?t:null),o.setEnd(h.container,h.offset)}return o}},{key:'isCfiString',value:function(e){return'string'==typeof e&&0===e.indexOf('epubcfi(')&&')'===e[e.length-1]}},{key:'generateChapterComponent',value:function(e,t,n){var a=parseInt(t),i='/'+2*(e+1)+'/';return i+=2*(a+1),n&&(i+='['+n+']'),i}},{key:'collapse',value:function(e){this.range&&(this.range=!1,e?(this.path.steps=this.path.steps.concat(this.start.steps),this.path.terminal=this.start.terminal):(this.path.steps=this.path.steps.concat(this.end.steps),this.path.terminal=this.end.terminal))}}]),e}();t.default=d,e.exports=t['default']},function(e,t,n){'use strict';var a=n(27),o=n(41),s=Function.prototype.apply,r=Function.prototype.call,i=Object.create,l=Object.defineProperty,d=Object.defineProperties,u=Object.prototype.hasOwnProperty,c={configurable:!0,enumerable:!1,writable:!0},p,h,g,f,m,y,v;p=function(e,t){var n;return o(t),u.call(this,'__ee__')?n=this.__ee__:(n=c.value=i(null),l(this,'__ee__',c),c.value=null),n[e]?'object'==typeof n[e]?n[e].push(t):n[e]=[n[e],t]:n[e]=t,this},h=function(e,t){var n,a;return o(t),a=this,p.call(this,e,n=function(){g.call(a,e,n),s.call(t,this,arguments)}),n.__eeOnceListener__=t,this},g=function(e,t){var n,a,s,r;if(o(t),!u.call(this,'__ee__'))return this;if(n=this.__ee__,!n[e])return this;if(a=n[e],'object'==typeof a)for(r=0;s=a[r];++r)(s===t||s.__eeOnceListener__===t)&&(2===a.length?n[e]=a[r?0:1]:a.splice(r,1));else(a===t||a.__eeOnceListener__===t)&&delete n[e];return this},f=function(e){var t,n,a,i,o;if(u.call(this,'__ee__')&&(i=this.__ee__[e],!!i))if('object'==typeof i){for(n=arguments.length,o=Array(n-1),t=1;tn.length||46!==n.charCodeAt(n.length-1)||46!==n.charCodeAt(n.length-2))if(2c){if(47===n.charCodeAt(l+h))return n.slice(l+h+1);if(0==h)return n.slice(l+h)}else r>c&&(47===e.charCodeAt(a+h)?p=h:0==h&&(p=0));break}var i=e.charCodeAt(a+h),g=n.charCodeAt(l+h);if(i!==g)break;else 47===i&&(p=h)}var f='';for(h=a+p+1;h<=o;++h)(h===o||47===e.charCodeAt(h))&&(f+=0===f.length?'..':'/..');return 0=s;--c){if(a=e.charCodeAt(c),47===a){if(!u){l=c+1;break}continue}-1==d&&(u=!1,d=c+1),46===a?-1==r?r=c:1!=i&&(i=1):-1!=r&&(i=-1)}return-1==r||-1==d||0==i||1==i&&r==d-1&&r==l+1?-1!=d&&(0==l&&o?n.base=n.name=e.slice(1,d):n.base=n.name=e.slice(l,d)):(0==l&&o?(n.name=e.slice(1,r),n.base=e.slice(1,d)):(n.name=e.slice(l,r),n.base=e.slice(l,d)),n.ext=e.slice(r,d)),0this.container.scrollWidth&&(t=this.container.scrollWidth-this.layout.delta)):n=e.top,this.scrollTo(t,n,!0)}},{key:'add',value:function(e){var t=this,n=this.createView(e);return this.views.append(n),n.onDisplayed=this.afterDisplayed.bind(this),n.onResize=this.afterResized.bind(this),n.on(b.EVENTS.VIEWS.AXIS,function(e){t.updateAxis(e)}),n.display(this.request)}},{key:'append',value:function(e){var t=this,n=this.createView(e);return this.views.append(n),n.onDisplayed=this.afterDisplayed.bind(this),n.onResize=this.afterResized.bind(this),n.on(b.EVENTS.VIEWS.AXIS,function(e){t.updateAxis(e)}),n.display(this.request)}},{key:'prepend',value:function(e){var t=this,n=this.createView(e);return n.on(b.EVENTS.VIEWS.RESIZED,function(e){t.counter(e)}),this.views.prepend(n),n.onDisplayed=this.afterDisplayed.bind(this),n.onResize=this.afterResized.bind(this),n.on(b.EVENTS.VIEWS.AXIS,function(e){t.updateAxis(e)}),n.display(this.request)}},{key:'counter',value:function(e){'vertical'===this.settings.axis?this.scrollBy(0,e.heightDelta,!0):this.scrollBy(e.widthDelta,0,!0)}},{key:'next',value:function(){var e=this.settings.direction,t,n;if(this.views.length){if(this.isPaginated&&'horizontal'===this.settings.axis&&(!e||'ltr'===e))this.scrollLeft=this.container.scrollLeft,n=this.container.scrollLeft+this.container.offsetWidth+this.layout.delta,n<=this.container.scrollWidth?this.scrollBy(this.layout.delta,0,!0):t=this.views.last().section.next();else if(this.isPaginated&&'horizontal'===this.settings.axis&&'rtl'===e)this.scrollLeft=this.container.scrollLeft,n=this.container.scrollLeft,0p&&(g=p,r=g-h);var f=e.layout.count(p,o).pages,m=a(h/o),y=[],v=a(g/o);y=[];for(var b=m,i;b<=v;b++)i=b+1,y.push(i);var k=e.mapping.page(t.contents,t.section.cfiBase,h,g);return{index:d,href:u,pages:y,totalPages:f,mapping:k}});return i}},{key:'paginatedLocation',value:function(){var e=this,t=this.visible(),n=this.container.getBoundingClientRect(),a=0,o=0;this.fullsize&&(a=window.scrollX);var i=t.map(function(t){var r=t.section,l=r.index,d=r.href,u=t.offset().left,c=t.position().left,p=t.width(),h=a+n.left-c+o,g=h+e.layout.width-o,f=e.mapping.page(t.contents,t.section.cfiBase,h,g),m=e.layout.count(p).pages,y=s(h/e.layout.pageWidth),v=[],b=s(g/e.layout.pageWidth);if(0>y&&(y=0,++b),'rtl'===e.settings.direction){var k=y;y=m-b,b=m-k}for(var x=y+1,i;x<=b;x++)i=x,v.push(i);return{index:l,href:d,pages:v,totalPages:m,mapping:f}});return i}},{key:'isVisible',value:function(e,t,n,a){var i=e.position(),o=a||this.bounds();return'horizontal'===this.settings.axis&&i.right>o.left-t&&i.lefto.top-t&&i.top=a.end.displayed.total&&(a.atEnd=!0),t.index===this.book.spine.first().index&&1===a.start.displayed.page&&(a.atStart=!0),a}},{key:'destroy',value:function(){this.manager&&this.manager.destroy(),this.book=void 0}},{key:'passEvents',value:function(t){var n=this,e=x.default.listenedEvents;e.forEach(function(a){t.on(a,function(e){return n.triggerViewEvent(e,t)})}),t.on(w.EVENTS.CONTENTS.SELECTED,function(a){return n.triggerSelectedEvent(a,t)})}},{key:'triggerViewEvent',value:function(t,e){this.emit(t.type,t,e)}},{key:'triggerSelectedEvent',value:function(e,t){this.emit(w.EVENTS.RENDITION.SELECTED,e,t)}},{key:'triggerMarkEvent',value:function(e,t,n){this.emit(w.EVENTS.RENDITION.MARK_CLICKED,e,t,n)}},{key:'getRange',value:function(e,t){var n=new h.default(e),a=this.manager.visible().filter(function(e){if(n.spinePos===e.index)return!0});if(a.length)return a[0].contents.range(n,t)}},{key:'adjustImages',value:function(e){return'pre-paginated'===this._layout.name?new Promise(function(e){e()}):(e.addStylesheetRules({img:{"max-width":(this._layout.columnWidth?this._layout.columnWidth+'px':'100%')+'!important',"max-height":(this._layout.height?0.6*this._layout.height+'px':'60%')+'!important',"object-fit":'contain',"page-break-inside":'avoid'},svg:{"max-width":(this._layout.columnWidth?this._layout.columnWidth+'px':'100%')+'!important',"max-height":(this._layout.height?0.6*this._layout.height+'px':'60%')+'!important',"page-break-inside":'avoid'}}),new Promise(function(e){setTimeout(function(){e()},1)}))}},{key:'getContents',value:function(){return this.manager?this.manager.getContents():[]}},{key:'views',value:function(){var e=this.manager?this.manager.views:void 0;return e||[]}},{key:'handleLinks',value:function(e){var t=this;e&&e.on(w.EVENTS.CONTENTS.LINK_CLICKED,function(e){var n=t.book.path.relative(e);t.display(n)})}},{key:'injectStylesheet',value:function(e){var t=e.createElement('link');t.setAttribute('type','text/css'),t.setAttribute('rel','stylesheet'),t.setAttribute('href',this.settings.stylesheet),e.getElementsByTagName('head')[0].appendChild(t)}},{key:'injectScript',value:function(e){var t=e.createElement('script');t.setAttribute('type','text/javascript'),t.setAttribute('src',this.settings.script),t.textContent=' ',e.getElementsByTagName('head')[0].appendChild(t)}},{key:'injectIdentifier',value:function(e){var t=this.book.package.metadata.identifier,n=e.createElement('meta');n.setAttribute('name','dc.relation.ispartof'),t&&n.setAttribute('content',t),e.getElementsByTagName('head')[0].appendChild(n)}}]),e}();(0,l.default)(P.prototype),t.default=P,e.exports=t['default']},function(e,t,n){'use strict';function o(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(){function e(e,t){for(var n=0,a;n=t&&s<=n)return e;if(r>t)return e;o=e,i.push(e)}else if(a.horizontal&&'rtl'===a.direction){if(s=u.left,r=u.right,r<=n&&r>=t)return e;if(s=t&&l<=n)return e;if(d>t)return e;o=e,i.push(e)}}),r)return this.findTextStartRange(r,t,n);return this.findTextStartRange(o,t,n)}},{key:'findEnd',value:function(e,t,n){for(var a=this,o=[e],s=e,r,l;o.length;)if(r=o.shift(),l=this.walk(r,function(e){var r,l,d,u,c;if(c=a.getBounds(e),a.horizontal&&'ltr'===a.direction){if(r=i(c.left),l=i(c.right),r>n&&s)return s;if(l>n)return e;s=e,o.push(e)}else if(a.horizontal&&'rtl'===a.direction){if(r=i(a.horizontal?c.left:c.top),l=i(a.horizontal?c.right:c.bottom),ln&&s)return s;if(u>n)return e;s=e,o.push(e)}}),l)return this.findTextEndRange(l,t,n);return this.findTextEndRange(s,t,n)}},{key:'findTextStartRange',value:function(e,t,n){for(var a=this.splitTextNodeIntoRanges(e),o=0,i,s,r,l,d;o=t)return i;}else if(this.horizontal&&'rtl'===this.direction){if(d=s.right,d<=n)return i;}else if(l=s.top,l>=t)return i;return a[0]}},{key:'findTextEndRange',value:function(e,t,n){for(var a=this.splitTextNodeIntoRanges(e),o=0,i,s,r,l,d,u,c;on&&i)return i;if(d>n)return s}else if(this.horizontal&&'rtl'===this.direction){if(l=r.left,d=r.right,dn&&i)return i;if(c>n)return s}i=s}return a[a.length-1]}},{key:'splitTextNodeIntoRanges',value:function(e,t){var n=[],a=e.textContent||'',i=a.trim(),o=e.ownerDocument,s=t||' ',r=i.indexOf(s),l;if(-1===r||e.nodeType!=Node.TEXT_NODE)return l=o.createRange(),l.selectNodeContents(e),[l];for(l=o.createRange(),l.setStart(e,0),l.setEnd(e,r),n.push(l),l=!1;-1!=r;)r=i.indexOf(s,r+1),0=t||0>n||y&&a>=x}function p(){var e=i();return c(e)?h(e):void(_=setTimeout(p,u(e)))}function h(e){return(_=void 0,v&&b)?l(e):(b=k=void 0,E)}function g(){var e=i(),n=c(e);if(b=arguments,k=this,w=e,n){if(void 0===_)return d(w);if(y)return _=setTimeout(p,t),l(w)}return void 0===_&&(_=setTimeout(p,t)),E}var f=0,m=!1,y=!1,v=!0,b,k,x,E,_,w;if('function'!=typeof e)throw new TypeError('Expected a function');return t=s(t)||0,a(n)&&(m=!!n.leading,y='maxWait'in n,x=y?o(s(n.maxWait)||0,t):x,v='trailing'in n?!!n.trailing:v),g.cancel=function(){void 0!==_&&clearTimeout(_),f=0,b=w=k=_=void 0},g.flush=function(){return void 0===_?E:h(i())},g}},function(e,t,n){var a=n(59),i='object'==typeof self&&self&&self.Object===Object&&self,o=a||i||Function('return this')();e.exports=o},function(e,t,n){var a=n(22),i=a.Symbol;e.exports=i},function(e,t,n){'use strict';function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')}function o(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)?t:e}function r(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)}Object.defineProperty(t,'__esModule',{value:!0});var l=function(){function e(e,t){for(var n=0,a;n=h&&(o&&l?g():f()),0>c-s&&(o&&l?f():g());var m=i.map(function(e){return e.displayed});return i.length?Promise.all(m).then(function(){if('pre-paginated'===n.layout.name&&n.layout.props.spread)return n.check()}).then(function(){return n.update(s)},function(e){return e}):(this.q.enqueue(function(){this.update()}.bind(this)),a.resolve(!1),a.promise)}},{key:'trim',value:function(){for(var e=new d.defer,t=this.views.displayed(),n=t[0],a=t[t.length-1],o=this.views.indexOf(n),s=this.views.indexOf(a),r=this.views.slice(0,o),l=this.views.slice(s+1),u=0;uarguments.length||'string'!=typeof t?(d=n,n=t,t=null):d=arguments[2],null==t?(o=l=!0,r=!1):(o=s.call(t,'c'),r=s.call(t,'e'),l=s.call(t,'w')),u={value:n,configurable:o,enumerable:r,writable:l},d?a(i(d),u):u},r.gs=function(t,n,r){var l,d,u,p;return'string'==typeof t?u=arguments[3]:(u=r,r=n,n=t,t=null),null==n?n=void 0:o(n)?null==r?r=void 0:!o(r)&&(u=r,r=void 0):(u=n,n=r=void 0),null==t?(l=!0,d=!1):(l=s.call(t,'c'),d=s.call(t,'e')),p={get:n,set:r,configurable:l,enumerable:d},u?a(i(u),p):p}},function(e,t,n){'use strict';e.exports=n(29)()?Object.assign:n(30)},function(e){'use strict';e.exports=function(){var e=Object.assign,t;return!('function'!=typeof e)&&(t={foo:'raz'},e(t,{bar:'dwa'},{trzy:'trzy'}),'razdwatrzy'===t.foo+t.bar+t.trzy)}},function(e,t,n){'use strict';var a=n(31),s=n(35);e.exports=function(e,t){var n=o(arguments.length,2),r,l,i;for(e=Object(s(e)),i=function(n){try{e[n]=t[n]}catch(t){r||(r=t)}},l=1;ln&&(s+=n,i=n);i=n)s+=n-i,i=n;else{i+=o,d.endContainer=e,d.endOffset=i;var r=new c.default(d,t).toString();a.push(r),s=0}u=e}.bind(this)),d&&d.startContainer&&u){d.endContainer=u,d.endOffset=u.length;var p=new c.default(d,t).toString();a.push(p),s=0}return a}},{key:'locationFromCfi',value:function(e){var t;return(c.default.prototype.isCfiString(e)&&(e=new c.default(e)),0===this._locations.length)?-1:(t=(0,r.locationOf)(e,this._locations,this.epubcfi.compare),t>this.total?this.total:t)}},{key:'percentageFromCfi',value:function(e){if(0===this._locations.length)return null;var t=this.locationFromCfi(e);return this.percentageFromLocation(t)}},{key:'percentageFromLocation',value:function(e){return e&&this.total?e/this.total:0}},{key:'cfiFromLocation',value:function(e){var t=-1;return'number'!=typeof e&&(e=parseInt(e)),0<=e&&e=this._minSpreadWidth?2:1,'reflowable'!==this.name||'paginated'!==this._flow||0<=n||(i=0==l%2?l:l-1),'pre-paginated'===this.name&&(i=0),1=e.left&&t.top>=e.top&&t.bottom<=e.bottom}var u='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&'function'==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?'symbol':typeof e};Object.defineProperty(t,'__esModule',{value:!0}),t.Underline=t.Highlight=t.Mark=t.Pane=void 0;var c=function e(t,n,a){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,n);if(i===void 0){var o=Object.getPrototypeOf(t);return null===o?void 0:e(o,n,a)}if('value'in i)return i.value;var s=i.get;return void 0===s?void 0:s.call(a)},p=function(){function e(e,t){for(var n=0,a;nn&&r>t}var s=t.getBoundingClientRect(),r=e.getBoundingClientRect();if(!o(r,n,a))return!1;for(var l=e.getClientRects(),d=0,i=l.length;dt&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function s(e){var t=e.charCodeAt(0);return 32t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function i(e,r,l){function d(e){x.push(e)}var m=r||'scheme start',y=0,v='',b=!1,k=!1,x=[];loop:for(;(e[y-1]!=f||0==y)&&!this._isInvalid;){var E=e[y];switch(m){case'scheme start':if(E&&h.test(E))v+=E.toLowerCase(),m='scheme';else if(!r){v='',m='no scheme';continue}else{d('Invalid scheme.');break loop}break;case'scheme':if(E&&g.test(E))v+=E.toLowerCase();else if(':'==E){if(this._scheme=v,v='',r)break loop;t(this._scheme)&&(this._isRelative=!0),m='file'==this._scheme?'relative':this._isRelative&&l&&l._scheme==this._scheme?'relative or authority':this._isRelative?'authority first slash':'scheme data'}else if(!r){v='',y=0,m='no scheme';continue}else if(f==E)break loop;else{d('Code point not allowed in scheme: '+E);break loop}break;case'scheme data':'?'==E?(this._query='?',m='query'):'#'==E?(this._fragment='#',m='fragment'):f!=E&&'\t'!=E&&'\n'!=E&&'\r'!=E&&(this._schemeData+=o(E));break;case'no scheme':if(!l||!t(l._scheme))d('Missing scheme.'),n.call(this);else{m='relative';continue}break;case'relative or authority':if('/'==E&&'/'==e[y+1])m='authority ignore slashes';else{d('Expected /, got: '+E),m='relative';continue}break;case'relative':if(this._isRelative=!0,'file'!=this._scheme&&(this._scheme=l._scheme),f==E){this._host=l._host,this._port=l._port,this._path=l._path.slice(),this._query=l._query,this._username=l._username,this._password=l._password;break loop}else if('/'==E||'\\'==E)'\\'==E&&d('\\ is an invalid code point.'),m='relative slash';else if('?'==E)this._host=l._host,this._port=l._port,this._path=l._path.slice(),this._query='?',this._username=l._username,this._password=l._password,m='query';else if('#'==E)this._host=l._host,this._port=l._port,this._path=l._path.slice(),this._query=l._query,this._fragment='#',this._username=l._username,this._password=l._password,m='fragment';else{var c=e[y+1],_=e[y+2];'file'==this._scheme&&h.test(E)&&(':'==c||'|'==c)&&(f==_||'/'==_||'\\'==_||'?'==_||'#'==_)||(this._host=l._host,this._port=l._port,this._username=l._username,this._password=l._password,this._path=l._path.slice(),this._path.pop()),m='relative path';continue}break;case'relative slash':if('/'==E||'\\'==E)'\\'==E&&d('\\ is an invalid code point.'),m='file'==this._scheme?'file host':'authority ignore slashes';else{'file'!=this._scheme&&(this._host=l._host,this._port=l._port,this._username=l._username,this._password=l._password),m='relative path';continue}break;case'authority first slash':if('/'==E)m='authority second slash';else{d('Expected \'/\', got: '+E),m='authority ignore slashes';continue}break;case'authority second slash':if(m='authority ignore slashes','/'!=E){d('Expected \'/\', got: '+E);continue}break;case'authority ignore slashes':if('/'!=E&&'\\'!=E){m='authority';continue}else d('Expected authority, got: '+E);break;case'authority':if('@'==E){b&&(d('@ already seen.'),v+='%40'),b=!0;for(var w=0,i;w - - + + + diff --git a/src/pages/book/book.html b/src/pages/book/book.html index 9282e18..6a7aec3 100644 --- a/src/pages/book/book.html +++ b/src/pages/book/book.html @@ -6,7 +6,7 @@ - {{pageTitle}} + {{ pageTitle }} - Page {{currentPage}} {{(book && book.pagination && book.pagination.totalPages) ? ' of ' + book.pagination.totalPages : ''}} + {{ currentPage }} + - + - + - + diff --git a/src/pages/settings/settings.ts b/src/pages/settings/settings.ts index a6d5ea6..7224aa5 100644 --- a/src/pages/settings/settings.ts +++ b/src/pages/settings/settings.ts @@ -7,62 +7,31 @@ import { NavController, NavParams, Events } from 'ionic-angular'; }) export class SettingsPage { - backgroundColor: string; + theme: string; fontSize: any; fontFamily: any; - colors = { // TODO Don't send color codes back to the book page, make it set classes - 'white': { - 'bg': 'rgb(255, 255, 255)', - 'fg': 'rgb(0, 0, 0)' - }, - 'tan': { - 'bg': 'rgb(249, 241, 228)', - 'fg': 'rgb(0, 0, 0)' - }, - 'grey': { - 'bg': 'rgb(76, 75, 80)', - 'fg': 'rgb(255, 255, 255)' - }, - 'black': { - 'bg': 'rgb(0, 0, 0)', - 'fg': 'rgb(255, 255, 255)' - }, - }; - constructor( public navCtrl: NavController, public navParams: NavParams, public events: Events ) { if (this.navParams.data) { - let backgroundColor = this.navParams.data.backgroundColor; - this.backgroundColor = this._getColorName(backgroundColor); + this.theme = this.navParams.data.theme; this.fontSize = this.navParams.data.fontSize; + if (this.navParams.data.fontFamily) { this.fontFamily = this.navParams.data.fontFamily.replace(/'/g, ""); // TODO Huh? } else { - //TODO get the default font-family - } - } - } - - _getColorName(color) { - if (!color) return 'white'; - let colorName = 'white'; - for (var key in this.colors) { - if (this.colors[key].bg == color) { - colorName = key; + this.fontFamily = "Athelas" } } - return colorName; } - changeBackground(backgroundColor) { - this.backgroundColor = backgroundColor; - this.events.publish('select:background-color', this.colors[backgroundColor].bg); - this.events.publish('select:color', this.colors[backgroundColor].fg); + changeBackground(theme) { + this.theme = theme; + this.events.publish('select:theme', theme); } changeFontSize(direction) { diff --git a/src/pages/toc/toc.html b/src/pages/toc/toc.html index 3e6fb96..c1cc877 100644 --- a/src/pages/toc/toc.html +++ b/src/pages/toc/toc.html @@ -1,5 +1,5 @@ - + {{chapter.label}} diff --git a/src/pages/toc/toc.scss b/src/pages/toc/toc.scss index d5ff69b..bd457ae 100644 --- a/src/pages/toc/toc.scss +++ b/src/pages/toc/toc.scss @@ -2,4 +2,7 @@ page-toc { .toc { font-size: smaller !important; } + .selected { + background: yellow; + } } diff --git a/src/pages/toc/toc.ts b/src/pages/toc/toc.ts index 9bf7713..20ace3b 100644 --- a/src/pages/toc/toc.ts +++ b/src/pages/toc/toc.ts @@ -6,9 +6,12 @@ import { NavController, NavParams, Events } from 'ionic-angular'; templateUrl: 'toc.html', }) export class TocPage { - private toc: any; + toc: any; + currentSection: any; + constructor(public navCtrl: NavController, public navParams: NavParams, public events : Events) { this.toc = navParams.data.toc; + this.currentSection = navParams.data.currentSection; } selectToc(content){