@nauth-toolkit/client-angular 0.1.91 → 0.1.93
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/esm2022/lib/recaptcha-provider.mjs +52 -0
- package/esm2022/lib/recaptcha.service.mjs +371 -0
- package/esm2022/lib/social-redirect-callback.guard.mjs +28 -21
- package/esm2022/ngmodule/auth.service.mjs +94 -12
- package/esm2022/ngmodule/nauth.module.mjs +60 -27
- package/esm2022/ngmodule/tokens.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/nauth-toolkit-client-angular.mjs +596 -58
- package/fesm2022/nauth-toolkit-client-angular.mjs.map +1 -1
- package/lib/recaptcha-provider.d.ts +27 -0
- package/lib/recaptcha.service.d.ts +195 -0
- package/lib/social-redirect-callback.guard.d.ts +1 -0
- package/ngmodule/auth.service.d.ts +45 -10
- package/ngmodule/nauth.module.d.ts +17 -3
- package/ngmodule/tokens.d.ts +97 -0
- package/package.json +2 -2
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { inject, makeEnvironmentProviders, APP_INITIALIZER } from '@angular/core';
|
|
2
|
+
import { RecaptchaService, RECAPTCHA_CONFIG } from './recaptcha.service';
|
|
3
|
+
/**
|
|
4
|
+
* Provides reCAPTCHA configuration and automatic script preloading.
|
|
5
|
+
*
|
|
6
|
+
* Sets up `RECAPTCHA_CONFIG` and forces `RecaptchaService` instantiation at app
|
|
7
|
+
* startup so the reCAPTCHA script preloads before the user clicks login/signup.
|
|
8
|
+
*
|
|
9
|
+
* @param config - reCAPTCHA configuration (enabled, version, siteKey, action)
|
|
10
|
+
* @returns Environment providers for reCAPTCHA
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* export const appConfig: ApplicationConfig = {
|
|
15
|
+
* providers: [
|
|
16
|
+
* provideRecaptcha({
|
|
17
|
+
* enabled: true,
|
|
18
|
+
* version: 'enterprise',
|
|
19
|
+
* siteKey: environment.recaptchaSiteKey,
|
|
20
|
+
* action: 'login',
|
|
21
|
+
* }),
|
|
22
|
+
* // ... other providers
|
|
23
|
+
* ],
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function provideRecaptcha(config) {
|
|
28
|
+
return makeEnvironmentProviders([
|
|
29
|
+
{
|
|
30
|
+
provide: RECAPTCHA_CONFIG,
|
|
31
|
+
useValue: config,
|
|
32
|
+
},
|
|
33
|
+
RecaptchaService,
|
|
34
|
+
{
|
|
35
|
+
provide: APP_INITIALIZER,
|
|
36
|
+
useFactory: () => {
|
|
37
|
+
const recaptcha = inject(RecaptchaService);
|
|
38
|
+
// Return initialization function that ensures script starts loading
|
|
39
|
+
return () => {
|
|
40
|
+
// Trigger script load (fire-and-forget, don't block app startup)
|
|
41
|
+
if (config.enabled && (config.version === 'v3' || config.version === 'enterprise')) {
|
|
42
|
+
recaptcha.loadScript().catch(() => {
|
|
43
|
+
// Silent fail - execute() will retry when called
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
multi: true,
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNhcHRjaGEtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBd0Isd0JBQXdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBOEI7SUFDN0QsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsUUFBUSxFQUFFLE1BQU07U0FDakI7UUFDRCxnQkFBZ0I7UUFDaEI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzQyxvRUFBb0U7Z0JBQ3BFLE9BQU8sR0FBRyxFQUFFO29CQUNWLGlFQUFpRTtvQkFDakUsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO3dCQUNuRixTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTs0QkFDaEMsaURBQWlEO3dCQUNuRCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycywgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWNhcHRjaGFTZXJ2aWNlLCBSRUNBUFRDSEFfQ09ORklHLCBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi9yZWNhcHRjaGEuc2VydmljZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gYW5kIGF1dG9tYXRpYyBzY3JpcHQgcHJlbG9hZGluZy5cbiAqXG4gKiBTZXRzIHVwIGBSRUNBUFRDSEFfQ09ORklHYCBhbmQgZm9yY2VzIGBSZWNhcHRjaGFTZXJ2aWNlYCBpbnN0YW50aWF0aW9uIGF0IGFwcFxuICogc3RhcnR1cCBzbyB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBwcmVsb2FkcyBiZWZvcmUgdGhlIHVzZXIgY2xpY2tzIGxvZ2luL3NpZ251cC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQsIHZlcnNpb24sIHNpdGVLZXksIGFjdGlvbilcbiAqIEByZXR1cm5zIEVudmlyb25tZW50IHByb3ZpZGVycyBmb3IgcmVDQVBUQ0hBXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjb25zdCBhcHBDb25maWc6IEFwcGxpY2F0aW9uQ29uZmlnID0ge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlUmVjYXB0Y2hhKHtcbiAqICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgICAgICB2ZXJzaW9uOiAnZW50ZXJwcmlzZScsXG4gKiAgICAgICBzaXRlS2V5OiBlbnZpcm9ubWVudC5yZWNhcHRjaGFTaXRlS2V5LFxuICogICAgICAgYWN0aW9uOiAnbG9naW4nLFxuICogICAgIH0pLFxuICogICAgIC8vIC4uLiBvdGhlciBwcm92aWRlcnNcbiAqICAgXSxcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSZWNhcHRjaGEoY29uZmlnOiBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBSRUNBUFRDSEFfQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICB9LFxuICAgIFJlY2FwdGNoYVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4ge1xuICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBpbmplY3QoUmVjYXB0Y2hhU2VydmljZSk7XG4gICAgICAgIC8vIFJldHVybiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IGVuc3VyZXMgc2NyaXB0IHN0YXJ0cyBsb2FkaW5nXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgLy8gVHJpZ2dlciBzY3JpcHQgbG9hZCAoZmlyZS1hbmQtZm9yZ2V0LCBkb24ndCBibG9jayBhcHAgc3RhcnR1cClcbiAgICAgICAgICBpZiAoY29uZmlnLmVuYWJsZWQgJiYgKGNvbmZpZy52ZXJzaW9uID09PSAndjMnIHx8IGNvbmZpZy52ZXJzaW9uID09PSAnZW50ZXJwcmlzZScpKSB7XG4gICAgICAgICAgICByZWNhcHRjaGEubG9hZFNjcmlwdCgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gU2lsZW50IGZhaWwgLSBleGVjdXRlKCkgd2lsbCByZXRyeSB3aGVuIGNhbGxlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { Injectable, Inject, PLATFORM_ID, Optional, InjectionToken } from '@angular/core';
|
|
2
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Injection token for reCAPTCHA configuration
|
|
6
|
+
*/
|
|
7
|
+
export const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG', {
|
|
8
|
+
providedIn: 'root',
|
|
9
|
+
factory: () => undefined,
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Google reCAPTCHA service for Angular applications.
|
|
13
|
+
*
|
|
14
|
+
* Provides lazy loading of reCAPTCHA script and platform-aware token generation.
|
|
15
|
+
* Automatically detects platform (web, Capacitor WebView, Capacitor native, SSR)
|
|
16
|
+
* and skips reCAPTCHA in environments where it's not supported or needed.
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Lazy script loading (only loads when needed)
|
|
20
|
+
* - v2 (checkbox) and v3 (invisible) support
|
|
21
|
+
* - Platform detection (web, Capacitor, SSR)
|
|
22
|
+
* - Automatic skip for Capacitor native mode
|
|
23
|
+
* - Automatic skip for SSR
|
|
24
|
+
*
|
|
25
|
+
* @example v3 Automatic Mode
|
|
26
|
+
* ```typescript
|
|
27
|
+
* constructor(private recaptcha: RecaptchaService) {}
|
|
28
|
+
*
|
|
29
|
+
* async login() {
|
|
30
|
+
* const token = await this.recaptcha.execute('login');
|
|
31
|
+
* await this.auth.login(email, password, token);
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example v2 Manual Mode
|
|
36
|
+
* ```typescript
|
|
37
|
+
* ngOnInit() {
|
|
38
|
+
* this.recaptcha.render('recaptcha-container', (token) => {
|
|
39
|
+
* this.recaptchaToken = token;
|
|
40
|
+
* });
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class RecaptchaService {
|
|
45
|
+
platformId;
|
|
46
|
+
config;
|
|
47
|
+
scriptLoaded = false;
|
|
48
|
+
scriptLoading = null;
|
|
49
|
+
platform;
|
|
50
|
+
widgetId = null;
|
|
51
|
+
constructor(platformId, config) {
|
|
52
|
+
this.platformId = platformId;
|
|
53
|
+
this.config = config;
|
|
54
|
+
this.platform = this.detectPlatform();
|
|
55
|
+
// Auto-preload script for v3/Enterprise so it's ready before first login/signup
|
|
56
|
+
// No-op when disabled, shouldSkip, or v2 (v2 renders on-demand)
|
|
57
|
+
if (this.config?.enabled && (this.config.version === 'v3' || this.config.version === 'enterprise')) {
|
|
58
|
+
if (!this.shouldSkip()) {
|
|
59
|
+
this.loadScript().catch(() => {
|
|
60
|
+
// Silently fail - execute() will handle errors when called
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Platform Detection
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Detect the current platform environment.
|
|
70
|
+
*
|
|
71
|
+
* Detection priority:
|
|
72
|
+
* 1. SSR (not in browser) → 'ssr'
|
|
73
|
+
* 2. Capacitor native (no web view) → 'capacitor-native'
|
|
74
|
+
* 3. Capacitor WebView → 'capacitor-webview'
|
|
75
|
+
* 4. Web browser → 'web'
|
|
76
|
+
*
|
|
77
|
+
* @returns Detected platform type
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const platform = this.detectPlatform();
|
|
82
|
+
* if (platform === 'capacitor-native') {
|
|
83
|
+
* // Skip reCAPTCHA, use device attestation
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
detectPlatform() {
|
|
88
|
+
// SSR detection
|
|
89
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
90
|
+
return 'ssr';
|
|
91
|
+
}
|
|
92
|
+
// Capacitor detection (window.Capacitor exists)
|
|
93
|
+
const windowRef = window;
|
|
94
|
+
if (windowRef.Capacitor) {
|
|
95
|
+
// Capacitor native (iOS/Android app)
|
|
96
|
+
if (typeof windowRef.Capacitor.isNativePlatform === 'function' && windowRef.Capacitor.isNativePlatform()) {
|
|
97
|
+
return 'capacitor-native';
|
|
98
|
+
}
|
|
99
|
+
// Capacitor WebView
|
|
100
|
+
return 'capacitor-webview';
|
|
101
|
+
}
|
|
102
|
+
return 'web';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the current platform.
|
|
106
|
+
*
|
|
107
|
+
* @returns Current platform type
|
|
108
|
+
*/
|
|
109
|
+
getPlatform() {
|
|
110
|
+
return this.platform;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if reCAPTCHA should be skipped for current platform.
|
|
114
|
+
*
|
|
115
|
+
* Skips for:
|
|
116
|
+
* - SSR (no window object)
|
|
117
|
+
* - Capacitor native (use device attestation instead)
|
|
118
|
+
*
|
|
119
|
+
* @returns True if should skip reCAPTCHA
|
|
120
|
+
*/
|
|
121
|
+
shouldSkip() {
|
|
122
|
+
return this.platform === 'ssr' || this.platform === 'capacitor-native';
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Script Loading
|
|
126
|
+
// ============================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Load Google reCAPTCHA script if not already loaded.
|
|
129
|
+
*
|
|
130
|
+
* Script URL format:
|
|
131
|
+
* - v2: https://www.google.com/recaptcha/api.js
|
|
132
|
+
* - v3: https://www.google.com/recaptcha/api.js?render={siteKey}
|
|
133
|
+
* - Enterprise: https://www.google.com/recaptcha/enterprise.js?render={siteKey}
|
|
134
|
+
*
|
|
135
|
+
* @returns Promise that resolves when script is loaded
|
|
136
|
+
*
|
|
137
|
+
* @throws Error if config is missing or script fails to load
|
|
138
|
+
*/
|
|
139
|
+
async loadScript() {
|
|
140
|
+
// Skip in SSR or Capacitor native
|
|
141
|
+
if (this.shouldSkip()) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Skip if disabled
|
|
145
|
+
if (!this.config?.enabled) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Already loaded
|
|
149
|
+
if (this.scriptLoaded) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Already loading (return existing promise)
|
|
153
|
+
if (this.scriptLoading) {
|
|
154
|
+
return this.scriptLoading;
|
|
155
|
+
}
|
|
156
|
+
// Validate config
|
|
157
|
+
if (!this.config.siteKey) {
|
|
158
|
+
throw new Error('[RecaptchaService] Site key is required');
|
|
159
|
+
}
|
|
160
|
+
// Start loading
|
|
161
|
+
this.scriptLoading = this.injectScript();
|
|
162
|
+
try {
|
|
163
|
+
await this.scriptLoading;
|
|
164
|
+
this.scriptLoaded = true;
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
this.scriptLoading = null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Inject the reCAPTCHA script into the DOM.
|
|
172
|
+
*
|
|
173
|
+
* @returns Promise that resolves when script loads
|
|
174
|
+
*/
|
|
175
|
+
injectScript() {
|
|
176
|
+
return new Promise((resolve, reject) => {
|
|
177
|
+
const script = document.createElement('script');
|
|
178
|
+
script.async = true;
|
|
179
|
+
script.defer = true;
|
|
180
|
+
// Set script URL based on version
|
|
181
|
+
if (this.config.version === 'enterprise') {
|
|
182
|
+
script.src = `https://www.google.com/recaptcha/enterprise.js?render=${this.config.siteKey}`;
|
|
183
|
+
}
|
|
184
|
+
else if (this.config.version === 'v3') {
|
|
185
|
+
script.src = `https://www.google.com/recaptcha/api.js?render=${this.config.siteKey}`;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// v2 - load without render parameter
|
|
189
|
+
let url = 'https://www.google.com/recaptcha/api.js';
|
|
190
|
+
if (this.config.language) {
|
|
191
|
+
url += `?hl=${this.config.language}`;
|
|
192
|
+
}
|
|
193
|
+
script.src = url;
|
|
194
|
+
}
|
|
195
|
+
script.onload = () => resolve();
|
|
196
|
+
script.onerror = () => reject(new Error('[RecaptchaService] Failed to load reCAPTCHA script'));
|
|
197
|
+
document.head.appendChild(script);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// ============================================================================
|
|
201
|
+
// v3/Enterprise Methods (Invisible Challenge)
|
|
202
|
+
// ============================================================================
|
|
203
|
+
/**
|
|
204
|
+
* Execute reCAPTCHA v3/Enterprise challenge (invisible).
|
|
205
|
+
*
|
|
206
|
+
* Automatically loads script if needed and generates a token.
|
|
207
|
+
* Skips automatically for SSR and Capacitor native.
|
|
208
|
+
*
|
|
209
|
+
* @param action - Action name for v3 analytics (e.g., 'login', 'signup')
|
|
210
|
+
* @returns Promise resolving to reCAPTCHA token, or undefined if skipped
|
|
211
|
+
*
|
|
212
|
+
* @throws Error if version is v2, config missing, or execution fails
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* const token = await this.recaptcha.execute('login');
|
|
217
|
+
* if (token) {
|
|
218
|
+
* await this.auth.login(email, password, token);
|
|
219
|
+
* }
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
async execute(action) {
|
|
223
|
+
// Skip for platforms that don't support reCAPTCHA
|
|
224
|
+
if (this.shouldSkip()) {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
// Skip if disabled
|
|
228
|
+
if (!this.config?.enabled) {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
// v2 requires manual render
|
|
232
|
+
if (this.config.version === 'v2') {
|
|
233
|
+
throw new Error('[RecaptchaService] execute() is only for v3/Enterprise. Use render() for v2.');
|
|
234
|
+
}
|
|
235
|
+
// Load script if needed
|
|
236
|
+
await this.loadScript();
|
|
237
|
+
// Get grecaptcha object
|
|
238
|
+
const grecaptcha = window.grecaptcha;
|
|
239
|
+
if (!grecaptcha) {
|
|
240
|
+
throw new Error('[RecaptchaService] grecaptcha is not loaded');
|
|
241
|
+
}
|
|
242
|
+
// Execute reCAPTCHA
|
|
243
|
+
const actionName = action || this.config.action || 'submit';
|
|
244
|
+
try {
|
|
245
|
+
if (this.config.version === 'enterprise' && grecaptcha.enterprise?.execute) {
|
|
246
|
+
return await grecaptcha.enterprise.execute(this.config.siteKey, { action: actionName });
|
|
247
|
+
}
|
|
248
|
+
else if (grecaptcha.execute) {
|
|
249
|
+
return await grecaptcha.execute(this.config.siteKey, { action: actionName });
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
throw new Error('[RecaptchaService] grecaptcha.execute is not available');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
throw new Error(`[RecaptchaService] Failed to execute reCAPTCHA: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// v2 Methods (Visible Checkbox)
|
|
261
|
+
// ============================================================================
|
|
262
|
+
/**
|
|
263
|
+
* Render reCAPTCHA v2 checkbox widget.
|
|
264
|
+
*
|
|
265
|
+
* @param containerId - DOM element ID or element to render in
|
|
266
|
+
* @param callback - Callback when user completes challenge
|
|
267
|
+
* @returns Promise resolving to widget ID
|
|
268
|
+
*
|
|
269
|
+
* @throws Error if version is not v2, config missing, or render fails
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```typescript
|
|
273
|
+
* ngAfterViewInit() {
|
|
274
|
+
* this.recaptcha.render('recaptcha-container', (token) => {
|
|
275
|
+
* this.recaptchaToken = token;
|
|
276
|
+
* this.loginForm.patchValue({ recaptchaToken: token });
|
|
277
|
+
* });
|
|
278
|
+
* }
|
|
279
|
+
* ```
|
|
280
|
+
*/
|
|
281
|
+
async render(containerId, callback) {
|
|
282
|
+
// Skip for platforms that don't support reCAPTCHA
|
|
283
|
+
if (this.shouldSkip()) {
|
|
284
|
+
throw new Error('[RecaptchaService] reCAPTCHA v2 is not supported in SSR or Capacitor native');
|
|
285
|
+
}
|
|
286
|
+
// Skip if disabled
|
|
287
|
+
if (!this.config?.enabled) {
|
|
288
|
+
throw new Error('[RecaptchaService] reCAPTCHA is not enabled');
|
|
289
|
+
}
|
|
290
|
+
// Only for v2
|
|
291
|
+
if (this.config.version !== 'v2') {
|
|
292
|
+
throw new Error('[RecaptchaService] render() is only for v2. Use execute() for v3/Enterprise.');
|
|
293
|
+
}
|
|
294
|
+
// Load script if needed
|
|
295
|
+
await this.loadScript();
|
|
296
|
+
// Get grecaptcha object
|
|
297
|
+
const grecaptcha = window.grecaptcha;
|
|
298
|
+
if (!grecaptcha?.render) {
|
|
299
|
+
throw new Error('[RecaptchaService] grecaptcha.render is not available');
|
|
300
|
+
}
|
|
301
|
+
// Render widget
|
|
302
|
+
try {
|
|
303
|
+
this.widgetId = grecaptcha.render(containerId, {
|
|
304
|
+
sitekey: this.config.siteKey,
|
|
305
|
+
callback: callback,
|
|
306
|
+
});
|
|
307
|
+
return this.widgetId;
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
throw new Error(`[RecaptchaService] Failed to render reCAPTCHA: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get response token from v2 widget.
|
|
315
|
+
*
|
|
316
|
+
* @param widgetId - Widget ID (optional, uses last rendered widget if not provided)
|
|
317
|
+
* @returns reCAPTCHA token or null if not completed
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* const token = this.recaptcha.getResponse();
|
|
322
|
+
* if (token) {
|
|
323
|
+
* await this.auth.login(email, password, token);
|
|
324
|
+
* }
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
getResponse(widgetId) {
|
|
328
|
+
const grecaptcha = window.grecaptcha;
|
|
329
|
+
if (!grecaptcha?.getResponse) {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
const id = widgetId !== undefined ? widgetId : this.widgetId ?? undefined;
|
|
333
|
+
return grecaptcha.getResponse(id) || null;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Reset v2 widget (clear response).
|
|
337
|
+
*
|
|
338
|
+
* @param widgetId - Widget ID (optional, uses last rendered widget if not provided)
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* ```typescript
|
|
342
|
+
* // After failed login
|
|
343
|
+
* this.recaptcha.reset();
|
|
344
|
+
* ```
|
|
345
|
+
*/
|
|
346
|
+
reset(widgetId) {
|
|
347
|
+
const grecaptcha = window.grecaptcha;
|
|
348
|
+
if (!grecaptcha?.reset) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
const id = widgetId !== undefined ? widgetId : this.widgetId ?? undefined;
|
|
352
|
+
grecaptcha.reset(id);
|
|
353
|
+
}
|
|
354
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, deps: [{ token: PLATFORM_ID }, { token: RECAPTCHA_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
355
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, providedIn: 'root' });
|
|
356
|
+
}
|
|
357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, decorators: [{
|
|
358
|
+
type: Injectable,
|
|
359
|
+
args: [{
|
|
360
|
+
providedIn: 'root',
|
|
361
|
+
}]
|
|
362
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
363
|
+
type: Inject,
|
|
364
|
+
args: [PLATFORM_ID]
|
|
365
|
+
}] }, { type: undefined, decorators: [{
|
|
366
|
+
type: Optional
|
|
367
|
+
}, {
|
|
368
|
+
type: Inject,
|
|
369
|
+
args: [RECAPTCHA_CONFIG]
|
|
370
|
+
}] }] });
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY2FwdGNoYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQTJCcEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUMsa0JBQWtCLEVBQUU7SUFDekcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7Q0FDekIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQU9JO0lBQ2lCO0lBUHhDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsYUFBYSxHQUF5QixJQUFJLENBQUM7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBRXZDLFlBQytCLFVBQWtCLEVBQ0QsTUFBK0I7UUFEaEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNELFdBQU0sR0FBTixNQUFNLENBQXlCO1FBRTdFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRDLGdGQUFnRjtRQUNoRixnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ25HLElBQUksQ0FBQyxJQUFJLENBQUMsVUFB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QUFXLGFBQ0MsZ0JBQWdCOzRHQVIzQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIERldGVjdHMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnRcbiAqL1xudHlwZSBQbGF0Zm9ybSA9ICd3ZWInIHwgJ2NhcGFjaXRvci13ZWJ2aWV3JyB8ICdjYXBhY2l0b3ItbmF0aXZlJyB8ICdzc3InO1xuXG4vKipcbiAqIHJlQ0FQVENIQSB2ZXJzaW9uIHR5cGVcbiAqL1xudHlwZSBSZWNhcHRjaGFWZXJzaW9uID0gJ3YyJyB8ICd2MycgfCAnZW50ZXJwcmlzZSc7XG5cbi8qKlxuICogcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gZm9yIFJlY2FwdGNoYVNlcnZpY2VcbiAqIFxuICogSW50ZXJuYWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgdXNlZCBieSBSZWNhcHRjaGFTZXJ2aWNlLlxuICogVXNlIFJlY2FwdGNoYUFuZ3VsYXJDb25maWcgZnJvbSB0b2tlbnMudHMgZm9yIGFwcCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVNlcnZpY2VDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICB2ZXJzaW9uOiBSZWNhcHRjaGFWZXJzaW9uO1xuICBzaXRlS2V5OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgYXV0b0xvYWRTY3JpcHQ/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBSRUNBUFRDSEFfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFJlY2FwdGNoYVNlcnZpY2VDb25maWcgfCB1bmRlZmluZWQ+KCdSRUNBUFRDSEFfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHVuZGVmaW5lZCxcbn0pO1xuXG4vKipcbiAqIEdvb2dsZSByZUNBUFRDSEEgc2VydmljZSBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgbGF6eSBsb2FkaW5nIG9mIHJlQ0FQVENIQSBzY3JpcHQgYW5kIHBsYXRmb3JtLWF3YXJlIHRva2VuIGdlbmVyYXRpb24uXG4gKiBBdXRvbWF0aWNhbGx5IGRldGVjdHMgcGxhdGZvcm0gKHdlYiwgQ2FwYWNpdG9yIFdlYlZpZXcsIENhcGFjaXRvciBuYXRpdmUsIFNTUilcbiAqIGFuZCBza2lwcyByZUNBUFRDSEEgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGl0J3Mgbm90IHN1cHBvcnRlZCBvciBuZWVkZWQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIExhenkgc2NyaXB0IGxvYWRpbmcgKG9ubHkgbG9hZHMgd2hlbiBuZWVkZWQpXG4gKiAtIHYyIChjaGVja2JveCkgYW5kIHYzIChpbnZpc2libGUpIHN1cHBvcnRcbiAqIC0gUGxhdGZvcm0gZGV0ZWN0aW9uICh3ZWIsIENhcGFjaXRvciwgU1NSKVxuICogLSBBdXRvbWF0aWMgc2tpcCBmb3IgQ2FwYWNpdG9yIG5hdGl2ZSBtb2RlXG4gKiAtIEF1dG9tYXRpYyBza2lwIGZvciBTU1JcbiAqXG4gKiBAZXhhbXBsZSB2MyBBdXRvbWF0aWMgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSByZWNhcHRjaGE6IFJlY2FwdGNoYVNlcnZpY2UpIHt9XG4gKlxuICogYXN5bmMgbG9naW4oKSB7XG4gKiAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5yZWNhcHRjaGEuZXhlY3V0ZSgnbG9naW4nKTtcbiAqICAgYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCwgdG9rZW4pO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgdjIgTWFudWFsIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5nT25Jbml0KCkge1xuICogICB0aGlzLnJlY2FwdGNoYS5yZW5kZXIoJ3JlY2FwdGNoYS1jb250YWluZXInLCAodG9rZW4pID0+IHtcbiAqICAgICB0aGlzLnJlY2FwdGNoYVRva2VuID0gdG9rZW47XG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtO1xuICBwcml2YXRlIHdpZGdldElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFQ0FQVENIQV9DT05GSUcpIHByaXZhdGUgY29uZmlnPzogUmVjYXB0Y2hhU2VydmljZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm0oKTtcbiAgICBcbiAgICAvLyBBdXRvLXByZWxvYWQgc2NyaXB0IGZvciB2My9FbnRlcnByaXNlIHNvIGl0J3MgcmVhZHkgYmVmb3JlIGZpcnN0IGxvZ2luL3NpZ251cFxuICAgIC8vIE5vLW9wIHdoZW4gZGlzYWJsZWQsIHNob3VsZFNraXAsIG9yIHYyICh2MiByZW5kZXJzIG9uLWRlbWFuZClcbiAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZWQgJiYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICd2MycgfHwgdGhpcy5jb25maWcudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZFNraXAoKSkge1xuICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIGV4ZWN1dGUoKSB3aWxsIGhhbmRsZSBlcnJvcnMgd2hlbiBjYWxsZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQbGF0Zm9ybSBEZXRlY3Rpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIERldGVjdGlvbiBwcmlvcml0eTpcbiAgICogMS4gU1NSIChub3QgaW4gYnJvd3Nlcikg4oaSICdzc3InXG4gICAqIDIuIENhcGFjaXRvciBuYXRpdmUgKG5vIHdlYiB2aWV3KSDihpIgJ2NhcGFjaXRvci1uYXRpdmUnXG4gICAqIDMuIENhcGFjaXRvciBXZWJWaWV3IOKGkiAnY2FwYWNpdG9yLXdlYnZpZXcnXG4gICAqIDQuIFdlYiBicm93c2VyIOKGkiAnd2ViJ1xuICAgKlxuICAgKiBAcmV0dXJucyBEZXRlY3RlZCBwbGF0Zm9ybSB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGxhdGZvcm0gPSB0aGlzLmRldGVjdFBsYXRmb3JtKCk7XG4gICAqIGlmIChwbGF0Zm9ybSA9PT0gJ2NhcGFjaXRvci1uYXRpdmUnKSB7XG4gICAqICAgLy8gU2tpcCByZUNBUFRDSEEsIHVzZSBkZXZpY2UgYXR0ZXN0YXRpb25cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIC8vIFNTUiBkZXRlY3Rpb25cbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybiAnc3NyJztcbiAgICB9XG5cbiAgICAvLyBDYXBhY2l0b3IgZGV0ZWN0aW9uICh3aW5kb3cuQ2FwYWNpdG9yIGV4aXN0cylcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgeyBDYXBhY2l0b3I/OiB7IGlzTmF0aXZlUGxhdGZvcm0/OiAoKSA9PiBib29sZWFuIH0gfTtcblxuICAgIGlmICh3aW5kb3dSZWYuQ2FwYWNpdG9yKSB7XG4gICAgICAvLyBDYXBhY2l0b3IgbmF0aXZlIChpT1MvQW5kcm9pZCBhcHApXG4gICAgICBpZiAodHlwZW9mIHdpbmRvd1JlZi5DYXBhY2l0b3IuaXNOYXRpdmVQbGF0Zm9ybSA9PT0gJ2Z1bmN0aW9uJyAmJiB3aW5kb3dSZWYuQ2FwYWNpdG9yLmlzTmF0aXZlUGxhdGZvcm0oKSkge1xuICAgICAgICByZXR1cm4gJ2NhcGFjaXRvci1uYXRpdmUnO1xuICAgICAgfVxuICAgICAgLy8gQ2FwYWNpdG9yIFdlYlZpZXdcbiAgICAgIHJldHVybiAnY2FwYWNpdG9yLXdlYnZpZXcnO1xuICAgIH1cblxuICAgIHJldHVybiAnd2ViJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgcGxhdGZvcm0gdHlwZVxuICAgKi9cbiAgZ2V0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJlQ0FQVENIQSBzaG91bGQgYmUgc2tpcHBlZCBmb3IgY3VycmVudCBwbGF0Zm9ybS5cbiAgICpcbiAgICogU2tpcHMgZm9yOlxuICAgKiAtIFNTUiAobm8gd2luZG93IG9iamVjdClcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2hvdWxkIHNraXAgcmVDQVBUQ0hBXG4gICAqL1xuICBzaG91bGRTa2lwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtID09PSAnc3NyJyB8fCB0aGlzLnBsYXRmb3JtID09PSAnY2FwYWNpdG9yLW5hdGl2ZSc7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNjcmlwdCBMb2FkaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTG9hZCBHb29nbGUgcmVDQVBUQ0hBIHNjcmlwdCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuXG4gICAqXG4gICAqIFNjcmlwdCBVUkwgZm9ybWF0OlxuICAgKiAtIHYyOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanNcbiAgICogLSB2MzogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICogLSBFbnRlcnByaXNlOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NyaXB0IGlzIGxvYWRlZFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvbmZpZyBpcyBtaXNzaW5nIG9yIHNjcmlwdCBmYWlscyB0byBsb2FkXG4gICAqL1xuICBhc3luYyBsb2FkU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNraXAgaW4gU1NSIG9yIENhcGFjaXRvciBuYXRpdmVcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMuc2NyaXB0TG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBsb2FkaW5nIChyZXR1cm4gZXhpc3RpbmcgcHJvbWlzZSlcbiAgICBpZiAodGhpcy5zY3JpcHRMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JpcHRMb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ1xuICAgIGlmICghdGhpcy5jb25maWcuc2l0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gU2l0ZSBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBsb2FkaW5nXG4gICAgdGhpcy5zY3JpcHRMb2FkaW5nID0gdGhpcy5pbmplY3RTY3JpcHQoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNjcmlwdExvYWRpbmc7XG4gICAgICB0aGlzLnNjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2NyaXB0TG9hZGluZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdCB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjcmlwdCBsb2Fkc1xuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RTY3JpcHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG5cbiAgICAgIC8vIFNldCBzY3JpcHQgVVJMIGJhc2VkIG9uIHZlcnNpb25cbiAgICAgIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSB7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZW50ZXJwcmlzZS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ3YzJykge1xuICAgICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdjIgLSBsb2FkIHdpdGhvdXQgcmVuZGVyIHBhcmFtZXRlclxuICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcyc7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICB1cmwgKz0gYD9obD0ke3RoaXMuY29uZmlnIS5sYW5ndWFnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBGYWlsZWQgdG8gbG9hZCByZUNBUFRDSEEgc2NyaXB0JykpO1xuXG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYzL0VudGVycHJpc2UgTWV0aG9kcyAoSW52aXNpYmxlIENoYWxsZW5nZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHJlQ0FQVENIQSB2My9FbnRlcnByaXNlIGNoYWxsZW5nZSAoaW52aXNpYmxlKS5cbiAgICpcbiAgICogQXV0b21hdGljYWxseSBsb2FkcyBzY3JpcHQgaWYgbmVlZGVkIGFuZCBnZW5lcmF0ZXMgYSB0b2tlbi5cbiAgICogU2tpcHMgYXV0b21hdGljYWxseSBmb3IgU1NSIGFuZCBDYXBhY2l0b3IgbmF0aXZlLlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljcyAoZS5nLiwgJ2xvZ2luJywgJ3NpZ251cCcpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHJlQ0FQVENIQSB0b2tlbiwgb3IgdW5kZWZpbmVkIGlmIHNraXBwZWRcbiAgICpcbiAgICogQHRocm93cyBFcnJvciBpZiB2ZXJzaW9uIGlzIHYyLCBjb25maWcgbWlzc2luZywgb3IgZXhlY3V0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnJlY2FwdGNoYS5leGVjdXRlKCdsb2dpbicpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGFjdGlvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEFcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgcmVxdWlyZXMgbWFudWFsIHJlbmRlclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBleGVjdXRlKCkgaXMgb25seSBmb3IgdjMvRW50ZXJwcmlzZS4gVXNlIHJlbmRlcigpIGZvciB2Mi4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZXhlY3V0ZT86IChzaXRlS2V5OiBzdHJpbmcsIG9wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxzdHJpbmc+OyBlbnRlcnByaXNlPzogeyBleGVjdXRlPzogKHNpdGVLZXk6IHN0cmluZywgb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPHN0cmluZz4gfSB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEgaXMgbm90IGxvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgcmVDQVBUQ0hBXG4gICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvbiB8fCB0aGlzLmNvbmZpZy5hY3Rpb24gfHwgJ3N1Ym1pdCc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICdlbnRlcnByaXNlJyAmJiBncmVjYXB0Y2hhLmVudGVycHJpc2U/LmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZW50ZXJwcmlzZS5leGVjdXRlKHRoaXMuY29uZmlnLnNpdGVLZXksIHsgYWN0aW9uOiBhY3Rpb25OYW1lIH0pO1xuICAgICAgfSBlbHNlIGlmIChncmVjYXB0Y2hhLmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZXhlY3V0ZSh0aGlzLmNvbmZpZy5zaXRlS2V5LCB7IGFjdGlvbjogYWN0aW9uTmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEuZXhlY3V0ZSBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byBleGVjdXRlIHJlQ0FQVENIQTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYyIE1ldGhvZHMgKFZpc2libGUgQ2hlY2tib3gpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVuZGVyIHJlQ0FQVENIQSB2MiBjaGVja2JveCB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJJZCAtIERPTSBlbGVtZW50IElEIG9yIGVsZW1lbnQgdG8gcmVuZGVyIGluXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxiYWNrIHdoZW4gdXNlciBjb21wbGV0ZXMgY2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHdpZGdldCBJRFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcnNpb24gaXMgbm90IHYyLCBjb25maWcgbWlzc2luZywgb3IgcmVuZGVyIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmdBZnRlclZpZXdJbml0KCkge1xuICAgKiAgIHRoaXMucmVjYXB0Y2hhLnJlbmRlcigncmVjYXB0Y2hhLWNvbnRhaW5lcicsICh0b2tlbikgPT4ge1xuICAgKiAgICAgdGhpcy5yZWNhcHRjaGFUb2tlbiA9IHRva2VuO1xuICAgKiAgICAgdGhpcy5sb2dpbkZvcm0ucGF0Y2hWYWx1ZSh7IHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9KTtcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbmRlcihjb250YWluZXJJZDogc3RyaW5nLCBjYWxsYmFjazogKHRva2VuOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBXG4gICAgaWYgKHRoaXMuc2hvdWxkU2tpcCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgdjIgaXMgbm90IHN1cHBvcnRlZCBpbiBTU1Igb3IgQ2FwYWNpdG9yIG5hdGl2ZScpO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgaXMgbm90IGVuYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZvciB2MlxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZW5kZXIoKSBpcyBvbmx5IGZvciB2Mi4gVXNlIGV4ZWN1dGUoKSBmb3IgdjMvRW50ZXJwcmlzZS4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVuZGVyPzogKGNvbnRhaW5lcjogc3RyaW5nLCBvcHRpb25zOiB7IHNpdGVrZXk6IHN0cmluZzsgY2FsbGJhY2s6ICh0b2tlbjogc3RyaW5nKSA9PiB2b2lkIH0pID0+IG51bWJlciB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LnJlbmRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gZ3JlY2FwdGNoYS5yZW5kZXIgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB3aWRnZXRcbiAgICB0cnkge1xuICAgICAgdGhpcy53aWRnZXRJZCA9IGdyZWNhcHRjaGEucmVuZGVyKGNvbnRhaW5lcklkLCB7XG4gICAgICAgIHNpdGVrZXk6IHRoaXMuY29uZmlnLnNpdGVLZXksXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SWQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byByZW5kZXIgcmVDQVBUQ0hBOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzcG9uc2UgdG9rZW4gZnJvbSB2MiB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAtIFdpZGdldCBJRCAob3B0aW9uYWwsIHVzZXMgbGFzdCByZW5kZXJlZCB3aWRnZXQgaWYgbm90IHByb3ZpZGVkKVxuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgbnVsbCBpZiBub3QgY29tcGxldGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSB0aGlzLnJlY2FwdGNoYS5nZXRSZXNwb25zZSgpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRSZXNwb25zZSh3aWRnZXRJZD86IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZ2V0UmVzcG9uc2U/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHN0cmluZyB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LmdldFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHdpZGdldElkICE9PSB1bmRlZmluZWQgPyB3aWRnZXRJZCA6IHRoaXMud2lkZ2V0SWQgPz8gdW5kZWZpbmVkO1xuICAgIHJldHVybiBncmVjYXB0Y2hhLmdldFJlc3BvbnNlKGlkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHYyIHdpZGdldCAoY2xlYXIgcmVzcG9uc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gd2lkZ2V0SWQgLSBXaWRnZXQgSUQgKG9wdGlvbmFsLCB1c2VzIGxhc3QgcmVuZGVyZWQgd2lkZ2V0IGlmIG5vdCBwcm92aWRlZClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBZnRlciBmYWlsZWQgbG9naW5cbiAgICogdGhpcy5yZWNhcHRjaGEucmVzZXQoKTtcbiAgICogYGBgXG4gICAqL1xuICByZXNldCh3aWRnZXRJZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVzZXQ/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHZvaWQgfSB9KS5ncmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFncmVjYXB0Y2hhPy5yZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gd2lkZ2V0SWQgIT09IHVuZGVmaW5lZCA/IHdpZGdldElkIDogdGhpcy53aWRnZXRJZCA/PyB1bmRlZmluZWQ7XG4gICAgZ3JlY2FwdGNoYS5yZXNldChpZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -15,6 +15,7 @@ import { NAuthClientError, NAuthErrorCode } from '@nauth-toolkit/client';
|
|
|
15
15
|
* - If `exchangeToken` exists: exchanges it via backend (SDK handles navigation automatically).
|
|
16
16
|
* - If no `exchangeToken`: treat as cookie-success path (SDK handles navigation automatically).
|
|
17
17
|
* - If `error` exists: redirects to oauthError route.
|
|
18
|
+
* - If auto-redirect is disabled (redirectUrls set to null): returns true to activate the route.
|
|
18
19
|
*
|
|
19
20
|
* @example
|
|
20
21
|
* ```typescript
|
|
@@ -45,14 +46,16 @@ export const socialRedirectCallbackGuard = async () => {
|
|
|
45
46
|
if (appState) {
|
|
46
47
|
await auth.getClient().storeOauthState(appState);
|
|
47
48
|
}
|
|
48
|
-
// Provider error: redirect to oauthError
|
|
49
|
+
// Provider error: redirect to oauthError (or activate route if auto-redirect disabled)
|
|
49
50
|
if (error) {
|
|
50
51
|
await router.navigateToError('oauth');
|
|
51
|
-
|
|
52
|
+
// Return true to activate route if oauthError redirect is disabled
|
|
53
|
+
return router.isErrorRedirectDisabled('oauth');
|
|
52
54
|
}
|
|
53
55
|
// No exchangeToken: cookie success path; hydrate then navigate to success.
|
|
54
56
|
//
|
|
55
|
-
// Note: we do not "activate" the callback route to avoid
|
|
57
|
+
// Note: When auto-redirect is enabled, we do not "activate" the callback route to avoid
|
|
58
|
+
// consumers needing to render a page. When disabled, we activate the route.
|
|
56
59
|
if (!exchangeToken) {
|
|
57
60
|
// ============================================================================
|
|
58
61
|
// Cookies mode: hydrate user state before redirecting
|
|
@@ -94,31 +97,35 @@ export const socialRedirectCallbackGuard = async () => {
|
|
|
94
97
|
appState: appState ?? undefined,
|
|
95
98
|
});
|
|
96
99
|
}
|
|
97
|
-
catch (
|
|
100
|
+
catch (error) {
|
|
98
101
|
// Only treat auth failures (401/403) as OAuth errors
|
|
99
102
|
// Network errors or other issues might be temporary - still try success route
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// The auth guard will handle authentication state on the next route
|
|
113
|
-
await router.navigateToSuccess(appState ? { appState } : undefined);
|
|
103
|
+
// Type guard: check if error is NAuthClientError
|
|
104
|
+
if (error instanceof NAuthClientError) {
|
|
105
|
+
const isAuthError = error.statusCode === 401 ||
|
|
106
|
+
error.statusCode === 403 ||
|
|
107
|
+
error.code === NAuthErrorCode.AUTH_TOKEN_INVALID ||
|
|
108
|
+
error.code === NAuthErrorCode.AUTH_SESSION_EXPIRED ||
|
|
109
|
+
error.code === NAuthErrorCode.AUTH_SESSION_NOT_FOUND;
|
|
110
|
+
if (isAuthError) {
|
|
111
|
+
// Cookies weren't set properly - OAuth failed
|
|
112
|
+
await router.navigateToError('oauth');
|
|
113
|
+
return router.isErrorRedirectDisabled('oauth');
|
|
114
|
+
}
|
|
114
115
|
}
|
|
116
|
+
// For network errors or other non-auth issues, proceed to success route
|
|
117
|
+
// The auth guard will handle authentication state on the next route
|
|
118
|
+
await router.navigateToSuccess(appState ? { appState } : undefined);
|
|
115
119
|
}
|
|
116
|
-
|
|
120
|
+
// Return true if success redirect is disabled, allowing the callback component to render
|
|
121
|
+
return router.isSuccessRedirectDisabled({ source: 'social', appState: appState ?? undefined });
|
|
117
122
|
}
|
|
118
123
|
// Exchange token - SDK handles navigation automatically
|
|
119
124
|
// Note: appState will be passed via query params when navigateToSuccess is called
|
|
120
125
|
// by the challenge router after successful exchange
|
|
121
126
|
await auth.exchangeSocialRedirect(exchangeToken);
|
|
122
|
-
|
|
127
|
+
// Return true if success redirect is disabled, allowing the callback component to render
|
|
128
|
+
// We use 'social' as source since this is the social OAuth callback flow
|
|
129
|
+
return router.isSuccessRedirectDisabled({ source: 'social', appState: appState ?? undefined });
|
|
123
130
|
};
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBa0IsS0FBSyxJQUFzQixFQUFFO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBRyxJQUFJ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b0RBQW9EO0lBQ3BELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdHlwZSBDYW5BY3RpdmF0ZUZuIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50RXJyb3IsIE5BdXRoRXJyb3JDb2RlLCB0eXBlIEF1dGhSZXNwb25zZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogU29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrIHJvdXRlIGd1YXJkLlxuICpcbiAqIFRoaXMgZ3VhcmQgc3VwcG9ydHMgdGhlIHJlZGlyZWN0LWZpcnN0IHNvY2lhbCBmbG93IHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0c1xuICogYmFjayB0byB0aGUgZnJvbnRlbmQgd2l0aDpcbiAqIC0gYGFwcFN0YXRlYCAoYWx3YXlzIG9wdGlvbmFsKVxuICogLSBgZXhjaGFuZ2VUb2tlbmAgKHByZXNlbnQgZm9yIGpzb24vaHlicmlkIGZsb3dzLCBhbmQgZm9yIGNvb2tpZSBmbG93cyB0aGF0IHJldHVybiBhIGNoYWxsZW5nZSlcbiAqIC0gYGVycm9yYCAvIGBlcnJvcl9kZXNjcmlwdGlvbmAgKHByb3ZpZGVyIGVycm9ycylcbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gSWYgYGV4Y2hhbmdlVG9rZW5gIGV4aXN0czogZXhjaGFuZ2VzIGl0IHZpYSBiYWNrZW5kIChTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogLSBJZiBubyBgZXhjaGFuZ2VUb2tlbmA6IHRyZWF0IGFzIGNvb2tpZS1zdWNjZXNzIHBhdGggKFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseSkuXG4gKiAtIElmIGBlcnJvcmAgZXhpc3RzOiByZWRpcmVjdHMgdG8gb2F1dGhFcnJvciByb3V0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50L2FuZ3VsYXInO1xuICpcbiAqIGV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAqICAgeyBwYXRoOiAnYXV0aC9jYWxsYmFjaycsIGNhbkFjdGl2YXRlOiBbc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkXSwgY29tcG9uZW50OiBDYWxsYmFja0NvbXBvbmVudCB9LFxuICogXTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkOiBDYW5BY3RpdmF0ZUZuID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIGNvbnN0IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuXG4gIGlmICghaXNCcm93c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgY29uc3QgZXJyb3IgPSBwYXJhbXMuZ2V0KCdlcnJvcicpO1xuICBjb25zdCBleGNoYW5nZVRva2VuID0gcGFyYW1zLmdldCgnZXhjaGFuZ2VUb2tlbicpO1xuICBjb25zdCBhcHBTdGF0ZSA9IHBhcmFtcy5nZXQoJ2FwcFN0YXRlJyk7XG5cbiAgY29uc3Qgcm91dGVyID0gYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGFwcFN0YXRlIGlmIHByZXNlbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXSFk6IGFwcFN0YXRlIGlzIHJvdW5kLXRyaXBwZWQgZnJvbSB0aGUgT0F1dGggZmxvdyBhbmQgc2hvdWxkIGJlIHN0b3JlZFxuICAvLyBmb3IgcmV0cmlldmFsIHZpYSBnZXRMYXN0T2F1dGhTdGF0ZSgpIGFuZCBwYXNzZWQgdG8gdGhlIHN1Y2Nlc3Mgcm91dGUuXG4gIGlmIChhcHBTdGF0ZSkge1xuICAgIGF3YWl0IGF1dGguZ2V0Q2xpZW50KCkuc3RvcmVPYXV0aFN0YXRlKGFwcFN0YXRlKTtcbiAgfVxuXG4gIC8vIFByb3ZpZGVyIGVycm9yOiByZWRpcmVjdCB0byBvYXV0aEVycm9yXG4gIGlmIChlcnJvcikge1xuICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTm8gZXhjaGFuZ2VUb2tlbjogY29va2llIHN1Y2Nlc3MgcGF0aDsgaHlkcmF0ZSB0aGVuIG5hdmlnYXRlIHRvIHN1Y2Nlc3MuXG4gIC8vXG4gIC8vIE5vdGU6IHdlIGRvIG5vdCBcImFjdGl2YXRlXCIgdGhlIGNhbGxiYWNrIHJvdXRlIHRvIGF2b2lkIGNvbnN1bWVycyBuZWVkaW5nIHRvIHJlbmRlciBhIHBhZ2UuXG4gIGlmICghZXhjaGFuZ2VUb2tlbikge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb29raWVzIG1vZGU6IGh5ZHJhdGUgdXNlciBzdGF0ZSBiZWZvcmUgcmVkaXJlY3RpbmdcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBJbiBjb29raWUgZGVsaXZlcnksIHRoZSBPQXV0aCBjYWxsYmFjayBjb21wbGV0ZXMgdmlhIGJyb3dzZXIgcmVkaXJlY3RzLCBzbyB0aGUgZnJvbnRlbmRcbiAgICAvLyBkb2VzIG5vdCByZWNlaXZlIGEgSlNPTiBBdXRoUmVzcG9uc2UgdG8gcG9wdWxhdGUgdGhlIFNESydzIGNhY2hlZCBgY3VycmVudFVzZXJgLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzeW5jIGd1YXJkcyAoYGF1dGhHdWFyZGApIGNhbiBpbW1lZGlhdGVseSByZWRpcmVjdCB0byAvbG9naW4gYmVjYXVzZVxuICAgIC8vIGBjdXJyZW50VXNlcmAgaXMgc3RpbGwgbnVsbCBldmVuIHRob3VnaCBjb29raWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGF1dGguZ2V0UHJvZmlsZSgpO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGhhbmRsZUF1dGhSZXNwb25zZSB0byBlbnN1cmUgb25BdXRoUmVzcG9uc2UgaXMgY2FsbGVkXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBXSFk6IG9uQXV0aFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgY29uc2lzdGVudGx5IGZvciBhbGwgYXV0aCBjb21wbGV0aW9ucyxcbiAgICAgIC8vIHdoZXRoZXIgdmlhIGV4Y2hhbmdlIHRva2VuIG9yIGNvb2tpZSBzdWNjZXNzIHBhdGguIFRoaXMgYWxsb3dzIGFwcHMgdG8gaGF2ZVxuICAgICAgLy8gYSBzaW5nbGUgaGFuZGxlciBmb3IgYWxsIGF1dGhlbnRpY2F0aW9uIG91dGNvbWVzIChsb2dpbiwgc2lnbnVwLCBzb2NpYWwpLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIHN5bnRoZXRpYyBBdXRoUmVzcG9uc2Ugd2l0aCB0aGUgdXNlciBkYXRhLiBUb2tlbnMgYXJlIG9taXR0ZWRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBpbiBodHRwT25seSBjb29raWVzLCBub3QgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50LlxuICAgICAgY29uc3Qgc3ludGhldGljUmVzcG9uc2U6IEF1dGhSZXNwb25zZSA9IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIHN1YjogdXNlci5zdWIsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBwaG9uZTogdXNlci5waG9uZSxcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQ6IHVzZXIuaXNFbWFpbFZlcmlmaWVkLFxuICAgICAgICAgIGlzUGhvbmVWZXJpZmllZDogdXNlci5pc1Bob25lVmVyaWZpZWQsXG4gICAgICAgICAgc29jaWFsUHJvdmlkZXJzOiB1c2VyLnNvY2lhbFByb3ZpZGVycyxcbiAgICAgICAgICBoYXNQYXNzd29yZEhhc2g6IHVzZXIuaGFzUGFzc3dvcmRIYXNoLFxuICAgICAgICB9LFxuICAgICAgICBhdXRoTWV0aG9kOiB1c2VyLnNlc3Npb25BdXRoTWV0aG9kID8/IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgaGFuZGxlQXV0aFJlc3BvbnNlIHdoaWNoIHJlc3BlY3RzIG9uQXV0aFJlc3BvbnNlIGNhbGxiYWNrXG4gICAgICAvLyBQYXNzIGFwcFN0YXRlIGluIGNvbnRleHQgc28gb25BdXRoUmVzcG9uc2UgY2FuIGFjY2VzcyBpdFxuICAgICAgYXdhaXQgcm91dGVyLmhhbmRsZUF1dGhSZXNwb25zZShzeW50aGV0aWNSZXNwb25zZSwge1xuICAgICAgICBzb3VyY2U6ICdzb2NpYWwnLFxuICAgICAgICBhcHBTdGF0ZTogYXBwU3RhdGUgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBPbmx5IHRyZWF0IGF1dGggZmFpbHVyZXMgKDQwMS80MDMpIGFzIE9BdXRoIGVycm9yc1xuICAgICAgLy8gTmV0d29yayBlcnJvcnMgb3Igb3RoZXIgaXNzdWVzIG1pZ2h0IGJlIHRlbXBvcmFyeSAtIHN0aWxsIHRyeSBzdWNjZXNzIHJvdXRlXG4gICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgIGVyciBpbnN0YW5jZW9mIE5BdXRoQ2xpZW50RXJyb3IgJiZcbiAgICAgICAgKGVyci5zdGF0dXNDb2RlID09PSA0MDEgfHxcbiAgICAgICAgICBlcnIuc3RhdHVzQ29kZSA9PT0gNDAzIHx8XG4gICAgICAgICAgZXJyLmNvZGUgPT09IE5BdXRoRXJyb3JDb2RlLkFVVEhfVE9LRU5fSU5WQUxJRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fRVhQSVJFRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fTk9UX0ZPVU5EKTtcblxuICAgICAgaWYgKGlzQXV0aEVycm9yKSB7XG4gICAgICAgIC8vIENvb2tpZXMgd2VyZW4ndCBzZXQgcHJvcGVybHkgLSBPQXV0aCBmYWlsZWRcbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBuZXR3b3JrIGVycm9ycyBvciBvdGhlciBpc3N1ZXMsIHByb2NlZWQgdG8gc3VjY2VzcyByb3V0ZVxuICAgICAgICAvLyBUaGUgYXV0aCBndWFyZCB3aWxsIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvbiB0aGUgbmV4dCByb3V0ZVxuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb1N1Y2Nlc3MoYXBwU3RhdGUgPyB7IGFwcFN0YXRlIH0gOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFeGNoYW5nZSB0b2tlbiAtIFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseVxuICAvLyBOb3RlOiBhcHBTdGF0ZSB3aWxsIGJlIHBhc3NlZCB2aWEgcXVlcnkgcGFyYW1zIHdoZW4gbmF2aWdhdGVUb1N1Y2Nlc3MgaXMgY2FsbGVkXG4gIC8vIGJ5IHRoZSBjaGFsbGVuZ2Ugcm91dGVyIGFmdGVyIHN1Y2Nlc3NmdWwgZXhjaGFuZ2VcbiAgYXdhaXQgYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICByZXR1cm4gZmFsc2U7XG59O1xuIl19
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWtCLEtBQUssSUFBc0IsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFeEMsTUFBTSxNQUFNLEdBQUcsSUFB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QUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELHlGQUF5RjtRQUN6RixPQUFPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsa0ZBQWtGO0lBQ2xGLG9EQUFvRDtJQUNwRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVqRCx5RkFBeUY7SUFDekYseUVBQXlFO0lBQ3pFLE9BQU8sTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDakcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdHlwZSBDYW5BY3RpdmF0ZUZuIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50RXJyb3IsIE5BdXRoRXJyb3JDb2RlLCB0eXBlIEF1dGhSZXNwb25zZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogU29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrIHJvdXRlIGd1YXJkLlxuICpcbiAqIFRoaXMgZ3VhcmQgc3VwcG9ydHMgdGhlIHJlZGlyZWN0LWZpcnN0IHNvY2lhbCBmbG93IHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0c1xuICogYmFjayB0byB0aGUgZnJvbnRlbmQgd2l0aDpcbiAqIC0gYGFwcFN0YXRlYCAoYWx3YXlzIG9wdGlvbmFsKVxuICogLSBgZXhjaGFuZ2VUb2tlbmAgKHByZXNlbnQgZm9yIGpzb24vaHlicmlkIGZsb3dzLCBhbmQgZm9yIGNvb2tpZSBmbG93cyB0aGF0IHJldHVybiBhIGNoYWxsZW5nZSlcbiAqIC0gYGVycm9yYCAvIGBlcnJvcl9kZXNjcmlwdGlvbmAgKHByb3ZpZGVyIGVycm9ycylcbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gSWYgYGV4Y2hhbmdlVG9rZW5gIGV4aXN0czogZXhjaGFuZ2VzIGl0IHZpYSBiYWNrZW5kIChTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogLSBJZiBubyBgZXhjaGFuZ2VUb2tlbmA6IHRyZWF0IGFzIGNvb2tpZS1zdWNjZXNzIHBhdGggKFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseSkuXG4gKiAtIElmIGBlcnJvcmAgZXhpc3RzOiByZWRpcmVjdHMgdG8gb2F1dGhFcnJvciByb3V0ZS5cbiAqIC0gSWYgYXV0by1yZWRpcmVjdCBpcyBkaXNhYmxlZCAocmVkaXJlY3RVcmxzIHNldCB0byBudWxsKTogcmV0dXJucyB0cnVlIHRvIGFjdGl2YXRlIHRoZSByb3V0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50L2FuZ3VsYXInO1xuICpcbiAqIGV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAqICAgeyBwYXRoOiAnYXV0aC9jYWxsYmFjaycsIGNhbkFjdGl2YXRlOiBbc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkXSwgY29tcG9uZW50OiBDYWxsYmFja0NvbXBvbmVudCB9LFxuICogXTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkOiBDYW5BY3RpdmF0ZUZuID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIGNvbnN0IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuXG4gIGlmICghaXNCcm93c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgY29uc3QgZXJyb3IgPSBwYXJhbXMuZ2V0KCdlcnJvcicpO1xuICBjb25zdCBleGNoYW5nZVRva2VuID0gcGFyYW1zLmdldCgnZXhjaGFuZ2VUb2tlbicpO1xuICBjb25zdCBhcHBTdGF0ZSA9IHBhcmFtcy5nZXQoJ2FwcFN0YXRlJyk7XG5cbiAgY29uc3Qgcm91dGVyID0gYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGFwcFN0YXRlIGlmIHByZXNlbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXSFk6IGFwcFN0YXRlIGlzIHJvdW5kLXRyaXBwZWQgZnJvbSB0aGUgT0F1dGggZmxvdyBhbmQgc2hvdWxkIGJlIHN0b3JlZFxuICAvLyBmb3IgcmV0cmlldmFsIHZpYSBnZXRMYXN0T2F1dGhTdGF0ZSgpIGFuZCBwYXNzZWQgdG8gdGhlIHN1Y2Nlc3Mgcm91dGUuXG4gIGlmIChhcHBTdGF0ZSkge1xuICAgIGF3YWl0IGF1dGguZ2V0Q2xpZW50KCkuc3RvcmVPYXV0aFN0YXRlKGFwcFN0YXRlKTtcbiAgfVxuXG4gIC8vIFByb3ZpZGVyIGVycm9yOiByZWRpcmVjdCB0byBvYXV0aEVycm9yIChvciBhY3RpdmF0ZSByb3V0ZSBpZiBhdXRvLXJlZGlyZWN0IGRpc2FibGVkKVxuICBpZiAoZXJyb3IpIHtcbiAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgIC8vIFJldHVybiB0cnVlIHRvIGFjdGl2YXRlIHJvdXRlIGlmIG9hdXRoRXJyb3IgcmVkaXJlY3QgaXMgZGlzYWJsZWRcbiAgICByZXR1cm4gcm91dGVyLmlzRXJyb3JSZWRpcmVjdERpc2FibGVkKCdvYXV0aCcpO1xuICB9XG5cbiAgLy8gTm8gZXhjaGFuZ2VUb2tlbjogY29va2llIHN1Y2Nlc3MgcGF0aDsgaHlkcmF0ZSB0aGVuIG5hdmlnYXRlIHRvIHN1Y2Nlc3MuXG4gIC8vXG4gIC8vIE5vdGU6IFdoZW4gYXV0by1yZWRpcmVjdCBpcyBlbmFibGVkLCB3ZSBkbyBub3QgXCJhY3RpdmF0ZVwiIHRoZSBjYWxsYmFjayByb3V0ZSB0byBhdm9pZFxuICAvLyBjb25zdW1lcnMgbmVlZGluZyB0byByZW5kZXIgYSBwYWdlLiBXaGVuIGRpc2FibGVkLCB3ZSBhY3RpdmF0ZSB0aGUgcm91dGUuXG4gIGlmICghZXhjaGFuZ2VUb2tlbikge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb29raWVzIG1vZGU6IGh5ZHJhdGUgdXNlciBzdGF0ZSBiZWZvcmUgcmVkaXJlY3RpbmdcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBJbiBjb29raWUgZGVsaXZlcnksIHRoZSBPQXV0aCBjYWxsYmFjayBjb21wbGV0ZXMgdmlhIGJyb3dzZXIgcmVkaXJlY3RzLCBzbyB0aGUgZnJvbnRlbmRcbiAgICAvLyBkb2VzIG5vdCByZWNlaXZlIGEgSlNPTiBBdXRoUmVzcG9uc2UgdG8gcG9wdWxhdGUgdGhlIFNESydzIGNhY2hlZCBgY3VycmVudFVzZXJgLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzeW5jIGd1YXJkcyAoYGF1dGhHdWFyZGApIGNhbiBpbW1lZGlhdGVseSByZWRpcmVjdCB0byAvbG9naW4gYmVjYXVzZVxuICAgIC8vIGBjdXJyZW50VXNlcmAgaXMgc3RpbGwgbnVsbCBldmVuIHRob3VnaCBjb29raWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGF1dGguZ2V0UHJvZmlsZSgpO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGhhbmRsZUF1dGhSZXNwb25zZSB0byBlbnN1cmUgb25BdXRoUmVzcG9uc2UgaXMgY2FsbGVkXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBXSFk6IG9uQXV0aFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgY29uc2lzdGVudGx5IGZvciBhbGwgYXV0aCBjb21wbGV0aW9ucyxcbiAgICAgIC8vIHdoZXRoZXIgdmlhIGV4Y2hhbmdlIHRva2VuIG9yIGNvb2tpZSBzdWNjZXNzIHBhdGguIFRoaXMgYWxsb3dzIGFwcHMgdG8gaGF2ZVxuICAgICAgLy8gYSBzaW5nbGUgaGFuZGxlciBmb3IgYWxsIGF1dGhlbnRpY2F0aW9uIG91dGNvbWVzIChsb2dpbiwgc2lnbnVwLCBzb2NpYWwpLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIHN5bnRoZXRpYyBBdXRoUmVzcG9uc2Ugd2l0aCB0aGUgdXNlciBkYXRhLiBUb2tlbnMgYXJlIG9taXR0ZWRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBpbiBodHRwT25seSBjb29raWVzLCBub3QgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50LlxuICAgICAgY29uc3Qgc3ludGhldGljUmVzcG9uc2U6IEF1dGhSZXNwb25zZSA9IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIHN1YjogdXNlci5zdWIsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBwaG9uZTogdXNlci5waG9uZSxcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQ6IHVzZXIuaXNFbWFpbFZlcmlmaWVkLFxuICAgICAgICAgIGlzUGhvbmVWZXJpZmllZDogdXNlci5pc1Bob25lVmVyaWZpZWQsXG4gICAgICAgICAgc29jaWFsUHJvdmlkZXJzOiB1c2VyLnNvY2lhbFByb3ZpZGVycyxcbiAgICAgICAgICBoYXNQYXNzd29yZEhhc2g6IHVzZXIuaGFzUGFzc3dvcmRIYXNoLFxuICAgICAgICB9LFxuICAgICAgICBhdXRoTWV0aG9kOiB1c2VyLnNlc3Npb25BdXRoTWV0aG9kID8/IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgaGFuZGxlQXV0aFJlc3BvbnNlIHdoaWNoIHJlc3BlY3RzIG9uQXV0aFJlc3BvbnNlIGNhbGxiYWNrXG4gICAgICAvLyBQYXNzIGFwcFN0YXRlIGluIGNvbnRleHQgc28gb25BdXRoUmVzcG9uc2UgY2FuIGFjY2VzcyBpdFxuICAgICAgYXdhaXQgcm91dGVyLmhhbmRsZUF1dGhSZXNwb25zZShzeW50aGV0aWNSZXNwb25zZSwge1xuICAgICAgICBzb3VyY2U6ICdzb2NpYWwnLFxuICAgICAgICBhcHBTdGF0ZTogYXBwU3RhdGUgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIE9ubHkgdHJlYXQgYXV0aCBmYWlsdXJlcyAoNDAxLzQwMykgYXMgT0F1dGggZXJyb3JzXG4gICAgICAvLyBOZXR3b3JrIGVycm9ycyBvciBvdGhlciBpc3N1ZXMgbWlnaHQgYmUgdGVtcG9yYXJ5IC0gc3RpbGwgdHJ5IHN1Y2Nlc3Mgcm91dGVcblxuICAgICAgLy8gVHlwZSBndWFyZDogY2hlY2sgaWYgZXJyb3IgaXMgTkF1dGhDbGllbnRFcnJvclxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTkF1dGhDbGllbnRFcnJvcikge1xuICAgICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAxIHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzIHx8XG4gICAgICAgICAgZXJyb3IuY29kZSA9PT0gTkF1dGhFcnJvckNvZGUuQVVUSF9UT0tFTl9JTlZBTElEIHx8XG4gICAgICAgICAgZXJyb3IuY29kZSA9PT0gTkF1dGhFcnJvckNvZGUuQVVUSF9TRVNTSU9OX0VYUElSRUQgfHxcbiAgICAgICAgICBlcnJvci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fTk9UX0ZPVU5EO1xuXG4gICAgICAgIGlmIChpc0F1dGhFcnJvcikge1xuICAgICAgICAgIC8vIENvb2tpZXMgd2VyZW4ndCBzZXQgcHJvcGVybHkgLSBPQXV0aCBmYWlsZWRcbiAgICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgICAgICAgIHJldHVybiByb3V0ZXIuaXNFcnJvclJlZGlyZWN0RGlzYWJsZWQoJ29hdXRoJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRm9yIG5ldHdvcmsgZXJyb3JzIG9yIG90aGVyIG5vbi1hdXRoIGlzc3VlcywgcHJvY2VlZCB0byBzdWNjZXNzIHJvdXRlXG4gICAgICAvLyBUaGUgYXV0aCBndWFyZCB3aWxsIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvbiB0aGUgbmV4dCByb3V0ZVxuICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGFwcFN0YXRlID8geyBhcHBTdGF0ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzIHJlZGlyZWN0IGlzIGRpc2FibGVkLCBhbGxvd2luZyB0aGUgY2FsbGJhY2sgY29tcG9uZW50IHRvIHJlbmRlclxuICAgIHJldHVybiByb3V0ZXIuaXNTdWNjZXNzUmVkaXJlY3REaXNhYmxlZCh7IHNvdXJjZTogJ3NvY2lhbCcsIGFwcFN0YXRlOiBhcHBTdGF0ZSA/PyB1bmRlZmluZWQgfSk7XG4gIH1cblxuICAvLyBFeGNoYW5nZSB0b2tlbiAtIFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseVxuICAvLyBOb3RlOiBhcHBTdGF0ZSB3aWxsIGJlIHBhc3NlZCB2aWEgcXVlcnkgcGFyYW1zIHdoZW4gbmF2aWdhdGVUb1N1Y2Nlc3MgaXMgY2FsbGVkXG4gIC8vIGJ5IHRoZSBjaGFsbGVuZ2Ugcm91dGVyIGFmdGVyIHN1Y2Nlc3NmdWwgZXhjaGFuZ2VcbiAgYXdhaXQgYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuXG4gIC8vIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3MgcmVkaXJlY3QgaXMgZGlzYWJsZWQsIGFsbG93aW5nIHRoZSBjYWxsYmFjayBjb21wb25lbnQgdG8gcmVuZGVyXG4gIC8vIFdlIHVzZSAnc29jaWFsJyBhcyBzb3VyY2Ugc2luY2UgdGhpcyBpcyB0aGUgc29jaWFsIE9BdXRoIGNhbGxiYWNrIGZsb3dcbiAgcmV0dXJuIHJvdXRlci5pc1N1Y2Nlc3NSZWRpcmVjdERpc2FibGVkKHsgc291cmNlOiAnc29jaWFsJywgYXBwU3RhdGU6IGFwcFN0YXRlID8/IHVuZGVmaW5lZCB9KTtcbn07XG4iXX0=
|