@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
JavaScript
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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