UNPKG

ng-storage-local

Version:

An Angular module that makes Web Storage working in the Angular Way

259 lines 29.4 kB
import { __awaiter } from "tslib"; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class NgStorage { /** @LocalStorage Service */ /** @setLocalStorage * Set data in local storage */ setLocalStorage(options) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (options.storageKey && options.storageType && options.storageData) { if (options.storageType == "JSON" /* JSON */) { this.convertJsonToString(options.storageData); this.saveDataInLocalStorage(options.storageKey, this.convertJsonToString(options.storageData)); } else if (options.storageType == "STRING" /* STRING */) { this.saveDataInLocalStorage(options.storageKey, options.storageData); } resolve({ error: false, message: "data store successfully" }); } else { reject({ error: true, message: "Please check parameters" }); } }); }); } /** @getLocalStorage * Get data in local storage */ getLocalStorage(options) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.localStorage.getItem(options.storageKey)) { if (options.storageType == "JSON" /* JSON */) { resolve(this.convertStringToJson(window.localStorage.getItem(options.storageKey))); } else if (options.storageType == "STRING" /* STRING */) { resolve(window.localStorage.getItem(options.storageKey)); } } else { reject({ error: true, message: options.storageKey + " No data found" }); } reject(new TypeError('Something Wrong')); }); }); } /** @removeLocalStorageItem * Remove data in local storage */ removeLocalStorageItem(key) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (key) { window.localStorage.removeItem(key); resolve({ error: false, message: key + " removed successfully" }); } else { reject({ error: true, message: "Please pass key to remove" }); } }); }); } /** @getLocalStorageLength * Get total local storage */ getLocalStorageLength() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.localStorage.length > 0) { resolve({ error: false, session: window.localStorage.length }); } else { reject({ error: true, message: " No local storage stored" }); } }); }); } /** @getLocalStorageAllKey * Get all local storage KEY list */ getLocalStorageAllKey() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.localStorage.length > 0) { let allLocalStorageKeyList = []; for (let index = 0; index < window.localStorage.length; index++) { allLocalStorageKeyList.push({ keyIndex: index, keyName: window.localStorage.key(index) }); resolve(allLocalStorageKeyList); } } else { reject({ error: true, message: " No local storage stored" }); } }); }); } /* To Clear Local Storage */ clearAllLocalStorage() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.localStorage.length > 0) { window.localStorage.clear(); resolve({ error: false, message: "All local storage are cleared" }); } else { reject({ error: true, message: " No local storage stored" }); } }); }); } /** @SessionStorage Service */ /** @setSessionStorage * Set data in session storage */ setSessionStorage(options) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (options.storageKey && options.storageType && options.storageData) { if (options.storageType == "JSON" /* JSON */) { this.convertJsonToString(options.storageData); this.saveDataInSessionStorage(options.storageKey, this.convertJsonToString(options.storageData)); } else if (options.storageType == "STRING" /* STRING */) { this.saveDataInSessionStorage(options.storageKey, options.storageData); } resolve({ error: false, message: "data store successfully" }); } else { reject({ error: true, message: "Please check parameters" }); } }); }); } /** @getSessionStorage * Get data in session storage */ getSessionStorage(options) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.sessionStorage.getItem(options.storageKey)) { if (options.storageType == "JSON" /* JSON */) { resolve(this.convertStringToJson(window.sessionStorage.getItem(options.storageKey))); } else if (options.storageType == "STRING" /* STRING */) { resolve(window.sessionStorage.getItem(options.storageKey)); } } else { reject({ error: true, message: options.storageKey + " No data found" }); } reject(new TypeError('Something Wrong')); }); }); } /** @getSessionStorageLength * Get total session storage */ getSessionStorageLength() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.sessionStorage.length > 0) { resolve({ error: false, session: window.sessionStorage.length }); } else { reject({ error: true, message: " No session stored" }); } }); }); } /** @getSessionStorageAllKey * Get all session storage KEY list */ getSessionStorageAllKey() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.sessionStorage.length > 0) { let allSessionStorageKeyList = []; for (let index = 0; index < window.sessionStorage.length; index++) { allSessionStorageKeyList.push({ keyIndex: index, keyName: window.sessionStorage.key(index) }); resolve(allSessionStorageKeyList); } } else { reject({ error: true, message: " No session storage stored" }); } }); }); } /** @removeLocalStorageItem * Remove data in local storage */ removeSessionStorageItem(key) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (key) { window.sessionStorage.removeItem(key); resolve({ error: false, message: key + " removed successfully" }); } else { reject({ error: true, message: "Please pass key to remove" }); } }); }); } clearAllSessionStorage() { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { if (window.sessionStorage.length > 0) { window.sessionStorage.clear(); resolve({ error: false, message: "All session storage are cleared" }); } else { reject({ error: true, message: " No session storage stored" }); } }); }); } convertJsonToString(json) { return JSON.stringify(json); } convertStringToJson(stringData) { return JSON.parse(stringData); } saveDataInLocalStorage(storageName, storageData) { window.localStorage.setItem(storageName, storageData); } saveDataInSessionStorage(storageName, storageData) { window.sessionStorage.setItem(storageName, storageData); } } NgStorage.ɵprov = i0.ɵɵdefineInjectable({ factory: function NgStorage_Factory() { return new NgStorage(); }, token: NgStorage, providedIn: "root" }); NgStorage.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3Byb2plY3RzL25nLXN0b3JhZ2Uvc3JjLyIsInNvdXJjZXMiOlsibGliL3N0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFRM0MsTUFBTSxPQUFPLFNBQVM7SUFFcEI7O09BRUc7SUFHSDs7O01BR0U7SUFDSSxlQUFlLENBQUMsT0FBc0I7O1lBQzFDLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtvQkFDcEUsSUFBSSxPQUFPLENBQUMsV0FBVyxxQkFBd0IsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO3FCQUMvRjt5QkFDSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLHlCQUEwQixFQUFFO3dCQUN0RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3RFO29CQUNELE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztpQkFDL0Q7cUJBQ0k7b0JBQ0gsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RDtZQUVILENBQUMsQ0FBQyxDQUFDO1FB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OUIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFVBQVU7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVztRQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxXQUFXO1FBQ3ZELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUN6RCxDQUFDOzs7O1lBL1BGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdldFN0b3JhZ2VDb25mbGlnLCBTdG9yYWdlQ29uZmlnLCBTdG9yYWdlVHlwZVVuaXQgfSBmcm9tICcuL3N0b3JhZ2VNb2RlbFBlcm1UeXBlJztcblxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5nU3RvcmFnZSB7XG5cbiAgLyoqXG4gICBATG9jYWxTdG9yYWdlIFNlcnZpY2VcbiAgICovXG5cblxuICAvKipcbiAgQHNldExvY2FsU3RvcmFnZVxuICAqIFNldCBkYXRhIGluIGxvY2FsIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlKG9wdGlvbnM6IFN0b3JhZ2VDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VLZXkgJiYgb3B0aW9ucy5zdG9yYWdlVHlwZSAmJiBvcHRpb25zLnN0b3JhZ2VEYXRhKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5KU09OKSB7XG4gICAgICAgICAgdGhpcy5jb252ZXJ0SnNvblRvU3RyaW5nKG9wdGlvbnMuc3RvcmFnZURhdGEpO1xuICAgICAgICAgIHRoaXMuc2F2ZURhdGFJbkxvY2FsU3RvcmFnZShvcHRpb25zLnN0b3JhZ2VLZXksIHRoaXMuY29udmVydEpzb25Ub1N0cmluZyhvcHRpb25zLnN0b3JhZ2VEYXRhKSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5TVFJJTkcpIHtcbiAgICAgICAgICB0aGlzLnNhdmVEYXRhSW5Mb2NhbFN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCBvcHRpb25zLnN0b3JhZ2VEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcImRhdGEgc3RvcmUgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIGNoZWNrIHBhcmFtZXRlcnNcIiB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRMb2NhbFN0b3JhZ2VcbiAgKiBHZXQgZGF0YSBpbiBsb2NhbCBzdG9yYWdlXG4gICovXG4gIGFzeW5jIGdldExvY2FsU3RvcmFnZShvcHRpb25zOiBHZXRTdG9yYWdlQ29uZmxpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0ob3B0aW9ucy5zdG9yYWdlS2V5KSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuSlNPTikge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5jb252ZXJ0U3RyaW5nVG9Kc29uKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKSlcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5TVFJJTkcpIHtcbiAgICAgICAgICByZXNvbHZlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBvcHRpb25zLnN0b3JhZ2VLZXkgKyBcIiBObyBkYXRhIGZvdW5kXCIgfSk7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignU29tZXRoaW5nIFdyb25nJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtXG4gICogUmVtb3ZlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAqL1xuICBhc3luYyByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmVzb2x2ZSh7IGVycm9yOiBmYWxzZSwgbWVzc2FnZToga2V5ICsgXCIgcmVtb3ZlZCBzdWNjZXNzZnVsbHlcIiB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZWplY3QoeyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJQbGVhc2UgcGFzcyBrZXkgdG8gcmVtb3ZlXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0TG9jYWxTdG9yYWdlTGVuZ3RoXG4gICogR2V0IHRvdGFsIGxvY2FsIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgZ2V0TG9jYWxTdG9yYWdlTGVuZ3RoKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzb2x2ZSh7IGVycm9yOiBmYWxzZSwgc2Vzc2lvbjogd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIGxvY2FsIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0TG9jYWxTdG9yYWdlQWxsS2V5XG4gICogR2V0IGFsbCBsb2NhbCBzdG9yYWdlIEtFWSBsaXN0XG4gICovXG4gIGFzeW5jIGdldExvY2FsU3RvcmFnZUFsbEtleSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0OiBBcnJheTx7IGtleU5hbWU6IHN0cmluZywga2V5SW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0LnB1c2goe1xuICAgICAgICAgICAga2V5SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAga2V5TmFtZTogd2luZG93LmxvY2FsU3RvcmFnZS5rZXkoaW5kZXgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzb2x2ZShhbGxMb2NhbFN0b3JhZ2VLZXlMaXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBcIiBObyBsb2NhbCBzdG9yYWdlIHN0b3JlZFwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiBUbyBDbGVhciBMb2NhbCBTdG9yYWdlICovXG4gIGFzeW5jIGNsZWFyQWxsTG9jYWxTdG9yYWdlKCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcIkFsbCBsb2NhbCBzdG9yYWdlIGFyZSBjbGVhcmVkXCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIGxvY2FsIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuICAvKipcbiAgICAgQFNlc3Npb25TdG9yYWdlIFNlcnZpY2VcbiAgKi9cblxuXG4gIC8qKlxuICBAc2V0U2Vzc2lvblN0b3JhZ2VcbiAgKiBTZXQgZGF0YSBpbiBzZXNzaW9uIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgc2V0U2Vzc2lvblN0b3JhZ2Uob3B0aW9uczogU3RvcmFnZUNvbmZpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuc3RvcmFnZUtleSAmJiBvcHRpb25zLnN0b3JhZ2VUeXBlICYmIG9wdGlvbnMuc3RvcmFnZURhdGEpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGVVbml0LkpTT04pIHtcbiAgICAgICAgICB0aGlzLmNvbnZlcnRKc29uVG9TdHJpbmcob3B0aW9ucy5zdG9yYWdlRGF0YSk7XG4gICAgICAgICAgdGhpcy5zYXZlRGF0YUluU2Vzc2lvblN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCB0aGlzLmNvbnZlcnRKc29uVG9TdHJpbmcob3B0aW9ucy5zdG9yYWdlRGF0YSkpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuU1RSSU5HKSB7XG4gICAgICAgICAgdGhpcy5zYXZlRGF0YUluU2Vzc2lvblN0b3JhZ2Uob3B0aW9ucy5zdG9yYWdlS2V5LCBvcHRpb25zLnN0b3JhZ2VEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcImRhdGEgc3RvcmUgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIGNoZWNrIHBhcmFtZXRlcnNcIiB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRTZXNzaW9uU3RvcmFnZVxuICAqIEdldCBkYXRhIGluIHNlc3Npb24gc3RvcmFnZVxuICAqL1xuICBhc3luYyBnZXRTZXNzaW9uU3RvcmFnZShvcHRpb25zOiBHZXRTdG9yYWdlQ29uZmxpZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlVW5pdC5KU09OKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLmNvbnZlcnRTdHJpbmdUb0pzb24od2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0ob3B0aW9ucy5zdG9yYWdlS2V5KSkpXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZVVuaXQuU1RSSU5HKSB7XG4gICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShvcHRpb25zLnN0b3JhZ2VLZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBvcHRpb25zLnN0b3JhZ2VLZXkgKyBcIiBObyBkYXRhIGZvdW5kXCIgfSk7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignU29tZXRoaW5nIFdyb25nJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIEBnZXRTZXNzaW9uU3RvcmFnZUxlbmd0aFxuICAqIEdldCB0b3RhbCBzZXNzaW9uIHN0b3JhZ2VcbiAgKi9cbiAgYXN5bmMgZ2V0U2Vzc2lvblN0b3JhZ2VMZW5ndGgoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc29sdmUoeyBlcnJvcjogZmFsc2UsIHNlc3Npb246IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiIE5vIHNlc3Npb24gc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICBAZ2V0U2Vzc2lvblN0b3JhZ2VBbGxLZXlcbiAgKiBHZXQgYWxsIHNlc3Npb24gc3RvcmFnZSBLRVkgbGlzdFxuICAqL1xuICBhc3luYyBnZXRTZXNzaW9uU3RvcmFnZUFsbEtleSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2luZG93LnNlc3Npb25TdG9yYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGFsbFNlc3Npb25TdG9yYWdlS2V5TGlzdDogQXJyYXk8eyBrZXlOYW1lOiBzdHJpbmcsIGtleUluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBhbGxTZXNzaW9uU3RvcmFnZUtleUxpc3QucHVzaCh7XG4gICAgICAgICAgICBrZXlJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBrZXlOYW1lOiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uua2V5KGluZGV4KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc29sdmUoYWxsU2Vzc2lvblN0b3JhZ2VLZXlMaXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlamVjdCh7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiBcIiBObyBzZXNzaW9uIHN0b3JhZ2Ugc3RvcmVkXCIgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBcbiAgLyoqXG4gIEByZW1vdmVMb2NhbFN0b3JhZ2VJdGVtXG4gICogUmVtb3ZlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAqL1xuICBhc3luYyByZW1vdmVTZXNzaW9uU3RvcmFnZUl0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHJlc29sdmUoeyBlcnJvcjogZmFsc2UsIG1lc3NhZ2U6IGtleSArIFwiIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5XCIgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiUGxlYXNlIHBhc3Mga2V5IHRvIHJlbW92ZVwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgYXN5bmMgY2xlYXJBbGxTZXNzaW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiBcIkFsbCBzZXNzaW9uIHN0b3JhZ2UgYXJlIGNsZWFyZWRcIiB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZWplY3QoeyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCIgTm8gc2Vzc2lvbiBzdG9yYWdlIHN0b3JlZFwiIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuXG5cbiAgcHJpdmF0ZSBjb252ZXJ0SnNvblRvU3RyaW5nKGpzb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1RvSnNvbihzdHJpbmdEYXRhKTogSlNPTiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyaW5nRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVEYXRhSW5Mb2NhbFN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VEYXRhKSB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZURhdGFJblNlc3Npb25TdG9yYWdlKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSkge1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VOYW1lLCBzdG9yYWdlRGF0YSlcbiAgfVxuXG59XG4iXX0=