@kolektor/nucleus-identity 0.0.8-pre.5672 → 0.0.9-pre.5707

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.
Files changed (32) hide show
  1. package/{esm2015/kolektor-nucleus-identity.js → esm2020/kolektor-nucleus-identity.mjs} +0 -0
  2. package/{esm2015/lib/models/client-registration.js → esm2020/lib/models/client-registration.mjs} +0 -0
  3. package/{esm2015/lib/models/device-code.js → esm2020/lib/models/device-code.mjs} +0 -0
  4. package/{esm2015/lib/models/identity.js → esm2020/lib/models/identity.mjs} +0 -0
  5. package/{esm2015/lib/models/otp.js → esm2020/lib/models/otp.mjs} +0 -0
  6. package/{esm2015/lib/models/service-principal.js → esm2020/lib/models/service-principal.mjs} +0 -0
  7. package/{esm2015/lib/nucleus-identity-config.js → esm2020/lib/nucleus-identity-config.mjs} +0 -0
  8. package/{esm2015/lib/nucleus-identity.module.js → esm2020/lib/nucleus-identity.module.mjs} +4 -4
  9. package/esm2020/lib/nucleus-identity.service.mjs +343 -0
  10. package/esm2020/lib/nucleus-token-interceptor.service.mjs +64 -0
  11. package/{esm2015/lib/utils/angular-requestor.js → esm2020/lib/utils/angular-requestor.mjs} +5 -6
  12. package/{esm2015/lib/utils/authorization-service-configuration.js → esm2020/lib/utils/authorization-service-configuration.mjs} +0 -0
  13. package/{esm2015/lib/utils/location.service.js → esm2020/lib/utils/location.service.mjs} +3 -3
  14. package/{esm2015/lib/utils/nucleus-authorization-notifier.js → esm2020/lib/utils/nucleus-authorization-notifier.mjs} +0 -0
  15. package/{esm2015/lib/utils/nucleus-crypto.js → esm2020/lib/utils/nucleus-crypto.mjs} +0 -0
  16. package/esm2020/lib/utils/oidc-configuration.service.mjs +90 -0
  17. package/esm2020/lib/utils/secrets-store.mjs +100 -0
  18. package/esm2020/lib/utils/token-client.mjs +140 -0
  19. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  20. package/fesm2015/{kolektor-nucleus-identity.js → kolektor-nucleus-identity.mjs} +132 -133
  21. package/fesm2015/kolektor-nucleus-identity.mjs.map +1 -0
  22. package/fesm2020/kolektor-nucleus-identity.mjs +1042 -0
  23. package/fesm2020/kolektor-nucleus-identity.mjs.map +1 -0
  24. package/package.json +22 -9
  25. package/bundles/kolektor-nucleus-identity.umd.js +0 -1910
  26. package/bundles/kolektor-nucleus-identity.umd.js.map +0 -1
  27. package/esm2015/lib/nucleus-identity.service.js +0 -385
  28. package/esm2015/lib/nucleus-token-interceptor.service.js +0 -66
  29. package/esm2015/lib/utils/oidc-configuration.service.js +0 -95
  30. package/esm2015/lib/utils/secrets-store.js +0 -113
  31. package/esm2015/lib/utils/token-client.js +0 -159
  32. package/fesm2015/kolektor-nucleus-identity.js.map +0 -1
@@ -14,10 +14,10 @@ export class NucleusIdentityModule {
14
14
  };
15
15
  }
16
16
  }
