{"version":3,"sources":["localforage.js","angular-localForage.js","localForage-ssatbDriver.js","localForage-ssatbHttpProvider.js","ssatb.authtokenrefresh.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","localforage","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","nextTick","draining","oldQueue","len","queue","immediate","task","push","scheduleDrain","Mutation","MutationObserver","WebKitMutationObserver","called","observer","element","document","createTextNode","observe","characterData","data","setImmediate","MessageChannel","createElement","scriptEl","onreadystatechange","parentNode","removeChild","documentElement","appendChild","setTimeout","channel","port1","onmessage","port2","postMessage","2","INTERNAL","Promise","resolver","TypeError","state","PENDING","outcome","safelyResolveThenable","QueueItem","promise","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","func","value","returnValue","handlers","reject","resolve","getThen","obj","then","apply","arguments","thenable","onError","onSuccess","tryToUnwrap","result","tryCatch","status","out","reason","all","iterable","allResolver","resolveFromAll","outValue","values","resolved","error","Object","prototype","toString","Array","race","response","REJECTED","FULFILLED","constructor","3","4","_classCallCheck","instance","Constructor","getIDB","indexedDB","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","isIndexedDBValid","idb","openDatabase","navigator","userAgent","test","open","IDBKeyRange","isWebSQLValid","isLocalStorageValid","localStorage","setItem","createBlob","parts","properties","Blob","name","Builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","builder","append","getBlob","type","executeCallback","callback","_binStringToArrayBuffer","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","_checkBlobSupportWithoutCaching","txn","Promise$1","blob","objectStore","DETECT_BLOB_SUPPORT_STORE","put","onabort","preventDefault","stopPropagation","oncomplete","matchedChrome","match","matchedEdge","parseInt","_checkBlobSupport","supportsBlobs","_deferReadiness","dbInfo","dbContext","dbContexts","deferredOperation","deferredOperations","dbReady","_advanceReadiness","pop","_getConnection","upgradeNeeded","db","close","dbArgs","version","openreq","onupgradeneeded","createObjectStore","storeName","oldVersion","ex","console","warn","newVersion","onerror","onsuccess","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","objectStoreNames","contains","isDowngrade","isUpgrade","incVersion","_encodeBlob","reader","FileReader","onloadend","base64","btoa","target","__local_forage_encoded_blob","readAsBinaryString","_decodeBlob","encodedBlob","arrayBuff","atob","_isEncodedBlob","_fullyReady","_initReady","_dbInfo","_initStorage","options","ignoreErrors","forages","ready","initPromises","j","forage","slice","_defaultConfig","k","getItem","key","String","store","transaction","req","get","undefined","iterate","iterator","openCursor","iterationNumber","cursor","blobSupport","err","removeItem","clear","count","advanced","advance","keys","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","p","buffer","bytes","BASE_CHARS","indexOf","bufferToString","base64String","substring","serialize","valueString","marker","SERIALIZED_MARKER","TYPE_ARRAYBUFFER","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_UINT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","fileReader","onload","str","BLOB_TYPE_PREFIX","TYPE_BLOB","readAsArrayBuffer","JSON","stringify","deserialize","SERIALIZED_MARKER_LENGTH","parse","blobType","TYPE_SERIALIZED_MARKER_LENGTH","BLOB_TYPE_PREFIX_REGEX","matcher","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","_initStorage$1","dbInfoPromise","description","size","executeSql","serializer","localforageSerializer","getItem$1","results","rows","item","iterate$1","setItem$1","originalValue","sqlError","QUOTA_ERR","removeItem$1","clear$1","length$1","c","key$1","keys$1","_initStorage$2","keyPrefix","clear$2","getItem$2","iterate$2","keyPrefixLength","key$2","keys$2","length$2","removeItem$2","setItem$2","executeTwoCallbacks","errorCallback","callWhenReady","localForageInstance","libraryMethod","_args","extend","arg","hasOwnProperty","isArray","isLibraryDriver","driverName","driver","DriverType","_typeof","Symbol","asyncStorage","_driver","webSQLStorage","localStorageWrapper","CustomDrivers","INDEXEDDB","LOCALSTORAGE","WEBSQL","DefaultDriverOrder","LibraryMethods","DefaultConfig","driverSupport","LocalForage","_config","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","config","replace","defineDriver","driverObject","complianceError","namingError","customDriverMethods","concat","customDriverMethod","supportPromise","_support","supportResult","getDriver","getDriverPromise","getSerializer","serializerPromise","drivers","setDriverToConfig","initDriver","supportedDrivers","driverPromiseLoop","currentDriverIndex","_extend","_getSupportedDrivers","oldDriverSetDone","supports","libraryMethodsAndProperties","createInstance","localforage_js","root","factory","angular","angularLocalForage","provider","lfInstances","defaultConfig","notify","watchers","setNotify","itemSet","itemRemove","isObject","$get","$rootScope","$q","$parse","args","fct","isString","LocalForageInstance","params","isDefined","_localforage","isUndefined","stripMeta","copy","map","$promise","$$hashKey","reduce","acc","localCopy","index","prefix","$broadcast","newvalue","rejectOnNull","deferred","defer","res","found","shouldResolve","promises","forEach","pull","itemValue","keyList","oldPrefix","tempKeyList","substr","getKeys","bind","$scope","opts","defaultOpts","defaultValue","scopeKey","model","assign","$watch","val","unbind","directive","$localForage","restrict","link","$element","$attrs","$eval","localForage","localforageSsatbDriver","DRIVER_NAME","_apiInfo","apiInfo","appendServiceResponseHeaders","jqXHR","headers","headersStr","getAllResponseHeaders","headersArray","split","header","kvs","trim","responseHeaders","getDefaultApiDetails","$","ajax","method","verb","url","Url","Headers","cache","dataType","contentType","done","items","keyProperty","fail","textStatus","errorThrown","getServerError","apiDetails","getApiDetails","serviceName","responseStatus","ignore404","api","apiHashmap","defaultKey","firstKey","statusText","responseJSON","ModuleType","DEFINE","EXPORT","WINDOW","moduleType","$localForageProvider","getApiNameByUrl","service","toLowerCase","interceptorFactories","interceptors","$injector","ssatbHttp","requestConfig","toUpperCase","requestInterceptors","responseInterceptors","when","reversedInterceptors","interceptor","request","requestError","unshift","responseError","chainInterceptors","createShortMethods","names","createShortMethodsWithData","ii","thenFn","rejectFn","interceptorFactory","invoke","authTokenRefreshService","$window","$http","refreshToken","refreshTokenBaseUrl","refreshTokenComplete","refreshTokenUrl","messageInterceptorsConfig","$provide","errorResponse","getServiceNameFromApiInfo","apiInfoObject","ServiceName","retry","errorHandler","_retrySsatbHttpRequest","$ssatbHttp","alertDialog","ssatbHttpProvider"],"mappings":"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","file":"ssatb.localforage.driver.bundle.min.js","sourcesContent":["/*!\n localForage -- Offline Storage, Improved\n Version 1.4.2\n https://mozilla.github.io/localForage\n (c) 2013-2015 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && typeof obj === 'object' && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nexports.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nexports.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nexports.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nexports.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb) {\n return false;\n }\n // We mimic PouchDB here; just UA test for Safari (which, as of\n // iOS 8/Yosemite, doesn't properly support IndexedDB).\n // IndexedDB support is broken and different from Blink's.\n // This is faster than the test case (and it's sync), so we just\n // do this. *SIGH*\n // http://bl.ocks.org/nolanlawson/raw/c83e9039edf2278047e9/\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n if (typeof openDatabase !== 'undefined' && typeof navigator !== 'undefined' && navigator.userAgent && /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)) {\n return false;\n }\n\n return idb && typeof idb.open === 'function' &&\n // Some Samsung/HTC Android 4.0-4.3 devices\n // have older IndexedDB specs; if this isn't available\n // their IndexedDB is too old for us to use.\n // (Replaces the onupgradeneeded test.)\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage && localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined' && typeof _dereq_ !== 'undefined') {\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs;\nvar dbContexts;\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/9c25a23/src/adapters/idb/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(txn) {\n return new Promise$1(function (resolve) {\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve) {\n deferredOperation.resolve = resolve;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function () {\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n resolve(openreq.result);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + ' can\\'t be downgraded from version ' + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n promise.then(callback, callback);\n return promise;\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Initialize a singleton container for all running localForages.\n if (!dbContexts) {\n dbContexts = {};\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (value instanceof Blob) {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n\n var req = store.put(value, key);\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var advanced = false;\n var req = store.openCursor();\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys\n};\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueString = '';\n if (value) {\n valueString = value.toString();\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (value.toString() === '[object ArrayBuffer]' || value.buffer && value.buffer.toString() === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueString === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueString === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueString === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueString === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueString === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueString === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueString === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueString === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueString === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueString === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' (id INTEGER PRIMARY KEY, key unique, value)', [], function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n t.executeSql('INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // TODO: Try to re-run the transaction.\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n t.executeSql('SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1\n};\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = dbInfo.name + '/';\n\n if (dbInfo.storeName !== self._defaultConfig.storeName) {\n dbInfo.keyPrefix += dbInfo.storeName + '/';\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n if (localStorage.key(i).indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(localStorage.key(i).substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n // Default API, from Gaia/localStorage.\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2\n};\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\n// Custom drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar CustomDrivers = {};\n\nvar DriverType = {\n INDEXEDDB: 'asyncStorage',\n LOCALSTORAGE: 'localStorageWrapper',\n WEBSQL: 'webSQLStorage'\n};\n\nvar DefaultDriverOrder = [DriverType.INDEXEDDB, DriverType.WEBSQL, DriverType.LOCALSTORAGE];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'];\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nvar driverSupport = {};\n// Check to see if IndexedDB is available and if it is the latest\n// implementation; it's our preferred backend library. We use \"_spec_test\"\n// as the name of the database because it's not the one we'll operate on,\n// but it's useful to make sure its using the right spec.\n// See: https://github.com/mozilla/localForage/issues/128\ndriverSupport[DriverType.INDEXEDDB] = isIndexedDBValid();\n\ndriverSupport[DriverType.WEBSQL] = isWebSQLValid();\n\ndriverSupport[DriverType.LOCALSTORAGE] = isLocalStorageValid();\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var key in arg) {\n if (arg.hasOwnProperty(key)) {\n if (isArray(arg[key])) {\n arguments[0][key] = arg[key].slice();\n } else {\n arguments[0][key] = arg[key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nfunction isLibraryDriver(driverName) {\n for (var driver in DriverType) {\n if (DriverType.hasOwnProperty(driver) && DriverType[driver] === driverName) {\n return true;\n }\n }\n\n return false;\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n this.INDEXEDDB = DriverType.INDEXEDDB;\n this.LOCALSTORAGE = DriverType.LOCALSTORAGE;\n this.WEBSQL = DriverType.WEBSQL;\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver);\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n var namingError = new Error('Custom driver name already in use: ' + driverObject._driver);\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n if (isLibraryDriver(driverObject._driver)) {\n reject(namingError);\n return;\n }\n\n var customDriverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0; i < customDriverMethods.length; i++) {\n var customDriverMethod = customDriverMethods[i];\n if (!customDriverMethod || !driverObject[customDriverMethod] || typeof driverObject[customDriverMethod] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var supportPromise = Promise$1.resolve(true);\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n supportPromise = driverObject._support();\n } else {\n supportPromise = Promise$1.resolve(!!driverObject._support);\n }\n }\n\n supportPromise.then(function (supportResult) {\n driverSupport[driverName] = supportResult;\n CustomDrivers[driverName] = driverObject;\n resolve();\n }, reject);\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var self = this;\n var getDriverPromise = Promise$1.resolve().then(function () {\n if (isLibraryDriver(driverName)) {\n switch (driverName) {\n case self.INDEXEDDB:\n return asyncStorage;\n case self.LOCALSTORAGE:\n return localStorageWrapper;\n case self.WEBSQL:\n return webSQLStorage;\n }\n } else if (CustomDrivers[driverName]) {\n return CustomDrivers[driverName];\n } else {\n throw new Error('Driver not found.');\n }\n });\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n })[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!driverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0; i < LibraryMethods.length; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});","/**\n * angular-localforage - Angular service & directive for https://github.com/mozilla/localForage (Offline storage, improved.)\n * @version v1.3.8\n * @link https://github.com/ocombe/angular-localForage\n * @license MIT\n * @author Olivier Combe \n */\n(function(root, factory) {\n 'use strict';\n\n var angular = (root && root.angular) || (window && window.angular);\n if(typeof define === 'function' && define.amd) { // AMD\n define(['localforage'], function(localforage) {\n return factory(angular, localforage);\n });\n }\n //commenting this in forked 1.3.8 version for using only browser code because module is undefined and reaches to NW.js version\n //else if (typeof exports === 'object' || typeof global === 'object') {\n // if(typeof module === 'undefined') {\n // global.module.exports = factory(angular, require('localforage')); // NW.js\n // } else {\n // module.exports = factory(angular, require('localforage')); // Node/Browserify\n // }\n //}\n else {\n return factory(angular, root.localforage); // Browser\n }\n})(this, function(angular, localforage, undefined) {\n 'use strict';\n\n var angularLocalForage = angular.module('LocalForageModule', ['ng']);\n angularLocalForage.provider('$localForage', function() {\n var lfInstances = {},\n defaultConfig = {\n name: 'lf'\n },\n // Send signals for each of the following actions ?\n notify = {\n setItem: false,\n removeItem: false\n },\n watchers = {};\n\n // Setter for notification config, itemSet & itemRemove should be booleans\n this.setNotify = function(itemSet, itemRemove) {\n notify = {\n setItem: itemSet,\n removeItem: itemRemove\n };\n };\n\n this.config = function(config) {\n if(!angular.isObject(config)) {\n throw new Error('The config parameter should be an object');\n }\n angular.extend(defaultConfig, config);\n };\n\n this.$get = ['$rootScope', '$q', '$parse', function($rootScope, $q, $parse) {\n var LocalForageInstance = function LocalForageInstance(params) {\n if(angular.isDefined(params)) {\n this._localforage = localforage.createInstance(params);\n } else {\n this._localforage = localforage;\n localforage.config(defaultConfig);\n }\n };\n\n LocalForageInstance.prototype.createInstance = function createInstance(config) {\n if(angular.isObject(config)) { // create new instance\n config = angular.extend({}, defaultConfig, config);\n if(angular.isDefined(lfInstances[config.name])) {\n throw new Error('A localForage instance with the name ' + config.name + ' is already defined.');\n }\n\n lfInstances[config.name] = new LocalForageInstance(config);\n return lfInstances[config.name];\n } else {\n throw new Error('The parameter should be a config object.')\n }\n };\n\n LocalForageInstance.prototype.instance = function instance(name) {\n if(angular.isUndefined(name)) {\n return lfInstances[defaultConfig.name];\n } else if(angular.isString(name)) {\n if(angular.isDefined(lfInstances[name])) {\n return lfInstances[name];\n } else {\n throw new Error('No localForage instance of that name exists.')\n }\n } else {\n throw new Error('The parameter should be a string.')\n }\n };\n\n // Setter for the storage driver\n LocalForageInstance.prototype.setDriver = function setDriver(driver) {\n return this._localforage.setDriver(driver);\n };\n\n // Getter for the storage driver\n LocalForageInstance.prototype.driver = function driver() {\n return this._localforage.driver();\n };\n\n // Define a new driver for upstream consistency\n LocalForageInstance.prototype.defineDriver = function defineDriver(driver) {\n return this._localforage.defineDriver(driver);\n }\n\n // Directly adds a value to storage\n LocalForageInstance.prototype.setItem = function setItem(key, value) {\n // throw error on undefined key, we allow undefined value because... why not ?\n if(angular.isUndefined(key)) {\n throw new Error(\"You must define a key to set\");\n }\n\n var self = this;\n var args = arguments;\n var localCopy;\n\n if(angular.isArray(key)) {\n if(!angular.isArray(value)) {\n throw new Error('If you set an array of keys, the values should be an array too');\n }\n\n return $q.all(key.map(function (k, index) {\n return self.setItem(k, value[index]);\n }));\n }\n\n localCopy = stripMeta(value);\n\n return self._localforage\n .setItem(self.prefix() + key, localCopy)\n .then(function success() {\n if(notify.setItem) {\n $rootScope.$broadcast('LocalForageModule.setItem', {\n key: key,\n newvalue: localCopy,\n driver: self.driver()\n });\n }\n\n return localCopy;\n })\n .catch(onError(args, self.setItem));\n\n function stripMeta(value) {\n var copy;\n if (angular.isArray(value)) {\n return value.map(stripMeta);\n } else if (angular.isObject(value) && value.constructor === Object) {\n copy = angular.extend({}, value);\n\n angular.isDefined(copy.$promise) && delete copy.$promise;\n angular.isDefined(copy.$$hashKey) && delete copy.$$hashKey;\n\n return Object\n .keys(copy)\n .reduce(function stripEntries(acc, key) {\n acc[key] = stripMeta(copy[key]);\n return acc;\n }, {});\n }\n return value;\n }\n };\n\n // Directly get a value from storage\n LocalForageInstance.prototype.getItem = function getItem(key, rejectOnNull) {\n // throw error on undefined key\n if(angular.isUndefined(key)) {\n throw new Error(\"You must define a key to get\");\n }\n\n var deferred = $q.defer(),\n args = arguments,\n self = this,\n promise;\n if(angular.isArray(key)) {\n var res = [],\n found = 0;\n promise = self._localforage.iterate(function(value, k) {\n var index = key.indexOf(self.prefix() + k);\n if(index > -1) {\n res[index] = value;\n found++;\n }\n if(found === key.length) {\n return res;\n }\n }).then(function() {\n var shouldResolve = true;\n for (var i = 0; i < key.length; i++) {\n if (angular.isUndefined(res[i])) {\n res[i] = null;\n shouldResolve = false;\n }\n }\n if (shouldResolve || !rejectOnNull) {\n deferred.resolve(res);\n } else {\n deferred.reject(res);\n }\n });\n } else {\n promise = self._localforage.getItem(self.prefix() + key).then(function(item) {\n if (rejectOnNull && item === null) {\n deferred.reject(item);\n } else {\n deferred.resolve(item);\n }\n });\n }\n\n promise.then(null, function error(data) {\n self.onError(data, args, self.getItem, deferred);\n });\n\n return deferred.promise;\n };\n\n // Iterate over all the values in storage\n LocalForageInstance.prototype.iterate = function iterate(callback) {\n // throw error on undefined key\n if(angular.isUndefined(callback)) {\n throw new Error(\"You must define a callback to iterate\");\n }\n\n var deferred = $q.defer(),\n args = arguments,\n self = this;\n\n self._localforage.iterate(callback).then(function success(item) {\n deferred.resolve(item);\n }, function error(data) {\n self.onError(data, args, self.iterate, deferred);\n });\n\n return deferred.promise;\n };\n\n // Remove an item from storage\n LocalForageInstance.prototype.removeItem = function removeItem(key) {\n // throw error on undefined key\n if(angular.isUndefined(key)) {\n throw new Error(\"You must define a key to remove\");\n }\n\n var self = this;\n\n if(angular.isArray(key)) {\n var promises = [];\n angular.forEach(key, function(k, index) {\n promises.push(self.removeItem(k));\n });\n\n return $q.all(promises);\n } else {\n var deferred = $q.defer(),\n args = arguments;\n\n self._localforage.removeItem(self.prefix() + key).then(function success() {\n if(notify.removeItem) {\n $rootScope.$broadcast('LocalForageModule.removeItem', {key: key, driver: self.driver()});\n }\n deferred.resolve();\n }, function error(data) {\n self.onError(data, args, self.removeItem, deferred);\n });\n\n return deferred.promise;\n }\n };\n\n // Get an item and removes it from storage\n LocalForageInstance.prototype.pull = function pull(key) {\n var self = this;\n var itemValue;\n\n if(angular.isUndefined(key)) {\n throw new Error(\"You must define a key to pull\");\n }\n\n return self\n .getItem(key)\n .then(function (value) {\n itemValue = value;\n return self.removeItem(key);\n })\n .then(function () {\n return itemValue;\n });\n };\n\n // Remove all data for this app from storage\n LocalForageInstance.prototype.clear = function clear() {\n var deferred = $q.defer(),\n args = arguments,\n self = this;\n\n self._localforage.clear().then(function success(keys) {\n deferred.resolve();\n }, function error(data) {\n self.onError(data, args, self.clear, deferred);\n });\n return deferred.promise;\n\n // return $q(function (resolve, reject) {\n // self._localforage\n // .clear()\n // .then(function (keys) {\n // resolve();\n // })\n // .catch(onError(arguments, self.clear));\n // });\n };\n\n // Return the key for item at position n\n LocalForageInstance.prototype.key = function key(n) {\n // throw error on undefined n\n if(angular.isUndefined(n)) {\n throw new Error(\"You must define a position to get for the key function\");\n }\n\n var deferred = $q.defer(),\n args = arguments,\n self = this;\n\n self._localforage.key(n).then(function success(key) {\n deferred.resolve(key);\n }, function error(data) {\n self.onError(data, args, self.key, deferred);\n });\n return deferred.promise;\n };\n\n var keys = function keys() {\n var deferred = $q.defer(),\n args = arguments,\n self = this;\n\n self._localforage.keys().then(function success(keyList) {\n if(defaultConfig.oldPrefix && self.driver() === 'localStorageWrapper') {\n var tempKeyList = [];\n for(var i = 0, len = keyList.length; i < len; i++) {\n tempKeyList.push(\n keyList[i].substr(self.prefix().length, keyList[i].length)\n );\n }\n keyList = tempKeyList;\n }\n deferred.resolve(keyList);\n }, function error(data) {\n self.onError(data, args, self.keys, deferred);\n });\n return deferred.promise;\n };\n\n // Return the list of keys stored for this application\n LocalForageInstance.prototype.keys = keys;\n\n // deprecated\n LocalForageInstance.prototype.getKeys = keys;\n\n // Returns the number of keys in this storage\n LocalForageInstance.prototype.length = function() {\n var deferred = $q.defer(),\n args = arguments,\n self = this;\n\n self._localforage.length().then(function success(length) {\n deferred.resolve(length);\n }, function error(data) {\n self.onError(data, args, length, deferred);\n });\n return deferred.promise;\n };\n\n /**\n * Bind - let's you directly bind a LocalForage value to a $scope variable\n * @param {Angular $scope} $scope - the current scope you want the variable available in\n * @param {String/Object} opts - the key name of the variable you are binding OR an object with the key and custom options like default value or instance name\n * Here are the available options you can set:\n * * key: the key used in storage and in the scope (if scopeKey isn't defined)\n * * defaultValue: the default value\n * * name: name of the instance that should store the data\n * * scopeKey: the key used in the scope\n * @returns {*} - returns whatever the stored value is\n */\n LocalForageInstance.prototype.bind = function bind($scope, opts) {\n if(angular.isString(opts)) {\n opts = {\n key: opts\n };\n } else if(!angular.isObject(opts) || angular.isUndefined(opts.key)) {\n throw new Error(\"You must define a key to bind\");\n }\n\n var defaultOpts = {\n defaultValue: '',\n name: defaultConfig.name\n };\n\n // If no defined options we use defaults otherwise extend defaults\n opts = angular.extend({}, defaultOpts, opts);\n\n var self = lfInstances[opts.name];\n\n if(angular.isUndefined(self)) {\n throw new Error(\"You must use the name of an existing instance\");\n }\n\n // Set the storeName key for the LocalForage entry\n // use user defined in specified\n var scopeKey = opts.scopeKey || opts.key,\n model = $parse(scopeKey);\n\n return self\n .getItem(opts.key, true)\n .then(function(item) {\n model.assign($scope, item);\n return item;\n })\n .catch(function () {\n model.assign($scope, opts.defaultValue);\n return self.setItem(opts.key, opts.defaultValue);\n })\n .then(function (item) {\n if(angular.isDefined(watchers[opts.key])) {\n watchers[opts.key]();\n }\n\n watchers[opts.key] = $scope.$watch(scopeKey, function(val) {\n if(angular.isDefined(val)) {\n self.setItem(opts.key, val);\n }\n }, true);\n\n return item;\n });\n };\n\n /**\n * Unbind - let's you unbind a variable from localForage while removing the value from both\n * the localForage and the local variable and sets it to null\n * @param {String/Object} opts - the key name of the variable you are unbinding OR an object with the key and custom options like default value or instance name\n * Here are the available options you can set:\n * * key: the key used in storage and in the scope (if scopeKey isn't defined)\n * * name: name of the instance that should store the data\n * * scopeKey: the key used in the scope\n */\n LocalForageInstance.prototype.unbind = function unbind($scope, opts) {\n if(angular.isString(opts)) {\n opts = {\n key: opts\n }\n } else if(!angular.isObject(opts) || angular.isUndefined(opts.key)) {\n throw new Error(\"You must define a key to unbind\");\n }\n\n var defaultOpts = {\n scopeKey: opts.key,\n name: defaultConfig.name\n };\n\n // If no defined options we use defaults otherwise extend defaults\n opts = angular.extend({}, defaultOpts, opts);\n\n var self = lfInstances[opts.name];\n\n if(angular.isUndefined(self)) {\n throw new Error(\"You must use the name of an existing instance\");\n }\n\n $parse(opts.scopeKey).assign($scope, null);\n if(angular.isDefined(watchers[opts.key])) {\n watchers[opts.key](); // unwatch\n delete watchers[opts.key];\n }\n return self.removeItem(opts.key);\n };\n\n LocalForageInstance.prototype.prefix = function() {\n return this.driver() === 'localStorageWrapper' && defaultConfig.oldPrefix ? this._localforage.config().name + '.' : '';\n };\n\n // Handling errors\n LocalForageInstance.prototype.onError = function(err, args, fct, deferred) {\n // test for private browsing errors in Firefox & Safari\n if(((angular.isObject(err) && err.name ? err.name === 'InvalidStateError' : (angular.isString(err) && err === 'InvalidStateError')) && this.driver() === 'asyncStorage')\n || (angular.isObject(err) && err.code && err.code === 5)) {\n var self = this;\n\n self.setDriver('localStorageWrapper').then(function() {\n fct.apply(self, args).then(function(item) {\n deferred.resolve(item);\n }, function(data) {\n deferred.reject(data);\n });\n }, function() {\n deferred.reject(err);\n });\n } else {\n deferred.reject(err);\n }\n };\n\n function onError(args, fct) {\n return function(err) {\n if(((angular.isObject(err) && err.name ? err.name === 'InvalidStateError' : (angular.isString(err) && err === 'InvalidStateError')) && this.driver() === 'asyncStorage')\n || (angular.isObject(err) && err.code && err.code === 5)) {\n var self = this;\n\n return self\n .setDriver('localStorageWrapper')\n .then(function () {\n return fct.apply(self, args);\n });\n }\n\n return $q.reject(err);\n };\n }\n\n lfInstances[defaultConfig.name] = new LocalForageInstance();\n return lfInstances[defaultConfig.name];\n\n }]\n });\n\n angularLocalForage.directive('localForage', ['$localForage', function($localForage) {\n return {\n restrict: 'A',\n link: function($scope, $element, $attrs) {\n var opts = $scope.$eval($attrs.localForage);\n if(angular.isObject(opts) && angular.isDefined(opts.key)) {\n $localForage.bind($scope, opts);\n } else {\n $localForage.bind($scope, $attrs.localForage);\n }\n }\n }\n }]);\n\n return angularLocalForage.name;\n});\n","/*\r\n * ----------------------------------------\r\n *\r\n * Based on https://github.com/mozilla/localForage/blob/master/src/drivers/websql.js\r\n *\r\n */\r\nvar localforageSsatbDriver = {\r\n DRIVER_NAME : 'localForage-SsatbDriver'\r\n};\r\n(function () {\r\n 'use strict';\r\n\r\n // Promises!\r\n var Promise = (typeof module !== 'undefined' && module.exports) ?\r\n require('promise') : this.Promise;\r\n\r\n var globalObject = this;\r\n var serializer = null;\r\n\r\n\r\n var ModuleType = {\r\n DEFINE: 1,\r\n EXPORT: 2,\r\n WINDOW: 3\r\n };\r\n\r\n // Attaching to window (i.e. no module loader) is the assumed,\r\n // simple default.\r\n var moduleType = ModuleType.WINDOW;\r\n\r\n // Find out what kind of module setup we have; if none, we'll just attach\r\n // localForage to the main window.\r\n if (typeof module !== 'undefined' && module.exports) {\r\n moduleType = ModuleType.EXPORT;\r\n } else if (typeof define === 'function' && define.amd) {\r\n moduleType = ModuleType.DEFINE;\r\n }\r\n\r\n function _initStorage(options) {\r\n var self = this;\r\n var apiInfo = null;\r\n if (options) {\r\n self._apiInfo = options.apiInfo;\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n function appendServiceResponseHeaders(obj, jqXHR) {\r\n var headers = null;\r\n if (obj != null)\r\n if (jqXHR != null) {\r\n var headersStr = jqXHR.getAllResponseHeaders();\r\n var headersArray = headersStr.split(\"\\n\");\r\n var headers = {};\r\n for (var i in headersArray) {\r\n if (headersArray.hasOwnProperty(i)) {\r\n var header = headersArray[i];\r\n var kvs = header.split(\":\");\r\n var key = kvs[0];\r\n if (key) {\r\n key = key.trim();\r\n if (key.length != 0) {\r\n var val = kvs[1];\r\n if (val)\r\n val = val.trim();\r\n headers[key] = val;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else\r\n console.warn(\"jqXHR is null. Headers not populated\");\r\n if (headers != null)\r\n obj.responseHeaders = headers;\r\n return obj;\r\n }\r\n\r\n function iterate(iterator, callback) {\r\n var self = this;\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n var apiInfo = getDefaultApiDetails(self._apiInfo);\r\n\r\n $.ajax({\r\n method: apiInfo.iterate.verb ? apiInfo.iterate.verb : \"GET\",\r\n url: apiInfo.Url + apiInfo.iterate.url,\r\n headers: apiInfo.Headers,\r\n global: false,\r\n cache: false,\r\n dataType: \"json\",\r\n contentType: 'application/json; charset=utf-8',\r\n }).done(function (items) {\r\n var length = items.length;\r\n for (var i = 0; i < length; i++) {\r\n var item = items[i];\r\n item = iterator(item, item[apiInfo.iterate.keyProperty],\r\n i + 1);\r\n if (item !== void (0)) {\r\n resolve(item);\r\n return;\r\n }\r\n }\r\n resolve();\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n reject(getServerError(apiInfo, jqXHR, textStatus, errorThrown));\r\n });\r\n\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function getItem(key, callback) {\r\n var self = this;\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n var apiDetails = getApiDetails(key);\r\n var apiInfo = self._apiInfo[apiDetails.serviceName];\r\n\r\n $.ajax({\r\n method: apiDetails.verb,\r\n url: apiInfo.Url + apiDetails.url,\r\n dataType: \"json\",\r\n global: false,\r\n cache: false,\r\n contentType: 'application/json; charset=utf-8',\r\n headers: apiInfo.Headers\r\n }).done(function (obj, responseStatus, jqXHR) {\r\n resolve(appendServiceResponseHeaders(obj, jqXHR));\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n if (apiDetails.ignore404 && angular.isDefined(jqXHR.status) && jqXHR.status === 404)\r\n resolve(appendServiceResponseHeaders(null, jqXHR));\r\n else\r\n reject(getServerError(apiDetails, jqXHR, textStatus, errorThrown));\r\n });\r\n\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n function setItem(key, value, callback) {\r\n var self = this;\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n var apiDetails = getApiDetails(key);\r\n var apiInfo = self._apiInfo[apiDetails.serviceName];\r\n\r\n $.ajax({\r\n method: apiDetails.verb,\r\n url: apiInfo.Url + apiDetails.url,\r\n dataType: \"json\",\r\n global: false,\r\n cache: false,\r\n contentType: 'application/json; charset=utf-8',\r\n headers: apiInfo.Headers,\r\n data: JSON.stringify(value)\r\n }).done(function (response, responseStatus, jqXHR) {\r\n value.response = response;\r\n resolve(appendServiceResponseHeaders(value, jqXHR));\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n reject(getServerError(apiDetails, jqXHR, textStatus, errorThrown));\r\n });\r\n\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function removeItem(key, callback) {\r\n var self = this;\r\n\r\n // Cast the key to a string, as that's all we can set as a key.\r\n if (typeof key !== 'string') {\r\n window.console.warn(key +\r\n ' used as a key, but it is not a string.');\r\n key = String(key);\r\n }\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n var apiDetails = getApiDetails(key);\r\n var apiInfo = self._apiInfo[apiDetails.serviceName];\r\n $.ajax({\r\n method: apiDetails.verb,\r\n url: apiInfo.Url + apiDetails.url,\r\n global: false,\r\n cache: false,\r\n headers: apiInfo.Headers\r\n }).done(function () {\r\n resolve()\r\n }).fail(function (jqXHR, textStatus, errorThrown) {\r\n reject(getServerError(apiDetails, jqXHR, textStatus, errorThrown));\r\n });\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function clear(callback) {\r\n var self = this;\r\n\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function length(callback) {\r\n var self = this;\r\n\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function key(n, callback) {\r\n var self = this;\r\n\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n }).catch(reject);\r\n });\r\n\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function keys(callback) {\r\n var self = this;\r\n\r\n var promise = new Promise(function (resolve, reject) {\r\n self.ready().then(function () {\r\n }).catch(reject);\r\n });\r\n executeCallback(promise, callback);\r\n return promise;\r\n }\r\n\r\n function executeCallback(promise, callback) {\r\n if (callback) {\r\n promise.then(function (result) {\r\n callback(null, result);\r\n }, function (error) {\r\n callback(error);\r\n });\r\n }\r\n }\r\n\r\n function getApiDetails(key) {\r\n var api = key.split(\"|\");\r\n return {\r\n serviceName: api[0],\r\n verb: api[1],\r\n url: api[2],\r\n ignore404: api.length > 3 ? api[3] : false\r\n };\r\n }\r\n function getDefaultApiDetails(apiHashmap) {\r\n var defaultKey = null;\r\n for (var firstKey in apiHashmap) {\r\n defaultKey = firstKey;\r\n break;\r\n }\r\n if (defaultKey == null)\r\n return null;\r\n return apiHashmap[defaultKey];\r\n }\r\n\r\n function getServerError(apiDetails, jqXHR, textStatus, errorThrown) {\r\n return {\r\n serviceName: apiDetails.serviceName,\r\n method: apiDetails.verb,\r\n status: jqXHR.status,\r\n url: apiDetails.url,\r\n statusText: textStatus,\r\n errorThrown: errorThrown,\r\n data: jqXHR.responseJSON\r\n };\r\n }\r\n\r\n\r\n var driver = {\r\n _driver: localforageSsatbDriver.DRIVER_NAME,\r\n _initStorage: _initStorage,\r\n _support: true,\r\n iterate: iterate,\r\n getItem: getItem,\r\n setItem: setItem,\r\n removeItem: removeItem,\r\n clear: clear,\r\n length: length,\r\n key: key,\r\n keys: keys\r\n };\r\n if (moduleType === ModuleType.DEFINE) {\r\n define(localforageSsatbDriver.DRIVER_NAME, function () {\r\n return driver;\r\n });\r\n } else if (moduleType === ModuleType.EXPORT) {\r\n module.exports = driver;\r\n } else {\r\n this[localforageSsatbDriver.DRIVER_NAME] = driver;\r\n }\r\n\r\n localforage.defineDriver(driver);\r\n\r\n}).call(window);\r\n","angular.module('SSATB.LocalForage', ['LocalForageModule'])\r\n.provider('ssatbHttp', ['$localForageProvider', function ($localForageProvider) {\r\n\r\n var _config = {\r\n driver: [localforageSsatbDriver.DRIVER_NAME]\r\n };\r\n\r\n this.config = function (config) {\r\n if (!angular.isObject(config))\r\n throw new Error('The config parameter should be an object');\r\n\r\n _config = angular.extend(_config, config);\r\n $localForageProvider.config(_config);\r\n };\r\n\r\n var interceptorFactories = this.interceptors = [];\r\n\r\n function getApiNameByUrl(url) {\r\n\r\n if (!angular.isObject(_config.apiInfo))\r\n return null;\r\n\r\n var service = null;\r\n angular.forEach(_config.apiInfo, function (value, key) {\r\n if (url.toLowerCase().indexOf(value.Url.toLowerCase()) === 0) {\r\n service = key;\r\n }\r\n });\r\n return service;\r\n }\r\n\r\n \r\n\r\n this.$get = ['$localForage', '$q', '$injector', function ($localForage, $q, $injector) {\r\n\r\n var reversedInterceptors = [];\r\n angular.forEach(interceptorFactories, function (interceptorFactory) {\r\n reversedInterceptors.unshift(angular.isString(interceptorFactory)\r\n ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\r\n });\r\n\r\n function ssatbHttp(requestConfig) {\r\n\r\n if (!angular.isObject(requestConfig))\r\n throw new Error('Http request configuration must be an object.');\r\n if (!angular.isString(requestConfig.url))\r\n throw new Error('Http request configuration url must be a string.');\r\n\r\n var config = angular.extend({\r\n method: 'get'\r\n }, requestConfig);\r\n \r\n config.method = angular.isString(config.method) ? config.method.toUpperCase() : config.method;\r\n \r\n var service = getApiNameByUrl(requestConfig.url);\r\n if (service === null)\r\n throw new Error('No matching apiInfo was found in the provider configuration for the service URL ' + requestConfig.url);\r\n\r\n var requestInterceptors = [];\r\n var responseInterceptors = [];\r\n var promise = $q.when(config);\r\n\r\n // apply interceptors\r\n angular.forEach(reversedInterceptors, function (interceptor) {\r\n if (interceptor.request || interceptor.requestError) {\r\n requestInterceptors.unshift(interceptor.request, interceptor.requestError);\r\n }\r\n if (interceptor.response || interceptor.responseError) {\r\n responseInterceptors.push(interceptor.response, interceptor.responseError);\r\n }\r\n });\r\n\r\n promise = chainInterceptors(promise, requestInterceptors);\r\n promise = promise.then(function (result) {\r\n var apiInfo = _config.apiInfo[service];\r\n var key = service + '|' + config.method + '|' + requestConfig.url.substring(apiInfo.Url.length);\r\n if (angular.isDefined(requestConfig.ignore404)) {\r\n key += '|' + requestConfig.ignore404;\r\n }\r\n if (config.method === 'GET')\r\n return $localForage.getItem(key);\r\n else\r\n if (config.method === 'DELETE')\r\n return $localForage.removeItem(key);\r\n else\r\n return $localForage.setItem(key, requestConfig.data);\r\n\r\n });\r\n promise = promise.then(function (response) {\r\n if (response != null)\r\n response.config = config;\r\n else\r\n return { config: config };\r\n return response;\r\n\r\n }, function (response) {\r\n if (response != null) {\r\n response.config = config\r\n throw response\r\n }\r\n else {\r\n throw new { config: config };\r\n }\r\n });\r\n\r\n return chainInterceptors(promise, responseInterceptors);\r\n }\r\n\r\n createShortMethods('get', 'delete');\r\n createShortMethodsWithData('post', 'put');\r\n\r\n return ssatbHttp;\r\n\r\n function createShortMethods(names) {\r\n angular.forEach(arguments, function (name) {\r\n ssatbHttp[name] = function (url, config) {\r\n return ssatbHttp(angular.extend({}, config || {}, {\r\n method: name,\r\n url: url\r\n }));\r\n };\r\n });\r\n }\r\n\r\n function createShortMethodsWithData(name) {\r\n angular.forEach(arguments, function (name) {\r\n ssatbHttp[name] = function (url, data, config) {\r\n return ssatbHttp(angular.extend({}, config || {}, {\r\n method: name,\r\n url: url,\r\n data: data\r\n }));\r\n };\r\n });\r\n }\r\n function chainInterceptors(promise, interceptors) {\r\n for (var i = 0, ii = interceptors.length; i < ii;) {\r\n var thenFn = interceptors[i++];\r\n var rejectFn = interceptors[i++];\r\n promise = promise.then(thenFn, rejectFn);\r\n }\r\n interceptors.length = 0;\r\n return promise;\r\n }\r\n\r\n }];\r\n\r\n}]);","(function () {\r\n var authTokenRefreshService = (\r\n function authTokenRefreshService($window, $http) {\r\n this.$window = $window;\r\n this.$http = $http;\r\n return {\r\n refreshToken: refreshToken\r\n }\r\n function refreshToken(refreshTokenBaseUrl,serviceName) {\r\n var refreshTokenUrl = refreshTokenBaseUrl + '?serviceName=' + serviceName;\r\n\r\n return $http.get(refreshTokenUrl).then(refreshTokenComplete);\r\n\r\n function refreshTokenComplete(response) {\r\n return response;\r\n }\r\n }\r\n }\r\n);\r\n\r\n var messageInterceptorsConfig = function ($provide, provider) {\r\n // push function to the interceptors which will intercept all the http responses\r\n provider.interceptors.push(['$q', '$injector', '$localForage', function ($q, $injector, $localForage) {\r\n return {\r\n responseError: function (errorResponse) {\r\n var deferred = $q.defer();\r\n var apiInfoObject = $localForage._localforage._apiInfo;\r\n var serviceName = getServiceNameFromApiInfo(apiInfoObject, errorResponse);\r\n var config = $injector.get('ssatbAuthTokenRefreshConfig');\r\n if (serviceName != null && config.refreshTokenUrl != null && !angular.isUndefined(errorResponse.config) && errorResponse.config != null\r\n && (angular.isUndefined(errorResponse.config.retry) || errorResponse.config.retry == false)\r\n && errorResponse.status === 401) {\r\n $injector.get('authTokenRefreshService').refreshToken(config.refreshTokenUrl, serviceName).then(function (response) {\r\n var apiInfo = apiInfoObject[errorResponse.serviceName];\r\n apiInfo.Headers = response.data;\r\n _retrySsatbHttpRequest(errorResponse.config, deferred, $injector);\r\n }, function () {\r\n if (!angular.isUndefined(config.errorHandler) && config.errorHandler != null)\r\n config.errorHandler('An unexpected error occurred. For assistance, please email info@enrollment.org.');\r\n deferred.reject(errorResponse);\r\n });\r\n } else {\r\n if (!angular.isUndefined(config.errorHandler) && config.errorHandler != null)\r\n config.errorHandler('An unexpected error occurred. For assistance, please email info@enrollment.org.');\r\n deferred.reject(errorResponse);\r\n }\r\n return deferred.promise;\r\n\r\n function getServiceNameFromApiInfo(apiInfoObject, errorResponse)\r\n {\r\n if (errorResponse.serviceName == null)\r\n return null;\r\n var apiInfo = apiInfoObject[errorResponse.serviceName];\r\n if (apiInfo == null)\r\n return null;\r\n return apiInfo.ServiceName;\r\n }\r\n }\r\n };\r\n }\r\n ])\r\n };\r\n var _retrySsatbHttpRequest = function (config, deferred, $injector) {\r\n $ssatbHttp = $injector.get('ssatbHttp');\r\n config.retry = true;\r\n $ssatbHttp(config).then(function (response) {\r\n deferred.resolve(response);\r\n }, function (response) {\r\n alertDialog('An unexpected error occurred. For assistance, please email info@enrollment.org.');\r\n deferred.reject(response);\r\n });\r\n }\r\n angular.module('ssatb.authtokenrefresh', ['SSATB.LocalForage'])\r\n .provider('ssatbAuthTokenRefreshConfig', ['ssatbHttpProvider', function (ssatbHttpProvider) {\r\n var _config = {};\r\n this.config = function (config)\r\n {\r\n if (!angular.isObject(config))\r\n throw new Error('The config parameter should be an object');\r\n _config = config;\r\n }\r\n this.$get = function () {\r\n return _config;\r\n }\r\n }])\r\n .config(['$provide', 'ssatbHttpProvider', messageInterceptorsConfig])\r\n .service('authTokenRefreshService', ['$window', '$http', authTokenRefreshService]);\r\n})();\r\n"]}