ngx-oauth 4.2.3 → 7.0.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.
- package/LICENSE +21 -0
- package/README.md +17 -16
- package/components/index.d.ts +1 -0
- package/components/{login/oauth-login.component.d.ts → o-auth-login.component.d.ts} +7 -9
- package/config/index.d.ts +17 -0
- package/esm2022/components/index.mjs +2 -0
- package/esm2022/components/o-auth-login.component.mjs +261 -0
- package/esm2022/config/index.mjs +32 -0
- package/esm2022/index.mjs +8 -0
- package/esm2022/models/index.mjs +16 -0
- package/esm2022/services/index.mjs +5 -0
- package/esm2022/services/o-auth-http-client.mjs +15 -0
- package/esm2022/services/o-auth-token.service.mjs +80 -0
- package/esm2022/services/o-auth.interceptor.mjs +43 -0
- package/esm2022/services/o-auth.service.mjs +302 -0
- package/fesm2022/ngx-oauth.mjs +731 -0
- package/fesm2022/ngx-oauth.mjs.map +1 -0
- package/index.d.ts +3 -5
- package/models/index.d.ts +3 -22
- package/package.json +10 -18
- package/services/index.d.ts +4 -0
- package/services/o-auth-http-client.d.ts +6 -0
- package/services/{token.service.d.ts → o-auth-token.service.d.ts} +5 -6
- package/services/o-auth.interceptor.d.ts +2 -0
- package/services/{oauth.service.d.ts → o-auth.service.d.ts} +5 -5
- package/esm2020/components/login/oauth-login.component.mjs +0 -123
- package/esm2020/index.mjs +0 -10
- package/esm2020/models/index.mjs +0 -47
- package/esm2020/oauth.module.mjs +0 -120
- package/esm2020/services/oauth.interceptor.mjs +0 -53
- package/esm2020/services/oauth.service.mjs +0 -300
- package/esm2020/services/token.service.mjs +0 -83
- package/fesm2015/ngx-oauth.mjs +0 -642
- package/fesm2015/ngx-oauth.mjs.map +0 -1
- package/fesm2020/ngx-oauth.mjs +0 -701
- package/fesm2020/ngx-oauth.mjs.map +0 -1
- package/oauth.module.d.ts +0 -14
- package/services/oauth.interceptor.d.ts +0 -13
- /package/{esm2020 → esm2022}/ngx-oauth.mjs +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, distinctUntilChanged, of, switchMap } from 'rxjs';
|
|
3
|
+
import { HEADER_APPLICATION } from '../models';
|
|
4
|
+
import { catchError, map, shareReplay } from 'rxjs/operators';
|
|
5
|
+
import { HttpParams } from '@angular/common/http';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../config";
|
|
8
|
+
import * as i2 from "./o-auth-http-client";
|
|
9
|
+
const isExpiredToken = (token) => token && token.expires && Date.now() > token.expires || false;
|
|
10
|
+
export class OAuthTokenService {
|
|
11
|
+
#token$;
|
|
12
|
+
constructor(authConfig, http) {
|
|
13
|
+
this.authConfig = authConfig;
|
|
14
|
+
this.http = http;
|
|
15
|
+
this.#token$ = new BehaviorSubject(this.saved);
|
|
16
|
+
this.token$ = this.#token$.pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), shareReplay(1), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)));
|
|
17
|
+
this.type$ = this.token$.pipe(map(token => token?.type), shareReplay(1));
|
|
18
|
+
this.accessToken$ = this.token$.pipe(map(token => token?.access_token), shareReplay(1));
|
|
19
|
+
}
|
|
20
|
+
get token() {
|
|
21
|
+
return this.#token$.value;
|
|
22
|
+
}
|
|
23
|
+
set token(token) {
|
|
24
|
+
const expiresIn = Number(token.expires_in) || 0;
|
|
25
|
+
const result = {
|
|
26
|
+
...token,
|
|
27
|
+
...expiresIn && { expires: Date.now() + expiresIn * 1000 } || {}
|
|
28
|
+
};
|
|
29
|
+
this.saved = result;
|
|
30
|
+
this.#token$.next(result);
|
|
31
|
+
}
|
|
32
|
+
get saved() {
|
|
33
|
+
const { storageKey, storage } = this.authConfig;
|
|
34
|
+
return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};
|
|
35
|
+
}
|
|
36
|
+
set saved(token) {
|
|
37
|
+
const { storageKey, storage } = this.authConfig;
|
|
38
|
+
if (storage && storageKey) {
|
|
39
|
+
if (token) {
|
|
40
|
+
storage[storageKey] = JSON.stringify(token);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
delete storage[storageKey];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
refreshToken(token) {
|
|
48
|
+
const { tokenPath, clientId, clientSecret, scope } = this.authConfig.config;
|
|
49
|
+
const { refresh_token } = token || {};
|
|
50
|
+
return tokenPath && refresh_token && this.http.post(tokenPath, new HttpParams({
|
|
51
|
+
fromObject: {
|
|
52
|
+
client_id: clientId,
|
|
53
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
54
|
+
grant_type: 'refresh_token',
|
|
55
|
+
refresh_token,
|
|
56
|
+
...scope && { scope } || {},
|
|
57
|
+
}
|
|
58
|
+
}), {
|
|
59
|
+
headers: HEADER_APPLICATION
|
|
60
|
+
}).pipe(catchError(() => {
|
|
61
|
+
this.token = {};
|
|
62
|
+
return of(this.token);
|
|
63
|
+
}), map(token => {
|
|
64
|
+
this.token = {
|
|
65
|
+
...this.token,
|
|
66
|
+
...token
|
|
67
|
+
};
|
|
68
|
+
return this.token;
|
|
69
|
+
})) || of(token);
|
|
70
|
+
}
|
|
71
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthTokenService, deps: [{ token: i1.OAuthConfig }, { token: i2.OAuthHttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
72
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthTokenService, providedIn: 'root' }); }
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthTokenService, decorators: [{
|
|
75
|
+
type: Injectable,
|
|
76
|
+
args: [{
|
|
77
|
+
providedIn: 'root'
|
|
78
|
+
}]
|
|
79
|
+
}], ctorParameters: () => [{ type: i1.OAuthConfig }, { type: i2.OAuthHttpClient }] });
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1hdXRoLXRva2VuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL3NlcnZpY2VzL28tYXV0aC10b2tlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxrQkFBa0IsRUFBYSxNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFJaEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7QUFLN0csTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixPQUFPLENBQStDO0lBZXRELFlBQXNCLFVBQXVCLEVBQ3ZCLElBQXFCO1FBRHJCLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDdkIsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFoQjNDLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN4QixvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENB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NUIsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDYixHQUFHLEtBQUs7YUFDVCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUNILElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7OEdBN0VVLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SEVBREVSX0FQUExJQ0FUSU9OLCBPQXV0aFRva2VufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBtYXAsIHNoYXJlUmVwbGF5fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T0F1dGhIdHRwQ2xpZW50fSBmcm9tICcuL28tYXV0aC1odHRwLWNsaWVudCc7XG5pbXBvcnQge09BdXRoQ29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuXG5jb25zdCBpc0V4cGlyZWRUb2tlbiA9ICh0b2tlbj86IE9BdXRoVG9rZW4pID0+IHRva2VuICYmIHRva2VuLmV4cGlyZXMgJiYgRGF0ZS5ub3coKSA+IHRva2VuLmV4cGlyZXMgfHwgZmFsc2U7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE9BdXRoVG9rZW5TZXJ2aWNlIHtcblxuICAjdG9rZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPQXV0aFRva2VuPih0aGlzLnNhdmVkKTtcbiAgdG9rZW4kID0gdGhpcy4jdG9rZW4kLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IEpTT04uc3RyaW5naWZ5KHAgfHwgbnVsbCkgPT09IEpTT04uc3RyaW5naWZ5KGMgfHwgbnVsbCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgIHN3aXRjaE1hcCh0b2tlbiA9PiAhaXNFeHBpcmVkVG9rZW4odG9rZW4pICYmIG9mKHRva2VuKSB8fCB0aGlzLnJlZnJlc2hUb2tlbih0b2tlbikpLFxuICApO1xuICB0eXBlJCA9IHRoaXMudG9rZW4kLnBpcGUoXG4gICAgbWFwKHRva2VuID0+IHRva2VuPy50eXBlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBhY2Nlc3NUb2tlbiQgPSB0aGlzLnRva2VuJC5waXBlKFxuICAgIG1hcCh0b2tlbiA9PiB0b2tlbj8uYWNjZXNzX3Rva2VuKSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXV0aENvbmZpZzogT0F1dGhDb25maWcsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBodHRwOiBPQXV0aEh0dHBDbGllbnQpIHtcbiAgfVxuXG4gIGdldCB0b2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jdG9rZW4kLnZhbHVlO1xuICB9XG5cbiAgc2V0IHRva2VuKHRva2VuKSB7XG4gICAgY29uc3QgZXhwaXJlc0luID0gTnVtYmVyKHRva2VuLmV4cGlyZXNfaW4pIHx8IDA7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgLi4udG9rZW4sXG4gICAgICAuLi5leHBpcmVzSW4gJiYge2V4cGlyZXM6IERhdGUubm93KCkgKyBleHBpcmVzSW4gKiAxMDAwfSB8fCB7fVxuICAgIH07XG4gICAgdGhpcy5zYXZlZCA9IHJlc3VsdDtcbiAgICB0aGlzLiN0b2tlbiQubmV4dChyZXN1bHQpO1xuICB9XG5cbiAgZ2V0IHNhdmVkKCkge1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5LCBzdG9yYWdlfSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICByZXR1cm4gc3RvcmFnZUtleSAmJiBzdG9yYWdlICYmIHN0b3JhZ2Vbc3RvcmFnZUtleV0gJiYgSlNPTi5wYXJzZShzdG9yYWdlW3N0b3JhZ2VLZXldKSB8fCB7fTtcbiAgfVxuXG4gIHNldCBzYXZlZCh0b2tlbjogT0F1dGhUb2tlbikge1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5LCBzdG9yYWdlfSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBpZiAoc3RvcmFnZSAmJiBzdG9yYWdlS2V5KSB7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgc3RvcmFnZVtzdG9yYWdlS2V5XSA9IEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBzdG9yYWdlW3N0b3JhZ2VLZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoVG9rZW4odG9rZW4/OiBPQXV0aFRva2VuKTogT2JzZXJ2YWJsZTxPQXV0aFRva2VuPiB7XG4gICAgY29uc3Qge3Rva2VuUGF0aCwgY2xpZW50SWQsIGNsaWVudFNlY3JldCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3Qge3JlZnJlc2hfdG9rZW59ID0gdG9rZW4gfHwge307XG4gICAgcmV0dXJuIHRva2VuUGF0aCAmJiByZWZyZXNoX3Rva2VuICYmIHRoaXMuaHR0cC5wb3N0PE9BdXRoVG9rZW4+KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbixcbiAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgIH1cbiAgICB9KSwge1xuICAgICAgaGVhZGVyczogSEVBREVSX0FQUExJQ0FUSU9OXG4gICAgfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0ge307XG4gICAgICAgIHJldHVybiBvZih0aGlzLnRva2VuKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKHRva2VuID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAuLi50aGlzLnRva2VuLFxuICAgICAgICAgIC4uLnRva2VuXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VuO1xuICAgICAgfSlcbiAgICApIHx8IG9mKHRva2VuKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { switchMap, take, throwError } from 'rxjs';
|
|
3
|
+
import { catchError, map } from 'rxjs/operators';
|
|
4
|
+
import { OAuthTokenService } from './o-auth-token.service';
|
|
5
|
+
import { OAuthConfig } from '../config';
|
|
6
|
+
export const OAuthInterceptor = (req, next) => {
|
|
7
|
+
const authConfig = inject(OAuthConfig);
|
|
8
|
+
const tokenService = inject(OAuthTokenService);
|
|
9
|
+
const isPathExcepted = (req) => {
|
|
10
|
+
const { ignorePaths } = authConfig || {};
|
|
11
|
+
if (ignorePaths) {
|
|
12
|
+
for (const ignorePath of ignorePaths) {
|
|
13
|
+
try {
|
|
14
|
+
if (req.url.match(ignorePath)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
return isPathExcepted(req) && next(req) || tokenService.token$.pipe(take(1), map(token => {
|
|
25
|
+
if (token?.access_token) {
|
|
26
|
+
req = req.clone({
|
|
27
|
+
setHeaders: {
|
|
28
|
+
Authorization: `${token.token_type} ${token.access_token}`
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return req;
|
|
33
|
+
}), switchMap(req => next(req)), catchError((err) => {
|
|
34
|
+
if (err.status === 401) {
|
|
35
|
+
tokenService.token = {
|
|
36
|
+
error: `${err.status}`,
|
|
37
|
+
error_description: err.message
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return throwError(() => err);
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW9hdXRoL3NyYy9zZXJ2aWNlcy9vLWF1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFzQixDQUFDLEdBQXFCLEVBQUUsSUFBbUIsRUFBRSxFQUFFO0lBQ2hHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN0QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQXFCLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFdBQVcsRUFBRTtZQUNmLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO2dCQUNwQyxJQUFJO29CQUNGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQzdCLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2dCQUFDLE9BQU8sR0FBRyxFQUFFO2lCQUNiO2FBQ0Y7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFBO0lBQ0QsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNqRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ1YsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQ3ZCLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixhQUFhLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7aUJBQzNEO2FBQ0YsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUMzQixVQUFVLENBQUMsQ0FBQyxHQUFzQixFQUFFLEVBQUU7UUFDcEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN0QixZQUFZLENBQUMsS0FBSyxHQUFHO2dCQUNuQixLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUN0QixpQkFBaUIsRUFBRSxHQUFHLENBQUMsT0FBTzthQUMvQixDQUFDO1NBQ0g7UUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhhbmRsZXJGbiwgSHR0cEludGVyY2VwdG9yRm4sIEh0dHBSZXF1ZXN0fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge3N3aXRjaE1hcCwgdGFrZSwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPQXV0aFRva2VuU2VydmljZX0gZnJvbSAnLi9vLWF1dGgtdG9rZW4uc2VydmljZSc7XG5pbXBvcnQge09BdXRoQ29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuXG5leHBvcnQgY29uc3QgT0F1dGhJbnRlcmNlcHRvcjogSHR0cEludGVyY2VwdG9yRm4gPSAocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlckZuKSA9PiB7XG4gIGNvbnN0IGF1dGhDb25maWcgPSBpbmplY3QoT0F1dGhDb25maWcpXG4gIGNvbnN0IHRva2VuU2VydmljZSA9IGluamVjdChPQXV0aFRva2VuU2VydmljZSlcbiAgY29uc3QgaXNQYXRoRXhjZXB0ZWQgPSAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KSA9PiB7XG4gICAgY29uc3Qge2lnbm9yZVBhdGhzfSA9IGF1dGhDb25maWcgfHwge307XG4gICAgaWYgKGlnbm9yZVBhdGhzKSB7XG4gICAgICBmb3IgKGNvbnN0IGlnbm9yZVBhdGggb2YgaWdub3JlUGF0aHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVxLnVybC5tYXRjaChpZ25vcmVQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzUGF0aEV4Y2VwdGVkKHJlcSkgJiYgbmV4dChyZXEpIHx8IHRva2VuU2VydmljZS50b2tlbiQucGlwZShcbiAgICB0YWtlKDEpLFxuICAgIG1hcCh0b2tlbiA9PiB7XG4gICAgICBpZiAodG9rZW4/LmFjY2Vzc190b2tlbikge1xuICAgICAgICByZXEgPSByZXEuY2xvbmUoe1xuICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3Rva2VuLnRva2VuX3R5cGV9ICR7dG9rZW4uYWNjZXNzX3Rva2VufWBcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxXG4gICAgfSksXG4gICAgc3dpdGNoTWFwKHJlcSA9PiBuZXh0KHJlcSkpLFxuICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgdG9rZW5TZXJ2aWNlLnRva2VuID0ge1xuICAgICAgICAgIGVycm9yOiBgJHtlcnIuc3RhdHVzfWAsXG4gICAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVyci5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgIH0pXG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpParams } from '@angular/common/http';
|
|
3
|
+
import { catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
4
|
+
import { firstValueFrom, from, noop, of, ReplaySubject, throwError } from 'rxjs';
|
|
5
|
+
import { HEADER_APPLICATION, OAuthStatus, OAuthType } from '../models';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../config";
|
|
8
|
+
import * as i2 from "./o-auth-token.service";
|
|
9
|
+
import * as i3 from "@angular/common/http";
|
|
10
|
+
import * as i4 from "@angular/common";
|
|
11
|
+
const arrToString = (buf) => buf.reduce((s, b) => s + String.fromCharCode(b), '');
|
|
12
|
+
const base64url = (str) => btoa(str)
|
|
13
|
+
.replace(/\+/g, '-')
|
|
14
|
+
.replace(/\//g, '_')
|
|
15
|
+
.replace(/=/g, '');
|
|
16
|
+
const randomString = (length = 48) => {
|
|
17
|
+
const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));
|
|
18
|
+
return base64url(buff).substring(0, length);
|
|
19
|
+
};
|
|
20
|
+
const pkce = async (value) => {
|
|
21
|
+
const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
|
|
22
|
+
return base64url(arrToString(new Uint8Array(buff)));
|
|
23
|
+
};
|
|
24
|
+
const parseOauthUri = (hash) => {
|
|
25
|
+
const regex = /([^&=]+)=([^&]*)/g;
|
|
26
|
+
const params = {};
|
|
27
|
+
let m;
|
|
28
|
+
// tslint:disable-next-line:no-conditional-assignment
|
|
29
|
+
while ((m = regex.exec(hash)) !== null) {
|
|
30
|
+
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
|
|
31
|
+
}
|
|
32
|
+
return Object.keys(params).length && params || {};
|
|
33
|
+
};
|
|
34
|
+
const jwt = (token) => JSON.parse(atob(token.split('.')[1]));
|
|
35
|
+
export class OAuthService {
|
|
36
|
+
get storageKey() {
|
|
37
|
+
return this.authConfig.storageKey;
|
|
38
|
+
}
|
|
39
|
+
set storageKey(storageKey) {
|
|
40
|
+
if (storageKey) {
|
|
41
|
+
this.authConfig.storageKey = storageKey;
|
|
42
|
+
this.tokenService.token = this.tokenService.saved;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
get token() {
|
|
46
|
+
return this.tokenService.token;
|
|
47
|
+
}
|
|
48
|
+
set token(token) {
|
|
49
|
+
this.tokenService.token = token;
|
|
50
|
+
}
|
|
51
|
+
get config() {
|
|
52
|
+
return this.authConfig.config;
|
|
53
|
+
}
|
|
54
|
+
set config(config) {
|
|
55
|
+
if (config) {
|
|
56
|
+
this.authConfig.config = {
|
|
57
|
+
...this.authConfig.config,
|
|
58
|
+
...config
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
constructor(authConfig, tokenService, http, locationService) {
|
|
63
|
+
this.authConfig = authConfig;
|
|
64
|
+
this.tokenService = tokenService;
|
|
65
|
+
this.http = http;
|
|
66
|
+
this.locationService = locationService;
|
|
67
|
+
this.state$ = new ReplaySubject(1);
|
|
68
|
+
this.config$ = of(this.config).pipe(filter(Boolean), filter(config => !!config?.clientId), map(config => config), switchMap(config => !config.issuerPath && of(config) || this.http.get(`${config.issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.config = {
|
|
69
|
+
...v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {},
|
|
70
|
+
...v.token_endpoint && { tokenPath: v.token_endpoint } || {},
|
|
71
|
+
...v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {},
|
|
72
|
+
...v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {},
|
|
73
|
+
...v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {},
|
|
74
|
+
...v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {},
|
|
75
|
+
...v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {},
|
|
76
|
+
...{ scope: config.scope || 'openid' }
|
|
77
|
+
}), map(() => this.config))), shareReplay(1));
|
|
78
|
+
this.token$ = this.config$.pipe(tap(config => {
|
|
79
|
+
const { hash, search, origin, pathname } = this.authConfig.location || {};
|
|
80
|
+
const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);
|
|
81
|
+
const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);
|
|
82
|
+
if (isImplicitRedirect) {
|
|
83
|
+
const parameters = parseOauthUri(hash.substring(1));
|
|
84
|
+
this.token = {
|
|
85
|
+
...parameters,
|
|
86
|
+
type: OAuthType.IMPLICIT,
|
|
87
|
+
};
|
|
88
|
+
this.checkResponse(this.token, parameters);
|
|
89
|
+
}
|
|
90
|
+
else if (isAuthCodeRedirect) {
|
|
91
|
+
const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1) || '');
|
|
92
|
+
if (!this.checkResponse(this.token, parameters)) {
|
|
93
|
+
this.token = parameters;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const newParametersString = this.getCleanedUnSearchParameters();
|
|
97
|
+
const { clientId, clientSecret, tokenPath, scope } = config;
|
|
98
|
+
const { codeVerifier } = this.token || {}; //should be set by authorizationUrl construction
|
|
99
|
+
this.http.post(tokenPath, new HttpParams({
|
|
100
|
+
fromObject: {
|
|
101
|
+
code: parameters?.['code'],
|
|
102
|
+
client_id: clientId,
|
|
103
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
104
|
+
redirect_uri: `${origin}${pathname}`,
|
|
105
|
+
grant_type: 'authorization_code',
|
|
106
|
+
...scope && { scope } || {},
|
|
107
|
+
...codeVerifier && { code_verifier: codeVerifier } || {}
|
|
108
|
+
}
|
|
109
|
+
}), { headers: HEADER_APPLICATION }).pipe().subscribe(token => {
|
|
110
|
+
this.token = {
|
|
111
|
+
...token,
|
|
112
|
+
type: OAuthType.AUTHORIZATION_CODE
|
|
113
|
+
};
|
|
114
|
+
this.locationService.replaceState(`${pathname}${newParametersString}`);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}), switchMap(() => this.tokenService.token$), shareReplay(1));
|
|
119
|
+
this.status$ = this.token$.pipe(map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED), shareReplay(1));
|
|
120
|
+
this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() => this.config.userPath), filter(Boolean), switchMap(path => this.getUserInfo(path)), shareReplay(1));
|
|
121
|
+
this.type$ = this.tokenService.type$;
|
|
122
|
+
this.ignorePaths = this.authConfig.ignorePaths || [];
|
|
123
|
+
}
|
|
124
|
+
async login(parameters) {
|
|
125
|
+
if (!!parameters && parameters.password) {
|
|
126
|
+
await this.resourceLogin(parameters);
|
|
127
|
+
}
|
|
128
|
+
else if (!!parameters && parameters.redirectUri && parameters.responseType) {
|
|
129
|
+
await this.toAuthorizationUrl(parameters);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
await this.clientCredentialLogin();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
logout(useLogoutUrl) {
|
|
136
|
+
this.revoke();
|
|
137
|
+
this.token = {};
|
|
138
|
+
const { logoutPath, logoutRedirectUri } = this.authConfig.config;
|
|
139
|
+
if (useLogoutUrl && logoutPath) {
|
|
140
|
+
const { origin, pathname } = this.authConfig.location || {};
|
|
141
|
+
const currentPath = `${origin}${pathname}`;
|
|
142
|
+
this.authConfig.location?.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
getUserInfo(path) {
|
|
146
|
+
const { userPath } = this.config;
|
|
147
|
+
return this.http.get(path || userPath);
|
|
148
|
+
}
|
|
149
|
+
revoke() {
|
|
150
|
+
const { revokePath, clientId, clientSecret } = this.authConfig.config;
|
|
151
|
+
if (revokePath) {
|
|
152
|
+
const { access_token, refresh_token } = this.token || {};
|
|
153
|
+
const toRevoke = [];
|
|
154
|
+
if (access_token) {
|
|
155
|
+
toRevoke.push({
|
|
156
|
+
...clientId && { client_id: clientId } || {},
|
|
157
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
158
|
+
token: access_token,
|
|
159
|
+
token_type_hint: 'access_token'
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (refresh_token) {
|
|
163
|
+
toRevoke.push({
|
|
164
|
+
...clientId && { client_id: clientId } || {},
|
|
165
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
166
|
+
token: refresh_token,
|
|
167
|
+
token_type_hint: 'refresh_token'
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
from(toRevoke).pipe(concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation
|
|
171
|
+
switchMap(o => this.http.post(revokePath, new HttpParams({ fromObject: o })))).subscribe(noop);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
clientCredentialLogin() {
|
|
175
|
+
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
176
|
+
return firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
177
|
+
fromObject: {
|
|
178
|
+
client_id: clientId,
|
|
179
|
+
client_secret: clientSecret,
|
|
180
|
+
grant_type: OAuthType.CLIENT_CREDENTIAL,
|
|
181
|
+
...scope ? { scope } : {},
|
|
182
|
+
}
|
|
183
|
+
}), { headers: HEADER_APPLICATION }).pipe(catchError((err) => {
|
|
184
|
+
this.token = err;
|
|
185
|
+
return throwError(() => err);
|
|
186
|
+
}), tap(params => {
|
|
187
|
+
this.token = {
|
|
188
|
+
...params,
|
|
189
|
+
type: OAuthType.CLIENT_CREDENTIAL,
|
|
190
|
+
};
|
|
191
|
+
})));
|
|
192
|
+
}
|
|
193
|
+
resourceLogin(parameters) {
|
|
194
|
+
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
195
|
+
const { username, password } = parameters;
|
|
196
|
+
return firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
197
|
+
fromObject: {
|
|
198
|
+
client_id: clientId,
|
|
199
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
200
|
+
grant_type: OAuthType.RESOURCE,
|
|
201
|
+
...scope && { scope } || {},
|
|
202
|
+
username,
|
|
203
|
+
password
|
|
204
|
+
}
|
|
205
|
+
}), { headers: HEADER_APPLICATION }).pipe(catchError(err => {
|
|
206
|
+
this.token = err;
|
|
207
|
+
return throwError(() => err);
|
|
208
|
+
}), tap(params => {
|
|
209
|
+
this.token = {
|
|
210
|
+
...params,
|
|
211
|
+
type: OAuthType.RESOURCE,
|
|
212
|
+
};
|
|
213
|
+
})));
|
|
214
|
+
}
|
|
215
|
+
async toAuthorizationUrl(parameters) {
|
|
216
|
+
const { config, location } = this.authConfig;
|
|
217
|
+
let authorizationUrl = `${config.authorizePath}`;
|
|
218
|
+
authorizationUrl += config.authorizePath.includes('?') && '&' || '?';
|
|
219
|
+
authorizationUrl += `client_id=${config.clientId}`;
|
|
220
|
+
authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;
|
|
221
|
+
authorizationUrl += `&response_type=${parameters.responseType}`;
|
|
222
|
+
authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;
|
|
223
|
+
authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;
|
|
224
|
+
return location?.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);
|
|
225
|
+
}
|
|
226
|
+
async generateCodeChallenge(config) {
|
|
227
|
+
if (config.pkce) {
|
|
228
|
+
const codeVerifier = randomString();
|
|
229
|
+
this.token = { ...this.token, codeVerifier };
|
|
230
|
+
return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;
|
|
231
|
+
}
|
|
232
|
+
return '';
|
|
233
|
+
}
|
|
234
|
+
generateNonce(config) {
|
|
235
|
+
if (config && config.scope && config.scope.indexOf('openid') > -1) {
|
|
236
|
+
const nonce = randomString(10);
|
|
237
|
+
this.token = { ...this.token, nonce };
|
|
238
|
+
return `&nonce=${nonce}`;
|
|
239
|
+
}
|
|
240
|
+
return '';
|
|
241
|
+
}
|
|
242
|
+
checkResponse(token, parameters) {
|
|
243
|
+
this.emitState(parameters);
|
|
244
|
+
this.cleanLocationHash();
|
|
245
|
+
if (!parameters || parameters['error']) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
if (token && token.nonce && parameters['access_token']) {
|
|
249
|
+
const jwtToken = jwt(parameters['access_token']);
|
|
250
|
+
return token.nonce === jwtToken.nonce;
|
|
251
|
+
}
|
|
252
|
+
return parameters['access_token'] || parameters['code'];
|
|
253
|
+
}
|
|
254
|
+
getCleanedUnSearchParameters() {
|
|
255
|
+
const { search } = this.authConfig.location || {};
|
|
256
|
+
let searchString = search && search.substring(1) || '';
|
|
257
|
+
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt', 'iss'];
|
|
258
|
+
hashKeys.forEach(hashKey => {
|
|
259
|
+
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
260
|
+
searchString = searchString.replace(re, '');
|
|
261
|
+
});
|
|
262
|
+
return searchString.length && `?${searchString}` || '';
|
|
263
|
+
}
|
|
264
|
+
cleanLocationHash() {
|
|
265
|
+
if (this.authConfig.location) {
|
|
266
|
+
const { hash } = this.authConfig.location;
|
|
267
|
+
let curHash = hash && hash.substring(1) || '';
|
|
268
|
+
const hashKeys = [
|
|
269
|
+
'access_token',
|
|
270
|
+
'token_type',
|
|
271
|
+
'expires_in',
|
|
272
|
+
'scope',
|
|
273
|
+
'state',
|
|
274
|
+
'error',
|
|
275
|
+
'error_description',
|
|
276
|
+
'session_state',
|
|
277
|
+
'nonce',
|
|
278
|
+
'id_token',
|
|
279
|
+
'code',
|
|
280
|
+
'iss'
|
|
281
|
+
];
|
|
282
|
+
hashKeys.forEach(hashKey => {
|
|
283
|
+
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
284
|
+
curHash = curHash.replace(re, '');
|
|
285
|
+
});
|
|
286
|
+
this.authConfig.location.hash = curHash;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
emitState(parameters) {
|
|
290
|
+
const { state } = parameters || {};
|
|
291
|
+
state && this.state$.next(state);
|
|
292
|
+
}
|
|
293
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthService, deps: [{ token: i1.OAuthConfig }, { token: i2.OAuthTokenService }, { token: i3.HttpClient }, { token: i4.Location }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
294
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthService, providedIn: 'root' }); }
|
|
295
|
+
}
|
|
296
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: OAuthService, decorators: [{
|
|
297
|
+
type: Injectable,
|
|
298
|
+
args: [{
|
|
299
|
+
providedIn: 'root',
|
|
300
|
+
}]
|
|
301
|
+
}], ctorParameters: () => [{ type: i1.OAuthConfig }, { type: i2.OAuthTokenService }, { type: i3.HttpClient }, { type: i4.Location }] });
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1hdXRoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL3NlcnZpY2VzL28tYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFHTCxrQkFBa0IsRUFFbEIsV0FBVyxFQUVYLFNBQVMsRUFNVixNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBS25CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBZSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFOUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDekMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVyQixNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxFQUFFO0lBQzNDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsS0FBYSxFQUFFLEVBQUU7SUFDbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDckMsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsQ0FBQztJQUNOLHFEQUFxRDtJQUNyRCxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0Q7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDcEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBS3JFLE1BQU0sT0FBTyxZQUFZO0lBZ0Z2QixJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxVQUFVO1FBQ3ZCLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQW1DO1FBQzVDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUc7Z0JBQ3ZCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixHQUFHLE1BQU07YUFDVixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQsWUFBc0IsVUFBdUIsRUFDdkIsWUFBK0IsRUFDL0IsSUFBZ0IsRUFDaEIsZUFBMEI7UUFIMUIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBbUI7UUFDL0IsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixvQkFBZSxHQUFmLGVBQWUsQ0FBVztRQWpIaEQsV0FBTSxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLFlBQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQXNCLENBQUMsRUFDckMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBc0IsR0FBRyxNQUFNLENBQUMsVUFBVSxtQ0FBbUMsQ0FBQyxDQUFDLElBQUksQ0FDdEosR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNyQixHQUFHLENBQUMsQ0FBQyxzQkFBc0IsSUFBSSxFQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsc0JBQXNCLEVBQUMsSUFBSSxFQUFFO1lBQzlFLEdBQUcsQ0FBQyxDQUFDLGNBQWMsSUFBSSxFQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFDLElBQUksRUFBRTtZQUMxRCxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxFQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsbUJBQW1CLEVBQUMsSUFBSSxFQUFFO1lBQ3JFLEdBQUcsQ0FBQyxDQUFDLGdDQUFnQyxJQUFJLEVBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFO1lBQzlHLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLEVBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBQyxJQUFJLEVBQUU7WUFDL0QsR0FBRyxDQUFDLENBQUMsc0JBQXNCLElBQUksRUFBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsc0JBQXNCLEVBQUMsSUFBSSxFQUFFO1lBQ2xGLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLEVBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsRUFBQyxJQUFJLEVBQUU7WUFDdkUsR0FBRyxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBQztTQUM5QixDQUFDLEVBQ1QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDdkIsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1FBQ0YsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN4QixHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxNQUFNLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ3hFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RyxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsS0FBSyxHQUFHO29CQUNYLEdBQUcsVUFBVTtvQkFDYixJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVE7aUJBQ3pCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNLElBQUksa0JBQWtCLEVBQUU7Z0JBQzdCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7aUJBQ3pCO3FCQUFNO29CQUNMLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7b0JBQ2hFLE1BQU0sRUFBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFpQyxDQUFDO29CQUNyRixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxnREFBZ0Q7b0JBQ3pGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLFVBQVUsQ0FBQzt3QkFDdkMsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7NEJBQzFCLFNBQVMsRUFBRSxRQUFROzRCQUNuQixHQUFHLFlBQVksSUFBSSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUMsSUFBSSxFQUFFOzRCQUN0RCxZQUFZLEVBQUUsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFOzRCQUNwQyxVQUFVLEVBQUUsb0JBQW9COzRCQUNoQyxHQUFHLEtBQUssSUFBSSxFQUFDLEtBQUssRUFBQyxJQUFJLEVBQUU7NEJBQ3pCLEdBQUcsWUFBWSxJQUFJLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBQyxJQUFJLEVBQUU7eUJBQ3ZEO3FCQUNGLENBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUMsSUFBSSxFQUN0QyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRzs0QkFDWCxHQUFHLEtBQUs7NEJBQ1IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxrQkFBa0I7eUJBQ25DLENBQUM7d0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO29CQUN6RSxDQUFDLENBQUMsQ0FBQztpQkFDSjthQUNGO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQ3pDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1FBQ0YsWUFBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFDN0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7UUFDRixjQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQ3pDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBRSxJQUFJLENBQUMsTUFBYyxDQUFDLFFBQVEsQ0FBQyxFQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQ2YsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN6QyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztRQUNGLFVBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNoQyxnQkFBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQXNDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBNEI7UUFDdEMsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFLLFVBQWlDLENBQUMsUUFBUSxFQUFFO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFnQyxDQUFDLENBQUM7U0FDNUQ7YUFBTSxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUssVUFBc0MsQ0FBQyxXQUFXLElBQUssVUFBc0MsQ0FBQyxZQUFZLEVBQ3BJO1lBQ0EsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBcUMsQ0FBQyxDQUFDO1NBQ3RFO2FBQU07WUFDTCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFzQjtRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFhLENBQUM7UUFDdEUsSUFBSSxZQUFZLElBQUksVUFBVSxFQUFFO1lBQzlCLE1BQU0sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQzFELE1BQU0sV0FBVyxHQUFHLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFVBQVUsNkJBQTZCLGlCQUFpQixJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDakg7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQWE7UUFDdkIsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBVyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLE1BQU07UUFDZCxNQUFNLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQWEsQ0FBQztRQUMzRSxJQUFJLFVBQVUsRUFBRTtZQUNkLE1BQU0sRUFBQyxZQUFZLEVBQUUsYUFBYSxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksWUFBWSxFQUFFO2dCQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNaLEdBQUcsUUFBUSxJQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxJQUFJLEVBQUU7b0JBQzFDLEdBQUcsWUFBWSxJQUFJLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBQyxJQUFJLEVBQUU7b0JBQ3RELEtBQUssRUFBRSxZQUFZO29CQUNuQixlQUFlLEVBQUUsY0FBYztpQkFDaEMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDakIsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDWixHQUFHLFFBQVEsSUFBSSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsSUFBSSxFQUFFO29CQUMxQyxHQUFHLFlBQVksSUFBSSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUMsSUFBSSxFQUFFO29CQUN0RCxLQUFLLEVBQUUsYUFBYTtvQkFDcEIsZUFBZSxFQUFFLGVBQWU7aUJBQ2pDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDakIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLHNDQUFzQztZQUM5RSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBQyxVQUFVLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQzVFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVTLHFCQUFxQjtRQUM3QixNQUFNLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFhLENBQUM7UUFDakYsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksVUFBVSxDQUFDO1lBQzdELFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsYUFBYSxFQUFFLFlBQVk7Z0JBQzNCLFVBQVUsRUFBRSxTQUFTLENBQUMsaUJBQWlCO2dCQUN2QyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUN4QjtTQUNGLENBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUNyQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNqQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUNYLEdBQUcsTUFBTTtnQkFDVCxJQUFJLEVBQUUsU0FBUyxDQUFDLGlCQUFpQjthQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGFBQWEsQ0FBQyxVQUE4QjtRQUNwRCxNQUFNLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFhLENBQUM7UUFDakYsTUFBTSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsR0FBRyxVQUFVLENBQUM7UUFDeEMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksVUFBVSxDQUFDO1lBQzdELFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsR0FBRyxZQUFZLElBQUksRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLElBQUksRUFBRTtnQkFDdEQsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRO2dCQUM5QixHQUFHLEtBQUssSUFBSSxFQUFDLEtBQUssRUFBQyxJQUFJLEVBQUU7Z0JBQ3pCLFFBQVE7Z0JBQ1IsUUFBUTthQUNUO1NBQ0YsQ0FBQyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsR0FBRyxNQUFNO2dCQUNULElBQUksRUFBRSxTQUFTLENBQUMsUUFBUTthQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFtQztRQUNwRSxNQUFNLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFpQixDQUFDO1FBQ2xELElBQUksZ0JBQWdCLEdBQUcsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakQsZ0JBQWdCLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNyRSxnQkFBZ0IsSUFBSSxhQUFhLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxnQkFBZ0IsSUFBSSxpQkFBaUIsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDbEYsZ0JBQWdCLElBQUksa0JBQWtCLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoRSxnQkFBZ0IsSUFBSSxVQUFVLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxnQkFBZ0IsSUFBSSxVQUFVLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxPQUFPLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxSCxDQUFDO0lBRVMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQVc7UUFDL0MsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2YsTUFBTSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQztZQUMzQyxPQUFPLG1CQUFtQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUM7U0FDakY7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFUyxhQUFhLENBQUMsTUFBVztRQUNqQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2pFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDO1lBQ3BDLE9BQU8sVUFBVSxLQUFLLEVBQUUsQ0FBQztTQUMxQjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFrQixFQUNsQixVQUFtQztRQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDdkM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4SCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsYUFBYSxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQztZQUMvRSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzVCLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN4QyxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsY0FBYztnQkFDZCxZQUFZO2dCQUNaLFlBQVk7Z0JBQ1osT0FBTztnQkFDUCxPQUFPO2dCQUNQLE9BQU87Z0JBQ1AsbUJBQW1CO2dCQUNuQixlQUFlO2dCQUNmLE9BQU87Z0JBQ1AsVUFBVTtnQkFDVixNQUFNO2dCQUNOLEtBQUs7YUFDTixDQUFDO1lBQ0YsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sR0FBRyxhQUFhLEdBQUcsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxVQUFtQztRQUNuRCxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQzs4R0FsVFUsWUFBWTtrSEFBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb20sIGZyb20sIG5vb3AsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25Db2RlQ29uZmlnLFxuICBBdXRob3JpemF0aW9uUGFyYW1ldGVycyxcbiAgSEVBREVSX0FQUExJQ0FUSU9OLFxuICBPQXV0aFBhcmFtZXRlcnMsXG4gIE9BdXRoU3RhdHVzLFxuICBPQXV0aFRva2VuLFxuICBPQXV0aFR5cGUsXG4gIE9BdXRoVHlwZUNvbmZpZyxcbiAgT3BlbklkQ29uZmlnLFxuICBPcGVuSWRDb25maWd1cmF0aW9uLFxuICBSZXNvdXJjZVBhcmFtZXRlcnMsXG4gIFVzZXJJbmZvXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge0xvY2F0aW9uIGFzIExvY2F0aW9uMn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7T0F1dGhUb2tlblNlcnZpY2V9IGZyb20gJy4vby1hdXRoLXRva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHtPQXV0aENvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcblxuY29uc3QgYXJyVG9TdHJpbmcgPSAoYnVmOiBVaW50OEFycmF5KSA9PiBidWYucmVkdWNlKChzLCBiKSA9PiBzICsgU3RyaW5nLmZyb21DaGFyQ29kZShiKSwgJycpO1xuXG5jb25zdCBiYXNlNjR1cmwgPSAoc3RyOiBzdHJpbmcpID0+IGJ0b2Eoc3RyKVxuICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gIC5yZXBsYWNlKC89L2csICcnKTtcblxuY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyID0gNDgpID0+IHtcbiAgY29uc3QgYnVmZiA9IGFyclRvU3RyaW5nKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkobGVuZ3RoICogMikpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChidWZmKS5zdWJzdHJpbmcoMCwgbGVuZ3RoKTtcbn07XG5cbmNvbnN0IHBrY2UgPSBhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBidWZmID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodmFsdWUpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChhcnJUb1N0cmluZyhuZXcgVWludDhBcnJheShidWZmKSkpO1xufTtcblxuY29uc3QgcGFyc2VPYXV0aFVyaSA9IChoYXNoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nO1xuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IG07XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gIHdoaWxlICgobSA9IHJlZ2V4LmV4ZWMoaGFzaCkpICE9PSBudWxsKSB7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXSk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoICYmIHBhcmFtcyB8fCB7fTtcbn07XG5cbmNvbnN0IGp3dCA9ICh0b2tlbjogc3RyaW5nKSA9PiBKU09OLnBhcnNlKGF0b2IodG9rZW4uc3BsaXQoJy4nKVsxXSkpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgT0F1dGhTZXJ2aWNlIHtcblxuICBzdGF0ZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xuICBjb25maWckID0gb2YodGhpcy5jb25maWcpLnBpcGUoXG4gICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgIGZpbHRlcihjb25maWcgPT4gISFjb25maWc/LmNsaWVudElkKSxcbiAgICBtYXAoY29uZmlnID0+IGNvbmZpZyBhcyBPcGVuSWRDb25maWcpLFxuICAgIHN3aXRjaE1hcChjb25maWcgPT4gIWNvbmZpZy5pc3N1ZXJQYXRoICYmIG9mKGNvbmZpZykgfHwgdGhpcy5odHRwLmdldDxPcGVuSWRDb25maWd1cmF0aW9uPihgJHtjb25maWcuaXNzdWVyUGF0aH0vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gKS5waXBlKFxuICAgICAgdGFwKHYgPT4gdGhpcy5jb25maWcgPSB7XG4gICAgICAgIC4uLnYuYXV0aG9yaXphdGlvbl9lbmRwb2ludCAmJiB7YXV0aG9yaXplUGF0aDogdi5hdXRob3JpemF0aW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi50b2tlbl9lbmRwb2ludCAmJiB7dG9rZW5QYXRoOiB2LnRva2VuX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi5yZXZvY2F0aW9uX2VuZHBvaW50ICYmIHtyZXZva2VQYXRoOiB2LnJldm9jYXRpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkICYmIHtwa2NlOiB2LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkLmluZGV4T2YoJ1MyNTYnKSA+IC0xfSB8fCB7fSxcbiAgICAgICAgLi4udi51c2VyaW5mb19lbmRwb2ludCAmJiB7dXNlclBhdGg6IHYudXNlcmluZm9fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmludHJvc3BlY3Rpb25fZW5kcG9pbnQgJiYge2ludHJvc3BlY3Rpb25QYXRoOiB2LmludHJvc3BlY3Rpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmVuZF9zZXNzaW9uX2VuZHBvaW50ICYmIHtsb2dvdXRQYXRoOiB2LmVuZF9zZXNzaW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4ue3Njb3BlOiBjb25maWcuc2NvcGUgfHwgJ29wZW5pZCd9XG4gICAgICB9IGFzIGFueSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5jb25maWcpXG4gICAgKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgdG9rZW4kID0gdGhpcy5jb25maWckLnBpcGUoXG4gICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICBjb25zdCB7aGFzaCwgc2VhcmNoLCBvcmlnaW4sIHBhdGhuYW1lfSA9IHRoaXMuYXV0aENvbmZpZy5sb2NhdGlvbiB8fCB7fTtcbiAgICAgIGNvbnN0IGlzSW1wbGljaXRSZWRpcmVjdCA9IGhhc2ggJiYgLyhhY2Nlc3NfdG9rZW49KXwoZXJyb3I9KS8udGVzdChoYXNoKTtcbiAgICAgIGNvbnN0IGlzQXV0aENvZGVSZWRpcmVjdCA9IHNlYXJjaCAmJiAvKGNvZGU9KXwoZXJyb3I9KS8udGVzdChzZWFyY2gpIHx8IGhhc2ggJiYgLyhjb2RlPSl8KGVycm9yPSkvLnRlc3QoaGFzaCk7XG4gICAgICBpZiAoaXNJbXBsaWNpdFJlZGlyZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKGhhc2guc3Vic3RyaW5nKDEpKTtcbiAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5JTVBMSUNJVCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGVja1Jlc3BvbnNlKHRoaXMudG9rZW4sIHBhcmFtZXRlcnMpO1xuICAgICAgfSBlbHNlIGlmIChpc0F1dGhDb2RlUmVkaXJlY3QpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcnNlT2F1dGhVcmkoc2VhcmNoICYmIHNlYXJjaC5zdWJzdHJpbmcoMSkgfHwgaGFzaCAmJiBoYXNoLnN1YnN0cmluZygxKSB8fCAnJyk7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1Jlc3BvbnNlKHRoaXMudG9rZW4sIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3UGFyYW1ldGVyc1N0cmluZyA9IHRoaXMuZ2V0Q2xlYW5lZFVuU2VhcmNoUGFyYW1ldGVycygpO1xuICAgICAgICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IGNvbmZpZyBhcyBBdXRob3JpemF0aW9uQ29kZUNvbmZpZztcbiAgICAgICAgICBjb25zdCB7Y29kZVZlcmlmaWVyfSA9IHRoaXMudG9rZW4gfHwge307IC8vc2hvdWxkIGJlIHNldCBieSBhdXRob3JpemF0aW9uVXJsIGNvbnN0cnVjdGlvblxuICAgICAgICAgIHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICAgICAgICBjb2RlOiBwYXJhbWV0ZXJzPy5bJ2NvZGUnXSxcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgICAgICByZWRpcmVjdF91cmk6IGAke29yaWdpbn0ke3BhdGhuYW1lfWAsXG4gICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICAgICAgICAuLi5zY29wZSAmJiB7c2NvcGV9IHx8IHt9LFxuICAgICAgICAgICAgICAuLi5jb2RlVmVyaWZpZXIgJiYge2NvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcn0gfHwge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwge2hlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTn0pLnBpcGUoXG4gICAgICAgICAgKS5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAgICAgLi4udG9rZW4sXG4gICAgICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5BVVRIT1JJWkFUSU9OX0NPREVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5yZXBsYWNlU3RhdGUoYCR7cGF0aG5hbWV9JHtuZXdQYXJhbWV0ZXJzU3RyaW5nfWApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMudG9rZW5TZXJ2aWNlLnRva2VuJCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgc3RhdHVzJCA9IHRoaXMudG9rZW4kLnBpcGUoXG4gICAgbWFwKHRva2VuID0+IHRva2VuLmFjY2Vzc190b2tlbiAmJiBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEIHx8IHRva2VuLmVycm9yICYmIE9BdXRoU3RhdHVzLkRFTklFRCB8fCBPQXV0aFN0YXR1cy5OT1RfQVVUSE9SSVpFRCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgdXNlckluZm8kID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgZmlsdGVyKHMgPT4gcyA9PT0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRCksXG4gICAgbWFwKCgpID0+ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnVzZXJQYXRoKSxcbiAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgc3dpdGNoTWFwKHBhdGggPT4gdGhpcy5nZXRVc2VySW5mbyhwYXRoKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgdHlwZSQgPSB0aGlzLnRva2VuU2VydmljZS50eXBlJDtcbiAgaWdub3JlUGF0aHMgPSB0aGlzLmF1dGhDb25maWcuaWdub3JlUGF0aHMgfHwgW107XG5cbiAgZ2V0IHN0b3JhZ2VLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlS2V5O1xuICB9XG5cbiAgc2V0IHN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICAgIGlmIChzdG9yYWdlS2V5KSB7XG4gICAgICB0aGlzLmF1dGhDb25maWcuc3RvcmFnZUtleSA9IHN0b3JhZ2VLZXk7XG4gICAgICB0aGlzLnRva2VuU2VydmljZS50b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLnNhdmVkO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0b2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlblNlcnZpY2UudG9rZW47XG4gIH1cblxuICBzZXQgdG9rZW4odG9rZW4pIHtcbiAgICB0aGlzLnRva2VuU2VydmljZS50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIHNldCBjb25maWcoY29uZmlnOiBPQXV0aFR5cGVDb25maWcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmF1dGhDb25maWcuY29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLmF1dGhDb25maWcuY29uZmlnLFxuICAgICAgICAuLi5jb25maWdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdG9rZW5TZXJ2aWNlOiBPQXV0aFRva2VuU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBsb2NhdGlvblNlcnZpY2U6IExvY2F0aW9uMikge1xuICB9XG5cbiAgYXN5bmMgbG9naW4ocGFyYW1ldGVycz86IE9BdXRoUGFyYW1ldGVycykge1xuICAgIGlmICghIXBhcmFtZXRlcnMgJiYgKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKS5wYXNzd29yZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKTtcbiAgICB9IGVsc2UgaWYgKCEhcGFyYW1ldGVycyAmJiAocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uUGFyYW1ldGVycykucmVkaXJlY3RVcmkgJiYgKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvblBhcmFtZXRlcnMpLnJlc3BvbnNlVHlwZVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uUGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50Q3JlZGVudGlhbExvZ2luKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nb3V0KHVzZUxvZ291dFVybD86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJldm9rZSgpO1xuICAgIHRoaXMudG9rZW4gPSB7fTtcbiAgICBjb25zdCB7bG9nb3V0UGF0aCwgbG9nb3V0UmVkaXJlY3RVcml9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKHVzZUxvZ291dFVybCAmJiBsb2dvdXRQYXRoKSB7XG4gICAgICBjb25zdCB7b3JpZ2luLCBwYXRobmFtZX0gPSB0aGlzLmF1dGhDb25maWcubG9jYXRpb24gfHwge307XG4gICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGAke29yaWdpbn0ke3BhdGhuYW1lfWA7XG4gICAgICB0aGlzLmF1dGhDb25maWcubG9jYXRpb24/LnJlcGxhY2UoYCR7bG9nb3V0UGF0aH0/cG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpPSR7bG9nb3V0UmVkaXJlY3RVcmkgfHwgY3VycmVudFBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlckluZm8ocGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IHt1c2VyUGF0aH0gPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VXNlckluZm8+KHBhdGggfHwgdXNlclBhdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJldm9rZSgpIHtcbiAgICBjb25zdCB7cmV2b2tlUGF0aCwgY2xpZW50SWQsIGNsaWVudFNlY3JldH0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBpZiAocmV2b2tlUGF0aCkge1xuICAgICAgY29uc3Qge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbn0gPSB0aGlzLnRva2VuIHx8IHt9O1xuICAgICAgY29uc3QgdG9SZXZva2UgPSBbXTtcbiAgICAgIGlmIChhY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdG9SZXZva2UucHVzaCh7XG4gICAgICAgICAgLi4uY2xpZW50SWQgJiYge2NsaWVudF9pZDogY2xpZW50SWR9IHx8IHt9LFxuICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICB0b2tlbjogYWNjZXNzX3Rva2VuLFxuICAgICAgICAgIHRva2VuX3R5cGVfaGludDogJ2FjY2Vzc190b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVmcmVzaF90b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiByZWZyZXNoX3Rva2VuLFxuICAgICAgICAgIHRva2VuX3R5cGVfaGludDogJ3JlZnJlc2hfdG9rZW4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnJvbSh0b1Jldm9rZSkucGlwZShcbiAgICAgICAgY29uY2F0TWFwKG8gPT4gb2YobykucGlwZShkZWxheSgzMDApKSksIC8vIHNwYWNlIHJlcXVlc3QgdG8gYXZvaWQgY2FuY2VsbGF0aW9uXG4gICAgICAgIHN3aXRjaE1hcChvID0+IHRoaXMuaHR0cC5wb3N0KHJldm9rZVBhdGgsIG5ldyBIdHRwUGFyYW1zKHtmcm9tT2JqZWN0OiBvfSkpKSxcbiAgICAgICkuc3Vic2NyaWJlKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGllbnRDcmVkZW50aWFsTG9naW4oKSB7XG4gICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6IE9BdXRoVHlwZS5DTElFTlRfQ1JFREVOVElBTCxcbiAgICAgICAgLi4uc2NvcGUgPyB7c2NvcGV9IDoge30sXG4gICAgICB9XG4gICAgfSksIHtoZWFkZXJzOiBIRUFERVJfQVBQTElDQVRJT059KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBlcnI7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICB9KSxcbiAgICAgIHRhcChwYXJhbXMgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICB0eXBlOiBPQXV0aFR5cGUuQ0xJRU5UX0NSRURFTlRJQUwsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnM6IFJlc291cmNlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHt1c2VybmFtZSwgcGFzc3dvcmR9ID0gcGFyYW1ldGVycztcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgZ3JhbnRfdHlwZTogT0F1dGhUeXBlLlJFU09VUkNFLFxuICAgICAgICAuLi5zY29wZSAmJiB7c2NvcGV9IHx8IHt9LFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmRcbiAgICAgIH1cbiAgICB9KSwge2hlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTn0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBlcnI7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICB9KSxcbiAgICAgIHRhcChwYXJhbXMgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICB0eXBlOiBPQXV0aFR5cGUuUkVTT1VSQ0UsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHRvQXV0aG9yaXphdGlvblVybChwYXJhbWV0ZXJzOiBBdXRob3JpemF0aW9uUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtjb25maWcsIGxvY2F0aW9ufSA9IHRoaXMuYXV0aENvbmZpZyBhcyBhbnk7XG4gICAgbGV0IGF1dGhvcml6YXRpb25VcmwgPSBgJHtjb25maWcuYXV0aG9yaXplUGF0aH1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gY29uZmlnLmF1dGhvcml6ZVBhdGguaW5jbHVkZXMoJz8nKSAmJiAnJicgfHwgJz8nO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYGNsaWVudF9pZD0ke2NvbmZpZy5jbGllbnRJZH1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5yZWRpcmVjdFVyaSl9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmcmVzcG9uc2VfdHlwZT0ke3BhcmFtZXRlcnMucmVzcG9uc2VUeXBlfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zY29wZSB8fCAnJyl9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5zdGF0ZSB8fCAnJyl9YDtcbiAgICByZXR1cm4gbG9jYXRpb24/LnJlcGxhY2UoYCR7YXV0aG9yaXphdGlvblVybH0ke3RoaXMuZ2VuZXJhdGVOb25jZShjb25maWcpfSR7YXdhaXQgdGhpcy5nZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnKX1gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnLnBrY2UpIHtcbiAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHJhbmRvbVN0cmluZygpO1xuICAgICAgdGhpcy50b2tlbiA9IHsuLi50aGlzLnRva2VuLCBjb2RlVmVyaWZpZXJ9O1xuICAgICAgcmV0dXJuIGAmY29kZV9jaGFsbGVuZ2U9JHthd2FpdCBwa2NlKGNvZGVWZXJpZmllcil9JmNvZGVfY2hhbGxlbmdlX21ldGhvZD1TMjU2YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlTm9uY2UoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5zY29wZSAmJiBjb25maWcuc2NvcGUuaW5kZXhPZignb3BlbmlkJykgPiAtMSkge1xuICAgICAgY29uc3Qgbm9uY2UgPSByYW5kb21TdHJpbmcoMTApO1xuICAgICAgdGhpcy50b2tlbiA9IHsuLi50aGlzLnRva2VuLCBub25jZX07XG4gICAgICByZXR1cm4gYCZub25jZT0ke25vbmNlfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tSZXNwb25zZSh0b2tlbj86IE9BdXRoVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIHRoaXMuZW1pdFN0YXRlKHBhcmFtZXRlcnMpO1xuICAgIHRoaXMuY2xlYW5Mb2NhdGlvbkhhc2goKTtcbiAgICBpZiAoIXBhcmFtZXRlcnMgfHwgcGFyYW1ldGVyc1snZXJyb3InXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodG9rZW4gJiYgdG9rZW4ubm9uY2UgJiYgcGFyYW1ldGVyc1snYWNjZXNzX3Rva2VuJ10pIHtcbiAgICAgIGNvbnN0IGp3dFRva2VuID0gand0KHBhcmFtZXRlcnNbJ2FjY2Vzc190b2tlbiddKTtcbiAgICAgIHJldHVybiB0b2tlbi5ub25jZSA9PT0gand0VG9rZW4ubm9uY2U7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbWV0ZXJzWydhY2Nlc3NfdG9rZW4nXSB8fCBwYXJhbWV0ZXJzWydjb2RlJ107XG4gIH1cblxuICBwcml2YXRlIGdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3Qge3NlYXJjaH0gPSB0aGlzLmF1dGhDb25maWcubG9jYXRpb24gfHwge307XG4gICAgbGV0IHNlYXJjaFN0cmluZyA9IHNlYXJjaCAmJiBzZWFyY2guc3Vic3RyaW5nKDEpIHx8ICcnO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydjb2RlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnc2NvcGUnLCAnYXV0aHVzZXInLCAncHJvbXB0JywgJ2lzcyddO1xuICAgIGhhc2hLZXlzLmZvckVhY2goaGFzaEtleSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWFyY2hTdHJpbmcubGVuZ3RoICYmIGA/JHtzZWFyY2hTdHJpbmd9YCB8fCAnJztcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5Mb2NhdGlvbkhhc2goKSB7XG4gICAgaWYgKHRoaXMuYXV0aENvbmZpZy5sb2NhdGlvbikge1xuICAgICAgY29uc3Qge2hhc2h9ID0gdGhpcy5hdXRoQ29uZmlnLmxvY2F0aW9uO1xuICAgICAgbGV0IGN1ckhhc2ggPSBoYXNoICYmIGhhc2guc3Vic3RyaW5nKDEpIHx8ICcnO1xuICAgICAgY29uc3QgaGFzaEtleXMgPSBbXG4gICAgICAgICdhY2Nlc3NfdG9rZW4nLFxuICAgICAgICAndG9rZW5fdHlwZScsXG4gICAgICAgICdleHBpcmVzX2luJyxcbiAgICAgICAgJ3Njb3BlJyxcbiAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ2Vycm9yX2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgJ3Nlc3Npb25fc3RhdGUnLFxuICAgICAgICAnbm9uY2UnLFxuICAgICAgICAnaWRfdG9rZW4nLFxuICAgICAgICAnY29kZScsXG4gICAgICAgICdpc3MnXG4gICAgICBdO1xuICAgICAgaGFzaEtleXMuZm9yRWFjaChoYXNoS2V5ID0+IHtcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcmJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/fF4nICsgaGFzaEtleSArICcoPVteJl0qKT8mPycpO1xuICAgICAgICBjdXJIYXNoID0gY3VySGFzaC5yZXBsYWNlKHJlLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXV0aENvbmZpZy5sb2NhdGlvbi5oYXNoID0gY3VySGFzaDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0ZShwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IHtzdGF0ZX0gPSBwYXJhbWV0ZXJzIHx8IHt9O1xuICAgIHN0YXRlICYmIHRoaXMuc3RhdGUkLm5leHQoc3RhdGUpO1xuICB9XG59XG4iXX0=
|