mesauth-angular 0.2.14 → 0.2.20
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.
- package/README.md +139 -61
- package/dist/README.md +139 -61
- package/dist/{fesm2020 → fesm2022}/mesauth-angular.mjs +702 -662
- package/dist/fesm2022/mesauth-angular.mjs.map +1 -0
- package/dist/index.d.ts +269 -9
- package/package.json +12 -12
- package/dist/esm2020/index.mjs +0 -10
- package/dist/esm2020/ma-user.component.mjs +0 -32
- package/dist/esm2020/mes-auth.interceptor.mjs +0 -29
- package/dist/esm2020/mes-auth.module.mjs +0 -23
- package/dist/esm2020/mes-auth.service.mjs +0 -146
- package/dist/esm2020/mesauth-angular.mjs +0 -5
- package/dist/esm2020/notification-badge.component.mjs +0 -71
- package/dist/esm2020/notification-panel.component.mjs +0 -333
- package/dist/esm2020/theme.service.mjs +0 -63
- package/dist/esm2020/toast-container.component.mjs +0 -83
- package/dist/esm2020/toast.service.mjs +0 -41
- package/dist/esm2020/user-profile.component.mjs +0 -223
- package/dist/fesm2015/mesauth-angular.mjs +0 -1012
- package/dist/fesm2015/mesauth-angular.mjs.map +0 -1
- package/dist/fesm2020/mesauth-angular.mjs.map +0 -1
- package/dist/ma-user.component.d.ts +0 -8
- package/dist/mes-auth.interceptor.d.ts +0 -13
- package/dist/mes-auth.module.d.ts +0 -6
- package/dist/mes-auth.service.d.ts +0 -102
- package/dist/notification-badge.component.d.ts +0 -20
- package/dist/notification-panel.component.d.ts +0 -36
- package/dist/package.json +0 -52
- package/dist/theme.service.d.ts +0 -19
- package/dist/toast-container.component.d.ts +0 -18
- package/dist/toast.service.d.ts +0 -18
- package/dist/user-profile.component.d.ts +0 -31
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
|
|
3
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
4
|
-
import { tap, filter, debounceTime } from 'rxjs/operators';
|
|
5
|
-
import { NavigationEnd } from '@angular/router';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
import * as i2 from "@angular/router";
|
|
9
|
-
export var NotificationType;
|
|
10
|
-
(function (NotificationType) {
|
|
11
|
-
NotificationType["Info"] = "Info";
|
|
12
|
-
NotificationType["Warning"] = "Warning";
|
|
13
|
-
NotificationType["Error"] = "Error";
|
|
14
|
-
NotificationType["Success"] = "Success";
|
|
15
|
-
})(NotificationType || (NotificationType = {}));
|
|
16
|
-
export class MesAuthService {
|
|
17
|
-
constructor(http, router) {
|
|
18
|
-
this.http = http;
|
|
19
|
-
this.router = router;
|
|
20
|
-
this.hubConnection = null;
|
|
21
|
-
this._currentUser = new BehaviorSubject(null);
|
|
22
|
-
this.currentUser$ = this._currentUser.asObservable();
|
|
23
|
-
this._notifications = new Subject();
|
|
24
|
-
this.notifications$ = this._notifications.asObservable();
|
|
25
|
-
this.apiBase = '';
|
|
26
|
-
this.config = null;
|
|
27
|
-
// Listen for route changes - only refresh user data if needed for SPA navigation
|
|
28
|
-
// This helps maintain authentication state in single-page applications
|
|
29
|
-
if (this.router) {
|
|
30
|
-
this.router.events
|
|
31
|
-
.pipe(filter(event => event instanceof NavigationEnd), debounceTime(1000) // Longer debounce to avoid interfering with login flow
|
|
32
|
-
)
|
|
33
|
-
.subscribe((event) => {
|
|
34
|
-
// Only refresh if user is logged in and navigating to protected routes
|
|
35
|
-
// Avoid refreshing during login/logout flows
|
|
36
|
-
if (this._currentUser.value && this.isProtectedRoute(event.url)) {
|
|
37
|
-
// Small delay to ensure any login/logout operations complete
|
|
38
|
-
setTimeout(() => {
|
|
39
|
-
if (this._currentUser.value) {
|
|
40
|
-
this.refreshUser();
|
|
41
|
-
}
|
|
42
|
-
}, 100);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
isProtectedRoute(url) {
|
|
48
|
-
// Consider routes protected if they don't include auth-related paths
|
|
49
|
-
return !url.includes('/login') && !url.includes('/auth') && !url.includes('/signin') && !url.includes('/logout');
|
|
50
|
-
}
|
|
51
|
-
init(config) {
|
|
52
|
-
this.config = config;
|
|
53
|
-
this.apiBase = config.apiBaseUrl.replace(/\/$/, '');
|
|
54
|
-
this.fetchCurrentUser();
|
|
55
|
-
this.fetchInitialNotifications();
|
|
56
|
-
}
|
|
57
|
-
getConfig() {
|
|
58
|
-
return this.config;
|
|
59
|
-
}
|
|
60
|
-
fetchCurrentUser() {
|
|
61
|
-
if (!this.apiBase)
|
|
62
|
-
return;
|
|
63
|
-
const url = `${this.apiBase}/auth/me`;
|
|
64
|
-
this.http.get(url, { withCredentials: this.config?.withCredentials ?? true }).subscribe({
|
|
65
|
-
next: (u) => {
|
|
66
|
-
this._currentUser.next(u);
|
|
67
|
-
if (u && this.config) {
|
|
68
|
-
this.startConnection(this.config);
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
error: (err) => { }
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
fetchInitialNotifications() {
|
|
75
|
-
if (!this.apiBase)
|
|
76
|
-
return;
|
|
77
|
-
this.http.get(`${this.apiBase}/notif/me`, { withCredentials: this.config?.withCredentials ?? true }).subscribe({
|
|
78
|
-
next: (notifications) => {
|
|
79
|
-
if (Array.isArray(notifications?.items)) {
|
|
80
|
-
notifications.items.forEach((n) => this._notifications.next(n));
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
error: (err) => { }
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
getUnreadCount() {
|
|
87
|
-
return this.http.get(`${this.apiBase}/notif/me/unread-count`, { withCredentials: this.config?.withCredentials ?? true });
|
|
88
|
-
}
|
|
89
|
-
getNotifications(page = 1, pageSize = 20, includeRead = false, type) {
|
|
90
|
-
let url = `${this.apiBase}/notif/me?page=${page}&pageSize=${pageSize}&includeRead=${includeRead}`;
|
|
91
|
-
if (type) {
|
|
92
|
-
url += `&type=${type}`;
|
|
93
|
-
}
|
|
94
|
-
return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true });
|
|
95
|
-
}
|
|
96
|
-
markAsRead(notificationId) {
|
|
97
|
-
return this.http.patch(`${this.apiBase}/notif/${notificationId}/read`, {}, { withCredentials: this.config?.withCredentials ?? true });
|
|
98
|
-
}
|
|
99
|
-
markAllAsRead() {
|
|
100
|
-
return this.http.patch(`${this.apiBase}/notif/me/read-all`, {}, { withCredentials: this.config?.withCredentials ?? true });
|
|
101
|
-
}
|
|
102
|
-
deleteNotification(notificationId) {
|
|
103
|
-
return this.http.delete(`${this.apiBase}/notif/${notificationId}`, { withCredentials: this.config?.withCredentials ?? true });
|
|
104
|
-
}
|
|
105
|
-
startConnection(config) {
|
|
106
|
-
if (this.hubConnection)
|
|
107
|
-
return;
|
|
108
|
-
const signalrUrl = config.apiBaseUrl.replace(/\/$/, '') + '/hub/notification';
|
|
109
|
-
const builder = new HubConnectionBuilder()
|
|
110
|
-
.withUrl(signalrUrl, { withCredentials: config.withCredentials ?? true })
|
|
111
|
-
.withAutomaticReconnect()
|
|
112
|
-
.configureLogging(LogLevel.Warning);
|
|
113
|
-
this.hubConnection = builder.build();
|
|
114
|
-
this.hubConnection.on('ReceiveNotification', (n) => {
|
|
115
|
-
this._notifications.next(n);
|
|
116
|
-
});
|
|
117
|
-
this.hubConnection.start().then(() => { }).catch((err) => { });
|
|
118
|
-
this.hubConnection.onclose(() => { });
|
|
119
|
-
this.hubConnection.onreconnecting(() => { });
|
|
120
|
-
this.hubConnection.onreconnected(() => { });
|
|
121
|
-
}
|
|
122
|
-
stop() {
|
|
123
|
-
if (!this.hubConnection)
|
|
124
|
-
return;
|
|
125
|
-
this.hubConnection.stop().catch(() => { });
|
|
126
|
-
this.hubConnection = null;
|
|
127
|
-
}
|
|
128
|
-
logout() {
|
|
129
|
-
const url = `${this.apiBase}/auth/logout`;
|
|
130
|
-
return this.http.post(url, {}, { withCredentials: this.config?.withCredentials ?? true }).pipe(tap(() => {
|
|
131
|
-
this._currentUser.next(null);
|
|
132
|
-
this.stop();
|
|
133
|
-
}));
|
|
134
|
-
}
|
|
135
|
-
refreshUser() {
|
|
136
|
-
this.fetchCurrentUser();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
MesAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService, deps: [{ token: i1.HttpClient }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
140
|
-
MesAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService });
|
|
141
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService, decorators: [{
|
|
142
|
-
type: Injectable
|
|
143
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.Router, decorators: [{
|
|
144
|
-
type: Optional
|
|
145
|
-
}] }]; } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXMtYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFVLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBb0N4RCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQzFCLGlDQUFhLENBQUE7SUFDYix1Q0FBbUIsQ0FBQTtJQUNuQixtQ0FBZSxDQUFBO0lBQ2YsdUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLM0I7QUFzQ0QsTUFBTSxPQUFPLGNBQWM7SUFVekIsWUFBb0IsSUFBZ0IsRUFBc0IsTUFBZTtRQUFyRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQXNCLFdBQU0sR0FBTixNQUFNLENBQVM7UUFUakUsa0JBQWEsR0FBeUIsSUFBSSxDQUFDO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7UUFDeEQsaUJBQVksR0FBNkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDckMsbUJBQWMsR0FBb0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwRSxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsV0FBTSxHQUF5QixJQUFJLENBQUM7UUFHMUMsaUZBQWlGO1FBQ2pGLHVFQUF1RTtRQUN2RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07aUJBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHVEQUF1RDthQUMzRTtpQkFDQSxTQUFTLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7Z0JBQ2xDLHVFQUF1RTtnQkFDdkUsNkNBQTZDO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQy9ELDZEQUE2RDtvQkFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFOzRCQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7eUJBQ3BCO29CQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDVDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsR0FBVztRQUNsQyxxRUFBcUU7UUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFxQjtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsTUFBTSxHQUFHLEdBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxVQUFVLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RGLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbkM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRSxDQUFDO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RyxJQUFJLEVBQUUsQ0FBQyxhQUFrQixFQUFFLEVBQUU7Z0JBQzNCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN0RTtZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFFLENBQUM7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLHdCQUF3QixFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0gsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQWUsQ0FBQyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxjQUF1QixLQUFLLEVBQUUsSUFBYTtRQUMxRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLGtCQUFrQixJQUFJLGFBQWEsUUFBUSxnQkFBZ0IsV0FBVyxFQUFFLENBQUM7UUFDbEcsSUFBSSxJQUFJLEVBQUU7WUFDUixHQUFHLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQztTQUN4QjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVNLFVBQVUsQ0FBQyxjQUFzQjtRQUN0QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sVUFBVSxjQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBRU0sYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sb0JBQW9CLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0gsQ0FBQztJQUVNLGtCQUFrQixDQUFDLGNBQXNCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxVQUFVLGNBQWMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEksQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFxQjtRQUMzQyxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUMvQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7UUFDOUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQkFBb0IsRUFBRTthQUN2QyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7YUFDeEUsc0JBQXNCLEVBQUU7YUFDeEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRU0sTUFBTTtRQUNYLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sY0FBYyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDNUYsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDOzsyR0EzSVUsY0FBYzsrR0FBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQVc4QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBIdWJDb25uZWN0aW9uLCBIdWJDb25uZWN0aW9uQnVpbGRlciwgTG9nTGV2ZWwgfSBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBmaWx0ZXIsIGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVzQXV0aENvbmZpZyB7ICBcclxuICBhcGlCYXNlVXJsOiBzdHJpbmc7XHJcbiAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICB1c2VyQmFzZVVybD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XHJcbiAgdXNlcklkPzogc3RyaW5nO1xyXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xyXG4gIGZ1bGxOYW1lPzogc3RyaW5nO1xyXG4gIGdlbmRlcj86IHN0cmluZztcclxuICBlbWFpbD86IHN0cmluZztcclxuICBwaG9uZU51bWJlcj86IHN0cmluZztcclxuICBkZXBhcnRtZW50Pzogc3RyaW5nO1xyXG4gIHBvc2l0aW9uPzogc3RyaW5nO1xyXG4gIHRva2VuVmVyc2lvbj86IHN0cmluZztcclxuICBwZXJtRW5kcG9pbnQ/OiBzdHJpbmc7XHJcbiAgcGVybXM/OiBTZXQ8c3RyaW5nPjtcclxuICBlbXBsb3llZUNvZGU/OiBzdHJpbmc7XHJcbiAgaHJGdWxsTmFtZVZuPzogc3RyaW5nO1xyXG4gIGhyRnVsbE5hbWVFbj86IHN0cmluZztcclxuICBoclBvc2l0aW9uPzogc3RyaW5nO1xyXG4gIGhySm9iVGl0bGU/OiBzdHJpbmc7XHJcbiAgaHJHZW5kZXI/OiBzdHJpbmc7XHJcbiAgaHJNb2JpbGU/OiBzdHJpbmc7XHJcbiAgaHJFbWFpbD86IHN0cmluZztcclxuICBockpvaW5EYXRlPzogc3RyaW5nO1xyXG4gIGhyQmlydGhEYXRlPzogc3RyaW5nO1xyXG4gIGhyV29ya1N0YXR1cz86IHN0cmluZztcclxuICBockRvaVR1b25nPzogc3RyaW5nO1xyXG4gIGhyVGVhbUNvZGU/OiBzdHJpbmc7XHJcbiAgaHJMaW5lQ29kZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uVHlwZSB7XHJcbiAgSW5mbyA9ICdJbmZvJyxcclxuICBXYXJuaW5nID0gJ1dhcm5pbmcnLFxyXG4gIEVycm9yID0gJ0Vycm9yJyxcclxuICBTdWNjZXNzID0gJ1N1Y2Nlc3MnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uRHRvIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIG1lc3NhZ2VIdG1sPzogc3RyaW5nO1xyXG4gIHVybD86IHN0cmluZztcclxuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xyXG4gIGlzUmVhZDogYm9vbGVhbjtcclxuICBjcmVhdGVkQXQ6IHN0cmluZztcclxuICBzb3VyY2VBcHBOYW1lOiBzdHJpbmc7XHJcbiAgc291cmNlQXBwSWNvblVybD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3Q8VD4ge1xyXG4gIGl0ZW1zOiBUW107XHJcbiAgdG90YWxDb3VudDogbnVtYmVyO1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHRvdGFsUGFnZXM6IG51bWJlcjtcclxuICBoYXNOZXh0OiBib29sZWFuO1xyXG4gIGhhc1ByZXZpb3VzOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlYWxUaW1lTm90aWZpY2F0aW9uRHRvIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIG1lc3NhZ2VIdG1sPzogc3RyaW5nO1xyXG4gIHVybD86IHN0cmluZztcclxuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIHNvdXJjZUFwcE5hbWU6IHN0cmluZztcclxuICBzb3VyY2VBcHBJY29uVXJsPzogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNZXNBdXRoU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBodWJDb25uZWN0aW9uOiBIdWJDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFVzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElVc2VyIHwgbnVsbD4obnVsbCk7XHJcbiAgcHVibGljIGN1cnJlbnRVc2VyJDogT2JzZXJ2YWJsZTxJVXNlciB8IG51bGw+ID0gdGhpcy5fY3VycmVudFVzZXIuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9ucyA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwdWJsaWMgbm90aWZpY2F0aW9ucyQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuX25vdGlmaWNhdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgYXBpQmFzZSA9ICcnO1xyXG4gIHByaXZhdGUgY29uZmlnOiBNZXNBdXRoQ29uZmlnIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZXI/OiBSb3V0ZXIpIHtcclxuICAgIC8vIExpc3RlbiBmb3Igcm91dGUgY2hhbmdlcyAtIG9ubHkgcmVmcmVzaCB1c2VyIGRhdGEgaWYgbmVlZGVkIGZvciBTUEEgbmF2aWdhdGlvblxyXG4gICAgLy8gVGhpcyBoZWxwcyBtYWludGFpbiBhdXRoZW50aWNhdGlvbiBzdGF0ZSBpbiBzaW5nbGUtcGFnZSBhcHBsaWNhdGlvbnNcclxuICAgIGlmICh0aGlzLnJvdXRlcikge1xyXG4gICAgICB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApIC8vIExvbmdlciBkZWJvdW5jZSB0byBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIGxvZ2luIGZsb3dcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgIC8vIE9ubHkgcmVmcmVzaCBpZiB1c2VyIGlzIGxvZ2dlZCBpbiBhbmQgbmF2aWdhdGluZyB0byBwcm90ZWN0ZWQgcm91dGVzXHJcbiAgICAgICAgICAvLyBBdm9pZCByZWZyZXNoaW5nIGR1cmluZyBsb2dpbi9sb2dvdXQgZmxvd3NcclxuICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VXNlci52YWx1ZSAmJiB0aGlzLmlzUHJvdGVjdGVkUm91dGUoZXZlbnQudXJsKSkge1xyXG4gICAgICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgYW55IGxvZ2luL2xvZ291dCBvcGVyYXRpb25zIGNvbXBsZXRlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VXNlci52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVXNlcigpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNQcm90ZWN0ZWRSb3V0ZSh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ29uc2lkZXIgcm91dGVzIHByb3RlY3RlZCBpZiB0aGV5IGRvbid0IGluY2x1ZGUgYXV0aC1yZWxhdGVkIHBhdGhzXHJcbiAgICByZXR1cm4gIXVybC5pbmNsdWRlcygnL2xvZ2luJykgJiYgIXVybC5pbmNsdWRlcygnL2F1dGgnKSAmJiAhdXJsLmluY2x1ZGVzKCcvc2lnbmluJykgJiYgIXVybC5pbmNsdWRlcygnL2xvZ291dCcpO1xyXG4gIH1cclxuXHJcbiAgaW5pdChjb25maWc6IE1lc0F1dGhDb25maWcpIHtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgdGhpcy5hcGlCYXNlID0gY29uZmlnLmFwaUJhc2VVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcclxuICAgIHRoaXMuZmV0Y2hDdXJyZW50VXNlcigpO1xyXG4gICAgdGhpcy5mZXRjaEluaXRpYWxOb3RpZmljYXRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWcoKTogTWVzQXV0aENvbmZpZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEN1cnJlbnRVc2VyKCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaUJhc2UpIHJldHVybjtcclxuICAgIGNvbnN0IHVybCA9ICBgJHt0aGlzLmFwaUJhc2V9L2F1dGgvbWVgO1xyXG4gICAgdGhpcy5odHRwLmdldCh1cmwsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHUpID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5uZXh0KHUpO1xyXG4gICAgICAgIGlmICh1ICYmIHRoaXMuY29uZmlnKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0Q29ubmVjdGlvbih0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge31cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEluaXRpYWxOb3RpZmljYXRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaUJhc2UpIHJldHVybjtcclxuICAgIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi9tZWAsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKG5vdGlmaWNhdGlvbnM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vdGlmaWNhdGlvbnM/Lml0ZW1zKSkge1xyXG4gICAgICAgICAgbm90aWZpY2F0aW9ucy5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHRoaXMuX25vdGlmaWNhdGlvbnMubmV4dChuKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge31cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFVucmVhZENvdW50KCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmFwaUJhc2V9L25vdGlmL21lL3VucmVhZC1jb3VudGAsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Tm90aWZpY2F0aW9ucyhwYWdlOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gMjAsIGluY2x1ZGVSZWFkOiBib29sZWFuID0gZmFsc2UsIHR5cGU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IHVybCA9IGAke3RoaXMuYXBpQmFzZX0vbm90aWYvbWU/cGFnZT0ke3BhZ2V9JnBhZ2VTaXplPSR7cGFnZVNpemV9JmluY2x1ZGVSZWFkPSR7aW5jbHVkZVJlYWR9YDtcclxuICAgIGlmICh0eXBlKSB7XHJcbiAgICAgIHVybCArPSBgJnR5cGU9JHt0eXBlfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbWFya0FzUmVhZChub3RpZmljYXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2goYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi8ke25vdGlmaWNhdGlvbklkfS9yZWFkYCwge30sIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbWFya0FsbEFzUmVhZCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChgJHt0aGlzLmFwaUJhc2V9L25vdGlmL21lL3JlYWQtYWxsYCwge30sIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi8ke25vdGlmaWNhdGlvbklkfWAsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0Q29ubmVjdGlvbihjb25maWc6IE1lc0F1dGhDb25maWcpIHtcclxuICAgIGlmICh0aGlzLmh1YkNvbm5lY3Rpb24pIHJldHVybjtcclxuICAgIGNvbnN0IHNpZ25hbHJVcmwgPSBjb25maWcuYXBpQmFzZVVybC5yZXBsYWNlKC9cXC8kLywgJycpICsgJy9odWIvbm90aWZpY2F0aW9uJztcclxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgSHViQ29ubmVjdGlvbkJ1aWxkZXIoKVxyXG4gICAgICAud2l0aFVybChzaWduYWxyVXJsLCB7IHdpdGhDcmVkZW50aWFsczogY29uZmlnLndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pXHJcbiAgICAgIC53aXRoQXV0b21hdGljUmVjb25uZWN0KClcclxuICAgICAgLmNvbmZpZ3VyZUxvZ2dpbmcoTG9nTGV2ZWwuV2FybmluZyk7XHJcblxyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uID0gYnVpbGRlci5idWlsZCgpO1xyXG5cclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbignUmVjZWl2ZU5vdGlmaWNhdGlvbicsIChuOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5fbm90aWZpY2F0aW9ucy5uZXh0KG4pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uLnN0YXJ0KCkudGhlbigoKSA9PiB7fSkuY2F0Y2goKGVycikgPT4ge30pO1xyXG5cclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbmNsb3NlKCgpID0+IHt9KTtcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbnJlY29ubmVjdGluZygoKSA9PiB7fSk7XHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25yZWNvbm5lY3RlZCgoKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcCgpIHtcclxuICAgIGlmICghdGhpcy5odWJDb25uZWN0aW9uKSByZXR1cm47XHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24uc3RvcCgpLmNhdGNoKCgpID0+IHt9KTtcclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nb3V0KCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaUJhc2V9L2F1dGgvbG9nb3V0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pLnBpcGUoXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFVzZXIubmV4dChudWxsKTtcclxuICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaFVzZXIoKSB7XHJcbiAgICB0aGlzLmZldGNoQ3VycmVudFVzZXIoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzYXV0aC1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lc2F1dGgtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Component, Output, EventEmitter, HostBinding } from '@angular/core';
|
|
2
|
-
import { NgIf } from '@angular/common';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import { takeUntil } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./mes-auth.service";
|
|
7
|
-
import * as i2 from "./theme.service";
|
|
8
|
-
export class NotificationBadgeComponent {
|
|
9
|
-
constructor(authService, themeService) {
|
|
10
|
-
this.authService = authService;
|
|
11
|
-
this.themeService = themeService;
|
|
12
|
-
this.notificationClick = new EventEmitter();
|
|
13
|
-
this.unreadCount = 0;
|
|
14
|
-
this.currentTheme = 'light';
|
|
15
|
-
this.destroy$ = new Subject();
|
|
16
|
-
}
|
|
17
|
-
get themeClass() {
|
|
18
|
-
return `theme-${this.currentTheme}`;
|
|
19
|
-
}
|
|
20
|
-
ngOnInit() {
|
|
21
|
-
this.themeService.currentTheme$
|
|
22
|
-
.pipe(takeUntil(this.destroy$))
|
|
23
|
-
.subscribe(theme => {
|
|
24
|
-
this.currentTheme = theme;
|
|
25
|
-
});
|
|
26
|
-
this.loadUnreadCount();
|
|
27
|
-
// Listen for new notifications
|
|
28
|
-
this.authService.notifications$
|
|
29
|
-
.pipe(takeUntil(this.destroy$))
|
|
30
|
-
.subscribe(() => {
|
|
31
|
-
this.loadUnreadCount();
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
ngOnDestroy() {
|
|
35
|
-
this.destroy$.next();
|
|
36
|
-
this.destroy$.complete();
|
|
37
|
-
}
|
|
38
|
-
loadUnreadCount() {
|
|
39
|
-
this.authService.getUnreadCount().subscribe({
|
|
40
|
-
next: (response) => {
|
|
41
|
-
this.unreadCount = response.unreadCount || 0;
|
|
42
|
-
},
|
|
43
|
-
error: (err) => console.error('Error loading unread count:', err)
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
onNotificationClick() {
|
|
47
|
-
this.notificationClick.emit();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
NotificationBadgeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NotificationBadgeComponent, deps: [{ token: i1.MesAuthService }, { token: i2.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
-
NotificationBadgeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NotificationBadgeComponent, isStandalone: true, selector: "ma-notification-badge", outputs: { notificationClick: "notificationClick" }, host: { properties: { "class": "this.themeClass" } }, ngImport: i0, template: `
|
|
52
|
-
<button class="notification-btn" (click)="onNotificationClick()" title="Notifications">
|
|
53
|
-
<span class="icon">🔔</span>
|
|
54
|
-
<span class="badge" *ngIf="unreadCount > 0">{{ unreadCount }}</span>
|
|
55
|
-
</button>
|
|
56
|
-
`, isInline: true, styles: [":host{--error-color: #f44336}:host(.theme-dark){--error-color: #ef5350}.notification-btn{position:relative;background:none;border:none;font-size:24px;cursor:pointer;padding:8px;transition:opacity .2s}.notification-btn:hover{opacity:.7}.icon{display:inline-block}.badge{position:absolute;top:0;right:0;background-color:var(--error-color);color:#fff;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NotificationBadgeComponent, decorators: [{
|
|
58
|
-
type: Component,
|
|
59
|
-
args: [{ selector: 'ma-notification-badge', standalone: true, imports: [NgIf], template: `
|
|
60
|
-
<button class="notification-btn" (click)="onNotificationClick()" title="Notifications">
|
|
61
|
-
<span class="icon">🔔</span>
|
|
62
|
-
<span class="badge" *ngIf="unreadCount > 0">{{ unreadCount }}</span>
|
|
63
|
-
</button>
|
|
64
|
-
`, styles: [":host{--error-color: #f44336}:host(.theme-dark){--error-color: #ef5350}.notification-btn{position:relative;background:none;border:none;font-size:24px;cursor:pointer;padding:8px;transition:opacity .2s}.notification-btn:hover{opacity:.7}.icon{display:inline-block}.badge{position:absolute;top:0;right:0;background-color:var(--error-color);color:#fff;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}\n"] }]
|
|
65
|
-
}], ctorParameters: function () { return [{ type: i1.MesAuthService }, { type: i2.ThemeService }]; }, propDecorators: { notificationClick: [{
|
|
66
|
-
type: Output
|
|
67
|
-
}], themeClass: [{
|
|
68
|
-
type: HostBinding,
|
|
69
|
-
args: ['class']
|
|
70
|
-
}] } });
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWJhZGdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3RpZmljYXRpb24tYmFkZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQXdEM0MsTUFBTSxPQUFPLDBCQUEwQjtJQVVyQyxZQUFvQixXQUEyQixFQUFVLFlBQTBCO1FBQS9ELGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBVHpFLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLdkQsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsaUJBQVksR0FBVSxPQUFPLENBQUM7UUFDdEIsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFK0MsQ0FBQztJQVJ2RixJQUEwQixVQUFVO1FBQ2xDLE9BQU8sU0FBUyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQVFELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7YUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7YUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDO1NBQ2xFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7O3VIQTdDVSwwQkFBMEI7MkdBQTFCLDBCQUEwQiw0TEFsRDNCOzs7OztHQUtULHVpQkFOUyxJQUFJOzJGQW1ESCwwQkFBMEI7a0JBdER0QyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxJQUFJLENBQUMsWUFDTDs7Ozs7R0FLVDtnSUE4Q1MsaUJBQWlCO3NCQUExQixNQUFNO2dCQUNtQixVQUFVO3NCQUFuQyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1lc0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9tZXMtYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlLCBUaGVtZSB9IGZyb20gJy4vdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtYS1ub3RpZmljYXRpb24tYmFkZ2UnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW05nSWZdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwibm90aWZpY2F0aW9uLWJ0blwiIChjbGljayk9XCJvbk5vdGlmaWNhdGlvbkNsaWNrKClcIiB0aXRsZT1cIk5vdGlmaWNhdGlvbnNcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+8J+UlDwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiICpuZ0lmPVwidW5yZWFkQ291bnQgPiAwXCI+e3sgdW5yZWFkQ291bnQgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuICAgIDpob3N0IHtcclxuICAgICAgLS1lcnJvci1jb2xvcjogI2Y0NDMzNjtcclxuICAgIH1cclxuXHJcbiAgICA6aG9zdCgudGhlbWUtZGFyaykge1xyXG4gICAgICAtLWVycm9yLWNvbG9yOiAjZWY1MzUwO1xyXG4gICAgfVxyXG5cclxuICAgIC5ub3RpZmljYXRpb24tYnRuIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBwYWRkaW5nOiA4cHg7XHJcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcclxuICAgIH1cclxuXHJcbiAgICAubm90aWZpY2F0aW9uLWJ0bjpob3ZlciB7XHJcbiAgICAgIG9wYWNpdHk6IDAuNztcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuXHJcbiAgICAuYmFkZ2Uge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWVycm9yLWNvbG9yKTtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25CYWRnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAT3V0cHV0KCkgbm90aWZpY2F0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGdldCB0aGVtZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYHRoZW1lLSR7dGhpcy5jdXJyZW50VGhlbWV9YDtcclxuICB9XHJcbiAgXHJcbiAgdW5yZWFkQ291bnQgPSAwO1xyXG4gIGN1cnJlbnRUaGVtZTogVGhlbWUgPSAnbGlnaHQnO1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBNZXNBdXRoU2VydmljZSwgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRoZW1lU2VydmljZS5jdXJyZW50VGhlbWUkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh0aGVtZSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VGhlbWUgPSB0aGVtZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5sb2FkVW5yZWFkQ291bnQoKTtcclxuICAgIFxyXG4gICAgLy8gTGlzdGVuIGZvciBuZXcgbm90aWZpY2F0aW9uc1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5ub3RpZmljYXRpb25zJFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZFVucmVhZENvdW50KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFVucmVhZENvdW50KCkge1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRVbnJlYWRDb3VudCgpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy51bnJlYWRDb3VudCA9IHJlc3BvbnNlLnVucmVhZENvdW50IHx8IDA7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHVucmVhZCBjb3VudDonLCBlcnIpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uTm90aWZpY2F0aW9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNsaWNrLmVtaXQoKTtcclxuICB9XHJcbn1cclxuIl19
|