17
- NucleusIdentityModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusIdentityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
- NucleusIdentityModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusIdentityModule });
19
- NucleusIdentityModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusIdentityModule, imports: [[]] });
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: NucleusIdentityModule, decorators: [{
17
+ NucleusIdentityModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
+ NucleusIdentityModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityModule });
19
+ NucleusIdentityModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityModule, imports: [[]] });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityModule, decorators: [{
21
21
  type: NgModule,
22
22
  args: [{
23
23
  imports: [],
@@ -0,0 +1,343 @@
1
+ import { AuthorizationRequest, RedirectRequestHandler, BasicQueryStringUtils, LocalStorageBackend, AppAuthError } from '@openid/appauth';
2
+ import { Injectable } from '@angular/core';
3
+ import { App } from '@capacitor/app';
4
+ import { Browser } from '@capacitor/browser';
5
+ import { Device } from '@capacitor/device';
6
+ import { NucleusCrypto } from './utils/nucleus-crypto';
7
+ import { NucleusAppService } from '@kolektor/nucleus-common';
8
+ import { LocationService } from './utils/location.service';
9
+ import { NucleusAuthorizationNotifier } from './utils/nucleus-authorization-notifier';
10
+ import { HttpClient } from '@angular/common/http';
11
+ import { SecretsStore } from './utils/secrets-store';
12
+ import { OidcConfigurationService } from './utils/oidc-configuration.service';
13
+ import { TokenClient } from './utils/token-client';
14
+ import { ServicePrincipalRegistrationStatus } from './models/service-principal';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@kolektor/nucleus-common";
17
+ import * as i2 from "./utils/location.service";
18
+ import * as i3 from "@angular/common/http";
19
+ import * as i4 from "./utils/oidc-configuration.service";
20
+ import * as i5 from "./utils/token-client";
21
+ export class NucleusIdentityService {
22
+ constructor(appService, location, http, config, tokenClient) {
23
+ this.appService = appService;
24
+ this.http = http;
25
+ this.config = config;
26
+ this.tokenClient = tokenClient;
27
+ this._authorizationNotifier = new NucleusAuthorizationNotifier();
28
+ this._initStarted = false;
29
+ this._initialized = false;
30
+ this._servicePrincipalTokenId = '_svcp';
31
+ const storage = new LocalStorageBackend();
32
+ this._crypto = new NucleusCrypto();
33
+ this._authorizationHandler = new RedirectRequestHandler(storage, new BasicQueryStringUtils(), location, this._crypto);
34
+ this._authorizationHandler.setAuthorizationNotifier(this._authorizationNotifier);
35
+ this._store = new SecretsStore(config.clientId);
36
+ }
37
+ get identity() {
38
+ return this._store.getIdentity();
39
+ }
40
+ get isAuthenticated() {
41
+ return this.identity != null;
42
+ }
43
+ get servicePrincipalIdentity() {
44
+ return this._store.getIdentity(this._servicePrincipalTokenId);
45
+ }
46
+ get isServicePrincipalAuthenticated() {
47
+ return this.servicePrincipalIdentity != null;
48
+ }
49
+ async init(startLogin = false) {
50
+ if (this._initStarted || this._initialized) {
51
+ console.warn('Nucleus.Identity: Auth initialization was already started. Don\'t call init() multiple times!');
52
+ return;
53
+ }
54
+ this._initStarted = true;
55
+ this.handleLaunchCodeHash();
56
+ await this._authorizationHandler.completeAuthorizationRequestIfPossible();
57
+ const authErr = this._authorizationNotifier.error;
58
+ if (authErr) {
59
+ throw new Error('Authorization err: ' + authErr.error + ': ' + authErr.errorDescription);
60
+ }
61
+ else if (this._authorizationNotifier.response) {
62
+ window.location.hash = '';
63
+ const request = this._authorizationNotifier.request;
64
+ const response = this._authorizationNotifier.response;
65
+ const res = await this.tokenClient.getByAuthorizationCode(request.redirectUri, response.code, request.internal['code_verifier']);
66
+ await this._store.setToken(res);
67
+ }
68
+ else {
69
+ const res = await this._store.getToken();
70
+ if (!res && startLogin) {
71
+ await this.login();
72
+ }
73
+ }
74
+ this._initialized = true;
75
+ }
76
+ async loginWithSecret(provider, secret) {
77
+ this._store.removeToken();
78
+ const assertionToken = await this.getServicePrincipalAccessToken();
79
+ const scope = this.prepareScope(true, this.config?.requestedScopes);
80
+ const res = await this.tokenClient.getBySecret(provider, secret, assertionToken, scope);
81
+ await this._store.setToken(res);
82
+ }
83
+ async login() {
84
+ this._store.removeToken();
85
+ const config = await this.config.getConfiguration();
86
+ const request = this.prepareAuthorizationRequest();
87
+ if (this.appService.isNative) {
88
+ const listener = App.addListener('appUrlOpen', data => {
89
+ if (this.appService.platform === 'ios') {
90
+ Browser.close();
91
+ }
92
+ listener.remove();
93
+ const hash = this.getCodeHash(data.url);
94
+ if (hash) {
95
+ const targetUrl = window.location.origin + window.location.pathname + '#' + hash;
96
+ window.location.assign(targetUrl);
97
+ window.location.reload();
98
+ }
99
+ else {
100
+ console.warn('Nucleus.Identity: Redirect url did not contain authorization code!', data);
101
+ }
102
+ });
103
+ }
104
+ this._authorizationHandler.performAuthorizationRequest(config, request);
105
+ }
106
+ async logout() {
107
+ this._store.removeToken();
108
+ const config = await this.config.getConfiguration();
109
+ const redirectUrl = this.config.redirectUrl;
110
+ const logoutUrl = config.endSessionEndpoint + '?post_logout_redirect_uri=' + encodeURI(redirectUrl);
111
+ if (this.appService.isNative) {
112
+ const listener = App.addListener('appUrlOpen', () => {
113
+ Device.getInfo().then(info => {
114
+ if (info.platform === 'ios') {
115
+ Browser.close();
116
+ }
117
+ });
118
+ listener.remove();
119
+ });
120
+ Browser.open({ url: logoutUrl });
121
+ }
122
+ else {
123
+ window.location.assign(logoutUrl);
124
+ }
125
+ }
126
+ async getAccessToken() {
127
+ if (!this._getTokenPromise) {
128
+ this._getTokenPromise = this.getAccessTokenInternal();
129
+ }
130
+ try {
131
+ return await this._getTokenPromise;
132
+ }
133
+ finally {
134
+ this._getTokenPromise = null;
135
+ }
136
+ }
137
+ async getServicePrincipalAccessToken() {
138
+ if (!this._getServicePrincipalTokenPromise) {
139
+ this._getServicePrincipalTokenPromise = this.getServicePrincipalAccessTokenInternal();
140
+ }
141
+ try {
142
+ return await this._getServicePrincipalTokenPromise;
143
+ }
144
+ finally {
145
+ this._getServicePrincipalTokenPromise = null;
146
+ }
147
+ }
148
+ async loginServicePrincipal() {
149
+ await this.loginServicePrincipalInternal();
150
+ }
151
+ /*
152
+ public async loginAsServicePrincipal() {
153
+ let token = await this._store.getToken(this._servicePrincipalTokenId);
154
+ if (!token) {
155
+ await this.loginServicePrincipal();
156
+ }
157
+ token = await this._store.getToken(this._servicePrincipalTokenId);
158
+ // TODO: we have to distinguished that token is service principal so refresh token stuff is handled correctly.
159
+ // We have to implement universal getAccessToken function that can handle all cases
160
+ await this._store.setToken(token);
161
+ }
162
+ */
163
+ async getOtp(type, expiresIn = -1) {
164
+ let url = this.config.getServerUrl(`/otp/create?type=${type}`);
165
+ if (expiresIn > 0) {
166
+ url += `&expiresIn=${expiresIn}`;
167
+ }
168
+ return this.http.get(url).toPromise();
169
+ }
170
+ async getOtpStatus(id) {
171
+ const url = this.config.getServerUrl(`/otp/status/${id}`);
172
+ return this.http.get(url).toPromise();
173
+ }
174
+ getOtpUrl(redirectUrl, password) {
175
+ const encoded = encodeURIComponent(redirectUrl);
176
+ const url = `/otp/auth?otpValue=${password}&returnUrl=${encoded}`;
177
+ return this.config.getServerUrl(url);
178
+ }
179
+ async startServicePrincipalRegistration() {
180
+ const sp = await this._store.getServicePrincipal();
181
+ return await this.tokenClient.getRegistrationCode(sp?.id);
182
+ }
183
+ async completeServicePrincipalRegistration(deviceCode) {
184
+ const tokenRes = await this.waitForDeviceToken(deviceCode);
185
+ const regRes = await this.tokenClient.registerServicePrincipal(tokenRes.accessToken);
186
+ await this._store.setServicePrincipal({
187
+ id: regRes.clientId,
188
+ secret: regRes.clientSecret,
189
+ expiresAt: regRes.secretExpirationDate
190
+ });
191
+ }
192
+ removeServicePrincipalRegistration() {
193
+ return this._store.removeServicePrincipal();
194
+ }
195
+ async getServicePrincipalRegistrationStatus() {
196
+ const sp = await this._store.getServicePrincipal();
197
+ return new ServicePrincipalRegistrationStatus(sp);
198
+ }
199
+ async startDeviceCodeLogin() {
200
+ const scope = this.prepareScope(true, this.config.requestedScopes);
201
+ return await this.tokenClient.getDeviceCode(scope);
202
+ }
203
+ async completeDeviceCodeLogin(deviceCode) {
204
+ const res = await this.waitForDeviceToken(deviceCode);
205
+ await this._store.setToken(res);
206
+ }
207
+ async waitForDeviceToken(deviceCode) {
208
+ let res = null;
209
+ do {
210
+ if (deviceCode.isExpired()) {
211
+ throw Error('Device code is expired!');
212
+ }
213
+ try {
214
+ res = await this.tokenClient.getByDeviceCode(deviceCode.deviceCode);
215
+ }
216
+ catch (error) {
217
+ if (error instanceof AppAuthError && error.message === 'authorization_pending') {
218
+ await this.delay(2000);
219
+ }
220
+ else {
221
+ throw error;
222
+ }
223
+ }
224
+ } while (!res);
225
+ return res;
226
+ }
227
+ prepareAuthorizationRequest() {
228
+ const redirectUri = this.config.redirectUrl;
229
+ const params = {
230
+ response_mode: 'fragment',
231
+ prompt: 'consent',
232
+ access_type: 'offline',
233
+ auth_provider_hint: this.config.authProviderHint
234
+ };
235
+ return new AuthorizationRequest({
236
+ client_id: this.config.clientId,
237
+ redirect_uri: redirectUri,
238
+ response_type: AuthorizationRequest.RESPONSE_TYPE_CODE,
239
+ scope: this.prepareScope(true, this.config.requestedScopes),
240
+ extras: params,
241
+ }, this._crypto, true);
242
+ }
243
+ async loginServicePrincipalInternal() {
244
+ const sp = await this._store.getServicePrincipal();
245
+ if (sp) {
246
+ const scope = this.prepareScope(false, this.config.servicePrincipalRequestedScopes);
247
+ const res = await this.tokenClient.getByClientCredentials(sp.id, sp.secret, scope);
248
+ await this._store.setToken(res, this._servicePrincipalTokenId);
249
+ return res;
250
+ }
251
+ else {
252
+ throw Error('Service principal is not registered!');
253
+ }
254
+ }
255
+ async getServicePrincipalAccessTokenInternal() {
256
+ let token = await this._store.getToken(this._servicePrincipalTokenId);
257
+ if (!token?.isValid()) {
258
+ token = await this.loginServicePrincipalInternal();
259
+ }
260
+ return token?.accessToken;
261
+ }
262
+ async getAccessTokenInternal() {
263
+ let token = await this._store.getToken();
264
+ if (token && !token.isValid()) {
265
+ token = await this.loginWithRefreshToken(token);
266
+ }
267
+ return token?.accessToken;
268
+ }
269
+ async loginWithRefreshToken(token) {
270
+ if (!this._refreshTokenPromise) {
271
+ this._refreshTokenPromise = this.loginWithRefreshTokenInternal(token);
272
+ }
273
+ try {
274
+ return await this._refreshTokenPromise;
275
+ }
276
+ finally {
277
+ this._refreshTokenPromise = null;
278
+ }
279
+ }
280
+ async loginWithRefreshTokenInternal(token) {
281
+ if (token?.refreshToken) {
282
+ try {
283
+ const res = await this.tokenClient.getByRefreshToken(token.refreshToken);
284
+ await this._store.setToken(res);
285
+ return res;
286
+ }
287
+ catch (err) {
288
+ console.warn('Nucleus.Identity: Failed to login with refresh token.', err);
289
+ if (err.message === 'invalid_grant') {
290
+ await this.logout();
291
+ }
292
+ }
293
+ }
294
+ else {
295
+ console.warn('Nucleus.Identity: There is no refresh token available.');
296
+ }
297
+ }
298
+ getCodeHash(url) {
299
+ const arr = url.split('#');
300
+ if (arr.length > 1) {
301
+ const hash = arr[1];
302
+ if (hash.startsWith('code=')) {
303
+ return hash;
304
+ }
305
+ }
306
+ return null;
307
+ }
308
+ handleLaunchCodeHash() {
309
+ if (this.appService.isNative && this.appService.launchUrl) {
310
+ const hash = this.getCodeHash(this.appService.launchUrl);
311
+ if (hash) {
312
+ console.log('Nucleus.Identity: Got authorization code from launchUrl, will assign it to hash.');
313
+ window.location.hash = '#' + hash;
314
+ }
315
+ }
316
+ }
317
+ prepareScope(offlineAccess, aditionalScope) {
318
+ let scope = 'openid';
319
+ if (offlineAccess) {
320
+ scope += ' offline_access';
321
+ }
322
+ if (scope) {
323
+ scope += ' ' + aditionalScope;
324
+ }
325
+ return scope;
326
+ }
327
+ delay(miliseconds) {
328
+ return new Promise(resolve => {
329
+ setTimeout(() => {
330
+ resolve();
331
+ }, miliseconds);
332
+ });
333
+ }
334
+ }
335
+ NucleusIdentityService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityService, deps: [{ token: i1.NucleusAppService }, { token: i2.LocationService }, { token: i3.HttpClient }, { token: i4.OidcConfigurationService }, { token: i5.TokenClient }], target: i0.ɵɵFactoryTarget.Injectable });
336
+ NucleusIdentityService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityService, providedIn: 'root' });
337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusIdentityService, decorators: [{
338
+ type: Injectable,
339
+ args: [{
340
+ providedIn: 'root'
341
+ }]
342
+ }], ctorParameters: function () { return [{ type: i1.NucleusAppService }, { type: i2.LocationService }, { type: i3.HttpClient }, { type: i4.OidcConfigurationService }, { type: i5.TokenClient }]; } });
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL251Y2xldXMtaWRlbnRpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBR3BCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLFlBQVksRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7OztBQUtoRixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsVUFBNkIsRUFDckMsUUFBeUIsRUFDakIs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dGhvcml6YXRpb25SZXF1ZXN0LFxyXG4gIFRva2VuUmVzcG9uc2UsXHJcbiAgQ3J5cHRvLFxyXG4gIFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIsXHJcbiAgQmFzaWNRdWVyeVN0cmluZ1V0aWxzLFxyXG4gIExvY2FsU3RvcmFnZUJhY2tlbmQsXHJcbiAgQXBwQXV0aEVycm9yXHJcbn0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQXBwIH0gZnJvbSAnQGNhcGFjaXRvci9hcHAnO1xyXG5pbXBvcnQgeyBCcm93c2VyIH0gZnJvbSAnQGNhcGFjaXRvci9icm93c2VyJztcclxuaW1wb3J0IHsgRGV2aWNlIH0gZnJvbSAnQGNhcGFjaXRvci9kZXZpY2UnO1xyXG5pbXBvcnQgeyBOdWNsZXVzQ3J5cHRvIH0gZnJvbSAnLi91dGlscy9udWNsZXVzLWNyeXB0byc7XHJcbmltcG9ydCB7IE51Y2xldXNBcHBTZXJ2aWNlIH0gZnJvbSAnQGtvbGVrdG9yL251Y2xldXMtY29tbW9uJztcclxuaW1wb3J0IHsgTG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi91dGlscy9sb2NhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuaW1wb3J0IHsgTnVjbGV1c0F1dGhvcml6YXRpb25Ob3RpZmllciB9IGZyb20gJy4vdXRpbHMvbnVjbGV1cy1hdXRob3JpemF0aW9uLW5vdGlmaWVyJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT3RwUmVzcG9uc2UsIE90cFN0YXR1cywgT3RwVHlwZSB9IGZyb20gJy4vbW9kZWxzL290cCc7XHJcbmltcG9ydCB7IFNlY3JldHNTdG9yZSB9IGZyb20gJy4vdXRpbHMvc2VjcmV0cy1zdG9yZSc7XHJcbmltcG9ydCB7IE9pZGNDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvb2lkYy1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2tlbkNsaWVudCB9IGZyb20gJy4vdXRpbHMvdG9rZW4tY2xpZW50JztcclxuaW1wb3J0IHsgRGV2aWNlQ29kZSB9IGZyb20gJy4vbW9kZWxzL2RldmljZS1jb2RlJztcclxuaW1wb3J0IHsgU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cyB9IGZyb20gJy4vbW9kZWxzL3NlcnZpY2UtcHJpbmNpcGFsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eVNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBOdWNsZXVzQXBwU2VydmljZSxcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGNvbmZpZzogT2lkY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2tlbkNsaWVudDogVG9rZW5DbGllbnRcclxuICApIHtcclxuICAgIGNvbnN0IHN0b3JhZ2UgPSBuZXcgTG9jYWxTdG9yYWdlQmFja2VuZCgpO1xyXG4gICAgdGhpcy5fY3J5cHRvID0gbmV3IE51Y2xldXNDcnlwdG8oKTtcclxuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoc3RvcmFnZSwgbmV3IEJhc2ljUXVlcnlTdHJpbmdVdGlscygpLCBsb2NhdGlvbiwgdGhpcy5fY3J5cHRvKTtcclxuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IYW5kbGVyLnNldEF1dGhvcml6YXRpb25Ob3RpZmllcih0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIpO1xyXG4gICAgdGhpcy5fc3RvcmUgPSBuZXcgU2VjcmV0c1N0b3JlKGNvbmZpZy5jbGllbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiBhZGQgc29tZSBraW5kIG9mIGNvbmZpZyB0aGF0IHdpbGwgc3BlY2lmeSB3aGljaCB0b2tlbiAodXNlclRva2VuIG9yIHNlcnZpY2VQcmluY2lwYWxUb2tlbikgc2hvdWxkIGJlIGluamVjdGVkIGJ5IGh0dHBJbnRlcmNlcHRvclxyXG5cclxuICBwcml2YXRlIF9hdXRob3JpemF0aW9uSGFuZGxlcjogQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyO1xyXG4gIHByaXZhdGUgX2F1dGhvcml6YXRpb25Ob3RpZmllciA9IG5ldyBOdWNsZXVzQXV0aG9yaXphdGlvbk5vdGlmaWVyKCk7XHJcbiAgcHJpdmF0ZSBfY3J5cHRvOiBDcnlwdG87XHJcbiAgcHJpdmF0ZSBfaW5pdFN0YXJ0ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hUb2tlblByb21pc2U6IFByb21pc2U8VG9rZW5SZXNwb25zZT47XHJcbiAgcHJpdmF0ZSBfZ2V0VG9rZW5Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XHJcbiAgcHJpdmF0ZSBfZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHByaXZhdGUgX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkID0gJ19zdmNwJztcclxuICBwcml2YXRlIF9zdG9yZTogU2VjcmV0c1N0b3JlO1xyXG5cclxuICBwdWJsaWMgZ2V0IGlkZW50aXR5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmlkZW50aXR5ICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlcnZpY2VQcmluY2lwYWxJZGVudGl0eSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRJZGVudGl0eSh0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2VydmljZVByaW5jaXBhbEF1dGhlbnRpY2F0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkgIT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0KHN0YXJ0TG9naW46IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX2luaXRTdGFydGVkIHx8IHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTnVjbGV1cy5JZGVudGl0eTogQXV0aCBpbml0aWFsaXphdGlvbiB3YXMgYWxyZWFkeSBzdGFydGVkLiBEb25cXCd0IGNhbGwgaW5pdCgpIG11bHRpcGxlIHRpbWVzIScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0U3RhcnRlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5oYW5kbGVMYXVuY2hDb2RlSGFzaCgpO1xyXG4gICAgYXdhaXQgdGhpcy5fYXV0aG9yaXphdGlvbkhhbmRsZXIuY29tcGxldGVBdXRob3JpemF0aW9uUmVxdWVzdElmUG9zc2libGUoKTtcclxuXHJcbiAgICBjb25zdCBhdXRoRXJyID0gdGhpcy5fYXV0aG9yaXphdGlvbk5vdGlmaWVyLmVycm9yO1xyXG4gICAgaWYgKGF1dGhFcnIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRob3JpemF0aW9uIGVycjogJyArIGF1dGhFcnIuZXJyb3IgKyAnOiAnICsgYXV0aEVyci5lcnJvckRlc2NyaXB0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5fYXV0aG9yaXphdGlvbk5vdGlmaWVyLnJlc3BvbnNlKSB7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIucmVxdWVzdDtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIucmVzcG9uc2U7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlBdXRob3JpemF0aW9uQ29kZShyZXF1ZXN0LnJlZGlyZWN0VXJpLCByZXNwb25zZS5jb2RlLCByZXF1ZXN0LmludGVybmFsWydjb2RlX3ZlcmlmaWVyJ10pO1xyXG4gICAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4oKTtcclxuICAgICAgaWYgKCFyZXMgJiYgc3RhcnRMb2dpbikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ2luV2l0aFNlY3JldChwcm92aWRlcjogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcclxuICAgIGNvbnN0IGFzc2VydGlvblRva2VuID0gYXdhaXQgdGhpcy5nZXRTZXJ2aWNlUHJpbmNpcGFsQWNjZXNzVG9rZW4oKTtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wcmVwYXJlU2NvcGUodHJ1ZSwgdGhpcy5jb25maWc/LnJlcXVlc3RlZFNjb3Blcyk7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5U2VjcmV0KHByb3ZpZGVyLCBzZWNyZXQsIGFzc2VydGlvblRva2VuLCBzY29wZSk7XHJcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnByZXBhcmVBdXRob3JpemF0aW9uUmVxdWVzdCgpO1xyXG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSkge1xyXG4gICAgICBjb25zdCBsaXN0ZW5lciA9IEFwcC5hZGRMaXN0ZW5lcignYXBwVXJsT3BlbicsIGRhdGEgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmFwcFNlcnZpY2UucGxhdGZvcm0gPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICBCcm93c2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldENvZGVIYXNoKGRhdGEudXJsKTtcclxuICAgICAgICBpZiAoaGFzaCkge1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0VXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICcjJyArIGhhc2g7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHRhcmdldFVybCk7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignTnVjbGV1cy5JZGVudGl0eTogUmVkaXJlY3QgdXJsIGRpZCBub3QgY29udGFpbiBhdXRob3JpemF0aW9uIGNvZGUhJywgZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IYW5kbGVyLnBlcmZvcm1BdXRob3JpemF0aW9uUmVxdWVzdChjb25maWcsIHJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3N0b3JlLnJlbW92ZVRva2VuKCk7XHJcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCk7XHJcbiAgICBjb25zdCByZWRpcmVjdFVybCA9IHRoaXMuY29uZmlnLnJlZGlyZWN0VXJsO1xyXG4gICAgY29uc3QgbG9nb3V0VXJsID0gY29uZmlnLmVuZFNlc3Npb25FbmRwb2ludCArICc/cG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpPScgKyBlbmNvZGVVUkkocmVkaXJlY3RVcmwpO1xyXG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSkge1xyXG4gICAgICBjb25zdCBsaXN0ZW5lciA9IEFwcC5hZGRMaXN0ZW5lcignYXBwVXJsT3BlbicsICgpID0+IHtcclxuICAgICAgICBEZXZpY2UuZ2V0SW5mbygpLnRoZW4oaW5mbyA9PiB7XHJcbiAgICAgICAgICBpZiAoaW5mby5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcclxuICAgICAgICAgICAgQnJvd3Nlci5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpO1xyXG4gICAgICB9KTtcclxuICAgICAgQnJvd3Nlci5vcGVuKHsgdXJsOiBsb2dvdXRVcmwgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGxvZ291dFVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2dldFRva2VuUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLl9nZXRUb2tlblByb21pc2UgPSB0aGlzLmdldEFjY2Vzc1Rva2VuSW50ZXJuYWwoKTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRUb2tlblByb21pc2U7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9nZXRUb2tlblByb21pc2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNlcnZpY2VQcmluY2lwYWxBY2Nlc3NUb2tlbigpIHtcclxuICAgIGlmICghdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlID0gdGhpcy5nZXRTZXJ2aWNlUHJpbmNpcGFsQWNjZXNzVG9rZW5JbnRlcm5hbCgpO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dldFNlcnZpY2VQcmluY2lwYWxUb2tlblByb21pc2U7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dpblNlcnZpY2VQcmluY2lwYWwoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvZ2luU2VydmljZVByaW5jaXBhbEludGVybmFsKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gIHB1YmxpYyBhc3luYyBsb2dpbkFzU2VydmljZVByaW5jaXBhbCgpIHtcclxuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFRva2VuKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcclxuICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2dpblNlcnZpY2VQcmluY2lwYWwoKTtcclxuICAgIH1cclxuICAgIHRva2VuID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4odGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xyXG4gICAgIC8vIFRPRE86IHdlIGhhdmUgdG8gZGlzdGluZ3Vpc2hlZCB0aGF0IHRva2VuIGlzIHNlcnZpY2UgcHJpbmNpcGFsIHNvIHJlZnJlc2ggdG9rZW4gc3R1ZmYgaXMgaGFuZGxlZCBjb3JyZWN0bHkuXHJcbiAgICAgLy8gV2UgaGF2ZSB0byBpbXBsZW1lbnQgdW5pdmVyc2FsIGdldEFjY2Vzc1Rva2VuIGZ1bmN0aW9uIHRoYXQgY2FuIGhhbmRsZSBhbGwgY2FzZXNcclxuICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFRva2VuKHRva2VuKTtcclxuICB9XHJcbiAgKi9cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldE90cCh0eXBlOiBPdHBUeXBlLCBleHBpcmVzSW46IG51bWJlciA9IC0xKSB7XHJcbiAgICBsZXQgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL2NyZWF0ZT90eXBlPSR7dHlwZX1gKTtcclxuICAgIGlmIChleHBpcmVzSW4gPiAwKSB7XHJcbiAgICAgIHVybCArPSBgJmV4cGlyZXNJbj0ke2V4cGlyZXNJbn1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8T3RwUmVzcG9uc2U+KHVybCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0T3RwU3RhdHVzKGlkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmdldFNlcnZlclVybChgL290cC9zdGF0dXMvJHtpZH1gKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE90cFN0YXR1cz4odXJsKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPdHBVcmwocmVkaXJlY3RVcmw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVybCk7XHJcbiAgICBjb25zdCB1cmwgPSBgL290cC9hdXRoP290cFZhbHVlPSR7cGFzc3dvcmR9JnJldHVyblVybD0ke2VuY29kZWR9YDtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRTZXJ2ZXJVcmwodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XHJcbiAgICBjb25zdCBzcCA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFNlcnZpY2VQcmluY2lwYWwoKTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldFJlZ2lzdHJhdGlvbkNvZGUoc3A/LmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjb21wbGV0ZVNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oZGV2aWNlQ29kZTogRGV2aWNlQ29kZSkge1xyXG4gICAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcclxuICAgIGNvbnN0IHJlZ1JlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQucmVnaXN0ZXJTZXJ2aWNlUHJpbmNpcGFsKHRva2VuUmVzLmFjY2Vzc1Rva2VuKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRTZXJ2aWNlUHJpbmNpcGFsKHtcclxuICAgICAgaWQ6IHJlZ1Jlcy5jbGllbnRJZCxcclxuICAgICAgc2VjcmV0OiByZWdSZXMuY2xpZW50U2VjcmV0LFxyXG4gICAgICBleHBpcmVzQXQ6IHJlZ1Jlcy5zZWNyZXRFeHBpcmF0aW9uRGF0ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9yZS5yZW1vdmVTZXJ2aWNlUHJpbmNpcGFsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cygpIHtcclxuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xyXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzKHNwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydERldmljZUNvZGVMb2dpbigpIHtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wcmVwYXJlU2NvcGUodHJ1ZSwgdGhpcy5jb25maWcucmVxdWVzdGVkU2NvcGVzKTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldERldmljZUNvZGUoc2NvcGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlRGV2aWNlQ29kZUxvZ2luKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMud2FpdEZvckRldmljZVRva2VuKGRldmljZUNvZGUpO1xyXG4gICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZVRva2VuKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcclxuICAgIGxldCByZXM6IFRva2VuUmVzcG9uc2UgPSBudWxsO1xyXG4gICAgZG8ge1xyXG4gICAgICBpZiAoZGV2aWNlQ29kZS5pc0V4cGlyZWQoKSkge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdEZXZpY2UgY29kZSBpcyBleHBpcmVkIScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlEZXZpY2VDb2RlKGRldmljZUNvZGUuZGV2aWNlQ29kZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBwQXV0aEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09ICdhdXRob3JpemF0aW9uX3BlbmRpbmcnKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGF5KDIwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gd2hpbGUgKCFyZXMpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUF1dGhvcml6YXRpb25SZXF1ZXN0KCk6IEF1dGhvcml6YXRpb25SZXF1ZXN0IHtcclxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICByZXNwb25zZV9tb2RlOiAnZnJhZ21lbnQnLFxyXG4gICAgICBwcm9tcHQ6ICdjb25zZW50JyxcclxuICAgICAgYWNjZXNzX3R5cGU6ICdvZmZsaW5lJyxcclxuICAgICAgYXV0aF9wcm92aWRlcl9oaW50OiB0aGlzLmNvbmZpZy5hdXRoUHJvdmlkZXJIaW50XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvblJlcXVlc3Qoe1xyXG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxyXG4gICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICByZXNwb25zZV90eXBlOiBBdXRob3JpemF0aW9uUmVxdWVzdC5SRVNQT05TRV9UWVBFX0NPREUsXHJcbiAgICAgIHNjb3BlOiB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpLFxyXG4gICAgICBleHRyYXM6IHBhcmFtcyxcclxuICAgIH0sIHRoaXMuX2NyeXB0bywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvZ2luU2VydmljZVByaW5jaXBhbEludGVybmFsKCkge1xyXG4gICAgY29uc3Qgc3AgPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRTZXJ2aWNlUHJpbmNpcGFsKCk7XHJcbiAgICBpZiAoc3ApIHtcclxuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZShmYWxzZSwgdGhpcy5jb25maWcuc2VydmljZVByaW5jaXBhbFJlcXVlc3RlZFNjb3Blcyk7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlDbGllbnRDcmVkZW50aWFscyhzcC5pZCwgc3Auc2VjcmV0LCBzY29wZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFRva2VuKHJlcywgdGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ1NlcnZpY2UgcHJpbmNpcGFsIGlzIG5vdCByZWdpc3RlcmVkIScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTZXJ2aWNlUHJpbmNpcGFsQWNjZXNzVG9rZW5JbnRlcm5hbCgpIHtcclxuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFRva2VuKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcclxuICAgIGlmICghdG9rZW4/LmlzVmFsaWQoKSkge1xyXG4gICAgICB0b2tlbiA9IGF3YWl0IHRoaXMubG9naW5TZXJ2aWNlUHJpbmNpcGFsSW50ZXJuYWwoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0b2tlbj8uYWNjZXNzVG9rZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEFjY2Vzc1Rva2VuSW50ZXJuYWwoKSB7XHJcbiAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRUb2tlbigpO1xyXG4gICAgaWYgKHRva2VuICYmICF0b2tlbi5pc1ZhbGlkKCkpIHtcclxuICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLmxvZ2luV2l0aFJlZnJlc2hUb2tlbih0b2tlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9rZW4/LmFjY2Vzc1Rva2VuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW4odG9rZW46IFRva2VuUmVzcG9uc2UpIHtcclxuICAgIGlmICghdGhpcy5fcmVmcmVzaFRva2VuUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlID0gdGhpcy5sb2dpbldpdGhSZWZyZXNoVG9rZW5JbnRlcm5hbCh0b2tlbik7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmcmVzaFRva2VuUHJvbWlzZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW5JbnRlcm5hbCh0b2tlbjogVG9rZW5SZXNwb25zZSkge1xyXG4gICAgaWYgKHRva2VuPy5yZWZyZXNoVG9rZW4pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5UmVmcmVzaFRva2VuKHRva2VuLnJlZnJlc2hUb2tlbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ051Y2xldXMuSWRlbnRpdHk6IEZhaWxlZCB0byBsb2dpbiB3aXRoIHJlZnJlc2ggdG9rZW4uJywgZXJyKTtcclxuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdpbnZhbGlkX2dyYW50Jykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTnVjbGV1cy5JZGVudGl0eTogVGhlcmUgaXMgbm8gcmVmcmVzaCB0b2tlbiBhdmFpbGFibGUuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvZGVIYXNoKHVybDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJyMnKTtcclxuICAgIGlmIChhcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICBjb25zdCBoYXNoID0gYXJyWzFdO1xyXG4gICAgICBpZiAoaGFzaC5zdGFydHNXaXRoKCdjb2RlPScpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhc2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMYXVuY2hDb2RlSGFzaCgpIHtcclxuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUgJiYgdGhpcy5hcHBTZXJ2aWNlLmxhdW5jaFVybCkge1xyXG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRDb2RlSGFzaCh0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKTtcclxuICAgICAgaWYgKGhhc2gpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5JZGVudGl0eTogR290IGF1dGhvcml6YXRpb24gY29kZSBmcm9tIGxhdW5jaFVybCwgd2lsbCBhc3NpZ24gaXQgdG8gaGFzaC4nKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcjJyArIGhhc2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVNjb3BlKG9mZmxpbmVBY2Nlc3M6IGJvb2xlYW4sIGFkaXRpb25hbFNjb3BlOiBzdHJpbmcpIHtcclxuICAgIGxldCBzY29wZSA9ICdvcGVuaWQnO1xyXG4gICAgaWYgKG9mZmxpbmVBY2Nlc3MpIHtcclxuICAgICAgc2NvcGUgKz0gJyBvZmZsaW5lX2FjY2Vzcyc7XHJcbiAgICB9XHJcbiAgICBpZiAoc2NvcGUpIHtcclxuICAgICAgc2NvcGUgKz0gJyAnICsgYWRpdGlvbmFsU2NvcGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2NvcGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGF5KG1pbGlzZWNvbmRzOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LCBtaWxpc2Vjb25kcyk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpErrorResponse } from '@angular/common/http';
3
+ import { from, throwError } from 'rxjs';
4
+ import { NucleusIdentityConfig } from './nucleus-identity-config';
5
+ import { NucleusIdentityService } from './nucleus-identity.service';
6
+ import { mergeMap, catchError } from 'rxjs/operators';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "./nucleus-identity.service";
9
+ import * as i2 from "./nucleus-identity-config";
10
+ export class NucleusTokenInterceptor {
11
+ constructor(auth, config) {
12
+ this.auth = auth;
13
+ this.config = config;
14
+ this._authorityInterceptPaths = ['/api', '/manage', '/otp/create', '/otp/status'];
15
+ this._authority = config.authority.toLowerCase();
16
+ this._interceptUrls = config.httpInterceptorUrls?.map(x => x.toLowerCase());
17
+ }
18
+ intercept(req, next) {
19
+ if (this.shouldIntercept(req.url)) {
20
+ const res = this.authorizeRequest(this.auth.getAccessToken(), req, next);
21
+ return this.checkUnauthorized(res);
22
+ }
23
+ return next.handle(req);
24
+ }
25
+ shouldIntercept(url) {
26
+ url = url.toLowerCase();
27
+ if (url.startsWith(this._authority)) {
28
+ const pathname = new URL(url).pathname;
29
+ return (this._authorityInterceptPaths.some(x => pathname.startsWith(x)));
30
+ }
31
+ if (this._interceptUrls?.length > 0) {
32
+ return this.config.httpInterceptorUrls.some(x => url.startsWith(x));
33
+ }
34
+ return false;
35
+ }
36
+ authorizeRequest(getToken, req, next) {
37
+ return from(getToken).pipe(mergeMap(token => {
38
+ if (token) {
39
+ const headers = req.headers.set('Authorization', `Bearer ${token}`);
40
+ req = req.clone({ headers });
41
+ }
42
+ return next.handle(req);
43
+ }));
44
+ }
45
+ checkUnauthorized(response) {
46
+ return response.pipe(catchError((err) => {
47
+ if (err instanceof HttpErrorResponse && err.status === 401) {
48
+ if (this.config.automaticLoginOnHttp401) {
49
+ this.auth.login();
50
+ }
51
+ }
52
+ return throwError(err);
53
+ }));
54
+ }
55
+ }
56
+ NucleusTokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusTokenInterceptor, deps: [{ token: i1.NucleusIdentityService }, { token: i2.NucleusIdentityConfig }], target: i0.ɵɵFactoryTarget.Injectable });
57
+ NucleusTokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusTokenInterceptor, providedIn: 'root' });
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NucleusTokenInterceptor, decorators: [{
59
+ type: Injectable,
60
+ args: [{
61
+ providedIn: 'root'
62
+ }]
63
+ }], ctorParameters: function () { return [{ type: i1.NucleusIdentityService }, { type: i2.NucleusIdentityConfig }]; } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL251Y2xldXMtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBd0QsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBS3RELE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBb0IsSUFBNEIsRUFBVSxNQUE2QjtRQUFuRSxTQUFJLEdBQUosSUFBSSxDQUF3QjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBTy9FLDZCQUF3QixHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFMbkYsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFNTSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUN2RCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVc7UUFDakMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV4QixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQXlCLEVBQUUsR0FBcUIsRUFBRSxJQUFpQjtRQUMxRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3hCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNmLElBQUksS0FBSyxFQUFFO2dCQUNQLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNoQztZQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQW9DO1FBQzVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakIsSUFBSSxHQUFHLFlBQVksaUJBQWlCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDbkI7YUFDRjtZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOztvSEF4RFUsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOdWNsZXVzSWRlbnRpdHlDb25maWcgfSBmcm9tICcuL251Y2xldXMtaWRlbnRpdHktY29uZmlnJztcclxuaW1wb3J0IHsgTnVjbGV1c0lkZW50aXR5U2VydmljZSB9IGZyb20gJy4vbnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgbWVyZ2VNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBOdWNsZXVzSWRlbnRpdHlTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZzogTnVjbGV1c0lkZW50aXR5Q29uZmlnXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9hdXRob3JpdHkgPSBjb25maWcuYXV0aG9yaXR5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLl9pbnRlcmNlcHRVcmxzID0gY29uZmlnLmh0dHBJbnRlcmNlcHRvclVybHM/Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hdXRob3JpdHk6IHN0cmluZztcclxuICBwcml2YXRlIF9hdXRob3JpdHlJbnRlcmNlcHRQYXRocyA9IFsnL2FwaScsICcvbWFuYWdlJywgJy9vdHAvY3JlYXRlJywgJy9vdHAvc3RhdHVzJ107XHJcbiAgcHJpdmF0ZSBfaW50ZXJjZXB0VXJsczogc3RyaW5nW107XHJcblxyXG4gIHB1YmxpYyBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIGlmICh0aGlzLnNob3VsZEludGVyY2VwdChyZXEudXJsKSkge1xyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmF1dGhvcml6ZVJlcXVlc3QodGhpcy5hdXRoLmdldEFjY2Vzc1Rva2VuKCksIHJlcSwgbmV4dCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrVW5hdXRob3JpemVkKHJlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvdWxkSW50ZXJjZXB0KHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgodGhpcy5fYXV0aG9yaXR5KSkge1xyXG4gICAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwodXJsKS5wYXRobmFtZTtcclxuICAgICAgcmV0dXJuICh0aGlzLl9hdXRob3JpdHlJbnRlcmNlcHRQYXRocy5zb21lKHggPT4gcGF0aG5hbWUuc3RhcnRzV2l0aCh4KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pbnRlcmNlcHRVcmxzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5odHRwSW50ZXJjZXB0b3JVcmxzLnNvbWUoeCA9PiB1cmwuc3RhcnRzV2l0aCh4KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGF1dGhvcml6ZVJlcXVlc3QoZ2V0VG9rZW46IFByb21pc2U8c3RyaW5nPiwgcmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIHJldHVybiBmcm9tKGdldFRva2VuKS5waXBlKFxyXG4gICAgICBtZXJnZU1hcCh0b2tlbiA9PiB7XHJcbiAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7dG9rZW59YCk7XHJcbiAgICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tVbmF1dGhvcml6ZWQocmVzcG9uc2U6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnIuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvbWF0aWNMb2dpbk9uSHR0cDQwMSkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGgubG9naW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -18,22 +18,21 @@ export class AngularRequestor extends Requestor {
18
18
  body: settings.data,
19
19
  headers: settings.headers,
20
20
  }).subscribe(res => resolve(res), err => {
21
- var _a;
22
21
  let e = new AppAuthError(err);
23
22
  if (err instanceof HttpErrorResponse) {
24
- e = new AppAuthError(((_a = err.error) === null || _a === void 0 ? void 0 : _a.error) || err.statusText);
23
+ e = new AppAuthError(err.error?.error || err.statusText);
25
24
  }
26
25
  reject(e);
27
26
  });
