UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

446 lines 30.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { HttpParams } from '@angular/common/http'; /** * @template T */ var /** * @template T */ Scope = /** @class */ (function () { function Scope(service) { /* tslint:disable:variable-name */ this._pagination = {}; this._filter = {}; this._sort = {}; this._fields = {}; this._include = []; this._stats = {}; this.service = service; } /* tslint:enable:variable-name */ /* tslint:enable:variable-name */ /** * @private * @template T * @param {?} old * @return {?} */ Scope.clone = /* tslint:enable:variable-name */ /** * @private * @template T * @param {?} old * @return {?} */ function (old) { /** @type {?} */ var clone = new Scope(old.service); /** @type {?} */ var clonedAttr = cloneDeep(old, 'service'); clone._pagination = clonedAttr._pagination; clone._filter = clonedAttr._filter; clone._sort = clonedAttr._sort; clone._fields = clonedAttr._fields; clone._include = clonedAttr._include; clone._stats = clonedAttr._stats; return clone; }; /** * @param {?=} options * @return {?} */ Scope.prototype.all = /** * @param {?=} options * @return {?} */ function (options) { /** @type {?} */ var params = this.buildParams(); options = options || {}; return this.service.all(tslib_1.__assign({ params: params }, options)); }; /** * @param {?} id * @return {?} */ Scope.prototype.find = /** * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var params = this.buildParams(); return this.service.find(id, params); }; /** * @param {?} pageNumber * @return {?} */ Scope.prototype.page = /** * @param {?} pageNumber * @return {?} */ function (pageNumber) { /** @type {?} */ var clone = Scope.clone(this); clone._pagination.number = pageNumber; return clone; }; /** * @param {?} size * @return {?} */ Scope.prototype.per = /** * @param {?} size * @return {?} */ function (size) { /** @type {?} */ var clone = Scope.clone(this); clone._pagination.size = size; return clone; }; /** * @param {?} clause * @return {?} */ Scope.prototype.where = /** * @param {?} clause * @return {?} */ function (clause) { /** @type {?} */ var clone = Scope.clone(this); for (var key in clause) { if (clause.hasOwnProperty(key)) { clone._filter[key] = clause[key]; } } return clone; }; /** * @param {?} clause * @return {?} */ Scope.prototype.stats = /** * @param {?} clause * @return {?} */ function (clause) { /** @type {?} */ var clone = Scope.clone(this); for (var key in clause) { if (clause.hasOwnProperty(key)) { clone._stats[key] = clause[key]; } } return clone; }; /** * @param {?} clause * @return {?} */ Scope.prototype.order = /** * @param {?} clause * @return {?} */ function (clause) { /** @type {?} */ var clone = Scope.clone(this); if (typeof clause === 'string') { clone._sort[clause] = 'asc'; return clone; } // else for (var key in clause) { if (clause.hasOwnProperty(key)) { clone._sort[key] = clause[key]; } } return clone; }; /** * @param {?} clause * @return {?} */ Scope.prototype.select = /** * @param {?} clause * @return {?} */ function (clause) { /** @type {?} */ var clone = Scope.clone(this); if (Array.isArray(clause) || typeof clause === 'string') { /** @type {?} */ var type = clone.service.getModelConfig().type; clone._fields[type] = clause; return clone; } // else for (var key in clause) { if (clause.hasOwnProperty(key)) { clone._fields[key] = clause[key]; } } return clone; }; /** * @param {?} clause * @return {?} */ Scope.prototype.includes = /** * @param {?} clause * @return {?} */ function (clause) { var _a; /** @type {?} */ var clone = Scope.clone(this); if (Array.isArray(clause)) { (_a = clone._include).push.apply(_a, tslib_1.__spread(clause)); } else { clone._include.push(clause); } return clone; }; /** * @private * @return {?} */ Scope.prototype.buildParams = /** * @private * @return {?} */ function () { /** @type {?} */ var params = { page: this._pagination, filter: this._filter, sort: this.stringifySorts(this._sort), fields: this._fields, stats: this._stats, include: this.stringifyIncludes(this._include), }; return this.serializeParams(params); }; /** * @private * @param {?} sorts * @return {?} */ Scope.prototype.stringifySorts = /** * @private * @param {?} sorts * @return {?} */ function (sorts) { if (!sorts || Object.keys(sorts).length === 0) { return []; } /** @type {?} */ var params = []; for (var key in sorts) { if (sorts.hasOwnProperty(key)) { if (sorts[key] !== 'asc') { key = "-" + key; } params.push(key); } } return params; }; /** * @private * @param {?} includes * @return {?} */ Scope.prototype.stringifyIncludes = /** * @private * @param {?} includes * @return {?} */ function (includes) { var _this = this; if (!includes || (Object.keys(includes).length === 0 && includes.length === 0)) { return []; } /** @type {?} */ var params = []; if (Array.isArray(includes)) { /** @type {?} */ var array = includes.map((/** * @param {?} elt * @return {?} */ function (elt) { return _this.stringifyIncludes(elt); })).reduce((/** * @param {?} res * @param {?} elt1 * @return {?} */ function (res, elt1) { res.push.apply(res, tslib_1.__spread(elt1)); return res; }), []); params.push.apply(params, tslib_1.__spread(array)); return params; } // else if (typeof includes === 'object') { var _loop_1 = function (key) { if (includes.hasOwnProperty(key)) { /** @type {?} */ var array = this_1.stringifyIncludes(includes[key]).map((/** * @param {?} incl * @return {?} */ function (incl) { return key + "." + incl; })); params.push.apply(params, tslib_1.__spread(array)); } }; var this_1 = this; for (var key in includes) { _loop_1(key); } return params; } // else (is a string) params.push(includes); return params; }; /** * @private * @param {?} obj * @param {?=} params * @return {?} */ Scope.prototype.serializeParams = /** * @private * @param {?} obj * @param {?=} params * @return {?} */ function (obj, params) { if (!params) { params = new HttpParams(); } for (var key in obj) { if (!obj.hasOwnProperty(key) || !obj[key]) { continue; } /** @type {?} */ var value = obj[key]; if (Array.isArray(value)) { if (value.length > 0) { params = params.append(key, value.join(',')); } continue; } // else if (typeof value === 'object') { for (var subKey in value) { if (!value.hasOwnProperty(subKey)) { continue; } /** @type {?} */ var elt = {}; /** @type {?} */ var k = key + "[" + subKey + "]"; elt[k] = value[subKey]; params = this.serializeParams(elt, params); } continue; } // else params = params.append(key, value); } return params; }; return Scope; }()); /** * @template T */ export { Scope }; if (false) { /** * @type {?} * @private */ Scope.prototype.service; /** * @type {?} * @private */ Scope.prototype._pagination; /** * @type {?} * @private */ Scope.prototype._filter; /** * @type {?} * @private */ Scope.prototype._sort; /** * @type {?} * @private */ Scope.prototype._fields; /** * @type {?} * @private */ Scope.prototype._include; /** * @type {?} * @private */ Scope.prototype._stats; } /** * @param {?} obj * @param {?=} omit * @return {?} */ function cloneDeep(obj, omit) { omit = omit || []; omit = typeof omit === 'string' ? [omit] : omit; // Handle simple types if (!obj || typeof obj !== 'object') { return obj; } // Handle Date if (obj instanceof Date) { /** @type {?} */ var copy = new Date(); copy.setTime(obj.getTime()); return copy; } // Handle Array if (obj instanceof Array) { /** @type {?} */ var copy = []; for (var i = 0, len = obj.length; i < len; i++) { copy[i] = cloneDeep(obj[i]); } return copy; } // Handle Object if (obj instanceof Object) { /** @type {?} */ var copy_1 = {}; Object.keys(obj).filter((/** * @param {?} key * @return {?} */ function (key) { return !omit.includes(key); })).forEach((/** * @param {?} key * @return {?} */ function (key) { copy_1[key] = cloneDeep(obj[key]); })); return copy_1; } throw new Error('Unable to copy obj! Its type isn\'t supported.'); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvc2NvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFnQmxEOzs7O0lBd0JFLGVBQVksT0FBOEI7O1FBcEJsQyxnQkFBVyxHQUFjLEVBQUUsQ0FBQztRQUM1QixZQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQWMsRUFBRSxDQUFDO1FBQ3RCLFlBQU8sR0FBZSxFQUFFLENBQUM7UUFDekIsYUFBUSxHQUFpQixFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFlLEVBQUUsQ0FBQztRQWdCOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQWhCRCxpQ0FBaUM7Ozs7Ozs7O0lBRWxCLFdBQUs7Ozs7Ozs7SUFBcEIsVUFBNkMsR0FBYTs7WUFDbEQsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7O1lBQzlCLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUM1QyxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDM0MsS0FBSyxDQUFDLE9BQU8sR0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxLQUFLLEdBQVMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNyQyxLQUFLLENBQUMsT0FBTyxHQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDdkMsS0FBSyxDQUFDLFFBQVEsR0FBTSxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxNQUFNLEdBQVEsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7O0lBU00sbUJBQUc7Ozs7SUFBVixVQUFXLE9BQWdDOztZQUNu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dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEpzb25hcGlCYXNlU2VydmljZSB9IGZyb20gJy4vanNvbmFwaS1iYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi9yZXNvdXJjZS1iYXNlLm1vZGVsJztcbmltcG9ydCB7XG4gIFBhZ2VTY29wZSxcbiAgU29ydFNjb3BlLFxuICBGaWVsZFNjb3BlLFxuICBGaWx0ZXJTY29wZSxcbiAgU3RhdHNTY29wZSxcbiAgSW5jbHVkZVNjb3BlLFxuICBJbmNsdWRlQXJnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcXVlcnkuaW50ZXJmYWNlJztcblxuXG5leHBvcnQgY2xhc3MgU2NvcGU8VCBleHRlbmRzIFJlc291cmNlQmFzZT4ge1xuICBwcml2YXRlIHNlcnZpY2U6IEpzb25hcGlCYXNlU2VydmljZTxUPjtcblxuICAvKiB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lICovXG4gIHByaXZhdGUgX3BhZ2luYXRpb246IFBhZ2VTY29wZSA9IHt9O1xuICBwcml2YXRlIF9maWx0ZXI6IEZpbHRlclNjb3BlID0ge307XG4gIHByaXZhdGUgX3NvcnQ6IFNvcnRTY29wZSA9IHt9O1xuICBwcml2YXRlIF9maWVsZHM6IEZpZWxkU2NvcGUgPSB7fTtcbiAgcHJpdmF0ZSBfaW5jbHVkZTogSW5jbHVkZUFyZ1tdID0gW107XG4gIHByaXZhdGUgX3N0YXRzOiBTdGF0c1Njb3BlID0ge307XG4gIC8qIHRzbGludDplbmFibGU6dmFyaWFibGUtbmFtZSAqL1xuXG4gIHByaXZhdGUgc3RhdGljIGNsb25lPFQgZXh0ZW5kcyBSZXNvdXJjZUJhc2U+KG9sZDogU2NvcGU8VD4pOiBTY29wZTxUPiB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgU2NvcGUob2xkLnNlcnZpY2UpO1xuICAgIGNvbnN0IGNsb25lZEF0dHIgPSBjbG9uZURlZXAob2xkLCAnc2VydmljZScpO1xuICAgIGNsb25lLl9wYWdpbmF0aW9uID0gY2xvbmVkQXR0ci5fcGFnaW5hdGlvbjtcbiAgICBjbG9uZS5fZmlsdGVyICAgICA9IGNsb25lZEF0dHIuX2ZpbHRlcjtcbiAgICBjbG9uZS5fc29ydCAgICAgICA9IGNsb25lZEF0dHIuX3NvcnQ7XG4gICAgY2xvbmUuX2ZpZWxkcyAgICAgPSBjbG9uZWRBdHRyLl9maWVsZHM7XG4gICAgY2xvbmUuX2luY2x1ZGUgICAgPSBjbG9uZWRBdHRyLl9pbmNsdWRlO1xuICAgIGNsb25lLl9zdGF0cyAgICAgID0gY2xvbmVkQXR0ci5fc3RhdHM7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2VydmljZTogSnNvbmFwaUJhc2VTZXJ2aWNlPFQ+KSB7XG4gICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBhbGwoKTogT2JzZXJ2YWJsZTxUW10+O1xuICBwdWJsaWMgYWxsKG9wdGlvbnM6IHsgbWV0YWRhdGE6IHRydWUgfSk6IE9ic2VydmFibGU8eyBkYXRhOiBUW10sIG1ldGE6IGFueSB9PjtcblxuICBwdWJsaWMgYWxsKG9wdGlvbnM/OiB7IG1ldGFkYXRhPzogYm9vbGVhbiB9KTogT2JzZXJ2YWJsZTxUW10+IHwgT2JzZXJ2YWJsZTx7IGRhdGE6IFRbXSwgbWV0YTogYW55IH0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKCk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hbGwoeyBwYXJhbXMsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5idWlsZFBhcmFtcygpO1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZChpZCwgcGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBjbG9uZSA9IFNjb3BlLmNsb25lKHRoaXMpO1xuXG4gICAgY2xvbmUuX3BhZ2luYXRpb24ubnVtYmVyID0gcGFnZU51bWJlcjtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwdWJsaWMgcGVyKHNpemU6IG51bWJlcik6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBjbG9uZSA9IFNjb3BlLmNsb25lKHRoaXMpO1xuXG4gICAgY2xvbmUuX3BhZ2luYXRpb24uc2l6ZSA9IHNpemU7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgcHVibGljIHdoZXJlKGNsYXVzZTogRmlsdGVyU2NvcGUpOiBTY29wZTxUPiB7XG4gICAgY29uc3QgY2xvbmUgPSBTY29wZS5jbG9uZSh0aGlzKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGNsYXVzZSkge1xuICAgICAgaWYgKGNsYXVzZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNsb25lLl9maWx0ZXJba2V5XSA9IGNsYXVzZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwdWJsaWMgc3RhdHMoY2xhdXNlOiBTdGF0c1Njb3BlKTogU2NvcGU8VD4ge1xuICAgIGNvbnN0IGNsb25lID0gU2NvcGUuY2xvbmUodGhpcyk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjbGF1c2UpIHtcbiAgICAgIGlmIChjbGF1c2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjbG9uZS5fc3RhdHNba2V5XSA9IGNsYXVzZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwdWJsaWMgb3JkZXIoY2xhdXNlOiBTb3J0U2NvcGUgfCBzdHJpbmcpOiBTY29wZTxUPiB7XG4gICAgY29uc3QgY2xvbmUgPSBTY29wZS5jbG9uZSh0aGlzKTtcblxuICAgIGlmICh0eXBlb2YgY2xhdXNlID09PSAnc3RyaW5nJykge1xuICAgICAgY2xvbmUuX3NvcnRbY2xhdXNlXSA9ICdhc2MnO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH0gLy8gZWxzZVxuICAgIGZvciAoY29uc3Qga2V5IGluIGNsYXVzZSkge1xuICAgICAgaWYgKGNsYXVzZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNsb25lLl9zb3J0W2tleV0gPSBjbGF1c2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0KGNsYXVzZTogRmllbGRTY29wZSB8IHN0cmluZyB8IHN0cmluZ1tdKTogU2NvcGU8VD4ge1xuICAgIGNvbnN0IGNsb25lID0gU2NvcGUuY2xvbmUodGhpcyk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjbGF1c2UpIHx8IHR5cGVvZiBjbGF1c2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB0eXBlID0gY2xvbmUuc2VydmljZS5nZXRNb2RlbENvbmZpZygpLnR5cGU7XG4gICAgICBjbG9uZS5fZmllbGRzW3R5cGVdID0gY2xhdXNlO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH0gLy8gZWxzZVxuICAgIGZvciAoY29uc3Qga2V5IGluIGNsYXVzZSkge1xuICAgICAgaWYgKGNsYXVzZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNsb25lLl9maWVsZHNba2V5XSA9IGNsYXVzZVtrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIHB1YmxpYyBpbmNsdWRlcyhjbGF1c2U6IEluY2x1ZGVTY29wZSk6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBjbG9uZSA9IFNjb3BlLmNsb25lKHRoaXMpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2xhdXNlKSkge1xuICAgICAgY2xvbmUuX2luY2x1ZGUucHVzaCguLi5jbGF1c2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbG9uZS5faW5jbHVkZS5wdXNoKGNsYXVzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFBhcmFtcygpOiBIdHRwUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBwYWdlOiB0aGlzLl9wYWdpbmF0aW9uLFxuICAgICAgZmlsdGVyOiB0aGlzLl9maWx0ZXIsXG4gICAgICBzb3J0OiB0aGlzLnN0cmluZ2lmeVNvcnRzKHRoaXMuX3NvcnQpLFxuICAgICAgZmllbGRzOiB0aGlzLl9maWVsZHMsXG4gICAgICBzdGF0czogdGhpcy5fc3RhdHMsXG4gICAgICBpbmNsdWRlOiB0aGlzLnN0cmluZ2lmeUluY2x1ZGVzKHRoaXMuX2luY2x1ZGUpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUGFyYW1zKHBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeVNvcnRzKHNvcnRzOiBTb3J0U2NvcGUgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCFzb3J0cyB8fCBPYmplY3Qua2V5cyhzb3J0cykubGVuZ3RoID09PSAwKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQga2V5IGluIHNvcnRzKSB7XG4gICAgICBpZiAoc29ydHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoc29ydHNba2V5XSAhPT0gJ2FzYycpIHsga2V5ID0gYC0ke2tleX1gOyB9XG4gICAgICAgIHBhcmFtcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RyaW5naWZ5SW5jbHVkZXMoaW5jbHVkZXM6IEluY2x1ZGVTY29wZSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIWluY2x1ZGVzIHx8IChPYmplY3Qua2V5cyhpbmNsdWRlcykubGVuZ3RoID09PSAwICYmIGluY2x1ZGVzLmxlbmd0aCA9PT0gMCkpIHsgcmV0dXJuIFtdOyB9XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5jbHVkZXMpKSB7XG4gICAgICBjb25zdCBhcnJheSA9IGluY2x1ZGVzLm1hcChlbHQgPT4gdGhpcy5zdHJpbmdpZnlJbmNsdWRlcyhlbHQpKS5yZWR1Y2UoKHJlcywgZWx0MSkgPT4geyByZXMucHVzaCguLi5lbHQxKTsgcmV0dXJuIHJlczsgfSwgW10pO1xuICAgICAgcGFyYW1zLnB1c2goLi4uYXJyYXkpO1xuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9IC8vIGVsc2VcbiAgICBpZiAodHlwZW9mIGluY2x1ZGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5jbHVkZXMpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuc3RyaW5naWZ5SW5jbHVkZXMoaW5jbHVkZXNba2V5XSkubWFwKGluY2wgPT4gYCR7a2V5fS4ke2luY2x9YCk7XG4gICAgICAgICAgcGFyYW1zLnB1c2goLi4uYXJyYXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH0gLy8gZWxzZSAoaXMgYSBzdHJpbmcpXG4gICAgcGFyYW1zLnB1c2goaW5jbHVkZXMpO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZVBhcmFtcyhvYmo6IGFueSwgcGFyYW1zPzogSHR0cFBhcmFtcyk6IEh0dHBQYXJhbXMge1xuICAgIGlmICghcGFyYW1zKSB7IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7IH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkgfHwgIW9ialtrZXldKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZS5qb2luKCcsJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZWxzZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlLmhhc093blByb3BlcnR5KHN1YktleSkpIHsgY29udGludWU7IH1cblxuICAgICAgICAgIGNvbnN0IGVsdCA9IHt9O1xuICAgICAgICAgIGNvbnN0IGsgPSBgJHtrZXl9WyR7c3ViS2V5fV1gO1xuICAgICAgICAgIGVsdFtrXSA9IHZhbHVlW3N1YktleV07XG4gICAgICAgICAgcGFyYW1zID0gdGhpcy5zZXJpYWxpemVQYXJhbXMoZWx0LCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZWxzZVxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lRGVlcChvYmosIG9taXQ/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICBvbWl0ID0gb21pdCB8fCBbXTtcbiAgb21pdCA9IHR5cGVvZiBvbWl0ID09PSAnc3RyaW5nJyA/IFtvbWl0XSA6IG9taXQ7XG5cbiAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlc1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgeyByZXR1cm4gb2JqOyB9XG5cbiAgLy8gSGFuZGxlIERhdGVcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBjb3B5ID0gbmV3IERhdGUoKTtcbiAgICBjb3B5LnNldFRpbWUob2JqLmdldFRpbWUoKSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvLyBIYW5kbGUgQXJyYXlcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgY29weSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBvYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvcHlbaV0gPSBjbG9uZURlZXAob2JqW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvLyBIYW5kbGUgT2JqZWN0XG4gIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICBjb25zdCBjb3B5ID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoa2V5ID0+ICFvbWl0LmluY2x1ZGVzKGtleSkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvcHlba2V5XSA9IGNsb25lRGVlcChvYmpba2V5XSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjb3B5IG9iaiEgSXRzIHR5cGUgaXNuXFwndCBzdXBwb3J0ZWQuJyk7XG59XG4iXX0=