@dontdrinkandroot/ngx-extensions 0.3.2 → 0.4.0

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 (45) hide show
  1. package/{esm2020 → esm2022}/src/cookie/cookie.service.mjs +4 -4
  2. package/esm2022/src/ddr-extensions.module.mjs +67 -0
  3. package/{esm2020 → esm2022}/src/http/redirect-to-login-interceptor.service.mjs +4 -4
  4. package/{esm2020 → esm2022}/src/http/with-credentials-interceptor.service.mjs +4 -4
  5. package/{esm2020 → esm2022}/src/image/lazy-image.directive.mjs +4 -4
  6. package/{esm2020 → esm2022}/src/jwt/jwt-interceptor.service.mjs +4 -4
  7. package/{esm2020 → esm2022}/src/jwt/jwt-refresh-token-interceptor.service.mjs +4 -4
  8. package/{esm2020 → esm2022}/src/jwt/jwt.service.mjs +4 -4
  9. package/{esm2020 → esm2022}/src/logger/console-logger.service.mjs +4 -4
  10. package/{esm2020 → esm2022}/src/oauth/oauth2-access-token-interceptor.service.mjs +4 -4
  11. package/esm2022/src/oauth/oauth2-error.mjs +8 -0
  12. package/{esm2020 → esm2022}/src/oauth/oauth2-refresh-token-interceptor.service.mjs +4 -4
  13. package/{esm2020 → esm2022}/src/oauth/oauth2.module.mjs +5 -5
  14. package/esm2022/src/oauth/oauth2.service.mjs +125 -0
  15. package/{esm2020 → esm2022}/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +4 -4
  16. package/{esm2020 → esm2022}/src/scroll/bottom-hit.directive.mjs +4 -4
  17. package/{esm2020 → esm2022}/src/scroll/scroll.service.mjs +4 -4
  18. package/{esm2020 → esm2022}/src/storage/local-storage.service.mjs +4 -4
  19. package/{esm2020 → esm2022}/src/visibility/visibility.service.mjs +4 -4
  20. package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs +82 -80
  21. package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs.map +1 -1
  22. package/package.json +9 -15
  23. package/src/image/lazy-image.directive.d.ts +1 -1
  24. package/esm2020/src/ddr-extensions.module.mjs +0 -67
  25. package/esm2020/src/oauth/oauth2-error.mjs +0 -8
  26. package/esm2020/src/oauth/oauth2.service.mjs +0 -125
  27. package/fesm2015/dontdrinkandroot-ngx-extensions.mjs +0 -1132
  28. package/fesm2015/dontdrinkandroot-ngx-extensions.mjs.map +0 -1
  29. /package/{esm2020 → esm2022}/dontdrinkandroot-ngx-extensions.mjs +0 -0
  30. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  31. /package/{esm2020 → esm2022}/src/http/url-info.mjs +0 -0
  32. /package/{esm2020 → esm2022}/src/jwt/jwt-token-response.mjs +0 -0
  33. /package/{esm2020 → esm2022}/src/logger/logger.service.mjs +0 -0
  34. /package/{esm2020 → esm2022}/src/methoddecorator/debounce.mjs +0 -0
  35. /package/{esm2020 → esm2022}/src/methoddecorator/limit.mjs +0 -0
  36. /package/{esm2020 → esm2022}/src/oauth/json-web-token.mjs +0 -0
  37. /package/{esm2020 → esm2022}/src/oauth/oauth2-config.mjs +0 -0
  38. /package/{esm2020 → esm2022}/src/oauth/token-response.mjs +0 -0
  39. /package/{esm2020 → esm2022}/src/storage/storage.service.mjs +0 -0
  40. /package/{esm2020 → esm2022}/src/typeguard/is-non-null.mjs +0 -0
  41. /package/{esm2020 → esm2022}/src/util/collection-utils.mjs +0 -0
  42. /package/{esm2020 → esm2022}/src/util/number-utils.mjs +0 -0
  43. /package/{esm2020 → esm2022}/src/util/object-utils.mjs +0 -0
  44. /package/{esm2020 → esm2022}/src/util/string-utils.mjs +0 -0
  45. /package/{esm2020 → esm2022}/src/util/type-utils.mjs +0 -0