28
27
  });
29
28
  }
30
29
  }
31
- AngularRequestor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: AngularRequestor, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
32
- AngularRequestor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: AngularRequestor, providedIn: 'root' });
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: AngularRequestor, decorators: [{
30
+ AngularRequestor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AngularRequestor, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
31
+ AngularRequestor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AngularRequestor, providedIn: 'root' });
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AngularRequestor, decorators: [{
34
33
  type: Injectable,
35
34
  args: [{
36
35
  providedIn: 'root'
37
36
  }]
38
37
  }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZXF1ZXN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvdXRpbHMvYW5ndWxhci1yZXF1ZXN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBS3JFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBRTdDLFlBQW9CLElBQWdCO1FBQ2xDLEtBQUssRUFBRSxDQUFDO1FBRFUsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUVwQyxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLEdBQUcsQ0FBSSxRQUE0QjtRQUNqQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2FBQzFCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7O2dCQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxHQUFHLFlBQVksaUJBQWlCLEVBQUU7b0JBQ3BDLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFBLE1BQUEsR0FBRyxDQUFDLEtBQUssMENBQUUsS0FBSyxLQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzZHQXZCVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcEF1dGhFcnJvciwgUmVxdWVzdG9yIH0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJSZXF1ZXN0b3IgZXh0ZW5kcyBSZXF1ZXN0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICB4aHI8VD4oc2V0dGluZ3M6IEpRdWVyeUFqYXhTZXR0aW5ncyk6IFByb21pc2U8VD4ge1xyXG4gICAgaWYgKHNldHRpbmdzLm1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHNldHRpbmdzLm1ldGhvZCA9ICdHRVQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnJlcXVlc3Q8VD4oc2V0dGluZ3MubWV0aG9kLCBzZXR0aW5ncy51cmwsIHtcclxuICAgICAgICBib2R5OiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgIGhlYWRlcnM6IHNldHRpbmdzLmhlYWRlcnMsXHJcbiAgICAgIH0pLnN1YnNjcmliZShyZXMgPT4gcmVzb2x2ZShyZXMpLCBlcnIgPT4ge1xyXG4gICAgICAgIGxldCBlID0gbmV3IEFwcEF1dGhFcnJvcihlcnIpO1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgZSA9IG5ldyBBcHBBdXRoRXJyb3IoZXJyLmVycm9yPy5lcnJvciB8fCBlcnIuc3RhdHVzVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZXF1ZXN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvdXRpbHMvYW5ndWxhci1yZXF1ZXN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBS3JFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBRTdDLFlBQW9CLElBQWdCO1FBQ2xDLEtBQUssRUFBRSxDQUFDO1FBRFUsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUVwQyxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLEdBQUcsQ0FBSSxRQUE0QjtRQUNqQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2FBQzFCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEdBQUcsWUFBWSxpQkFBaUIsRUFBRTtvQkFDcEMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzZHQXZCVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcEF1dGhFcnJvciwgUmVxdWVzdG9yIH0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJSZXF1ZXN0b3IgZXh0ZW5kcyBSZXF1ZXN0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICB4aHI8VD4oc2V0dGluZ3M6IEpRdWVyeUFqYXhTZXR0aW5ncyk6IFByb21pc2U8VD4ge1xyXG4gICAgaWYgKHNldHRpbmdzLm1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHNldHRpbmdzLm1ldGhvZCA9ICdHRVQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnJlcXVlc3Q8VD4oc2V0dGluZ3MubWV0aG9kLCBzZXR0aW5ncy51cmwsIHtcclxuICAgICAgICBib2R5OiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgIGhlYWRlcnM6IHNldHRpbmdzLmhlYWRlcnMsXHJcbiAgICAgIH0pLnN1YnNjcmliZShyZXMgPT4gcmVzb2x2ZShyZXMpLCBlcnIgPT4ge1xyXG4gICAgICAgIGxldCBlID0gbmV3IEFwcEF1dGhFcnJvcihlcnIpO1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgZSA9IG5ldyBBcHBBdXRoRXJyb3IoZXJyLmVycm9yPy5lcnJvciB8fCBlcnIuc3RhdHVzVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
@@ -61,9 +61,9 @@ export class LocationService {
61
61
  }
62
62
  }
63
63
  }
64
- LocationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: LocationService, deps: [{ token: i1.NucleusAppService }], target: i0.ɵɵFactoryTarget.Injectable });
65
- LocationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: LocationService, providedIn: 'root' });
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.3", ngImport: i0, type: LocationService, decorators: [{
64
+ LocationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: LocationService, deps: [{ token: i1.NucleusAppService }], target: i0.ɵɵFactoryTarget.Injectable });
65
+ LocationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: LocationService, providedIn: 'root' });
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: LocationService, decorators: [{
67
67
  type: Injectable,
68
68
  args: [{
69
69
  providedIn: 'root'