UNPKG

@neocomplexx/ngx-neo-indexeddb

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

465 lines (457 loc) 37.8 kB
import { NgModule } from '@angular/core'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxNeoIndexedDbModule = /** @class */ (function () { function NgxNeoIndexedDbModule() { } /** * @return {?} */ NgxNeoIndexedDbModule.forRoot = /** * @return {?} */ function () { return { ngModule: NgxNeoIndexedDbModule, providers: [] }; }; NgxNeoIndexedDbModule.decorators = [ { type: NgModule, args: [{ declarations: [], imports: [], exports: [] },] } ]; return NgxNeoIndexedDbModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var DbWrapper = /** @class */ (function () { function DbWrapper(dbName, version) { this.dbName = dbName; this.dbVersion = version || 1; this.db = null; } /** * @param {?} storeName * @return {?} */ DbWrapper.prototype.validateStoreName = /** * @param {?} storeName * @return {?} */ function (storeName) { return this.db.objectStoreNames.contains(storeName); }; /** * @param {?} storeName * @param {?} reject * @return {?} */ DbWrapper.prototype.validateBeforeTransaction = /** * @param {?} storeName * @param {?} reject * @return {?} */ function (storeName, reject) { if (!this.db) { reject('You need to use the openDatabase function to create a database before you query it!'); } if (!this.validateStoreName(storeName)) { reject(('objectStore does not exists: ' + storeName)); } }; /** * @param {?} options * @return {?} */ DbWrapper.prototype.createTransaction = /** * @param {?} options * @return {?} */ function (options) { /** @type {?} */ var trans = this.db.transaction(options.storeName, options.dbMode); trans.onerror = options.error; trans.oncomplete = options.complete; trans.onabort = options.abort; return trans; }; return DbWrapper; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var Utils = /** @class */ (function () { function Utils() { this.indexedDB = window.indexedDB || ((/** @type {?} */ (window))).mozIndexedDB || ((/** @type {?} */ (window))).webkitIndexedDB || ((/** @type {?} */ (window))).msIndexedDB; } return Utils; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxNeoIDB = /** @class */ (function () { function NgxNeoIDB(dbName, version) { this.utils = new Utils(); this.dbWrapper = new DbWrapper(dbName, version); } /** * @param {?} version * @param {?=} upgradeCallback * @return {?} */ NgxNeoIDB.prototype.openDatabase = /** * @param {?} version * @param {?=} upgradeCallback * @return {?} */ function (version, upgradeCallback) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.dbVersion = version; /** @type {?} */ var request = _this.utils.indexedDB.open(_this.dbWrapper.dbName, version); request.onsuccess = function (e) { _this.dbWrapper.db = request.result; resolve(); }; request.onerror = function (e) { reject('IndexedDB error: ' + ((/** @type {?} */ (e.target))).errorCode ? ((/** @type {?} */ (e.target))).errorCode + ' (' + ((/** @type {?} */ (e.target))).error + ')' : ((/** @type {?} */ (e.target))).errorCode); }; if (typeof upgradeCallback === 'function') { request.onupgradeneeded = function (e) { upgradeCallback(e, _this.dbWrapper.db); }; } }); }; /** * @param {?} storeName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.getByKey = /** * @param {?} storeName * @param {?} key * @return {?} */ function (storeName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request; request = objectStore.get(key); request.onsuccess = function (event) { resolve(((/** @type {?} */ (event.target))).result); }; }); }; /** * @param {?} storeName * @param {?=} keyRange * @param {?=} indexDetails * @return {?} */ NgxNeoIDB.prototype.getAll = /** * @param {?} storeName * @param {?=} keyRange * @param {?=} indexDetails * @return {?} */ function (storeName, keyRange, indexDetails) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var result = []; /** @type {?} */ var request; if (indexDetails) { /** @type {?} */ var index = objectStore.index(indexDetails.indexName); /** @type {?} */ var order = (indexDetails.order === 'desc') ? 'prev' : 'next'; request = index.openCursor(keyRange, (/** @type {?} */ (order))); } else { request = objectStore.openCursor(keyRange); } request.onerror = function (e) { reject(e); }; request.onsuccess = function (evt) { /** @type {?} */ var cursor = ((/** @type {?} */ (evt.target))).result; if (cursor) { result.push(cursor.value); cursor['continue'](); } else { resolve(result); } }; }); }; /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ NgxNeoIDB.prototype.add = /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ function (storeName, value, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve({ key: key, value: value }); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request = objectStore.add(value, key); request.onsuccess = function (evt) { key = evt.target.result; }; }); }; /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ NgxNeoIDB.prototype.update = /** * @param {?} storeName * @param {?} value * @param {?=} key * @return {?} */ function (storeName, value, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(value); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore.put(value, key); }); }; /** * @param {?} storeName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.delete = /** * @param {?} storeName * @param {?} key * @return {?} */ function (storeName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore['delete'](key); }); }; /** * @param {?} storeName * @param {?} cursorCallback * @param {?=} keyRange * @return {?} */ NgxNeoIDB.prototype.openCursor = /** * @param {?} storeName * @param {?} cursorCallback * @param {?=} keyRange * @return {?} */ function (storeName, cursorCallback, keyRange) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var request = objectStore.openCursor(keyRange); request.onsuccess = function (evt) { cursorCallback(evt); resolve(); }; }); }; /** * @param {?} storeName * @return {?} */ NgxNeoIDB.prototype.clear = /** * @param {?} storeName * @return {?} */ function (storeName) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readwrite', error: function (e) { reject(e); }, complete: function (e) { resolve(); }, abort: function (e) { reject(e); } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); objectStore.clear(); resolve(); }); }; /** * @param {?} storeName * @param {?} indexName * @param {?} key * @return {?} */ NgxNeoIDB.prototype.getByIndex = /** * @param {?} storeName * @param {?} indexName * @param {?} key * @return {?} */ function (storeName, indexName, key) { var _this = this; return new Promise(function (resolve, reject) { _this.dbWrapper.validateBeforeTransaction(storeName, reject); /** @type {?} */ var transaction = _this.dbWrapper.createTransaction({ storeName: storeName, dbMode: 'readonly', error: function (e) { reject(e); }, abort: function (e) { reject(e); }, complete: function (e) { } }); /** @type {?} */ var objectStore = transaction.objectStore(storeName); /** @type {?} */ var index = objectStore.index(indexName); /** @type {?} */ var request = index.get(key); request.onsuccess = function (event) { resolve(((/** @type {?} */ (event.target))).result); }; }); }; return NgxNeoIDB; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { NgxNeoIndexedDbModule, NgxNeoIDB }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvY29tcGxleHgtbmd4LW5lby1pbmRleGVkZGIuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvbmd4LW5lby1pbmRleGVkLWRiLm1vZHVsZS50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL2RiV3JhcHBlci50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL3V0aWxzLnRzIiwibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1pbmRleGVkZGIvbGliL05neElEQi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgU2ViYXN0aWFuIExhcnJpZXVcbiAqIEBlbWFpbCBzbGFycmlldUBuZW9jb21wbGV4eC5jb21cbiAqIEBjcmVhdGUgZGF0ZSAyMDE4LTExLTIyIDA4OjIzOjMwXG4gKiBAbW9kaWZ5IGRhdGUgMjAxOC0xMS0yMiAwODoyMzozMFxuKi9cbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW10sXG4gIGltcG9ydHM6IFtdLFxuICBleHBvcnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hOZW9JbmRleGVkRGJNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neE5lb0luZGV4ZWREYk1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW11cbiAgICB9O1xuICB9XG4gfVxuIiwiZXhwb3J0IGNsYXNzIERiV3JhcHBlciB7XHJcbiAgICBkYk5hbWU6IHN0cmluZztcclxuICAgIGRiVmVyc2lvbjogbnVtYmVyO1xyXG4gICAgZGI6IElEQkRhdGFiYXNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRiTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcclxuICAgICAgICB0aGlzLmRiVmVyc2lvbiA9IHZlcnNpb24gfHwgMTtcclxuICAgICAgICB0aGlzLmRiID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVN0b3JlTmFtZShzdG9yZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZTogc3RyaW5nLCByZWplY3Q6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnWW91IG5lZWQgdG8gdXNlIHRoZSBvcGVuRGF0YWJhc2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZGF0YWJhc2UgYmVmb3JlIHlvdSBxdWVyeSBpdCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU3RvcmVOYW1lKHN0b3JlTmFtZSkpIHtcclxuICAgICAgICAgICAgcmVqZWN0KCgnb2JqZWN0U3RvcmUgZG9lcyBub3QgZXhpc3RzOiAnICsgc3RvcmVOYW1lKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVRyYW5zYWN0aW9uKFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgc3RvcmVOYW1lOiBzdHJpbmcsIGRiTW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLFxyXG4gICAgICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiBhbnksXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IGFueSxcclxuICAgICAgICAgICAgYWJvcnQ/OiAoZTogRXZlbnQpID0+IGFueVxyXG4gICAgICAgIH0pOiBJREJUcmFuc2FjdGlvbiB7XHJcbiAgICAgICAgY29uc3QgdHJhbnM6IElEQlRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihvcHRpb25zLnN0b3JlTmFtZSwgb3B0aW9ucy5kYk1vZGUpO1xyXG4gICAgICAgIHRyYW5zLm9uZXJyb3IgPSBvcHRpb25zLmVycm9yO1xyXG4gICAgICAgIHRyYW5zLm9uY29tcGxldGUgPSBvcHRpb25zLmNvbXBsZXRlO1xyXG4gICAgICAgIHRyYW5zLm9uYWJvcnQgPSBvcHRpb25zLmFib3J0O1xyXG4gICAgICAgIHJldHVybiB0cmFucztcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gICAgaW5kZXhlZERCOiBJREJGYWN0b3J5O1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbmRleGVkREIgPSB3aW5kb3cuaW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubW96SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykud2Via2l0SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubXNJbmRleGVkREI7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRGJXcmFwcGVyIH0gZnJvbSAnLi9jbGFzc2VzL2RiV3JhcHBlcic7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vY2xhc3Nlcy91dGlscyc7XG5pbXBvcnQgeyBJbmRleERldGFpbHMgfSBmcm9tICcuL2NsYXNzZXMvaW5kZXhEZXRhaWxzJztcblxuXG5leHBvcnQgY2xhc3MgTmd4TmVvSURCIHtcbiAgdXRpbHM6IFV0aWxzO1xuICBkYldyYXBwZXI6IERiV3JhcHBlcjtcblxuICBjb25zdHJ1Y3RvcihkYk5hbWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSB7XG4gICAgdGhpcy51dGlscyA9IG5ldyBVdGlscygpO1xuICAgIHRoaXMuZGJXcmFwcGVyID0gbmV3IERiV3JhcHBlcihkYk5hbWUsIHZlcnNpb24pO1xuICB9XG5cbiAgb3BlbkRhdGFiYXNlKHZlcnNpb246IG51bWJlciwgdXBncmFkZUNhbGxiYWNrPzogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci5kYlZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudXRpbHMuaW5kZXhlZERCLm9wZW4odGhpcy5kYldyYXBwZXIuZGJOYW1lLCB2ZXJzaW9uKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5kYldyYXBwZXIuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KCdJbmRleGVkREIgZXJyb3I6ICcgKyAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlID9cbiAgICAgICAgICAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlICsgJyAoJyArICg8YW55PmUudGFyZ2V0KS5lcnJvciArICcpJyA6XG4gICAgICAgICAgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIHVwZ3JhZGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChlKSA9PiB7XG4gICAgICAgICAgdXBncmFkZUNhbGxiYWNrKGUsIHRoaXMuZGJXcmFwcGVyLmRiKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5S2V5KHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcblxuICAgICAgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChrZXkpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKDxhbnk+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbChzdG9yZU5hbWU6IHN0cmluZywga2V5UmFuZ2U/OiBJREJLZXlSYW5nZSwgaW5kZXhEZXRhaWxzPzogSW5kZXhEZXRhaWxzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcbiAgICAgIGlmIChpbmRleERldGFpbHMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChpbmRleERldGFpbHMuaW5kZXhOYW1lKSxcbiAgICAgICAgICBvcmRlciA9IChpbmRleERldGFpbHMub3JkZXIgPT09ICdkZXNjJykgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5vcGVuQ3Vyc29yKGtleVJhbmdlLCA8SURCQ3Vyc29yRGlyZWN0aW9uPm9yZGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAgKGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3Vyc29yOiBhbnkgPSAoPElEQk9wZW5EQlJlcXVlc3Q+ZXZ0LnRhcmdldCkucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgICBjdXJzb3JbJ2NvbnRpbnVlJ10oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBhZGQoc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGtleT86IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmFkZCh2YWx1ZSwga2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2dDogYW55KSA9PiB7XG4gICAgICAgIGtleSA9IGV2dC50YXJnZXQucmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZShzdG9yZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwga2V5PzogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgICBvYmplY3RTdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUoc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgb2JqZWN0U3RvcmVbJ2RlbGV0ZSddKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBvcGVuQ3Vyc29yKHN0b3JlTmFtZTogc3RyaW5nLCBjdXJzb3JDYWxsYmFjazogKGV2dDogRXZlbnQpID0+IHZvaWQsIGtleVJhbmdlPzogSURCS2V5UmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICBjdXJzb3JDYWxsYmFjayhldnQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoc3RvcmVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkd3JpdGUnLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgb2JqZWN0U3RvcmUuY2xlYXIoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5SW5kZXgoc3RvcmVOYW1lOiBzdHJpbmcsIGluZGV4TmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWRvbmx5JyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLFxuICAgICAgICBpbmRleCA9IG9iamVjdFN0b3JlLmluZGV4KGluZGV4TmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgoPElEQk9wZW5EQlJlcXVlc3Q+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7SUFRQTtLQVlFOzs7O0lBTk8sNkJBQU87OztJQUFkO1FBQ0UsT0FBTztZQUNMLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO0tBQ0g7O2dCQVhGLFFBQVEsU0FBQztvQkFDUixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLEVBQUU7aUJBQ1o7O0lBUUEsNEJBQUM7Q0FaRjs7Ozs7O0FDUkE7SUFLSSxtQkFBWSxNQUFjLEVBQUUsT0FBZTtRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7S0FDbEI7Ozs7O0lBRUQscUNBQWlCOzs7O0lBQWpCLFVBQWtCLFNBQWlCO1FBQy9C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