@@ -1,125 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { throwError } from 'rxjs';
3
- import { HttpParams } from '@angular/common/http';
4
- import { catchError, map, shareReplay } from 'rxjs/operators';
5
- import { DDR_OAUTH2_CONFIG } from './oauth2-config';
6
- import { OAuth2Error } from './oauth2-error';
7
- import { TypeUtils } from '../util/type-utils';
8
- import { StringUtils } from '../util/string-utils';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/router";
11
- import * as i2 from "@angular/common/http";
12
- import * as i3 from "../logger/logger.service";
13
- import * as i4 from "./oauth2-config";
14
- export class OAuth2Service {
15
- constructor(route, httpClient, loggerService, config) {
16
- this.route = route;
17
- this.httpClient = httpClient;
18
- this.loggerService = loggerService;
19
- this.config = config;
20
- this.accessTokenString = null;
21
- this.accessToken = null;
22
- this.REFRESH_MARGIN_SECONDS = 60 * 10;
23
- this.refreshTokenRequest$ = null;
24
- }
25
- redirectToLogin() {
26
- const challenge = this.createChallenge();
27
- localStorage.setItem(OAuth2Service.STORAGE_KEY_CHALLENGE, challenge);
28
- const params = new HttpParams()
29
- .set('client_id', this.config.clientId)
30
- .set('response_type', 'code')
31
- .set('redirect_uri', this.config.redirectUri)
32
- .set('code_challenge', challenge)
33
- .set('code_challenge_method', 'plain');
34
- window.location.href = this.config.authorizeUri + '?' + params.toString();
35
- }
36
- handleCode() {
37
- if (this.route.snapshot.queryParamMap.has('error')) {
38
- const error = this.route.snapshot.queryParamMap.get('error');
39
- return throwError(() => new OAuth2Error(error ?? 'Unknown error'));
40
- }
41
- if (!this.route.snapshot.queryParamMap.has('code')) {
42
- return throwError(() => new OAuth2Error(OAuth2Error.CODE_NOT_FOUND));
43
- }
44
- const code = TypeUtils.notNull(this.route.snapshot.queryParamMap.get('code'));
45
- const params = new HttpParams()
46
- .set('grant_type', 'authorization_code')
47
- .set('code', code)
48
- .set('redirect_uri', this.config.redirectUri)
49
- .set('code_verifier', TypeUtils.notNull(localStorage.getItem(OAuth2Service.STORAGE_KEY_CHALLENGE)))
50
- .set('client_id', this.config.clientId);
51
- return this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => this.processTokenResponse(tokenResponse)));
52
- }
53
- createChallenge() {
54
- return StringUtils.createRandomString(64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._~');
55
- }
56
- getRefreshToken() {
57
- return localStorage.getItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
58
- }
59
- getAccessTokenString() {
60
- return this.accessTokenString;
61
- }
62
- isAccessTokenExpired() {
63
- return (null == this.accessToken
64
- || this.accessToken.exp * 1000 < Date.now());
65
- }
66
- isRefreshPossibleAndRequired(req = null) {
67
- return ((null == req || !req.url.endsWith(this.config.tokenUri))
68
- && null != this.getRefreshToken()
69
- && (null == this.accessToken
70
- || (this.accessToken.exp - this.REFRESH_MARGIN_SECONDS) * 1000 < Date.now()));
71
- }
72
- performRefresh() {
73
- if (null == this.refreshTokenRequest$) {
74
- this.loggerService.info('Performing token refesh');
75
- const params = new HttpParams()
76
- .set('grant_type', 'refresh_token')
77
- .set('refresh_token', TypeUtils.notNull(this.getRefreshToken()))
78
- .set('client_id', this.config.clientId);
79
- this.refreshTokenRequest$ = this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => {
80
- const token = this.processTokenResponse(tokenResponse);
81
- this.refreshTokenRequest$ = null;
82
- return token;
83
- }), catchError(error => {
84
- this.accessTokenString = null;
85
- this.accessToken = null;
86
- localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
87
- this.refreshTokenRequest$ = null;
88
- return throwError(error);
89
- }), shareReplay(1));
90
- }
91
- return this.refreshTokenRequest$;
92
- }
93
- processTokenResponse(tokenResponse) {
94
- localStorage.removeItem(OAuth2Service.STORAGE_KEY_CHALLENGE);
95
- this.accessTokenString = tokenResponse.access_token;
96
- this.accessToken = JSON.parse(atob(tokenResponse.access_token.split('.')[1]));
97
- this.loggerService.info('Access Token Expiry', new Date(this.accessToken.exp * 1000));
98
- localStorage.setItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN, tokenResponse.refresh_token);
99
- return this.accessToken;
100
- }
101
- clear() {
102
- this.accessToken = null;
103
- this.accessTokenString = null;
104
- localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
105
- localStorage.removeItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
106
- }
107
- setReturnUrl(url) {
108
- localStorage.setItem(OAuth2Service.STORAGE_KEY_RETURN_URL, url);
109
- }
110
- getReturnUrl() {
111
- return localStorage.getItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
112
- }
113
- }
114
- OAuth2Service.STORAGE_KEY_CHALLENGE = 'ddr_oauth2_challenge';
115
- OAuth2Service.STORAGE_KEY_REFRESH_TOKEN = 'ddr_oauth2_refresh_token';
116
- OAuth2Service.STORAGE_KEY_RETURN_URL = 'ddr_oauth2_return_url';
117
- OAuth2Service.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service, deps: [{ token: i1.ActivatedRoute }, { token: i2.HttpClient }, { token: i3.Logger }, { token: DDR_OAUTH2_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
118
- OAuth2Service.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service });
119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service, decorators: [{
120
- type: Injectable
121
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.HttpClient }, { type: i3.Logger }, { type: i4.OAuth2Config, decorators: [{
122
- type: Inject,
123
- args: [DDR_OAUTH2_CONFIG]
124
- }] }]; } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvb2F1dGgvb2F1dGgyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQWEsVUFBVSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUlqRCxNQUFNLE9BQU8sYUFBYTtJQWdCdEIsWUFDWSxLQUFxQixFQUNyQixVQUFzQixFQUN0QixhQUFxQixFQUNNLE1BQW9CO1FBSC9DLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDTSxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBWm5ELHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFFeEMsZ0JBQVcsR0FBd0IsSUFBSSxDQUFDO1FBRS9CLDJCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFMUMseUJBQW9CLEdBQW9DLElBQUksQ0FBQztJQVNyRSxDQUFDO0lBRU0sZUFBZTtRQUVsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekMsWUFBWSxDQUFDLE9BQU8s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QUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pFLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxHQUFXO1FBRTNCLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxZQUFZO1FBRWYsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O0FBMUpjLG1DQUFxQixHQUFHLHNCQUFzQixDQUFDO0FBRS9DLHVDQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRXhELG9DQUFzQixHQUFHLHVCQUF1QixDQUFDOzBHQU50RCxhQUFhLGdHQW9CVixpQkFBaUI7OEdBcEJwQixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLFVBQVU7OzBCQXFCRixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zLCBIdHRwUmVxdWVzdH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBtYXAsIHNoYXJlUmVwbGF5fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rva2VuUmVzcG9uc2V9IGZyb20gJy4vdG9rZW4tcmVzcG9uc2UnO1xuaW1wb3J0IHtKc29uV2ViVG9rZW59IGZyb20gJy4vanNvbi13ZWItdG9rZW4nO1xuaW1wb3J0IHtERFJfT0FVVEgyX0NPTkZJRywgT0F1dGgyQ29uZmlnfSBmcm9tICcuL29hdXRoMi1jb25maWcnO1xuaW1wb3J0IHtPQXV0aDJFcnJvcn0gZnJvbSAnLi9vYXV0aDItZXJyb3InO1xuaW1wb3J0IHtUeXBlVXRpbHN9IGZyb20gJy4uL3V0aWwvdHlwZS11dGlscyc7XG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuLi91dGlsL3N0cmluZy11dGlscyc7XG5pbXBvcnQge0xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyL2xvZ2dlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoMlNlcnZpY2VcbntcbiAgICBwcml2YXRlIHN0YXRpYyBTVE9SQUdFX0tFWV9DSEFMTEVOR0UgPSAnZGRyX29hdXRoMl9jaGFsbGVuZ2UnO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1RPUkFHRV9LRVlfUkVGUkVTSF9UT0tFTiA9ICdkZHJfb2F1dGgyX3JlZnJlc2hfdG9rZW4nO1xuXG4gICAgcHVibGljIHN0YXRpYyBTVE9SQUdFX0tFWV9SRVRVUk5fVVJMID0gJ2Rkcl9vYXV0aDJfcmV0dXJuX3VybCc7XG5cbiAgICBwcml2YXRlIGFjY2Vzc1Rva2VuU3RyaW5nOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgYWNjZXNzVG9rZW46IEpzb25XZWJUb2tlbiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBSRUZSRVNIX01BUkdJTl9TRUNPTkRTID0gNjAgKiAxMDtcblxuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuUmVxdWVzdCQ6IE9ic2VydmFibGU8SnNvbldlYlRva2VuPiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyU2VydmljZTogTG9nZ2VyLFxuICAgICAgICBASW5qZWN0KEREUl9PQVVUSDJfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogT0F1dGgyQ29uZmlnXG4gICAgKVxuICAgIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVkaXJlY3RUb0xvZ2luKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZSA9IHRoaXMuY3JlYXRlQ2hhbGxlbmdlKCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfQ0hBTExFTkdFLCBjaGFsbGVuZ2UpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICAgICAgICAgIC5zZXQoJ2NsaWVudF9pZCcsIHRoaXMuY29uZmlnLmNsaWVudElkKVxuICAgICAgICAgICAgLnNldCgncmVzcG9uc2VfdHlwZScsICdjb2RlJylcbiAgICAgICAgICAgIC5zZXQoJ3JlZGlyZWN0X3VyaScsIHRoaXMuY29uZmlnLnJlZGlyZWN0VXJpKVxuICAgICAgICAgICAgLnNldCgnY29kZV9jaGFsbGVuZ2UnLCBjaGFsbGVuZ2UpXG4gICAgICAgICAgICAuc2V0KCdjb2RlX2NoYWxsZW5nZV9tZXRob2QnLCAncGxhaW4nKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuY29uZmlnLmF1dGhvcml6ZVVyaSArICc/JyArIHBhcmFtcy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVDb2RlKCk6IE9ic2VydmFibGU8SnNvbldlYlRva2VuPlxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5oYXMoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZXJyb3InKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBPQXV0aDJFcnJvcihlcnJvciA/PyAnVW5rbm93biBlcnJvcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmhhcygnY29kZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgT0F1dGgyRXJyb3IoT0F1dGgyRXJyb3IuQ09ERV9OT1RfRk9VTkQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvZGUgPSBUeXBlVXRpbHMubm90TnVsbCh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdjb2RlJykpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KCdncmFudF90eXBlJywgJ2F1dGhvcml6YXRpb25fY29kZScpXG4gICAgICAgICAgICAuc2V0KCdjb2RlJywgY29kZSlcbiAgICAgICAgICAgIC5zZXQoJ3JlZGlyZWN0X3VyaScsIHRoaXMuY29uZmlnLnJlZGlyZWN0VXJpKVxuICAgICAgICAgICAgLnNldCgnY29kZV92ZXJpZmllcicsIFR5cGVVdGlscy5ub3ROdWxsKGxvY2FsU3RvcmFnZS5nZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfQ0hBTExFTkdFKSkpXG4gICAgICAgICAgICAuc2V0KCdjbGllbnRfaWQnLCB0aGlzLmNvbmZpZy5jbGllbnRJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUb2tlblJlc3BvbnNlPih0aGlzLmNvbmZpZy50b2tlblVyaSwgcGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgbWFwKHRva2VuUmVzcG9uc2UgPT4gdGhpcy5wcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoYWxsZW5nZSgpXG4gICAge1xuICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuY3JlYXRlUmFuZG9tU3RyaW5nKDY0LCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwLS5fficpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVmcmVzaFRva2VuKCk6IHN0cmluZyB8IG51bGxcbiAgICB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBY2Nlc3NUb2tlblN0cmluZygpOiBzdHJpbmcgfCBudWxsXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NUb2tlblN0cmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY2Nlc3NUb2tlbkV4cGlyZWQoKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG51bGwgPT0gdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICAgICAgfHwgdGhpcy5hY2Nlc3NUb2tlbi5leHAgKiAxMDAwIDwgRGF0ZS5ub3coKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1JlZnJlc2hQb3NzaWJsZUFuZFJlcXVpcmVkKHJlcTogSHR0cFJlcXVlc3Q8YW55PiB8IG51bGwgPSBudWxsKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChudWxsID09IHJlcSB8fCAhcmVxLnVybC5lbmRzV2l0aCh0aGlzLmNvbmZpZy50b2tlblVyaSkpXG4gICAgICAgICAgICAmJiBudWxsICE9IHRoaXMuZ2V0UmVmcmVzaFRva2VuKClcbiAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICBudWxsID09IHRoaXMuYWNjZXNzVG9rZW5cbiAgICAgICAgICAgICAgICB8fCAodGhpcy5hY2Nlc3NUb2tlbi5leHAgLSB0aGlzLlJFRlJFU0hfTUFSR0lOX1NFQ09ORFMpICogMTAwMCA8IERhdGUubm93KClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGVyZm9ybVJlZnJlc2goKTogT2JzZXJ2YWJsZTxKc29uV2ViVG9rZW4+XG4gICAge1xuICAgICAgICBpZiAobnVsbCA9PSB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkKSB7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5pbmZvKCdQZXJmb3JtaW5nIHRva2VuIHJlZmVzaCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAgICAgLnNldCgnZ3JhbnRfdHlwZScsICdyZWZyZXNoX3Rva2VuJylcbiAgICAgICAgICAgICAgICAuc2V0KCdyZWZyZXNoX3Rva2VuJywgVHlwZVV0aWxzLm5vdE51bGwodGhpcy5nZXRSZWZyZXNoVG9rZW4oKSkpXG4gICAgICAgICAgICAgICAgLnNldCgnY2xpZW50X2lkJywgdGhpcy5jb25maWcuY2xpZW50SWQpO1xuXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkID0gdGhpcy5odHRwQ2xpZW50LnBvc3Q8VG9rZW5SZXNwb25zZT4odGhpcy5jb25maWcudG9rZW5VcmksIHBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodG9rZW5SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5SZXF1ZXN0JCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblN0cmluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuUmVxdWVzdCQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogSnNvbldlYlRva2VuXG4gICAge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX0NIQUxMRU5HRSk7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TdHJpbmcgPSB0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IEpTT04ucGFyc2UoYXRvYih0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbi5zcGxpdCgnLicpWzFdKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5pbmZvKCdBY2Nlc3MgVG9rZW4gRXhwaXJ5JywgbmV3IERhdGUodGhpcy5hY2Nlc3NUb2tlbiEuZXhwICogMTAwMCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4sIHRva2VuUmVzcG9uc2UucmVmcmVzaF90b2tlbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW4hO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpXG4gICAge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblN0cmluZyA9IG51bGw7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVGUkVTSF9UT0tFTik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVUVVJOX1VSTCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJldHVyblVybCh1cmw6IHN0cmluZylcbiAgICB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVUVVJOX1VSTCwgdXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmV0dXJuVXJsKCk6IHN0cmluZyB8IG51bGxcbiAgICB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFVFVSTl9VUkwpO1xuICAgIH1cbn1cbiJdfQ==