@kolektor/nucleus-notifications 0.0.8-pre.5352 → 0.0.9-pre.5702

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"kolektor-nucleus-notifications.umd.js","sources":["../../../node_modules/tslib/tslib.es6.js","../../../projects/nucleus-notifications/src/lib/models.ts","../../../projects/nucleus-notifications/src/lib/nucleus-notifications.service.ts","../../../projects/nucleus-notifications/src/lib/nucleus-notifications.module.ts","../../../projects/nucleus-notifications/src/public-api.ts","../../../projects/nucleus-notifications/src/kolektor-nucleus-notifications.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export class Notification {\r\n public id: string;\r\n public sender: Identity;\r\n public data: NotificationData;\r\n public isRead: boolean;\r\n public dateCreated: Date;\r\n public expirationDate: Date;\r\n}\r\n\r\nexport class Identity {\r\n public subject: string;\r\n public name: string;\r\n public pictureUrl: string;\r\n}\r\n\r\nexport class Recipient {\r\n public attributeName: string;\r\n public directoryName: string;\r\n public attributeValue: string;\r\n}\r\n\r\nexport class NotificationData {\r\n title: string;\r\n message: string;\r\n htmlMessage: string;\r\n preventDismissal: boolean;\r\n deepLink: string;\r\n}\r\n\r\nexport class WebKey {\r\n publicKey: string;\r\n}\r\n\r\nexport class Registration {\r\n id: string;\r\n token: string;\r\n platform: PlatformValue;\r\n}\r\n\r\nexport class RegistrationResult {\r\n id: string;\r\n}\r\n\r\nexport class PayloadData {\r\n notificationId: string;\r\n eventType: NotificationEventType;\r\n}\r\n\r\nexport class NucleusNotificationsConfig {\r\n serverApiUrl: string;\r\n}\r\n\r\nexport class NotificationClick {\r\n id: string;\r\n type: NotificationType;\r\n routerLink?: string;\r\n}\r\n\r\nexport type NotificationEventType = 'new' | 'updated' | 'deleted' | 'deletedAll' | 'updatedAll' | 'newSilent';\r\n\r\nexport type PlatformValue = 'ios' | 'android' | 'web' | 'none';\r\n\r\nexport type NotificationType = 'default' | 'deeplink';\r\n\r\nexport interface ChannelId {\r\n senderId: string;\r\n channelId: string;\r\n}\r\n\r\nexport class UserChannelConfig {\r\n channelId: string;\r\n displayName: string;\r\n isSubscribed: boolean;\r\n subscriptionType: ChannelSubscriptionType;\r\n methods: NotifyMethod[];\r\n allowedMethods: NotifyMethod[];\r\n}\r\n\r\nexport type ChannelSubscriptionType = 'invariant' | 'optIn' | 'optOut';\r\n\r\nexport type NotifyMethod = 'push' | 'email' | 'sms';\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { SwPush } from '@angular/service-worker';\r\nimport { PushNotifications, PushNotificationSchema } from '@capacitor/push-notifications';\r\nimport { NucleusAppService } from '@kolektor/nucleus-common';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport {\r\n ChannelId,\r\n Notification,\r\n NotificationClick,\r\n NotificationEventType,\r\n NotificationType,\r\n NucleusNotificationsConfig,\r\n PayloadData,\r\n PlatformValue,\r\n Registration,\r\n RegistrationResult,\r\n UserChannelConfig,\r\n WebKey\r\n} from './models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NucleusNotificationsService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private swPush: SwPush,\r\n private appService: NucleusAppService,\r\n config: NucleusNotificationsConfig\r\n ) {\r\n let url = config.serverApiUrl;\r\n if (!url.endsWith('/')) {\r\n url += '/';\r\n }\r\n this.apiUrl = url;\r\n }\r\n\r\n private apiUrl = null;\r\n private readonly registrationStorageKey = 'NucleusNotificationsRegistrationId';\r\n private readonly notificationsStorageKey = 'NucleusNotificationsLocalCache';\r\n private _platform: PlatformValue;\r\n private _isInitialized = false;\r\n private _newNotifications = new Subject<Notification>();\r\n private _clicksSubject = new Subject<NotificationClick>();\r\n private _stateChangesSubject = new Subject<void>();\r\n\r\n public notifications: Notification[] = [];\r\n\r\n public get unreadCount() {\r\n return this.notifications.filter(x => !x.isRead).length;\r\n }\r\n\r\n public get newNotifications() {\r\n return this._newNotifications.asObservable();\r\n }\r\n\r\n public get clicks() {\r\n return this._clicksSubject.asObservable();\r\n }\r\n public get stateChanges() {\r\n return this._stateChangesSubject.asObservable();\r\n }\r\n\r\n public get isInitialized() {\r\n return this._isInitialized;\r\n }\r\n\r\n public async initialize() {\r\n // make sure app service has finished initializing\r\n await this.appService.init();\r\n\r\n this.loadFromStorage();\r\n\r\n if (this.appService.isNative) {\r\n this._platform = this.appService.deviceInfo.platform as PlatformValue;\r\n await this.registerCapacitorEvents();\r\n } else if (this.swPush.isEnabled) {\r\n this._platform = 'web';\r\n this.registerWebPushEvents();\r\n } else {\r\n console.warn('Nucleus.Notifications: There is no push capability, timer will be used to update notifications');\r\n setInterval(() => {\r\n console.log('Updating notifications...');\r\n this.refresh(true);\r\n }, 5 * 60 * 1000);\r\n }\r\n this._isInitialized = true;\r\n this.refresh();\r\n }\r\n\r\n public register(): Promise<any> {\r\n return new Promise((_resolve, _reject) => {\r\n this.getRegistrationInfo().then((info) => {\r\n this.http.post<RegistrationResult>(this.apiUrl + 'registration', info).subscribe((regResult) => {\r\n window.localStorage.setItem(this.registrationStorageKey, regResult.id);\r\n _resolve(null);\r\n }, error => {\r\n console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);\r\n _reject(error);\r\n });\r\n }).catch((error) => _reject(error));\r\n });\r\n }\r\n\r\n public unregister(): Promise<any> {\r\n return new Promise((_resolve, _reject) => {\r\n this.getRegistrationInfo().then((info) => {\r\n this.http.request<any>('DELETE', this.apiUrl + 'registration', { body: info }).subscribe(() => {\r\n window.localStorage.removeItem(this.registrationStorageKey);\r\n _resolve(null);\r\n }, error => {\r\n console.log('Nucleus.Notifications: Failed to remove registration from server.', error);\r\n _reject(error);\r\n });\r\n }).catch((error) => _reject(error));\r\n });\r\n }\r\n\r\n public refresh(notifyAboutNew = false) {\r\n this.http.get<Notification[]>(this.apiUrl + 'notifications').subscribe(res => {\r\n this.updateNotifications(res, notifyAboutNew);\r\n });\r\n }\r\n\r\n public getNotification(id: string): Observable<Notification> {\r\n const localNotification = this.notifications.find(x => x.id === id);\r\n if (localNotification) {\r\n return of(localNotification);\r\n }\r\n return this.http.get<Notification>(this.apiUrl + 'notifications/' + id);\r\n }\r\n\r\n public readNotification(id: string) {\r\n const n = this.notifications.find(x => x.id === id);\r\n if (n && !n.isRead) {\r\n n.isRead = true;\r\n this.notifyStateChanged();\r\n }\r\n this.http.get(this.apiUrl + 'notifications/read/' + id).subscribe();\r\n }\r\n\r\n public dismissNotification(id: string) {\r\n this.deleteNotificaton(id);\r\n this.http.delete(this.apiUrl + 'notifications/' + id).subscribe();\r\n this.removeDeliveredNotification(id);\r\n }\r\n\r\n public dismissAll() {\r\n this.notifications.splice(0);\r\n this.notifyStateChanged();\r\n this.http.delete(this.apiUrl + 'notifications/all').subscribe();\r\n if (this._platform === 'ios' || this._platform === 'android') {\r\n PushNotifications.removeAllDeliveredNotifications();\r\n } else if (this._platform === 'web') {\r\n // TODO: remove all web push notifications\r\n }\r\n }\r\n\r\n public readAll() {\r\n for (const n of this.notifications) {\r\n n.isRead = true;\r\n }\r\n this.notifyStateChanged();\r\n this.http.get(this.apiUrl + 'notifications/read/all').subscribe();\r\n }\r\n\r\n public getChannelConfig(senderId: string, channelId: string, language: string = null) {\r\n return this.http.get<UserChannelConfig>(this.apiUrl + `settings/channel/${senderId}/${channelId}?language=${language}`);\r\n }\r\n\r\n public getChannelConfigsForSender(senderId: string, channelIds: string[], language: string = null) {\r\n const idsStr = channelIds.map(x => senderId + ',' + x).join(';');\r\n return this.getChannelConfigsInternal(idsStr, language);\r\n }\r\n\r\n public getChannelConfigs(ids: ChannelId[], language: string = null) {\r\n const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');\r\n return this.getChannelConfigsInternal(idsStr, language);\r\n }\r\n\r\n public setChannelConfig(senderId: string, config: UserChannelConfig) {\r\n return this.http.post<void>(`${this.apiUrl}settings/channel/${senderId}`, config);\r\n }\r\n\r\n public setChannelConfigs(configs: UserChannelConfig[]) {\r\n return this.http.post<void>(`${this.apiUrl}settings/channels`, configs);\r\n }\r\n\r\n private getChannelConfigsInternal(ids: string, language: string) {\r\n return this.http.get<UserChannelConfig[]>(`${this.apiUrl}settings/channels?ids=${ids}&language=${language}`);\r\n }\r\n\r\n private updateNotifications(newNotifications: Notification[], notifyAboutNew = false) {\r\n let stateChanged = false;\r\n for (const n of newNotifications) {\r\n const existing = this.notifications.find(x => x.id === n.id);\r\n if (existing) {\r\n if (existing.isRead !== n.isRead) {\r\n existing.isRead = n.isRead;\r\n stateChanged = true;\r\n }\r\n } else {\r\n let i = 0;\r\n while (i < this.notifications.length && n.dateCreated < this.notifications[i].dateCreated) {\r\n i++;\r\n }\r\n this.notifications.splice(i, 0, n);\r\n stateChanged = true;\r\n if (notifyAboutNew) {\r\n this._newNotifications.next(n);\r\n }\r\n }\r\n }\r\n\r\n const now = Date.now();\r\n for (let i = this.notifications.length - 1; i >= 0; i--) {\r\n const n = this.notifications[i];\r\n if (new Date(n.expirationDate).getTime() < now || !newNotifications.find(x => x.id === n.id)) {\r\n this.notifications.splice(i, 1);\r\n stateChanged = true;\r\n }\r\n }\r\n\r\n if (stateChanged) {\r\n this.notifyStateChanged();\r\n }\r\n }\r\n\r\n private saveToStorage() {\r\n const str = JSON.stringify(this.notifications);\r\n window.localStorage.setItem(this.notificationsStorageKey, str);\r\n }\r\n\r\n private loadFromStorage() {\r\n try {\r\n const str = window.localStorage.getItem(this.notificationsStorageKey);\r\n if (str) {\r\n const notifications = JSON.parse(str) as Notification[];\r\n this.notifications = notifications.filter(x => !!x);\r\n // precaution for notification.isRead of undefined error\r\n this.notifyStateChanged(false);\r\n }\r\n } catch { }\r\n }\r\n\r\n private handleNotificationEvent(id: string, eventType: NotificationEventType) {\r\n if (eventType.startsWith('new') || eventType === 'updated') { // we are handling new and newSilent\r\n this.getNotification(id).subscribe(n => {\r\n if (eventType.startsWith('new') && !n.isRead) {\r\n this._newNotifications.next(n);\r\n }\r\n const existing = this.notifications.find(x => x.id === n.id);\r\n if (existing) {\r\n existing.isRead = n.isRead;\r\n } else {\r\n this.notifications.splice(0, 0, n);\r\n }\r\n this.notifyStateChanged();\r\n });\r\n } else if (eventType === 'deleted') {\r\n this.deleteNotificaton(id);\r\n } else {\r\n this.refresh();\r\n }\r\n }\r\n\r\n private deleteNotificaton(id: string) {\r\n const i = this.notifications.findIndex(x => x.id === id);\r\n if (i >= 0) {\r\n this.notifications.splice(i, 1);\r\n this.notifyStateChanged();\r\n }\r\n }\r\n\r\n private notifyStateChanged(persistState = true) {\r\n if (persistState) {\r\n this.saveToStorage();\r\n }\r\n this._stateChangesSubject.next();\r\n }\r\n\r\n private handleNotificationAction(notificationAction: string) {\r\n const arr = notificationAction.split(':');\r\n const notificationClick: NotificationClick = {\r\n id: arr[0],\r\n type: arr[1] as NotificationType,\r\n routerLink: arr[2]\r\n };\r\n\r\n const validNotificationClickTypes = ['default', 'deeplink'];\r\n if (validNotificationClickTypes.includes(notificationClick.type)) {\r\n this._clicksSubject.next(notificationClick);\r\n } else {\r\n console.error(`Nucleus.Notifications: Unknown notification action: '${notificationAction}'.`);\r\n }\r\n }\r\n\r\n private removeDeliveredNotification(id: string) {\r\n if (this._platform === 'ios' || this._platform === 'android') {\r\n PushNotifications.getDeliveredNotifications().then(list => {\r\n const toRemove = list.notifications.filter(n => {\r\n const data = this.getNotificationPayloadData(n);\r\n return (data.notificationId === id);\r\n });\r\n\r\n // TODO: On Android this does not currently work because notificationID is not set.\r\n // This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523\r\n PushNotifications.removeDeliveredNotifications({\r\n notifications: toRemove\r\n });\r\n });\r\n } else if (this._platform === 'web') {\r\n // TODO: remove web push notification\r\n }\r\n }\r\n\r\n private getNotificationPayloadData(pushNotification: PushNotificationSchema): PayloadData {\r\n return (this._platform === 'ios') ? pushNotification.data.data : pushNotification.data;\r\n }\r\n\r\n private async registerCapacitorEvents() {\r\n await PushNotifications.addListener('pushNotificationReceived', n => {\r\n const data = this.getNotificationPayloadData(n);\r\n console.log('Nucleus.Notifications: Received capacitor push event: ' + data.eventType, n);\r\n this.handleNotificationEvent(data.notificationId, data.eventType);\r\n });\r\n\r\n await PushNotifications.addListener('pushNotificationActionPerformed', a => {\r\n let action = (a as any).notification.data.notificationAction;\r\n if (this._platform === 'ios') {\r\n action = (a as any).notification.data.data.notificationAction;\r\n }\r\n console.log('Nucleus.Notifications: Received capacitor action event', action);\r\n this.handleNotificationAction(action);\r\n });\r\n }\r\n\r\n private registerWebPushEvents() {\r\n this.swPush.messages.subscribe((n) => {\r\n const data: PayloadData = (n as any).data;\r\n console.log('Nucleus.Notifications: Received WebPush event: ' + data.eventType, n);\r\n this.handleNotificationEvent(data.notificationId, data.eventType);\r\n });\r\n\r\n this.swPush.notificationClicks.subscribe((action) => {\r\n console.log('Nucleus.Notifications: Received WebPush action event', action);\r\n const tag = action.notification.tag;\r\n this.handleNotificationAction(tag);\r\n });\r\n }\r\n\r\n private getRegistrationInfo(): Promise<Registration> {\r\n return new Promise((_resolve, _reject) => {\r\n const registrationId = window.localStorage.getItem(this.registrationStorageKey);\r\n if (this._platform === 'android' || this._platform === 'ios') {\r\n // capacitor platform\r\n const listener = PushNotifications.addListener('registration', token => {\r\n listener.remove();\r\n _resolve({ id: registrationId, token: token.value, platform: this._platform });\r\n });\r\n PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));\r\n } else if (this._platform === 'web') {\r\n // Web Push API\r\n this.http.get<WebKey>(this.apiUrl + 'registration/webkey').subscribe(key => {\r\n this.getWebPushSubscription(key.publicKey).then(subscription => {\r\n const t = JSON.stringify(subscription.toJSON());\r\n _resolve({ id: registrationId, token: t, platform: 'web' });\r\n });\r\n }, error => _reject(error));\r\n } else {\r\n _reject(`Nucleus.Notifications: Platform is not supported`);\r\n }\r\n });\r\n }\r\n\r\n private getWebPushSubscription(publicKey: string): Promise<PushSubscription> {\r\n return new Promise((_resolve, _reject) => {\r\n this.swPush.subscription.subscribe(subscription => {\r\n if (subscription != null) {\r\n _resolve(subscription);\r\n } else {\r\n this.swPush.requestSubscription({ serverPublicKey: publicKey }).then(s => _resolve(s)).catch(e => _reject(e));\r\n }\r\n }, error => {\r\n console.error('Nucleus.Notifications: Cannot get web push subscription', error);\r\n _reject(error);\r\n });\r\n });\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { NucleusNotificationsConfig } from './models';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n ],\r\n exports: []\r\n})\r\nexport class NucleusNotificationsModule {\r\n\r\n static forRoot(config: NucleusNotificationsConfig): ModuleWithProviders<NucleusNotificationsModule> {\r\n return {\r\n ngModule: NucleusNotificationsModule,\r\n providers: [\r\n { provide: NucleusNotificationsConfig, useValue: config }\r\n ]\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of nucleus-notifications\r\n */\r\n\r\nexport * from './lib/nucleus-notifications.service';\r\nexport * from './lib/nucleus-notifications.module';\r\nexport * from './lib/models';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Subject","of","PushNotifications","Injectable","NgModule"],"mappings":"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"}
@@ -1,361 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { HttpClient } from '@angular/common/http';
3
- import { Injectable } from '@angular/core';
4
- import { SwPush } from '@angular/service-worker';
5
- import { PushNotifications } from '@capacitor/push-notifications';
6
- import { NucleusAppService } from '@kolektor/nucleus-common';
7
- import { of, Subject } from 'rxjs';
8
- import { NucleusNotificationsConfig } from './models';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common/http";
11
- import * as i2 from "@angular/service-worker";
12
- import * as i3 from "@kolektor/nucleus-common";
13
- import * as i4 from "./models";
14
- export class NucleusNotificationsService {
15
- constructor(http, swPush, appService, config) {
16
- this.http = http;
17
- this.swPush = swPush;
18
- this.appService = appService;
19
- this.apiUrl = null;
20
- this.registrationStorageKey = 'NucleusNotificationsRegistrationId';
21
- this.notificationsStorageKey = 'NucleusNotificationsLocalCache';
22
- this._isInitialized = false;
23
- this._newNotifications = new Subject();
24
- this._clicksSubject = new Subject();
25
- this._stateChangesSubject = new Subject();
26
- this.notifications = [];
27
- let url = config.serverApiUrl;
28
- if (!url.endsWith('/')) {
29
- url += '/';
30
- }
31
- this.apiUrl = url;
32
- }
33
- get unreadCount() {
34
- return this.notifications.filter(x => !x.isRead).length;
35
- }
36
- get newNotifications() {
37
- return this._newNotifications.asObservable();
38
- }
39
- get clicks() {
40
- return this._clicksSubject.asObservable();
41
- }
42
- get stateChanges() {
43
- return this._stateChangesSubject.asObservable();
44
- }
45
- get isInitialized() {
46
- return this._isInitialized;
47
- }
48
- initialize() {
49
- return __awaiter(this, void 0, void 0, function* () {
50
- // make sure app service has finished initializing
51
- yield this.appService.init();
52
- this.loadFromStorage();
53
- if (this.appService.isNative) {
54
- this._platform = this.appService.deviceInfo.platform;
55
- yield this.registerCapacitorEvents();
56
- }
57
- else if (this.swPush.isEnabled) {
58
- this._platform = 'web';
59
- this.registerWebPushEvents();
60
- }
61
- else {
62
- console.warn('Nucleus.Notifications: There is no push capability, timer will be used to update notifications');
63
- setInterval(() => {
64
- console.log('Updating notifications...');
65
- this.refresh(true);
66
- }, 5 * 60 * 1000);
67
- }
68
- this._isInitialized = true;
69
- this.refresh();
70
- });
71
- }
72
- register() {
73
- return new Promise((_resolve, _reject) => {
74
- this.getRegistrationInfo().then((info) => {
75
- this.http.post(this.apiUrl + 'registration', info).subscribe((regResult) => {
76
- window.localStorage.setItem(this.registrationStorageKey, regResult.id);
77
- _resolve(null);
78
- }, error => {
79
- console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);
80
- _reject(error);
81
- });
82
- }).catch((error) => _reject(error));
83
- });
84
- }
85
- unregister() {
86
- return new Promise((_resolve, _reject) => {
87
- this.getRegistrationInfo().then((info) => {
88
- this.http.request('DELETE', this.apiUrl + 'registration', { body: info }).subscribe(() => {
89
- window.localStorage.removeItem(this.registrationStorageKey);
90
- _resolve(null);
91
- }, error => {
92
- console.log('Nucleus.Notifications: Failed to remove registration from server.', error);
93
- _reject(error);
94
- });
95
- }).catch((error) => _reject(error));
96
- });
97
- }
98
- refresh(notifyAboutNew = false) {
99
- this.http.get(this.apiUrl + 'notifications').subscribe(res => {
100
- this.updateNotifications(res, notifyAboutNew);
101
- });
102
- }
103
- getNotification(id) {
104
- const localNotification = this.notifications.find(x => x.id === id);
105
- if (localNotification) {
106
- return of(localNotification);
107
- }
108
- return this.http.get(this.apiUrl + 'notifications/' + id);
109
- }
110
- readNotification(id) {
111
- const n = this.notifications.find(x => x.id === id);
112
- if (n && !n.isRead) {
113
- n.isRead = true;
114
- this.notifyStateChanged();
115
- }
116
- this.http.get(this.apiUrl + 'notifications/read/' + id).subscribe();
117
- }
118
- dismissNotification(id) {
119
- this.deleteNotificaton(id);
120
- this.http.delete(this.apiUrl + 'notifications/' + id).subscribe();
121
- this.removeDeliveredNotification(id);
122
- }
123
- dismissAll() {
124
- this.notifications.splice(0);
125
- this.notifyStateChanged();
126
- this.http.delete(this.apiUrl + 'notifications/all').subscribe();
127
- if (this._platform === 'ios' || this._platform === 'android') {
128
- PushNotifications.removeAllDeliveredNotifications();
129
- }
130
- else if (this._platform === 'web') {
131
- // TODO: remove all web push notifications
132
- }
133
- }
134
- readAll() {
135
- for (const n of this.notifications) {
136
- n.isRead = true;
137
- }
138
- this.notifyStateChanged();
139
- this.http.get(this.apiUrl + 'notifications/read/all').subscribe();
140
- }
141
- getChannelConfig(senderId, channelId, language = null) {
142
- return this.http.get(this.apiUrl + `settings/channel/${senderId}/${channelId}?language=${language}`);
143
- }
144
- getChannelConfigsForSender(senderId, channelIds, language = null) {
145
- const idsStr = channelIds.map(x => senderId + ',' + x).join(';');
146
- return this.getChannelConfigsInternal(idsStr, language);
147
- }
148
- getChannelConfigs(ids, language = null) {
149
- const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');
150
- return this.getChannelConfigsInternal(idsStr, language);
151
- }
152
- setChannelConfig(senderId, config) {
153
- return this.http.post(`${this.apiUrl}settings/channel/${senderId}`, config);
154
- }
155
- setChannelConfigs(configs) {
156
- return this.http.post(`${this.apiUrl}settings/channels`, configs);
157
- }
158
- getChannelConfigsInternal(ids, language) {
159
- return this.http.get(`${this.apiUrl}settings/channels?ids=${ids}&language=${language}`);
160
- }
161
- updateNotifications(newNotifications, notifyAboutNew = false) {
162
- let stateChanged = false;
163
- for (const n of newNotifications) {
164
- const existing = this.notifications.find(x => x.id === n.id);
165
- if (existing) {
166
- if (existing.isRead !== n.isRead) {
167
- existing.isRead = n.isRead;
168
- stateChanged = true;
169
- }
170
- }
171
- else {
172
- let i = 0;
173
- while (i < this.notifications.length && n.dateCreated < this.notifications[i].dateCreated) {
174
- i++;
175
- }
176
- this.notifications.splice(i, 0, n);
177
- stateChanged = true;
178
- if (notifyAboutNew) {
179
- this._newNotifications.next(n);
180
- }
181
- }
182
- }
183
- const now = Date.now();
184
- for (let i = this.notifications.length - 1; i >= 0; i--) {
185
- const n = this.notifications[i];
186
- if (new Date(n.expirationDate).getTime() < now || !newNotifications.find(x => x.id === n.id)) {
187
- this.notifications.splice(i, 1);
188
- stateChanged = true;
189
- }
190
- }
191
- if (stateChanged) {
192
- this.notifyStateChanged();
193
- }
194
- }
195
- saveToStorage() {
196
- const str = JSON.stringify(this.notifications);
197
- window.localStorage.setItem(this.notificationsStorageKey, str);
198
- }
199
- loadFromStorage() {
200
- try {
201
- const str = window.localStorage.getItem(this.notificationsStorageKey);
202
- if (str) {
203
- const notifications = JSON.parse(str);
204
- this.notifications = notifications.filter(x => !!x);
205
- // precaution for notification.isRead of undefined error
206
- this.notifyStateChanged(false);
207
- }
208
- }
209
- catch (_a) { }
210
- }
211
- handleNotificationEvent(id, eventType) {
212
- if (eventType.startsWith('new') || eventType === 'updated') { // we are handling new and newSilent
213
- this.getNotification(id).subscribe(n => {
214
- if (eventType.startsWith('new') && !n.isRead) {
215
- this._newNotifications.next(n);
216
- }
217
- const existing = this.notifications.find(x => x.id === n.id);
218
- if (existing) {
219
- existing.isRead = n.isRead;
220
- }
221
- else {
222
- this.notifications.splice(0, 0, n);
223
- }
224
- this.notifyStateChanged();
225
- });
226
- }
227
- else if (eventType === 'deleted') {
228
- this.deleteNotificaton(id);
229
- }
230
- else {
231
- this.refresh();
232
- }
233
- }
234
- deleteNotificaton(id) {
235
- const i = this.notifications.findIndex(x => x.id === id);
236
- if (i >= 0) {
237
- this.notifications.splice(i, 1);
238
- this.notifyStateChanged();
239
- }
240
- }
241
- notifyStateChanged(persistState = true) {
242
- if (persistState) {
243
- this.saveToStorage();
244
- }
245
- this._stateChangesSubject.next();
246
- }
247
- handleNotificationAction(notificationAction) {
248
- const arr = notificationAction.split(':');
249
- const notificationClick = {
250
- id: arr[0],
251
- type: arr[1],
252
- routerLink: arr[2]
253
- };
254
- const validNotificationClickTypes = ['default', 'deeplink'];
255
- if (validNotificationClickTypes.includes(notificationClick.type)) {
256
- this._clicksSubject.next(notificationClick);
257
- }
258
- else {
259
- console.error(`Nucleus.Notifications: Unknown notification action: '${notificationAction}'.`);
260
- }
261
- }
262
- removeDeliveredNotification(id) {
263
- if (this._platform === 'ios' || this._platform === 'android') {
264
- PushNotifications.getDeliveredNotifications().then(list => {
265
- const toRemove = list.notifications.filter(n => {
266
- const data = this.getNotificationPayloadData(n);
267
- return (data.notificationId === id);
268
- });
269
- // TODO: On Android this does not currently work because notificationID is not set.
270
- // This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523
271
- PushNotifications.removeDeliveredNotifications({
272
- notifications: toRemove
273
- });
274
- });
275
- }
276
- else if (this._platform === 'web') {
277
- // TODO: remove web push notification
278
- }
279
- }
280
- getNotificationPayloadData(pushNotification) {
281
- return (this._platform === 'ios') ? pushNotification.data.data : pushNotification.data;
282
- }
283
- registerCapacitorEvents() {
284
- return __awaiter(this, void 0, void 0, function* () {
285
- yield PushNotifications.addListener('pushNotificationReceived', n => {
286
- const data = this.getNotificationPayloadData(n);
287
- console.log('Nucleus.Notifications: Received capacitor push event: ' + data.eventType, n);
288
- this.handleNotificationEvent(data.notificationId, data.eventType);
289
- });
290
- yield PushNotifications.addListener('pushNotificationActionPerformed', a => {
291
- let action = a.notification.data.notificationAction;
292
- if (this._platform === 'ios') {
293
- action = a.notification.data.data.notificationAction;
294
- }
295
- console.log('Nucleus.Notifications: Received capacitor action event', action);
296
- this.handleNotificationAction(action);
297
- });
298
- });
299
- }
300
- registerWebPushEvents() {
301
- this.swPush.messages.subscribe((n) => {
302
- const data = n.data;
303
- console.log('Nucleus.Notifications: Received WebPush event: ' + data.eventType, n);
304
- this.handleNotificationEvent(data.notificationId, data.eventType);
305
- });
306
- this.swPush.notificationClicks.subscribe((action) => {
307
- console.log('Nucleus.Notifications: Received WebPush action event', action);
308
- const tag = action.notification.tag;
309
- this.handleNotificationAction(tag);
310
- });
311
- }
312
- getRegistrationInfo() {
313
- return new Promise((_resolve, _reject) => {
314
- const registrationId = window.localStorage.getItem(this.registrationStorageKey);
315
- if (this._platform === 'android' || this._platform === 'ios') {
316
- // capacitor platform
317
- const listener = PushNotifications.addListener('registration', token => {
318
- listener.remove();
319
- _resolve({ id: registrationId, token: token.value, platform: this._platform });
320
- });
321
- PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));
322
- }
323
- else if (this._platform === 'web') {
324
- // Web Push API
325
- this.http.get(this.apiUrl + 'registration/webkey').subscribe(key => {
326
- this.getWebPushSubscription(key.publicKey).then(subscription => {
327
- const t = JSON.stringify(subscription.toJSON());
328
- _resolve({ id: registrationId, token: t, platform: 'web' });
329
- });
330
- }, error => _reject(error));
331
- }
332
- else {
333
- _reject(`Nucleus.Notifications: Platform is not supported`);
334
- }
335
- });
336
- }
337
- getWebPushSubscription(publicKey) {
338
- return new Promise((_resolve, _reject) => {
339
- this.swPush.subscription.subscribe(subscription => {
340
- if (subscription != null) {
341
- _resolve(subscription);
342
- }
343
- else {
344
- this.swPush.requestSubscription({ serverPublicKey: publicKey }).then(s => _resolve(s)).catch(e => _reject(e));
345
- }
346
- }, error => {
347
- console.error('Nucleus.Notifications: Cannot get web push subscription', error);
348
- _reject(error);
349
- });
350
- });
351
- }
352
- }
353
- NucleusNotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusNotificationsService, deps: [{ token: i1.HttpClient }, { token: i2.SwPush }, { token: i3.NucleusAppService }, { token: i4.NucleusNotificationsConfig }], target: i0.ɵɵFactoryTarget.Injectable });
354
- NucleusNotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusNotificationsService, providedIn: 'root' });
355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusNotificationsService, decorators: [{
356
- type: Injectable,
357
- args: [{
358
- providedIn: 'root'
359
- }]
360
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SwPush }, { type: i3.NucleusAppService }, { type: i4.NucleusNotificationsConfig }]; } });
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEIsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBTUwsMEJBQTBCLEVBTzNCLE1BQU0sVUFBVSxDQUFDOzs7Ozs7QUFLbEIsTUFBTSxPQUFPLDJCQUEyQjtJQUV0QyxZQUNVLElBQWdCLEVBQ2hCLE1BQWMsRUFDZCxVQUE2QixFQUNyQyxNQUFrQztRQUgxQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQVUvQixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ0wsMkJBQXNCLEdBQUcsb0NBQW9DLENBQUM7UUFDOUQsNEJBQXVCLEdBQUcsZ0NBQWdDLENBQUM7UUFFcEUsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDaEQsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztRQUNsRCx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTVDLGtCQUFh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QUFrRCxDQUFDLENBQUM7YUFDN0Q7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxTQUFpQjtRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDaEQsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO29CQUN4QixRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0c7WUFDSCxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyx5REFBeUQsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzt3SEE5V1UsMkJBQTJCOzRIQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTsyRkFFUCwyQkFBMkI7a0JBSHZDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTd1B1c2ggfSBmcm9tICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlcic7XHJcbmltcG9ydCB7IFB1c2hOb3RpZmljYXRpb25zLCBQdXNoTm90aWZpY2F0aW9uU2NoZW1hIH0gZnJvbSAnQGNhcGFjaXRvci9wdXNoLW5vdGlmaWNhdGlvbnMnO1xyXG5pbXBvcnQgeyBOdWNsZXVzQXBwU2VydmljZSB9IGZyb20gJ0Brb2xla3Rvci9udWNsZXVzLWNvbW1vbic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbm5lbElkLFxyXG4gIE5vdGlmaWNhdGlvbixcclxuICBOb3RpZmljYXRpb25DbGljayxcclxuICBOb3RpZmljYXRpb25FdmVudFR5cGUsXHJcbiAgTm90aWZpY2F0aW9uVHlwZSxcclxuICBOdWNsZXVzTm90aWZpY2F0aW9uc0NvbmZpZyxcclxuICBQYXlsb2FkRGF0YSxcclxuICBQbGF0Zm9ybVZhbHVlLFxyXG4gIFJlZ2lzdHJhdGlvbixcclxuICBSZWdpc3RyYXRpb25SZXN1bHQsXHJcbiAgVXNlckNoYW5uZWxDb25maWcsXHJcbiAgV2ViS2V5XHJcbn0gZnJvbSAnLi9tb2RlbHMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTnVjbGV1c05vdGlmaWNhdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHN3UHVzaDogU3dQdXNoLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBOdWNsZXVzQXBwU2VydmljZSxcclxuICAgIGNvbmZpZzogTnVjbGV1c05vdGlmaWNhdGlvbnNDb25maWdcclxuICApIHtcclxuICAgIGxldCB1cmwgPSBjb25maWcuc2VydmVyQXBpVXJsO1xyXG4gICAgaWYgKCF1cmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICB1cmwgKz0gJy8nO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcGlVcmwgPSB1cmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwaVVybCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyYXRpb25TdG9yYWdlS2V5ID0gJ051Y2xldXNOb3RpZmljYXRpb25zUmVnaXN0cmF0aW9uSWQnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uc1N0b3JhZ2VLZXkgPSAnTnVjbGV1c05vdGlmaWNhdGlvbnNMb2NhbENhY2hlJztcclxuICBwcml2YXRlIF9wbGF0Zm9ybTogUGxhdGZvcm1WYWx1ZTtcclxuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbmV3Tm90aWZpY2F0aW9ucyA9IG5ldyBTdWJqZWN0PE5vdGlmaWNhdGlvbj4oKTtcclxuICBwcml2YXRlIF9jbGlja3NTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Tm90aWZpY2F0aW9uQ2xpY2s+KCk7XHJcbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZ2V0IHVucmVhZENvdW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucy5maWx0ZXIoeCA9PiAheC5pc1JlYWQpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbmV3Tm90aWZpY2F0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXdOb3RpZmljYXRpb25zLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjbGlja3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpY2tzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzdGF0ZUNoYW5nZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVDaGFuZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNJbml0aWFsaXplZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKSB7XHJcbiAgICAvLyBtYWtlIHN1cmUgYXBwIHNlcnZpY2UgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZ1xyXG4gICAgYXdhaXQgdGhpcy5hcHBTZXJ2aWNlLmluaXQoKTtcclxuXHJcbiAgICB0aGlzLmxvYWRGcm9tU3RvcmFnZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcclxuICAgICAgdGhpcy5fcGxhdGZvcm0gPSB0aGlzLmFwcFNlcnZpY2UuZGV2aWNlSW5mby5wbGF0Zm9ybSBhcyBQbGF0Zm9ybVZhbHVlO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyQ2FwYWNpdG9yRXZlbnRzKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3dQdXNoLmlzRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLl9wbGF0Zm9ybSA9ICd3ZWInO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyV2ViUHVzaEV2ZW50cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFRoZXJlIGlzIG5vIHB1c2ggY2FwYWJpbGl0eSwgdGltZXIgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSBub3RpZmljYXRpb25zJyk7XHJcbiAgICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRpbmcgbm90aWZpY2F0aW9ucy4uLicpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcclxuICAgICAgfSwgNSAqIDYwICogMTAwMCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZ2lzdGVyKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0UmVnaXN0cmF0aW9uSW5mbygpLnRoZW4oKGluZm8pID0+IHtcclxuICAgICAgICB0aGlzLmh0dHAucG9zdDxSZWdpc3RyYXRpb25SZXN1bHQ+KHRoaXMuYXBpVXJsICsgJ3JlZ2lzdHJhdGlvbicsIGluZm8pLnN1YnNjcmliZSgocmVnUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5yZWdpc3RyYXRpb25TdG9yYWdlS2V5LCByZWdSZXN1bHQuaWQpO1xyXG4gICAgICAgICAgX3Jlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ051Y2xldXMuTm90aWZpY2F0aW9uczogRmFpbGVkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiB0byBzZXJ2ZXIuJywgZXJyb3IpO1xyXG4gICAgICAgICAgX3JlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX3JlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdW5yZWdpc3RlcigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmdldFJlZ2lzdHJhdGlvbkluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3Q8YW55PignREVMRVRFJywgdGhpcy5hcGlVcmwgKyAncmVnaXN0cmF0aW9uJywgeyBib2R5OiBpbmZvIH0pLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5yZWdpc3RyYXRpb25TdG9yYWdlS2V5KTtcclxuICAgICAgICAgIF9yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IEZhaWxlZCB0byByZW1vdmUgcmVnaXN0cmF0aW9uIGZyb20gc2VydmVyLicsIGVycm9yKTtcclxuICAgICAgICAgIF9yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IF9yZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2gobm90aWZ5QWJvdXROZXcgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5odHRwLmdldDxOb3RpZmljYXRpb25bXT4odGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucycpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZU5vdGlmaWNhdGlvbnMocmVzLCBub3RpZnlBYm91dE5ldyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROb3RpZmljYXRpb24oaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uPiB7XHJcbiAgICBjb25zdCBsb2NhbE5vdGlmaWNhdGlvbiA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKHggPT4geC5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKGxvY2FsTm90aWZpY2F0aW9uKSB7XHJcbiAgICAgIHJldHVybiBvZihsb2NhbE5vdGlmaWNhdGlvbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOb3RpZmljYXRpb24+KHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvJyArIGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWFkTm90aWZpY2F0aW9uKGlkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCh4ID0+IHguaWQgPT09IGlkKTtcclxuICAgIGlmIChuICYmICFuLmlzUmVhZCkge1xyXG4gICAgICBuLmlzUmVhZCA9IHRydWU7XHJcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvcmVhZC8nICsgaWQpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc21pc3NOb3RpZmljYXRpb24oaWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5kZWxldGVOb3RpZmljYXRvbihpZCk7XHJcbiAgICB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvJyArIGlkKS5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMucmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9uKGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNtaXNzQWxsKCkge1xyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZSgwKTtcclxuICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvYWxsJykuc3Vic2NyaWJlKCk7XHJcbiAgICBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnIHx8IHRoaXMuX3BsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcclxuICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVtb3ZlQWxsRGVsaXZlcmVkTm90aWZpY2F0aW9ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ3dlYicpIHtcclxuICAgICAgLy8gVE9ETzogcmVtb3ZlIGFsbCB3ZWIgcHVzaCBub3RpZmljYXRpb25zXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVhZEFsbCgpIHtcclxuICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcclxuICAgICAgbi5pc1JlYWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICAgIHRoaXMuaHR0cC5nZXQodGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy9yZWFkL2FsbCcpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYW5uZWxDb25maWcoc2VuZGVySWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVc2VyQ2hhbm5lbENvbmZpZz4odGhpcy5hcGlVcmwgKyBgc2V0dGluZ3MvY2hhbm5lbC8ke3NlbmRlcklkfS8ke2NoYW5uZWxJZH0/bGFuZ3VhZ2U9JHtsYW5ndWFnZX1gKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGFubmVsQ29uZmlnc0ZvclNlbmRlcihzZW5kZXJJZDogc3RyaW5nLCBjaGFubmVsSWRzOiBzdHJpbmdbXSwgbGFuZ3VhZ2U6IHN0cmluZyA9IG51bGwpIHtcclxuICAgIGNvbnN0IGlkc1N0ciA9IGNoYW5uZWxJZHMubWFwKHggPT4gc2VuZGVySWQgKyAnLCcgKyB4KS5qb2luKCc7Jyk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkc1N0ciwgbGFuZ3VhZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYW5uZWxDb25maWdzKGlkczogQ2hhbm5lbElkW10sIGxhbmd1YWdlOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICBjb25zdCBpZHNTdHIgPSBpZHMubWFwKHggPT4geC5zZW5kZXJJZCArICcsJyArIHguY2hhbm5lbElkKS5qb2luKCc7Jyk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkc1N0ciwgbGFuZ3VhZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENoYW5uZWxDb25maWcoc2VuZGVySWQ6IHN0cmluZywgY29uZmlnOiBVc2VyQ2hhbm5lbENvbmZpZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PHZvaWQ+KGAke3RoaXMuYXBpVXJsfXNldHRpbmdzL2NoYW5uZWwvJHtzZW5kZXJJZH1gLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENoYW5uZWxDb25maWdzKGNvbmZpZ3M6IFVzZXJDaGFubmVsQ29uZmlnW10pIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx2b2lkPihgJHt0aGlzLmFwaVVybH1zZXR0aW5ncy9jaGFubmVsc2AsIGNvbmZpZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkczogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVc2VyQ2hhbm5lbENvbmZpZ1tdPihgJHt0aGlzLmFwaVVybH1zZXR0aW5ncy9jaGFubmVscz9pZHM9JHtpZHN9Jmxhbmd1YWdlPSR7bGFuZ3VhZ2V9YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU5vdGlmaWNhdGlvbnMobmV3Tm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10sIG5vdGlmeUFib3V0TmV3ID0gZmFsc2UpIHtcclxuICAgIGxldCBzdGF0ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgbiBvZiBuZXdOb3RpZmljYXRpb25zKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmQoeCA9PiB4LmlkID09PSBuLmlkKTtcclxuICAgICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nLmlzUmVhZCAhPT0gbi5pc1JlYWQpIHtcclxuICAgICAgICAgIGV4aXN0aW5nLmlzUmVhZCA9IG4uaXNSZWFkO1xyXG4gICAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAmJiBuLmRhdGVDcmVhdGVkIDwgdGhpcy5ub3RpZmljYXRpb25zW2ldLmRhdGVDcmVhdGVkKSB7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoaSwgMCwgbik7XHJcbiAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICBpZiAobm90aWZ5QWJvdXROZXcpIHtcclxuICAgICAgICAgIHRoaXMuX25ld05vdGlmaWNhdGlvbnMubmV4dChuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBuID0gdGhpcy5ub3RpZmljYXRpb25zW2ldO1xyXG4gICAgICBpZiAobmV3IERhdGUobi5leHBpcmF0aW9uRGF0ZSkuZ2V0VGltZSgpIDwgbm93IHx8ICFuZXdOb3RpZmljYXRpb25zLmZpbmQoeCA9PiB4LmlkID09PSBuLmlkKSkge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVRvU3RvcmFnZSgpIHtcclxuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMubm90aWZpY2F0aW9ucyk7XHJcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5ub3RpZmljYXRpb25zU3RvcmFnZUtleSwgc3RyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEZyb21TdG9yYWdlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc3RyID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubm90aWZpY2F0aW9uc1N0b3JhZ2VLZXkpO1xyXG4gICAgICBpZiAoc3RyKSB7XHJcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IEpTT04ucGFyc2Uoc3RyKSBhcyBOb3RpZmljYXRpb25bXTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBub3RpZmljYXRpb25zLmZpbHRlcih4ID0+ICEheCk7XHJcbiAgICAgICAgLy8gcHJlY2F1dGlvbiBmb3Igbm90aWZpY2F0aW9uLmlzUmVhZCBvZiB1bmRlZmluZWQgZXJyb3JcclxuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlZChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGlkOiBzdHJpbmcsIGV2ZW50VHlwZTogTm90aWZpY2F0aW9uRXZlbnRUeXBlKSB7XHJcbiAgICBpZiAoZXZlbnRUeXBlLnN0YXJ0c1dpdGgoJ25ldycpIHx8IGV2ZW50VHlwZSA9PT0gJ3VwZGF0ZWQnKSB7IC8vIHdlIGFyZSBoYW5kbGluZyBuZXcgYW5kIG5ld1NpbGVudFxyXG4gICAgICB0aGlzLmdldE5vdGlmaWNhdGlvbihpZCkuc3Vic2NyaWJlKG4gPT4ge1xyXG4gICAgICAgIGlmIChldmVudFR5cGUuc3RhcnRzV2l0aCgnbmV3JykgJiYgIW4uaXNSZWFkKSB7XHJcbiAgICAgICAgICB0aGlzLl9uZXdOb3RpZmljYXRpb25zLm5leHQobik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmQoeCA9PiB4LmlkID09PSBuLmlkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgICAgIGV4aXN0aW5nLmlzUmVhZCA9IG4uaXNSZWFkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKDAsIDAsIG4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlZCgpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZGVsZXRlZCcpIHtcclxuICAgICAgdGhpcy5kZWxldGVOb3RpZmljYXRvbihpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTm90aWZpY2F0b24oaWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaSA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kSW5kZXgoeCA9PiB4LmlkID09PSBpZCk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vdGlmeVN0YXRlQ2hhbmdlZChwZXJzaXN0U3RhdGUgPSB0cnVlKSB7XHJcbiAgICBpZiAocGVyc2lzdFN0YXRlKSB7XHJcbiAgICAgIHRoaXMuc2F2ZVRvU3RvcmFnZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VzU3ViamVjdC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbkFjdGlvbihub3RpZmljYXRpb25BY3Rpb246IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyID0gbm90aWZpY2F0aW9uQWN0aW9uLnNwbGl0KCc6Jyk7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb25DbGljazogTm90aWZpY2F0aW9uQ2xpY2sgPSB7XHJcbiAgICAgIGlkOiBhcnJbMF0sXHJcbiAgICAgIHR5cGU6IGFyclsxXSBhcyBOb3RpZmljYXRpb25UeXBlLFxyXG4gICAgICByb3V0ZXJMaW5rOiBhcnJbMl1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdmFsaWROb3RpZmljYXRpb25DbGlja1R5cGVzID0gWydkZWZhdWx0JywgJ2RlZXBsaW5rJ107XHJcbiAgICBpZiAodmFsaWROb3RpZmljYXRpb25DbGlja1R5cGVzLmluY2x1ZGVzKG5vdGlmaWNhdGlvbkNsaWNrLnR5cGUpKSB7XHJcbiAgICAgIHRoaXMuX2NsaWNrc1N1YmplY3QubmV4dChub3RpZmljYXRpb25DbGljayk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFVua25vd24gbm90aWZpY2F0aW9uIGFjdGlvbjogJyR7bm90aWZpY2F0aW9uQWN0aW9ufScuYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlbGl2ZXJlZE5vdGlmaWNhdGlvbihpZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnIHx8IHRoaXMuX3BsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcclxuICAgICAgUHVzaE5vdGlmaWNhdGlvbnMuZ2V0RGVsaXZlcmVkTm90aWZpY2F0aW9ucygpLnRoZW4obGlzdCA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBsaXN0Lm5vdGlmaWNhdGlvbnMuZmlsdGVyKG4gPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0Tm90aWZpY2F0aW9uUGF5bG9hZERhdGEobik7XHJcbiAgICAgICAgICByZXR1cm4gKGRhdGEubm90aWZpY2F0aW9uSWQgPT09IGlkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogT24gQW5kcm9pZCB0aGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGJlY2F1c2Ugbm90aWZpY2F0aW9uSUQgaXMgbm90IHNldC5cclxuICAgICAgICAvLyBUaGlzIG15IHNvbHZlIHRoZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2lvbmljLXRlYW0vY2FwYWNpdG9yL3B1bGwvMzUyM1xyXG4gICAgICAgIFB1c2hOb3RpZmljYXRpb25zLnJlbW92ZURlbGl2ZXJlZE5vdGlmaWNhdGlvbnMoe1xyXG4gICAgICAgICAgbm90aWZpY2F0aW9uczogdG9SZW1vdmVcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnd2ViJykge1xyXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2ViIHB1c2ggbm90aWZpY2F0aW9uXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5vdGlmaWNhdGlvblBheWxvYWREYXRhKHB1c2hOb3RpZmljYXRpb246IFB1c2hOb3RpZmljYXRpb25TY2hlbWEpOiBQYXlsb2FkRGF0YSB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJykgPyBwdXNoTm90aWZpY2F0aW9uLmRhdGEuZGF0YSA6IHB1c2hOb3RpZmljYXRpb24uZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJDYXBhY2l0b3JFdmVudHMoKSB7XHJcbiAgICBhd2FpdCBQdXNoTm90aWZpY2F0aW9ucy5hZGRMaXN0ZW5lcigncHVzaE5vdGlmaWNhdGlvblJlY2VpdmVkJywgbiA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldE5vdGlmaWNhdGlvblBheWxvYWREYXRhKG4pO1xyXG4gICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBSZWNlaXZlZCBjYXBhY2l0b3IgcHVzaCBldmVudDogJyArIGRhdGEuZXZlbnRUeXBlLCBuKTtcclxuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25FdmVudChkYXRhLm5vdGlmaWNhdGlvbklkLCBkYXRhLmV2ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCBQdXNoTm90aWZpY2F0aW9ucy5hZGRMaXN0ZW5lcigncHVzaE5vdGlmaWNhdGlvbkFjdGlvblBlcmZvcm1lZCcsIGEgPT4ge1xyXG4gICAgICBsZXQgYWN0aW9uID0gKGEgYXMgYW55KS5ub3RpZmljYXRpb24uZGF0YS5ub3RpZmljYXRpb25BY3Rpb247XHJcbiAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcclxuICAgICAgICBhY3Rpb24gPSAoYSBhcyBhbnkpLm5vdGlmaWNhdGlvbi5kYXRhLmRhdGEubm90aWZpY2F0aW9uQWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIGNhcGFjaXRvciBhY3Rpb24gZXZlbnQnLCBhY3Rpb24pO1xyXG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbkFjdGlvbihhY3Rpb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZ2lzdGVyV2ViUHVzaEV2ZW50cygpIHtcclxuICAgIHRoaXMuc3dQdXNoLm1lc3NhZ2VzLnN1YnNjcmliZSgobikgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhOiBQYXlsb2FkRGF0YSA9IChuIGFzIGFueSkuZGF0YTtcclxuICAgICAgY29uc29sZS5sb2coJ051Y2xldXMuTm90aWZpY2F0aW9uczogUmVjZWl2ZWQgV2ViUHVzaCBldmVudDogJyArIGRhdGEuZXZlbnRUeXBlLCBuKTtcclxuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25FdmVudChkYXRhLm5vdGlmaWNhdGlvbklkLCBkYXRhLmV2ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN3UHVzaC5ub3RpZmljYXRpb25DbGlja3Muc3Vic2NyaWJlKChhY3Rpb24pID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ051Y2xldXMuTm90aWZpY2F0aW9uczogUmVjZWl2ZWQgV2ViUHVzaCBhY3Rpb24gZXZlbnQnLCBhY3Rpb24pO1xyXG4gICAgICBjb25zdCB0YWcgPSBhY3Rpb24ubm90aWZpY2F0aW9uLnRhZztcclxuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25BY3Rpb24odGFnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25JbmZvKCk6IFByb21pc2U8UmVnaXN0cmF0aW9uPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbklkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMucmVnaXN0cmF0aW9uU3RvcmFnZUtleSk7XHJcbiAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnIHx8IHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJykge1xyXG4gICAgICAgIC8vIGNhcGFjaXRvciBwbGF0Zm9ybVxyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gUHVzaE5vdGlmaWNhdGlvbnMuYWRkTGlzdGVuZXIoJ3JlZ2lzdHJhdGlvbicsIHRva2VuID0+IHtcclxuICAgICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgX3Jlc29sdmUoeyBpZDogcmVnaXN0cmF0aW9uSWQsIHRva2VuOiB0b2tlbi52YWx1ZSwgcGxhdGZvcm06IHRoaXMuX3BsYXRmb3JtIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFB1c2hOb3RpZmljYXRpb25zLnJlZ2lzdGVyKCkuY2F0Y2goZXJyb3IgPT4gX3JlamVjdCgnQ291bGQgbm90IHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zOicgKyBlcnJvcikpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnd2ViJykge1xyXG4gICAgICAgIC8vIFdlYiBQdXNoIEFQSVxyXG4gICAgICAgIHRoaXMuaHR0cC5nZXQ8V2ViS2V5Pih0aGlzLmFwaVVybCArICdyZWdpc3RyYXRpb24vd2Via2V5Jykuc3Vic2NyaWJlKGtleSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFdlYlB1c2hTdWJzY3JpcHRpb24oa2V5LnB1YmxpY0tleSkudGhlbihzdWJzY3JpcHRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0ID0gSlNPTi5zdHJpbmdpZnkoc3Vic2NyaXB0aW9uLnRvSlNPTigpKTtcclxuICAgICAgICAgICAgX3Jlc29sdmUoeyBpZDogcmVnaXN0cmF0aW9uSWQsIHRva2VuOiB0LCBwbGF0Zm9ybTogJ3dlYicgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LCBlcnJvciA9PiBfcmVqZWN0KGVycm9yKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX3JlamVjdChgTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBQbGF0Zm9ybSBpcyBub3Qgc3VwcG9ydGVkYCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRXZWJQdXNoU3Vic2NyaXB0aW9uKHB1YmxpY0tleTogc3RyaW5nKTogUHJvbWlzZTxQdXNoU3Vic2NyaXB0aW9uPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuc3dQdXNoLnN1YnNjcmlwdGlvbi5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgIF9yZXNvbHZlKHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3dQdXNoLnJlcXVlc3RTdWJzY3JpcHRpb24oeyBzZXJ2ZXJQdWJsaWNLZXk6IHB1YmxpY0tleSB9KS50aGVuKHMgPT4gX3Jlc29sdmUocykpLmNhdGNoKGUgPT4gX3JlamVjdChlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBDYW5ub3QgZ2V0IHdlYiBwdXNoIHN1YnNjcmlwdGlvbicsIGVycm9yKTtcclxuICAgICAgICBfcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19