@atlasauth/angular 0.3.0 → 0.5.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/CHANGELOG.md +53 -0
- package/dist/esm2022/lib/atlas.service.mjs +115 -33
- package/dist/esm2022/lib/components/attempt-flow.component.mjs +76 -9
- package/dist/esm2022/lib/components/flow-controller.mjs +49 -2
- package/dist/esm2022/lib/components/sign-in.component.mjs +11 -4
- package/dist/esm2022/lib/components/sign-up-form.component.mjs +44 -15
- package/dist/esm2022/lib/components/sign-up.component.mjs +2 -2
- package/dist/esm2022/lib/i18n.mjs +44 -1
- package/dist/esm2022/public-api.mjs +4 -1
- package/dist/fesm2022/atlasauth-angular.mjs +332 -58
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/atlas.service.d.ts +37 -3
- package/dist/lib/components/attempt-flow.component.d.ts +16 -1
- package/dist/lib/components/flow-controller.d.ts +26 -0
- package/dist/lib/components/sign-up-form.component.d.ts +8 -2
- package/dist/public-api.d.ts +2 -1
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,58 @@
|
|
|
1
1
|
# @atlasauth/angular changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
Requires `@atlasauth/js` 0.9.0.
|
|
5
|
+
- **Server errors render in the app's language.** `<atlas-sign-in>` / `<atlas-sign-up>` (the attempt flow and
|
|
6
|
+
the sign-up form) show the catalog string `error.<reason>` for an error's `reason`, falling back to the
|
|
7
|
+
server's message, then `error.generic`.
|
|
8
|
+
- **`Accept-Language`.** `AtlasService`'s Frontend API client and `createFapiClient()` send the `locale` tag of
|
|
9
|
+
the `localization` bundle, so the server localises `message` too.
|
|
10
|
+
- **Added 38 `error.<reason>` keys** to the built-in `EN_US` catalog (see `@atlasauth/localizations` 0.4.0).
|
|
11
|
+
- `AtlasService` gains `errorText(error)`, the `locale` getter (`string | undefined`) and the
|
|
12
|
+
`errorLocalization` getter (`Catalog`).
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## 0.4.0
|
|
16
|
+
- **Safer sign-out.** `AtlasService.signOut(options?: SignOutOptions)` now returns
|
|
17
|
+
`Promise<SignOutResult>` (`{ revoked: boolean; activeSessionId?: string }`; was `Promise<void>` —
|
|
18
|
+
existing `await signOut()` / `.then()` call sites keep working). It runs through the shared
|
|
19
|
+
`SignOutGuard` from `@atlasauth/js`: the session id is recorded as a tombstone (localStorage, per
|
|
20
|
+
Frontend API origin) before the revoke, the revoke is retried once, and a reload, token refresh, a
|
|
21
|
+
sibling tab or a tab opened later never re-adopts a signed-out session — even when the revoke failed
|
|
22
|
+
and the refresh cookie is still valid. A refused session's revoke is retried in the background and
|
|
23
|
+
its tombstone dropped once the server confirms. With no cached token the cookie session is found via
|
|
24
|
+
`GET /v1/client`, so the revoke is never skipped. A parked session the server promoted on revoke
|
|
25
|
+
(`active_session_id`) is adopted. New option `signOut({ strict: true })` rejects with a
|
|
26
|
+
`SignOutError` (`code: 'SIGN_OUT_REVOKE_FAILED'`, `sessionId`, `status`) after the local sign-out
|
|
27
|
+
when the revoke was never confirmed. Another tab signing out of the same session now signs this tab
|
|
28
|
+
out too. `ngOnDestroy()` also stops the cross-tab watch and cancels background re-tries.
|
|
29
|
+
- **Popup OAuth landing.** On startup (browser only), before the redirect-ticket exchange, the service
|
|
30
|
+
calls `completeOAuthPopupLanding()`: on the landing page of a sign-in popup whose opener was severed
|
|
31
|
+
by a Cross-Origin-Opener-Policy (`#atlas_popup_result=…`) it scrubs the fragment, relays the result
|
|
32
|
+
to the opener and closes the window — without redeeming the ticket itself. When no opener takes it,
|
|
33
|
+
it exchanges the ticket like a redirect result (or follows the payload's `continuationUrl`). After a
|
|
34
|
+
successful ticket exchange inside the Atlas popup it calls `closeOAuthPopupAfterSignIn()`, which
|
|
35
|
+
wakes the waiting opener and closes the popup (a no-op in an ordinary tab).
|
|
36
|
+
- **Email delivery in the prebuilt components** (`InstanceSettings.emailDelivery` from
|
|
37
|
+
`GET /v1/appearance`; everything reads as available when the server omits it):
|
|
38
|
+
- `<atlas-sign-up-form>` shows a `signUp.emailUnavailable` notice (`role="alert"`,
|
|
39
|
+
`data-atlas-email-unavailable`) instead of the email + password form when
|
|
40
|
+
`emailDelivery.passwordSignUp` is `false`.
|
|
41
|
+
- `<atlas-sign-in>`'s first-factor step offers `offeredFirstFactors(strategies, emailDelivery)`:
|
|
42
|
+
an "Email me a code" option when `email_code` is offered (hidden while the app cannot send email),
|
|
43
|
+
and the password field unless an emailed code is the only offer.
|
|
44
|
+
- **Added to `AtlasFlowController`:** `firstFactors(): string[]`, `signUpEmailUnavailable(): boolean`,
|
|
45
|
+
`passwordResetAvailable(): boolean`, `prepare(strategy: 'email_code'): Promise<void>` and
|
|
46
|
+
`preparedFactor: WritableSignal<'email_code' | null>`.
|
|
47
|
+
- **Added to `AttemptFlowComponent`:** inputs `firstFactors: string[] | null` and
|
|
48
|
+
`preparedFactor: string | null`, output `chooseFactor: EventEmitter<'email_code'>`; new element class
|
|
49
|
+
`atlas-button-secondary` (`formButtonSecondary`).
|
|
50
|
+
- **Added catalog keys** (en-US): `signUp.emailUnavailable` ("This app can't send email right now. Try
|
|
51
|
+
another sign-in method or contact the app owner." — `EMAIL_UNAVAILABLE_MESSAGE`), `signIn.useEmailCode`.
|
|
52
|
+
- **Added re-exports** from `@atlasauth/js`: `SignOutError` (class) and the types `SignOutResult`,
|
|
53
|
+
`SignOutOptions`, `EmailDelivery`.
|
|
54
|
+
- Requires `@atlasauth/js` 0.8.0.
|
|
55
|
+
|
|
3
56
|
## 0.3.0
|
|
4
57
|
- **`<atlas-sign-up>` now creates accounts.** Its first step is a create-account form (the instance's
|
|
5
58
|
configured sign-up fields, email, password and the legal-consent row) that posts
|
|
@@ -3,7 +3,7 @@ import { isPlatformBrowser } from '@angular/common';
|
|
|
3
3
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
5
5
|
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
6
|
-
import { FapiClient, TokenCache, getProviderToken as fetchProviderToken, msUntilRefresh, readExpiry, readRedirectResult, resolveFrontendApi, stripRedirectParams,
|
|
6
|
+
import { FapiClient, SignOutGuard, catalogLocale, localizedErrorMessage, TokenCache, closeOAuthPopupAfterSignIn, completeOAuthPopupLanding, getProviderToken as fetchProviderToken, mapOAuthPopupPayload, msUntilRefresh, readExpiry, readRedirectResult, resolveFrontendApi, stripRedirectParams, } from '@atlasauth/js';
|
|
7
7
|
import { evaluate } from '@atlasauth/authz';
|
|
8
8
|
import { ATLAS_OPTIONS } from './atlas.config';
|
|
9
9
|
import { cssVariables, instanceDesignFrom, renderAppearance, resolveTokens, } from './appearance';
|
|
@@ -37,7 +37,19 @@ export class AtlasService {
|
|
|
37
37
|
cache = new TokenCache();
|
|
38
38
|
fapiClient;
|
|
39
39
|
refreshTimer = null;
|
|
40
|
+
/**
|
|
41
|
+
* The sessions this browser signed out of (tombstones in localStorage, per
|
|
42
|
+
* Frontend API origin), the revoke and its background re-tries. Every reload /
|
|
43
|
+
* refresh asks it before adopting a session, so a sign-out the server never
|
|
44
|
+
* confirmed is not undone by the still-valid refresh cookie.
|
|
45
|
+
*/
|
|
46
|
+
guard;
|
|
47
|
+
stopWatchingSignOut = null;
|
|
40
48
|
catalog;
|
|
49
|
+
/** The language layer of `catalog` (the `localization` bundle alone; `EN_US` when none). */
|
|
50
|
+
errorCatalog;
|
|
51
|
+
/** Sent to the Frontend API as `Accept-Language`: the `localization` bundle's `locale` tag. */
|
|
52
|
+
requestLocale;
|
|
41
53
|
/**
|
|
42
54
|
* A sign-in attempt handed back by an OAuth redirect that still needs a second
|
|
43
55
|
* factor (no session was issued). Null in the ordinary case; the `<atlas-sign-in>`
|
|
@@ -93,10 +105,17 @@ export class AtlasService {
|
|
|
93
105
|
});
|
|
94
106
|
this.doFetch = options.fetchImpl ?? ((...args) => fetch(...args));
|
|
95
107
|
this.catalog = options.localization ? withFallback(options.localization) : EN_US;
|
|
108
|
+
this.errorCatalog = options.localization ?? EN_US;
|
|
109
|
+
this.requestLocale = catalogLocale(options.localization);
|
|
96
110
|
this.fapiClient = new FapiClient({
|
|
97
111
|
publishableKey: this.publishableKey,
|
|
98
112
|
baseUrl: this.baseUrl,
|
|
99
113
|
fetchImpl: this.doFetch,
|
|
114
|
+
locale: this.requestLocale,
|
|
115
|
+
});
|
|
116
|
+
this.guard = new SignOutGuard({
|
|
117
|
+
request: (path, init) => this.call(path, init),
|
|
118
|
+
frontendApi: this.baseUrl,
|
|
100
119
|
});
|
|
101
120
|
// Captured synchronously (not in an async init) so it is available before any
|
|
102
121
|
// flow component reads it: a needs_second_factor redirect carries a status but
|
|
@@ -105,10 +124,19 @@ export class AtlasService {
|
|
|
105
124
|
// Boot once, browser only. On the server there is no cookie jar to read a
|
|
106
125
|
// session from, so we leave the state at `loading` and let hydration boot it.
|
|
107
126
|
if (this.isBrowser) {
|
|
127
|
+
// Another tab signed out of THIS session (its tombstone reached the shared
|
|
128
|
+
// store): drop the token and re-check, which then refuses the session.
|
|
129
|
+
this.stopWatchingSignOut = this.guard.watch(() => this.cache.peek()?.sessionId ?? this._session.value?.id, () => {
|
|
130
|
+
this.cache.clear();
|
|
131
|
+
void this.reload();
|
|
132
|
+
});
|
|
108
133
|
void this.boot();
|
|
109
134
|
}
|
|
110
135
|
}
|
|
111
136
|
ngOnDestroy() {
|
|
137
|
+
this.stopWatchingSignOut?.();
|
|
138
|
+
this.stopWatchingSignOut = null;
|
|
139
|
+
this.guard.dispose();
|
|
112
140
|
this.clearRefreshTimer();
|
|
113
141
|
this._status.complete();
|
|
114
142
|
this._user.complete();
|
|
@@ -126,6 +154,22 @@ export class AtlasService {
|
|
|
126
154
|
get frontendApi() {
|
|
127
155
|
return this.baseUrl;
|
|
128
156
|
}
|
|
157
|
+
/** The `Accept-Language` sent to the Frontend API: the `localization` bundle's `locale` tag, if any. */
|
|
158
|
+
get locale() {
|
|
159
|
+
return this.requestLocale;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The text to show for a server error, in the app's language: the catalog's
|
|
163
|
+
* `error.<reason>` (looked up in the `localization` bundle, or `EN_US` when
|
|
164
|
+
* none is set), else the server's message, else `error.generic`.
|
|
165
|
+
*/
|
|
166
|
+
errorText(error) {
|
|
167
|
+
return localizedErrorMessage(error, this.errorCatalog, this.catalog);
|
|
168
|
+
}
|
|
169
|
+
/** The catalog server errors are looked up in (see {@link errorText}). */
|
|
170
|
+
get errorLocalization() {
|
|
171
|
+
return this.errorCatalog;
|
|
172
|
+
}
|
|
129
173
|
/** Tokens as CSS custom properties, for a host element to inherit. */
|
|
130
174
|
appearanceVariables() {
|
|
131
175
|
return cssVariables(resolveTokens(this.options.appearance));
|
|
@@ -159,7 +203,11 @@ export class AtlasService {
|
|
|
159
203
|
}
|
|
160
204
|
/** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */
|
|
161
205
|
createFapiClient() {
|
|
162
|
-
return new FapiClient({
|
|
206
|
+
return new FapiClient({
|
|
207
|
+
publishableKey: this.publishableKey,
|
|
208
|
+
baseUrl: this.baseUrl,
|
|
209
|
+
locale: this.requestLocale,
|
|
210
|
+
});
|
|
163
211
|
}
|
|
164
212
|
// --- Imperative API (mirrors the React hooks' actions) ----------------------
|
|
165
213
|
/**
|
|
@@ -187,25 +235,27 @@ export class AtlasService {
|
|
|
187
235
|
has(condition) {
|
|
188
236
|
return evaluate(this._claims.value, condition).allowed;
|
|
189
237
|
}
|
|
190
|
-
/**
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
this.
|
|
206
|
-
this.
|
|
207
|
-
this.
|
|
208
|
-
this.
|
|
238
|
+
/**
|
|
239
|
+
* Revoke the current session server-side and drop all local auth state.
|
|
240
|
+
*
|
|
241
|
+
* The session id is remembered before the revoke (a tombstone shared by every
|
|
242
|
+
* tab), so a reload, a token refresh, a sibling tab or a tab opened later never
|
|
243
|
+
* re-adopts it — even when the revoke failed (it is retried once, then again in
|
|
244
|
+
* the background) and the refresh cookie is still valid. Resolves
|
|
245
|
+
* `{ revoked, activeSessionId? }`; with `{ strict: true }` an unconfirmed revoke
|
|
246
|
+
* rejects with a `SignOutError` instead (after the local sign-out). A parked
|
|
247
|
+
* session the server promoted on revoke is adopted. Front-channel logout runs
|
|
248
|
+
* unless `{ frontchannel: false }`.
|
|
249
|
+
*/
|
|
250
|
+
async signOut(options = {}) {
|
|
251
|
+
// With no cached token the guard finds the cookie session itself
|
|
252
|
+
// (GET /v1/client), so a missing JWT never skips the revoke.
|
|
253
|
+
const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;
|
|
254
|
+
const attempt = await this.guard.revoke(sessionId, options);
|
|
255
|
+
this.clearLocalState();
|
|
256
|
+
if (this.guard.promoted(attempt))
|
|
257
|
+
await this.reload();
|
|
258
|
+
return this.guard.settle(attempt, options);
|
|
209
259
|
}
|
|
210
260
|
/**
|
|
211
261
|
* Switch the active organization (or `null` for the personal account). The
|
|
@@ -233,14 +283,10 @@ export class AtlasService {
|
|
|
233
283
|
if (!response.ok)
|
|
234
284
|
throw new Error('boot failed');
|
|
235
285
|
const body = (await response.json());
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
this.
|
|
240
|
-
this._user.next(null);
|
|
241
|
-
this._session.next(null);
|
|
242
|
-
this._claims.next(null);
|
|
243
|
-
this._memberships.next([]);
|
|
286
|
+
// A session this browser signed out of is never re-adopted from the
|
|
287
|
+
// refresh cookie; the guard re-tries its revoke in the background.
|
|
288
|
+
if (!body.session || !body.user || this.guard.refuse(body.session.id)) {
|
|
289
|
+
this.clearLocalState();
|
|
244
290
|
return;
|
|
245
291
|
}
|
|
246
292
|
this._user.next(body.user);
|
|
@@ -268,17 +314,41 @@ export class AtlasService {
|
|
|
268
314
|
* has no ticket, so nothing is exchanged and the app boots signed-out.
|
|
269
315
|
*/
|
|
270
316
|
async boot() {
|
|
271
|
-
const
|
|
317
|
+
const fromUrl = readRedirectResult(window.location.search);
|
|
318
|
+
let result = fromUrl;
|
|
319
|
+
// §oauth popup mode: this page may be the landing of a sign-in popup whose
|
|
320
|
+
// opener a Cross-Origin-Opener-Policy severed (`#atlas_popup_result=…`).
|
|
321
|
+
// The result is relayed to the opener, which redeems the ticket, and this
|
|
322
|
+
// window closes. If no opener takes it (its tab is gone), finish here like
|
|
323
|
+
// a redirect.
|
|
324
|
+
const landing = await completeOAuthPopupLanding().catch(() => null);
|
|
325
|
+
if (landing && !landing.delivered) {
|
|
326
|
+
const outcome = mapOAuthPopupPayload(landing.payload);
|
|
327
|
+
if (outcome?.ticket && outcome.attemptId) {
|
|
328
|
+
result = { attemptId: outcome.attemptId, ticket: outcome.ticket };
|
|
329
|
+
}
|
|
330
|
+
else if (outcome?.continuationUrl) {
|
|
331
|
+
// A second factor / connect step / provider error: the redirect flow's page.
|
|
332
|
+
window.location.replace(outcome.continuationUrl);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
let exchanged = false;
|
|
272
337
|
if (result?.ticket) {
|
|
273
|
-
await this.call('/v1/client/tickets/exchange', {
|
|
338
|
+
const response = await this.call('/v1/client/tickets/exchange', {
|
|
274
339
|
method: 'POST',
|
|
275
340
|
body: JSON.stringify({ attempt_id: result.attemptId, ticket: result.ticket }),
|
|
276
341
|
}).catch(() => undefined);
|
|
342
|
+
exchanged = !!response?.ok;
|
|
277
343
|
}
|
|
278
|
-
if (
|
|
344
|
+
if (fromUrl) {
|
|
279
345
|
window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));
|
|
280
346
|
}
|
|
281
347
|
await this.reload();
|
|
348
|
+
// Signed in inside the Atlas popup (the redirect flow ran in it): hand back
|
|
349
|
+
// to the waiting opener and close. A no-op in an ordinary tab.
|
|
350
|
+
if (exchanged)
|
|
351
|
+
void closeOAuthPopupAfterSignIn();
|
|
282
352
|
}
|
|
283
353
|
readPendingAttempt() {
|
|
284
354
|
const result = readRedirectResult(window.location.search);
|
|
@@ -300,6 +370,9 @@ export class AtlasService {
|
|
|
300
370
|
});
|
|
301
371
|
}
|
|
302
372
|
applyToken(jwt, sessionId) {
|
|
373
|
+
// An in-flight refresh must not resurrect a session signed out meanwhile.
|
|
374
|
+
if (this.guard.isSignedOut(sessionId))
|
|
375
|
+
return;
|
|
303
376
|
const expiresAt = readExpiry(jwt);
|
|
304
377
|
if (!expiresAt)
|
|
305
378
|
return;
|
|
@@ -325,6 +398,15 @@ export class AtlasService {
|
|
|
325
398
|
await this.reload();
|
|
326
399
|
}
|
|
327
400
|
}
|
|
401
|
+
clearLocalState() {
|
|
402
|
+
this.clearRefreshTimer();
|
|
403
|
+
this.cache.clear();
|
|
404
|
+
this._status.next('signed_out');
|
|
405
|
+
this._user.next(null);
|
|
406
|
+
this._session.next(null);
|
|
407
|
+
this._claims.next(null);
|
|
408
|
+
this._memberships.next([]);
|
|
409
|
+
}
|
|
328
410
|
/** §7.4: proactive, jittered refresh scheduled from the token's own expiry. */
|
|
329
411
|
scheduleRefresh() {
|
|
330
412
|
this.clearRefreshTimer();
|
|
@@ -361,4 +443,4 @@ function decodeClaims(jwt) {
|
|
|
361
443
|
return null;
|
|
362
444
|
}
|
|
363
445
|
}
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFFbkIsaUNBQWlDLEdBRWxDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQXlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixhQUFhLEdBSWQsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxTQUFTLEdBQUcs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QUMsR0FBVztJQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDckIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBUb2tlbkNhY2hlLFxuICBnZXRQcm92aWRlclRva2VuIGFzIGZldGNoUHJvdmlkZXJUb2tlbixcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgcmVzb2x2ZUZyb250ZW5kQXBpLFxuICBzdHJpcFJlZGlyZWN0UGFyYW1zLFxuICB0eXBlIFByb3ZpZGVyVG9rZW4sXG4gIHJ1bkZyb250Q2hhbm5lbExvZ291dEZyb21SZXNwb25zZSxcbiAgdHlwZSBTaWduT3V0T3B0aW9ucyxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgdHlwZSBQcm90ZWN0Q29uZGl0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9hdXRoeic7XG5pbXBvcnQgeyBBVExBU19PUFRJT05TIH0gZnJvbSAnLi9hdGxhcy5jb25maWcnO1xuaW1wb3J0IHtcbiAgY3NzVmFyaWFibGVzLFxuICBpbnN0YW5jZURlc2lnbkZyb20sXG4gIHJlbmRlckFwcGVhcmFuY2UsXG4gIHJlc29sdmVUb2tlbnMsXG4gIHR5cGUgQXBwZWFyYW5jZSxcbiAgdHlwZSBBcHBlYXJhbmNlUmVuZGVyLFxuICB0eXBlIEluc3RhbmNlRGVzaWduLFxufSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgRU5fVVMsIHdpdGhGYWxsYmFjaywgdHlwZSBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB0eXBlIHtcbiAgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwLFxuICBBdGxhc1Nlc3Npb24sXG4gIEF0bGFzVXNlcixcbiAgQXV0aFN0YXR1cyxcbiAgU2Vzc2lvbkNsYWltcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYEF0bGFzU2VydmljZWAg4oCUIHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPEF0bGFzUHJvdmlkZXI+YCArIGhvb2tzLlxuICpcbiAqIEl0IGhvbGRzIGV4YWN0bHkgb25lIHRoaW5nIHRoYXQgbWF0dGVycyBpbiBtZW1vcnk6IHRoZSBzaG9ydC1saXZlZCBKV1QsIGluIGFcbiAqIHtAbGluayBUb2tlbkNhY2hlfS4gTm90IGxvY2FsU3RvcmFnZSwgbm90IGEgY29va2llIHRoaXMgY29kZSB3cml0ZXMg4oCUIHRoZVxuICogcmVmcmVzaCB0b2tlbiBpcyBIdHRwT25seSBzbyBicm93c2VyIHNjcmlwdCBuZXZlciB0b3VjaGVzIGl0LCBhbmQgdGhlIEpXVFxuICogbGl2ZXMgb25seSBhcyBsb25nIGFzIHRoZSB0YWIuIEFueXRoaW5nIHBlcnNpc3RlZCB3b3VsZCBzdXJ2aXZlIHRoZSB0YWIgYW5kXG4gKiBiZWNvbWUgdGhlIGZpcnN0IHRoaW5nIGFuIFhTUyByZWFkcy5cbiAqXG4gKiBSZWFjdGl2ZSBhdXRoIHN0YXRlIGlzIGV4cG9zZWQgdHdvIHdheXMgc28gY2FsbGVycyBjYW4gcGljayB0aGVpciBpZGlvbTpcbiAqICAtIFJ4SlMgb2JzZXJ2YWJsZXMgKGB1c2VyJGAsIGBzZXNzaW9uJGAsIGBpc1NpZ25lZEluJGAsIOKApikg4oCUIHRoZSBwcmltYXJ5IEFQSSxcbiAqICAgIHRoZSBhbmFsb2d1ZSBvZiB0aGUgUmVhY3QgaG9va3MnIHJldHVybiB2YWx1ZXMuXG4gKiAgLSBBbmd1bGFyIHNpZ25hbHMgKGB1c2VyYCwgYHNlc3Npb25gLCBgaXNTaWduZWRJbmAsIOKApikg4oCUIHRoZSBzYW1lIHZhbHVlcyBhc1xuICogICAgYFNpZ25hbDxUPmAsIGZvciB0ZW1wbGF0ZXMgYW5kIGBjb21wdXRlZCgpYC5cbiAqXG4gKiBUaGUgaW1wZXJhdGl2ZSBtZXRob2RzIChgc2lnbk91dGAsIGBnZXRUb2tlbmAsIGBnZXRQcm92aWRlclRva2VuYCxcbiAqIGBzZXRBY3RpdmVPcmdhbml6YXRpb25gLCBgcmVsb2FkYCkgbWlycm9yIHRoZSBhY3Rpb25zIHRoZSBob29rcyByZXR1cm4uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXRsYXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KEFUTEFTX09QVElPTlMpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkb0ZldGNoOiB0eXBlb2YgZmV0Y2g7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBUb2tlbkNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFwaUNsaWVudDogRmFwaUNsaWVudDtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nOiBDYXRhbG9nO1xuXG4gIC8qKlxuICAgKiBBIHNpZ24taW4gYXR0ZW1wdCBoYW5kZWQgYmFjayBieSBhbiBPQXV0aCByZWRpcmVjdCB0aGF0IHN0aWxsIG5lZWRzIGEgc2Vjb25kXG4gICAqIGZhY3RvciAobm8gc2Vzc2lvbiB3YXMgaXNzdWVkKS4gTnVsbCBpbiB0aGUgb3JkaW5hcnkgY2FzZTsgdGhlIGA8YXRsYXMtc2lnbi1pbj5gXG4gICAqIGZsb3cgc2VlZHMgaXRzZWxmIGZyb20gdGhpcyBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSAyRkEgc3RlcC4gQ2FwdHVyZWRcbiAgICogb25jZSwgc3luY2hyb25vdXNseSwgYXQgY29uc3RydWN0aW9uIOKAlCBiZWZvcmUgYW55IGZsb3cgY29tcG9uZW50IHJlYWRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ0F0dGVtcHQ6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGw7XG5cbiAgLy8gLS0tIFJlYWN0aXZlIHN0YXRlIChzb3VyY2Ugb2YgdHJ1dGgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFN0YXR1cz4oJ2xvYWRpbmcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Nlc3Npb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzU2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFpbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25DbGFpbXMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVtYmVyc2hpcHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPihbXSk7XG5cbiAgLyoqIFRoZSB0aHJlZS1zdGF0ZSBhdXRoIGxpZmVjeWNsZTogYGxvYWRpbmdgIOKGkiBgc2lnbmVkX2luYCB8IGBzaWduZWRfb3V0YC4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzJDogT2JzZXJ2YWJsZTxBdXRoU3RhdHVzPiA9IHRoaXMuX3N0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8QXRsYXNVc2VyIHwgbnVsbD4gPSB0aGlzLl91c2VyLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBzZXNzaW9uJDogT2JzZXJ2YWJsZTxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRoaXMuX3Nlc3Npb24uYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNsYWltcyQ6IE9ic2VydmFibGU8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdGhpcy5fY2xhaW1zLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBtZW1iZXJzaGlwcyQ6IE9ic2VydmFibGU8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+ID1cbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogVHJ1ZSBvbmNlIHRoZSBTREsgaGFzIGZpbmlzaGVkIGl0cyBmaXJzdCBib290LiBEaXN0aW5ndWlzaGluZyBcInN0aWxsIGxvYWRpbmdcIlxuICAgKiBmcm9tIFwic2lnbmVkIG91dFwiIGlzIHdoYXQgbGV0cyBhIHRlbXBsYXRlIGF2b2lkIHRoZSBmbGFzaCBvZiBhIHNpZ24taW4gZm9ybVxuICAgKiBvbiBldmVyeSBwYWdlIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBpc0xvYWRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBtYXAoKHMpID0+IHMgIT09ICdsb2FkaW5nJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICByZWFkb25seSBpc1NpZ25lZEluJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyA9PT0gJ3NpZ25lZF9pbicpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgb3JnYW5pemF0aW9uIG1lbWJlcnNoaXAsIGRlcml2ZWQgZnJvbSB0aGUgdG9rZW4ncyBgb3JnX2lkYCBjbGFpbS4gKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLFxuICAgIHRoaXMuX2NsYWltcyxcbiAgXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW21lbWJlcnNoaXBzLCBjbGFpbXNdKSA9PlxuICAgICAgICBtZW1iZXJzaGlwcy5maW5kKChtKSA9PiBtLm9yZ2FuaXphdGlvbi5pZCA9PT0gY2xhaW1zPy5vcmdfaWQpID8/IG51bGwsXG4gICAgKSxcbiAgKTtcblxuICAvLyAtLS0gU2lnbmFsIG1pcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcmVhZG9ubHkgc3RhdHVzOiBTaWduYWw8QXV0aFN0YXR1cz4gPSB0b1NpZ25hbCh0aGlzLnN0YXR1cyQsIHsgaW5pdGlhbFZhbHVlOiAnbG9hZGluZycgfSk7XG4gIHJlYWRvbmx5IHVzZXI6IFNpZ25hbDxBdGxhc1VzZXIgfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMudXNlciQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBzZXNzaW9uOiBTaWduYWw8QXRsYXNTZXNzaW9uIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLnNlc3Npb24kLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgY2xhaW1zOiBTaWduYWw8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdG9TaWduYWwodGhpcy5jbGFpbXMkLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcHM6IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPSB0b1NpZ25hbCh0aGlzLm1lbWJlcnNoaXBzJCwge1xuICAgIGluaXRpYWxWYWx1ZTogW10gYXMgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10sXG4gIH0pO1xuICByZWFkb25seSBpc0xvYWRlZDogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSAhPT0gJ2xvYWRpbmcnKTtcbiAgcmVhZG9ubHkgaXNTaWduZWRJbjogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSA9PT0gJ3NpZ25lZF9pbicpO1xuICByZWFkb25seSBvcmdhbml6YXRpb246IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHRoaXMuY2xhaW1zKCk/Lm9yZ19pZDtcbiAgICByZXR1cm4gdGhpcy5tZW1iZXJzaGlwcygpLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBvcmdJZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnB1Ymxpc2hhYmxlS2V5ID0gb3B0aW9ucy5wdWJsaXNoYWJsZUtleTtcbiAgICAvLyBUaHJvd3MgYW4gYEF0bGFzQ29uZmlnRXJyb3JgIG9uIGEgbWlzc2luZy9pbnZhbGlkIHZhbHVlIHJhdGhlciB0aGFuIHF1aWV0bHlcbiAgICAvLyBzZW5kaW5nIGV2ZXJ5IHJlcXVlc3QgdG8gYSByZWxhdGl2ZSBwYXRoIG9uIHRoZSBhcHAncyBvcmlnaW4uXG4gICAgdGhpcy5iYXNlVXJsID0gcmVzb2x2ZUZyb250ZW5kQXBpKG9wdGlvbnMuZnJvbnRlbmRBcGksIHtcbiAgICAgIGNvbXBvbmVudDogJ3Byb3ZpZGVBdGxhcygpIC8gQXRsYXNNb2R1bGUuZm9yUm9vdCgpJyxcbiAgICB9KTtcbiAgICB0aGlzLmRvRmV0Y2ggPSBvcHRpb25zLmZldGNoSW1wbCA/PyAoKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPikgPT4gZmV0Y2goLi4uYXJncykpO1xuXG4gICAgdGhpcy5jYXRhbG9nID0gb3B0aW9ucy5sb2NhbGl6YXRpb24gPyB3aXRoRmFsbGJhY2sob3B0aW9ucy5sb2NhbGl6YXRpb24pIDogRU5fVVM7XG5cbiAgICB0aGlzLmZhcGlDbGllbnQgPSBuZXcgRmFwaUNsaWVudCh7XG4gICAgICBwdWJsaXNoYWJsZUtleTogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgIGZldGNoSW1wbDogdGhpcy5kb0ZldGNoLFxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZWQgc3luY2hyb25vdXNseSAobm90IGluIGFuIGFzeW5jIGluaXQpIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgYW55XG4gICAgLy8gZmxvdyBjb21wb25lbnQgcmVhZHMgaXQ6IGEgbmVlZHNfc2Vjb25kX2ZhY3RvciByZWRpcmVjdCBjYXJyaWVzIGEgc3RhdHVzIGJ1dFxuICAgIC8vIG5vIHRpY2tldCwgYW5kIHRoYXQgaXMgd2hhdCB0aGUgMkZBIHJlc3VtZSBzZWVkcyBmcm9tLlxuICAgIHRoaXMucGVuZGluZ0F0dGVtcHQgPSB0aGlzLmlzQnJvd3NlciA/IHRoaXMucmVhZFBlbmRpbmdBdHRlbXB0KCkgOiBudWxsO1xuXG4gICAgLy8gQm9vdCBvbmNlLCBicm93c2VyIG9ubHkuIE9uIHRoZSBzZXJ2ZXIgdGhlcmUgaXMgbm8gY29va2llIGphciB0byByZWFkIGFcbiAgICAvLyBzZXNzaW9uIGZyb20sIHNvIHdlIGxlYXZlIHRoZSBzdGF0ZSBhdCBgbG9hZGluZ2AgYW5kIGxldCBoeWRyYXRpb24gYm9vdCBpdC5cbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHZvaWQgdGhpcy5ib290KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuX3N0YXR1cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3VzZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xhaW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIC0tLSBDb25maWd1cmF0aW9uIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBnZXQgYXBwZWFyYW5jZSgpOiBBcHBlYXJhbmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwcGVhcmFuY2U7XG4gIH1cblxuICBnZXQgbG9jYWxpemF0aW9uKCk6IENhdGFsb2cge1xuICAgIHJldHVybiB0aGlzLmNhdGFsb2c7XG4gIH1cblxuICBnZXQgZnJvbnRlbmRBcGkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsO1xuICB9XG5cbiAgLyoqIFRva2VucyBhcyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIGZvciBhIGhvc3QgZWxlbWVudCB0byBpbmhlcml0LiAqL1xuICBhcHBlYXJhbmNlVmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBjc3NWYXJpYWJsZXMocmVzb2x2ZVRva2Vucyh0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGFwcGVhcmFuY2UgcmVuZGVyIGZvciBhIHJvb3QgZWxlbWVudDogaW5saW5lIHZhcmlhYmxlcywgdGhlXG4gICAqIGBkYXRhLWF0bGFzLSpgIGF0dHJpYnV0ZXMgYW5kIHRoZSBkZXNpZ24gc3R5bGVzaGVldC4gUGFzcyB0aGUgZGFzaGJvYXJkXG4gICAqIGRlc2lnbiAoZnJvbSB7QGxpbmsgbG9hZEluc3RhbmNlRGVzaWdufSkgdG8gbGF5ZXIgY29kZSBvdmVycmlkZXMgb24gaXQg4oCUXG4gICAqIHRoZSBzYW1lIHNlbWFudGljcyBhcyBgQGF0bGFzYXV0aC9yZWFjdGAuXG4gICAqL1xuICBhcHBlYXJhbmNlUmVuZGVyKGluc3RhbmNlRGVzaWduPzogSW5zdGFuY2VEZXNpZ24gfCBudWxsKTogQXBwZWFyYW5jZVJlbmRlciB7XG4gICAgcmV0dXJuIHJlbmRlckFwcGVhcmFuY2UodGhpcy5vcHRpb25zLmFwcGVhcmFuY2UsIGluc3RhbmNlRGVzaWduID8/IG51bGwsIHtcbiAgICAgIGZyb250ZW5kQXBpOiB0aGlzLmJhc2VVcmwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlc2lnbiBjb25maWd1cmVkIGluIHRoZSBBdGxhcyBkYXNoYm9hcmQgKGBHRVQgL3YxL2FwcGVhcmFuY2VgKSwgb3IgbnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vbmUsIGl0IGNhbm5vdCBiZSByZWFkLCBvciB0aGUgYXBwIG9wdGVkIG91dCB3aXRoXG4gICAqIGBhcHBlYXJhbmNlLmluc3RhbmNlRGVzaWduOiBmYWxzZWAuXG4gICAqL1xuICBhc3luYyBsb2FkSW5zdGFuY2VEZXNpZ24oKTogUHJvbWlzZTxJbnN0YW5jZURlc2lnbiB8IG51bGw+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFwcGVhcmFuY2U/Lmluc3RhbmNlRGVzaWduID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvYXBwZWFyYW5jZScpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rID8gaW5zdGFuY2VEZXNpZ25Gcm9tKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgZnJlc2gge0BsaW5rIEZhcGlDbGllbnR9IGZvciBkcml2aW5nIGEgc2lnbi1pbi9zaWduLXVwIGZsb3cuICovXG4gIGNyZWF0ZUZhcGlDbGllbnQoKTogRmFwaUNsaWVudCB7XG4gICAgcmV0dXJuIG5ldyBGYXBpQ2xpZW50KHsgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksIGJhc2VVcmw6IHRoaXMuYmFzZVVybCB9KTtcbiAgfVxuXG4gIC8vIC0tLSBJbXBlcmF0aXZlIEFQSSAobWlycm9ycyB0aGUgUmVhY3QgaG9va3MnIGFjdGlvbnMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2Vzc2lvbidzIEpXVCwgYWx3YXlzIGZyZXNoOiBpZiB0aGUgY2FjaGVkIHRva2VuIGlzIHdpdGhpbiA1cyBvZlxuICAgKiBleHBpcnkgaXQgaXMgcmVmcmVzaGVkIGZpcnN0IHJhdGhlciB0aGFuIGhhbmRlZCBvdmVyLiBOdWxsIHdoZW4gc2lnbmVkIG91dC5cbiAgICovXG4gIGFzeW5jIGdldFRva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWJsZSA9IHRoaXMuY2FjaGUuZ2V0KDVfMDAwKTtcbiAgICBpZiAodXNhYmxlKSByZXR1cm4gdXNhYmxlLmp3dDtcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCg1XzAwMCk/Lmp3dCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaWduZWQtaW4gdXNlcidzIE9XTiBsaXZlIGFjY2VzcyB0b2tlbiBhdCBhIGNvbm5lY3RlZCBwcm92aWRlciAoR29vZ2xlLFxuICAgKiBHaXRIdWIsIOKApiksIHNvIHRoZSBhcHAgY2FuIGNhbGwgdGhhdCBwcm92aWRlcidzIEFQSSBmcm9tIHRoZSBicm93c2VyLiBOdWxsXG4gICAqIHdoZW4gdGhlcmUgaXMgbm8gdXNhYmxlIHRva2VuIOKAlCBubyBsaW5rZWQgYWNjb3VudCwgb3IgdGhlIHByb3ZpZGVyIGdyYW50ZWQgL1xuICAgKiBrZXB0IG5vbmUuIFRoZSBzZXJ2ZXIgcmVmcmVzaGVzIGEgc3RhbGUgdG9rZW4gb24gcmVhZDsgdGhlIHJlZnJlc2ggdG9rZW4gaXNcbiAgICogbmV2ZXIgZXhwb3NlZC5cbiAgICovXG4gIGdldFByb3ZpZGVyVG9rZW4ocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8UHJvdmlkZXJUb2tlbiB8IG51bGw+IHtcbiAgICByZXR1cm4gZmV0Y2hQcm92aWRlclRva2VuKHRoaXMuZmFwaUNsaWVudCwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqIEltcGVyYXRpdmUgYGhhcygpYCDigJQgdGhlIHNhbWUgZXZhbHVhdGlvbiBgKmF0bGFzUHJvdGVjdGAgcmVuZGVycyBvbi4gKi9cbiAgaGFzKGNvbmRpdGlvbjogUHJvdGVjdENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmFsdWF0ZSh0aGlzLl9jbGFpbXMudmFsdWUsIGNvbmRpdGlvbikuYWxsb3dlZDtcbiAgfVxuXG4gIC8qKiBSZXZva2UgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzZXJ2ZXItc2lkZSBhbmQgZHJvcCBhbGwgbG9jYWwgYXV0aCBzdGF0ZS4gKi9cbiAgYXN5bmMgc2lnbk91dChvcHRpb25zPzogU2lnbk91dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHJldm9rZWQgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vcmV2b2tlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAvLyBPSURDIEZyb250LUNoYW5uZWwgTG9nb3V0OiBsZXQgdGhlIGFwcHMgc2lnbmVkIGluIHRocm91Z2ggdGhpcyBzZXNzaW9uXG4gICAgICAvLyBjbGVhciB0aGVpcnMgaW4gdGhpcyBicm93c2VyIChoaWRkZW4gaWZyYW1lcywgY2FwcGVkIGF0IDUgcykuIEJlc3QtZWZmb3J0LlxuICAgICAgaWYgKG9wdGlvbnM/LmZyb250Y2hhbm5lbCAhPT0gZmFsc2UpIGF3YWl0IHJ1bkZyb250Q2hhbm5lbExvZ291dEZyb21SZXNwb25zZShyZXZva2VkKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIHRoaXMuX3VzZXIubmV4dChudWxsKTtcbiAgICB0aGlzLl9zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgdGhpcy5fY2xhaW1zLm5leHQobnVsbCk7XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChbXSk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uIChvciBgbnVsbGAgZm9yIHRoZSBwZXJzb25hbCBhY2NvdW50KS4gVGhlXG4gICAqIG5ldyB0b2tlbiBjYXJyaWVzIHRoZSBuZXcgb3JnIGNsYWltcywgc28gdGhlIGFwcCdzIHBlcm1pc3Npb24gY2hlY2tzIHVwZGF0ZVxuICAgKiB3aXRob3V0IGEgcmUtbG9naW4uXG4gICAqL1xuICBhc3luYyBzZXRBY3RpdmVPcmdhbml6YXRpb24ob3JnYW5pemF0aW9uSWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS90b3VjaGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3RpdmVfb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCB9KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm47XG5cbiAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd3Q6IHN0cmluZyB9O1xuICAgIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgY3VycmVudC5zZXNzaW9uSWQpO1xuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICAvKiogUmUtcmVhZCBgL3YxL2NsaWVudGA6IHJlZnJlc2ggdXNlciwgc2Vzc2lvbiwgbWVtYmVyc2hpcHMgYW5kIHN0YXR1cy4gKi9cbiAgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudCcpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdib290IGZhaWxlZCcpO1xuXG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICBzZXNzaW9uOiBBdGxhc1Nlc3Npb24gfCBudWxsO1xuICAgICAgICB1c2VyOiBBdGxhc1VzZXIgfCBudWxsO1xuICAgICAgICBqd3Q/OiBzdHJpbmc7XG4gICAgICAgIG9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcz86IEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFib2R5LnNlc3Npb24gfHwgIWJvZHkudXNlcikge1xuICAgICAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICAgICAgdGhpcy5fdXNlci5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9tZW1iZXJzaGlwcy5uZXh0KFtdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91c2VyLm5leHQoYm9keS51c2VyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb24ubmV4dChib2R5LnNlc3Npb24pO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChib2R5Lm9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcyA/PyBbXSk7XG4gICAgICBpZiAoYm9keS5qd3QpIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uLmlkKTtcbiAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfaW4nKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIGZhaWxlZCBib290IGlzIE5PVCBzaWduZWQtb3V0LiBSZW5kZXJpbmcgYSBzaWduLWluIGZvcm0gYmVjYXVzZSB0aGVcbiAgICAgIC8vIG5ldHdvcmsgaGljY3VwZWQgdGhyb3dzIGF3YXkgYSBwZXJmZWN0bHkgZ29vZCBzZXNzaW9uIGFuZCBmb3JjZXMgYVxuICAgICAgLy8gbmVlZGxlc3MgcmUtYXV0aGVudGljYXRpb24uIE9ubHkgcHJvbW90ZSBsb2FkaW5nIOKGkiBzaWduZWRfb3V0LlxuICAgICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSA9PT0gJ2xvYWRpbmcnKSB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogwqc2LjMgc3RlcCAzOiBjb21wbGV0ZSBhIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4sIHRoZW4gYm9vdC4gQW4gT0F1dGggb3JcbiAgICogaG9zdGVkLXBhZ2UgZmxvdyBsYW5kcyBiYWNrIHdpdGggYSBvbmUtdGltZSB0aWNrZXQgaW4gdGhlIFVSTDsgZXhjaGFuZ2UgaXRcbiAgICogZm9yIGNvb2tpZXMsIHNjcnViIHRoZSBVUkwgc28gYSByZWxvYWQgY2Fubm90IHJlcGxheSBpdCwgVEhFTiByZWFkIHRoZVxuICAgKiBzZXNzaW9uLiBBIHJlZGlyZWN0IGNhcnJ5aW5nIG9ubHkgYSBzdGF0dXMgKGEgc2Vjb25kIGZhY3RvciBpcyBzdGlsbCBvd2VkKVxuICAgKiBoYXMgbm8gdGlja2V0LCBzbyBub3RoaW5nIGlzIGV4Y2hhbmdlZCBhbmQgdGhlIGFwcCBib290cyBzaWduZWQtb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRSZWRpcmVjdFJlc3VsdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIGlmIChyZXN1bHQ/LnRpY2tldCkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF0dGVtcHRfaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHRpY2tldDogcmVzdWx0LnRpY2tldCB9KSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgZG9jdW1lbnQudGl0bGUsIHN0cmlwUmVkaXJlY3RQYXJhbXMod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFBlbmRpbmdBdHRlbXB0KCk6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRSZWRpcmVjdFJlc3VsdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4gcmVzdWx0Py5zdGF0dXMgJiYgIXJlc3VsdC50aWNrZXRcbiAgICAgID8geyBpZDogcmVzdWx0LmF0dGVtcHRJZCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChwYXRoOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5kb0ZldGNoKGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIC8vIENvb2tpZXMgY2FycnkgdGhlIHNlc3Npb247IGEgcmVxdWVzdCB3aXRob3V0IHRoaXMgaXMgaW5kaXN0aW5ndWlzaGFibGVcbiAgICAgIC8vIGZyb20gYmVpbmcgc2lnbmVkIG91dC5cbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXB1Ymxpc2hhYmxlLWtleSc6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICAgIC4uLihpbml0Py5ib2R5ID8geyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gOiB7fSksXG4gICAgICAgIC4uLmluaXQ/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRva2VuKGp3dDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IHJlYWRFeHBpcnkoand0KTtcbiAgICBpZiAoIWV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoeyBqd3QsIGV4cGlyZXNBdCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KGRlY29kZUNsYWltcyhqd3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG9rZW5zYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdyZWZyZXNoIGZhaWxlZCcpO1xuXG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd3Q6IHN0cmluZzsgc2Vzc2lvbl9pZDogc3RyaW5nIH07XG4gICAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbl9pZCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHNlc3Npb24gbWF5IGdlbnVpbmVseSBiZSBnb25lLiBSZS1ib290IHJhdGhlciB0aGFuIGd1ZXNzLlxuICAgICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogwqc3LjQ6IHByb2FjdGl2ZSwgaml0dGVyZWQgcmVmcmVzaCBzY2hlZHVsZWQgZnJvbSB0aGUgdG9rZW4ncyBvd24gZXhwaXJ5LiAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSAhPT0gJ3NpZ25lZF9pbicpIHJldHVybjtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgZGVsYXkgPSBtc1VudGlsUmVmcmVzaCh7IHRva2VuLCBub3c6IERhdGUubm93KCkgfSk7XG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5yZWZyZXNoKCksIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRGVjb2RlIGEgSldUIHBheWxvYWQgd2l0aG91dCB2ZXJpZnlpbmcgaXQg4oCUIGEgc2NoZWR1bGluZy9VSSBoaW50IG9ubHkuICovXG5mdW5jdGlvbiBkZWNvZGVDbGFpbXMoand0OiBzdHJpbmcpOiBTZXNzaW9uQ2xhaW1zIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gand0LnNwbGl0KCcuJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgYXRvYihwYXJ0c1sxXSEucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSksXG4gICAgKSBhcyBTZXNzaW9uQ2xhaW1zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
|
|
446
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLHFCQUFxQixFQUVyQixVQUFVLEVBQ1YsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6QixnQkFBZ0IsSUFBSSxrQkFBa0IsRUFDdEMsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsR0FLcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FJZCxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBZ0IsTUFBTSxRQUFRLENBQUM7O0FBUzNEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE1BQU0sT0FBTyxZQUFZO0lBQ04sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FB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R0FBWixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOztBQTZjbEMsNkVBQTZFO0FBQzdFLFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FDZixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUNyQyxDQUFDO0lBQ3JCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgU2lnbmFsLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRmFwaUNsaWVudCxcbiAgU2lnbk91dEd1YXJkLFxuICBjYXRhbG9nTG9jYWxlLFxuICBsb2NhbGl6ZWRFcnJvck1lc3NhZ2UsXG4gIHR5cGUgRXJyb3JMaWtlLFxuICBUb2tlbkNhY2hlLFxuICBjbG9zZU9BdXRoUG9wdXBBZnRlclNpZ25JbixcbiAgY29tcGxldGVPQXV0aFBvcHVwTGFuZGluZyxcbiAgZ2V0UHJvdmlkZXJUb2tlbiBhcyBmZXRjaFByb3ZpZGVyVG9rZW4sXG4gIG1hcE9BdXRoUG9wdXBQYXlsb2FkLFxuICBtc1VudGlsUmVmcmVzaCxcbiAgcmVhZEV4cGlyeSxcbiAgcmVhZFJlZGlyZWN0UmVzdWx0LFxuICByZXNvbHZlRnJvbnRlbmRBcGksXG4gIHN0cmlwUmVkaXJlY3RQYXJhbXMsXG4gIHR5cGUgUHJvdmlkZXJUb2tlbixcbiAgdHlwZSBSZWRpcmVjdFJlc3VsdCxcbiAgdHlwZSBTaWduT3V0T3B0aW9ucyxcbiAgdHlwZSBTaWduT3V0UmVzdWx0LFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IGV2YWx1YXRlLCB0eXBlIFByb3RlY3RDb25kaXRpb24gfSBmcm9tICdAYXRsYXNhdXRoL2F1dGh6JztcbmltcG9ydCB7IEFUTEFTX09QVElPTlMgfSBmcm9tICcuL2F0bGFzLmNvbmZpZyc7XG5pbXBvcnQge1xuICBjc3NWYXJpYWJsZXMsXG4gIGluc3RhbmNlRGVzaWduRnJvbSxcbiAgcmVuZGVyQXBwZWFyYW5jZSxcbiAgcmVzb2x2ZVRva2VucyxcbiAgdHlwZSBBcHBlYXJhbmNlLFxuICB0eXBlIEFwcGVhcmFuY2VSZW5kZXIsXG4gIHR5cGUgSW5zdGFuY2VEZXNpZ24sXG59IGZyb20gJy4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyBFTl9VUywgd2l0aEZhbGxiYWNrLCB0eXBlIENhdGFsb2cgfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHR5cGUge1xuICBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAsXG4gIEF0bGFzU2Vzc2lvbixcbiAgQXRsYXNVc2VyLFxuICBBdXRoU3RhdHVzLFxuICBTZXNzaW9uQ2xhaW1zLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBgQXRsYXNTZXJ2aWNlYCDigJQgdGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGA8QXRsYXNQcm92aWRlcj5gICsgaG9va3MuXG4gKlxuICogSXQgaG9sZHMgZXhhY3RseSBvbmUgdGhpbmcgdGhhdCBtYXR0ZXJzIGluIG1lbW9yeTogdGhlIHNob3J0LWxpdmVkIEpXVCwgaW4gYVxuICoge0BsaW5rIFRva2VuQ2FjaGV9LiBOb3QgbG9jYWxTdG9yYWdlLCBub3QgYSBjb29raWUgdGhpcyBjb2RlIHdyaXRlcyDigJQgdGhlXG4gKiByZWZyZXNoIHRva2VuIGlzIEh0dHBPbmx5IHNvIGJyb3dzZXIgc2NyaXB0IG5ldmVyIHRvdWNoZXMgaXQsIGFuZCB0aGUgSldUXG4gKiBsaXZlcyBvbmx5IGFzIGxvbmcgYXMgdGhlIHRhYi4gQW55dGhpbmcgcGVyc2lzdGVkIHdvdWxkIHN1cnZpdmUgdGhlIHRhYiBhbmRcbiAqIGJlY29tZSB0aGUgZmlyc3QgdGhpbmcgYW4gWFNTIHJlYWRzLlxuICpcbiAqIFJlYWN0aXZlIGF1dGggc3RhdGUgaXMgZXhwb3NlZCB0d28gd2F5cyBzbyBjYWxsZXJzIGNhbiBwaWNrIHRoZWlyIGlkaW9tOlxuICogIC0gUnhKUyBvYnNlcnZhYmxlcyAoYHVzZXIkYCwgYHNlc3Npb24kYCwgYGlzU2lnbmVkSW4kYCwg4oCmKSDigJQgdGhlIHByaW1hcnkgQVBJLFxuICogICAgdGhlIGFuYWxvZ3VlIG9mIHRoZSBSZWFjdCBob29rcycgcmV0dXJuIHZhbHVlcy5cbiAqICAtIEFuZ3VsYXIgc2lnbmFscyAoYHVzZXJgLCBgc2Vzc2lvbmAsIGBpc1NpZ25lZEluYCwg4oCmKSDigJQgdGhlIHNhbWUgdmFsdWVzIGFzXG4gKiAgICBgU2lnbmFsPFQ+YCwgZm9yIHRlbXBsYXRlcyBhbmQgYGNvbXB1dGVkKClgLlxuICpcbiAqIFRoZSBpbXBlcmF0aXZlIG1ldGhvZHMgKGBzaWduT3V0YCwgYGdldFRva2VuYCwgYGdldFByb3ZpZGVyVG9rZW5gLFxuICogYHNldEFjdGl2ZU9yZ2FuaXphdGlvbmAsIGByZWxvYWRgKSBtaXJyb3IgdGhlIGFjdGlvbnMgdGhlIGhvb2tzIHJldHVybi5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdGxhc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoQVRMQVNfT1BUSU9OUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvRmV0Y2g6IHR5cGVvZiBmZXRjaDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFRva2VuQ2FjaGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYXBpQ2xpZW50OiBGYXBpQ2xpZW50O1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNlc3Npb25zIHRoaXMgYnJvd3NlciBzaWduZWQgb3V0IG9mICh0b21ic3RvbmVzIGluIGxvY2FsU3RvcmFnZSwgcGVyXG4gICAqIEZyb250ZW5kIEFQSSBvcmlnaW4pLCB0aGUgcmV2b2tlIGFuZCBpdHMgYmFja2dyb3VuZCByZS10cmllcy4gRXZlcnkgcmVsb2FkIC9cbiAgICogcmVmcmVzaCBhc2tzIGl0IGJlZm9yZSBhZG9wdGluZyBhIHNlc3Npb24sIHNvIGEgc2lnbi1vdXQgdGhlIHNlcnZlciBuZXZlclxuICAgKiBjb25maXJtZWQgaXMgbm90IHVuZG9uZSBieSB0aGUgc3RpbGwtdmFsaWQgcmVmcmVzaCBjb29raWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGd1YXJkOiBTaWduT3V0R3VhcmQ7XG4gIHByaXZhdGUgc3RvcFdhdGNoaW5nU2lnbk91dDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nOiBDYXRhbG9nO1xuICAvKiogVGhlIGxhbmd1YWdlIGxheWVyIG9mIGBjYXRhbG9nYCAodGhlIGBsb2NhbGl6YXRpb25gIGJ1bmRsZSBhbG9uZTsgYEVOX1VTYCB3aGVuIG5vbmUpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQ2F0YWxvZzogQ2F0YWxvZztcbiAgLyoqIFNlbnQgdG8gdGhlIEZyb250ZW5kIEFQSSBhcyBgQWNjZXB0LUxhbmd1YWdlYDogdGhlIGBsb2NhbGl6YXRpb25gIGJ1bmRsZSdzIGBsb2NhbGVgIHRhZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0TG9jYWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgc2lnbi1pbiBhdHRlbXB0IGhhbmRlZCBiYWNrIGJ5IGFuIE9BdXRoIHJlZGlyZWN0IHRoYXQgc3RpbGwgbmVlZHMgYSBzZWNvbmRcbiAgICogZmFjdG9yIChubyBzZXNzaW9uIHdhcyBpc3N1ZWQpLiBOdWxsIGluIHRoZSBvcmRpbmFyeSBjYXNlOyB0aGUgYDxhdGxhcy1zaWduLWluPmBcbiAgICogZmxvdyBzZWVkcyBpdHNlbGYgZnJvbSB0aGlzIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIDJGQSBzdGVwLiBDYXB0dXJlZFxuICAgKiBvbmNlLCBzeW5jaHJvbm91c2x5LCBhdCBjb25zdHJ1Y3Rpb24g4oCUIGJlZm9yZSBhbnkgZmxvdyBjb21wb25lbnQgcmVhZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nQXR0ZW1wdDogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbDtcblxuICAvLyAtLS0gUmVhY3RpdmUgc3RhdGUgKHNvdXJjZSBvZiB0cnV0aCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdHVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoU3RhdHVzPignbG9hZGluZycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1VzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNTZXNzaW9uIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYWltcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbkNsYWltcyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW1iZXJzaGlwcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+KFtdKTtcblxuICAvKiogVGhlIHRocmVlLXN0YXRlIGF1dGggbGlmZWN5Y2xlOiBgbG9hZGluZ2Ag4oaSIGBzaWduZWRfaW5gIHwgYHNpZ25lZF9vdXRgLiAqL1xuICByZWFkb25seSBzdGF0dXMkOiBPYnNlcnZhYmxlPEF1dGhTdGF0dXM+ID0gdGhpcy5fc3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxBdGxhc1VzZXIgfCBudWxsPiA9IHRoaXMuX3VzZXIuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHNlc3Npb24kOiBPYnNlcnZhYmxlPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY2xhaW1zJDogT2JzZXJ2YWJsZTxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0aGlzLl9jbGFpbXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPVxuICAgIHRoaXMuX21lbWJlcnNoaXBzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcnVlIG9uY2UgdGhlIFNESyBoYXMgZmluaXNoZWQgaXRzIGZpcnN0IGJvb3QuIERpc3Rpbmd1aXNoaW5nIFwic3RpbGwgbG9hZGluZ1wiXG4gICAqIGZyb20gXCJzaWduZWQgb3V0XCIgaXMgd2hhdCBsZXRzIGEgdGVtcGxhdGUgYXZvaWQgdGhlIGZsYXNoIG9mIGEgc2lnbi1pbiBmb3JtXG4gICAqIG9uIGV2ZXJ5IHBhZ2UgbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyAhPT0gJ2xvYWRpbmcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzU2lnbmVkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzID09PSAnc2lnbmVkX2luJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICAvKiogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gbWVtYmVyc2hpcCwgZGVyaXZlZCBmcm9tIHRoZSB0b2tlbidzIGBvcmdfaWRgIGNsYWltLiAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24kOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fbWVtYmVyc2hpcHMsXG4gICAgdGhpcy5fY2xhaW1zLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbbWVtYmVyc2hpcHMsIGNsYWltc10pID0+XG4gICAgICAgIG1lbWJlcnNoaXBzLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBjbGFpbXM/Lm9yZ19pZCkgPz8gbnVsbCxcbiAgICApLFxuICApO1xuXG4gIC8vIC0tLSBTaWduYWwgbWlycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWFkb25seSBzdGF0dXM6IFNpZ25hbDxBdXRoU3RhdHVzPiA9IHRvU2lnbmFsKHRoaXMuc3RhdHVzJCwgeyBpbml0aWFsVmFsdWU6ICdsb2FkaW5nJyB9KTtcbiAgcmVhZG9ubHkgdXNlcjogU2lnbmFsPEF0bGFzVXNlciB8IG51bGw+ID0gdG9TaWduYWwodGhpcy51c2VyJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IHNlc3Npb246IFNpZ25hbDxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuc2Vzc2lvbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBjbGFpbXM6IFNpZ25hbDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLmNsYWltcyQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBtZW1iZXJzaGlwczogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9IHRvU2lnbmFsKHRoaXMubWVtYmVyc2hpcHMkLCB7XG4gICAgaW5pdGlhbFZhbHVlOiBbXSBhcyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXSxcbiAgfSk7XG4gIHJlYWRvbmx5IGlzTG9hZGVkOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpICE9PSAnbG9hZGluZycpO1xuICByZWFkb25seSBpc1NpZ25lZEluOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpID09PSAnc2lnbmVkX2luJyk7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9yZ0lkID0gdGhpcy5jbGFpbXMoKT8ub3JnX2lkO1xuICAgIHJldHVybiB0aGlzLm1lbWJlcnNoaXBzKCkuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IG9yZ0lkKSA/PyBudWxsO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucHVibGlzaGFibGVLZXkgPSBvcHRpb25zLnB1Ymxpc2hhYmxlS2V5O1xuICAgIC8vIFRocm93cyBhbiBgQXRsYXNDb25maWdFcnJvcmAgb24gYSBtaXNzaW5nL2ludmFsaWQgdmFsdWUgcmF0aGVyIHRoYW4gcXVpZXRseVxuICAgIC8vIHNlbmRpbmcgZXZlcnkgcmVxdWVzdCB0byBhIHJlbGF0aXZlIHBhdGggb24gdGhlIGFwcCdzIG9yaWdpbi5cbiAgICB0aGlzLmJhc2VVcmwgPSByZXNvbHZlRnJvbnRlbmRBcGkob3B0aW9ucy5mcm9udGVuZEFwaSwge1xuICAgICAgY29tcG9uZW50OiAncHJvdmlkZUF0bGFzKCkgLyBBdGxhc01vZHVsZS5mb3JSb290KCknLFxuICAgIH0pO1xuICAgIHRoaXMuZG9GZXRjaCA9IG9wdGlvbnMuZmV0Y2hJbXBsID8/ICgoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZmV0Y2g+KSA9PiBmZXRjaCguLi5hcmdzKSk7XG5cbiAgICB0aGlzLmNhdGFsb2cgPSBvcHRpb25zLmxvY2FsaXphdGlvbiA/IHdpdGhGYWxsYmFjayhvcHRpb25zLmxvY2FsaXphdGlvbikgOiBFTl9VUztcbiAgICB0aGlzLmVycm9yQ2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8/IEVOX1VTO1xuICAgIHRoaXMucmVxdWVzdExvY2FsZSA9IGNhdGFsb2dMb2NhbGUob3B0aW9ucy5sb2NhbGl6YXRpb24pO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICAgIGxvY2FsZTogdGhpcy5yZXF1ZXN0TG9jYWxlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5ndWFyZCA9IG5ldyBTaWduT3V0R3VhcmQoe1xuICAgICAgcmVxdWVzdDogKHBhdGgsIGluaXQpID0+IHRoaXMuY2FsbChwYXRoLCBpbml0KSxcbiAgICAgIGZyb250ZW5kQXBpOiB0aGlzLmJhc2VVcmwsXG4gICAgfSk7XG5cbiAgICAvLyBDYXB0dXJlZCBzeW5jaHJvbm91c2x5IChub3QgaW4gYW4gYXN5bmMgaW5pdCkgc28gaXQgaXMgYXZhaWxhYmxlIGJlZm9yZSBhbnlcbiAgICAvLyBmbG93IGNvbXBvbmVudCByZWFkcyBpdDogYSBuZWVkc19zZWNvbmRfZmFjdG9yIHJlZGlyZWN0IGNhcnJpZXMgYSBzdGF0dXMgYnV0XG4gICAgLy8gbm8gdGlja2V0LCBhbmQgdGhhdCBpcyB3aGF0IHRoZSAyRkEgcmVzdW1lIHNlZWRzIGZyb20uXG4gICAgdGhpcy5wZW5kaW5nQXR0ZW1wdCA9IHRoaXMuaXNCcm93c2VyID8gdGhpcy5yZWFkUGVuZGluZ0F0dGVtcHQoKSA6IG51bGw7XG5cbiAgICAvLyBCb290IG9uY2UsIGJyb3dzZXIgb25seS4gT24gdGhlIHNlcnZlciB0aGVyZSBpcyBubyBjb29raWUgamFyIHRvIHJlYWQgYVxuICAgIC8vIHNlc3Npb24gZnJvbSwgc28gd2UgbGVhdmUgdGhlIHN0YXRlIGF0IGBsb2FkaW5nYCBhbmQgbGV0IGh5ZHJhdGlvbiBib290IGl0LlxuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgLy8gQW5vdGhlciB0YWIgc2lnbmVkIG91dCBvZiBUSElTIHNlc3Npb24gKGl0cyB0b21ic3RvbmUgcmVhY2hlZCB0aGUgc2hhcmVkXG4gICAgICAvLyBzdG9yZSk6IGRyb3AgdGhlIHRva2VuIGFuZCByZS1jaGVjaywgd2hpY2ggdGhlbiByZWZ1c2VzIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5zdG9wV2F0Y2hpbmdTaWduT3V0ID0gdGhpcy5ndWFyZC53YXRjaChcbiAgICAgICAgKCkgPT4gdGhpcy5jYWNoZS5wZWVrKCk/LnNlc3Npb25JZCA/PyB0aGlzLl9zZXNzaW9uLnZhbHVlPy5pZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB2b2lkIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdm9pZCB0aGlzLmJvb3QoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BXYXRjaGluZ1NpZ25PdXQ/LigpO1xuICAgIHRoaXMuc3RvcFdhdGNoaW5nU2lnbk91dCA9IG51bGw7XG4gICAgdGhpcy5ndWFyZC5kaXNwb3NlKCk7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuX3N0YXR1cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3VzZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xhaW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIC0tLSBDb25maWd1cmF0aW9uIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBnZXQgYXBwZWFyYW5jZSgpOiBBcHBlYXJhbmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwcGVhcmFuY2U7XG4gIH1cblxuICBnZXQgbG9jYWxpemF0aW9uKCk6IENhdGFsb2cge1xuICAgIHJldHVybiB0aGlzLmNhdGFsb2c7XG4gIH1cblxuICBnZXQgZnJvbnRlbmRBcGkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsO1xuICB9XG5cbiAgLyoqIFRoZSBgQWNjZXB0LUxhbmd1YWdlYCBzZW50IHRvIHRoZSBGcm9udGVuZCBBUEk6IHRoZSBgbG9jYWxpemF0aW9uYCBidW5kbGUncyBgbG9jYWxlYCB0YWcsIGlmIGFueS4gKi9cbiAgZ2V0IGxvY2FsZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gc2hvdyBmb3IgYSBzZXJ2ZXIgZXJyb3IsIGluIHRoZSBhcHAncyBsYW5ndWFnZTogdGhlIGNhdGFsb2cnc1xuICAgKiBgZXJyb3IuPHJlYXNvbj5gIChsb29rZWQgdXAgaW4gdGhlIGBsb2NhbGl6YXRpb25gIGJ1bmRsZSwgb3IgYEVOX1VTYCB3aGVuXG4gICAqIG5vbmUgaXMgc2V0KSwgZWxzZSB0aGUgc2VydmVyJ3MgbWVzc2FnZSwgZWxzZSBgZXJyb3IuZ2VuZXJpY2AuXG4gICAqL1xuICBlcnJvclRleHQoZXJyb3I6IEVycm9yTGlrZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBsb2NhbGl6ZWRFcnJvck1lc3NhZ2UoZXJyb3IsIHRoaXMuZXJyb3JDYXRhbG9nLCB0aGlzLmNhdGFsb2cpO1xuICB9XG5cbiAgLyoqIFRoZSBjYXRhbG9nIHNlcnZlciBlcnJvcnMgYXJlIGxvb2tlZCB1cCBpbiAoc2VlIHtAbGluayBlcnJvclRleHR9KS4gKi9cbiAgZ2V0IGVycm9yTG9jYWxpemF0aW9uKCk6IENhdGFsb2cge1xuICAgIHJldHVybiB0aGlzLmVycm9yQ2F0YWxvZztcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBhcHBlYXJhbmNlIHJlbmRlciBmb3IgYSByb290IGVsZW1lbnQ6IGlubGluZSB2YXJpYWJsZXMsIHRoZVxuICAgKiBgZGF0YS1hdGxhcy0qYCBhdHRyaWJ1dGVzIGFuZCB0aGUgZGVzaWduIHN0eWxlc2hlZXQuIFBhc3MgdGhlIGRhc2hib2FyZFxuICAgKiBkZXNpZ24gKGZyb20ge0BsaW5rIGxvYWRJbnN0YW5jZURlc2lnbn0pIHRvIGxheWVyIGNvZGUgb3ZlcnJpZGVzIG9uIGl0IOKAlFxuICAgKiB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYEBhdGxhc2F1dGgvcmVhY3RgLlxuICAgKi9cbiAgYXBwZWFyYW5jZVJlbmRlcihpbnN0YW5jZURlc2lnbj86IEluc3RhbmNlRGVzaWduIHwgbnVsbCk6IEFwcGVhcmFuY2VSZW5kZXIge1xuICAgIHJldHVybiByZW5kZXJBcHBlYXJhbmNlKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiA/PyBudWxsLCB7XG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpZ24gY29uZmlndXJlZCBpbiB0aGUgQXRsYXMgZGFzaGJvYXJkIChgR0VUIC92MS9hcHBlYXJhbmNlYCksIG9yIG51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBjYW5ub3QgYmUgcmVhZCwgb3IgdGhlIGFwcCBvcHRlZCBvdXQgd2l0aFxuICAgKiBgYXBwZWFyYW5jZS5pbnN0YW5jZURlc2lnbjogZmFsc2VgLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluc3RhbmNlRGVzaWduKCk6IFByb21pc2U8SW5zdGFuY2VEZXNpZ24gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlPy5pbnN0YW5jZURlc2lnbiA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2FwcGVhcmFuY2UnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vayA/IGluc3RhbmNlRGVzaWduRnJvbShhd2FpdCByZXNwb25zZS5qc29uKCkpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7XG4gICAgICBwdWJsaXNoYWJsZUtleTogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgIGxvY2FsZTogdGhpcy5yZXF1ZXN0TG9jYWxlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tIEltcGVyYXRpdmUgQVBJIChtaXJyb3JzIHRoZSBSZWFjdCBob29rcycgYWN0aW9ucykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzZXNzaW9uJ3MgSldULCBhbHdheXMgZnJlc2g6IGlmIHRoZSBjYWNoZWQgdG9rZW4gaXMgd2l0aGluIDVzIG9mXG4gICAqIGV4cGlyeSBpdCBpcyByZWZyZXNoZWQgZmlyc3QgcmF0aGVyIHRoYW4gaGFuZGVkIG92ZXIuIE51bGwgd2hlbiBzaWduZWQgb3V0LlxuICAgKi9cbiAgYXN5bmMgZ2V0VG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgdXNhYmxlID0gdGhpcy5jYWNoZS5nZXQoNV8wMDApO1xuICAgIGlmICh1c2FibGUpIHJldHVybiB1c2FibGUuand0O1xuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KDVfMDAwKT8uand0ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpZ25lZC1pbiB1c2VyJ3MgT1dOIGxpdmUgYWNjZXNzIHRva2VuIGF0IGEgY29ubmVjdGVkIHByb3ZpZGVyIChHb29nbGUsXG4gICAqIEdpdEh1Yiwg4oCmKSwgc28gdGhlIGFwcCBjYW4gY2FsbCB0aGF0IHByb3ZpZGVyJ3MgQVBJIGZyb20gdGhlIGJyb3dzZXIuIE51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBubyB1c2FibGUgdG9rZW4g4oCUIG5vIGxpbmtlZCBhY2NvdW50LCBvciB0aGUgcHJvdmlkZXIgZ3JhbnRlZCAvXG4gICAqIGtlcHQgbm9uZS4gVGhlIHNlcnZlciByZWZyZXNoZXMgYSBzdGFsZSB0b2tlbiBvbiByZWFkOyB0aGUgcmVmcmVzaCB0b2tlbiBpc1xuICAgKiBuZXZlciBleHBvc2VkLlxuICAgKi9cbiAgZ2V0UHJvdmlkZXJUb2tlbihwcm92aWRlcjogc3RyaW5nKTogUHJvbWlzZTxQcm92aWRlclRva2VuIHwgbnVsbD4ge1xuICAgIHJldHVybiBmZXRjaFByb3ZpZGVyVG9rZW4odGhpcy5mYXBpQ2xpZW50LCBwcm92aWRlcik7XG4gIH1cblxuICAvKiogSW1wZXJhdGl2ZSBgaGFzKClgIOKAlCB0aGUgc2FtZSBldmFsdWF0aW9uIGAqYXRsYXNQcm90ZWN0YCByZW5kZXJzIG9uLiAqL1xuICBoYXMoY29uZGl0aW9uOiBQcm90ZWN0Q29uZGl0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2YWx1YXRlKHRoaXMuX2NsYWltcy52YWx1ZSwgY29uZGl0aW9uKS5hbGxvd2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZSB0aGUgY3VycmVudCBzZXNzaW9uIHNlcnZlci1zaWRlIGFuZCBkcm9wIGFsbCBsb2NhbCBhdXRoIHN0YXRlLlxuICAgKlxuICAgKiBUaGUgc2Vzc2lvbiBpZCBpcyByZW1lbWJlcmVkIGJlZm9yZSB0aGUgcmV2b2tlIChhIHRvbWJzdG9uZSBzaGFyZWQgYnkgZXZlcnlcbiAgICogdGFiKSwgc28gYSByZWxvYWQsIGEgdG9rZW4gcmVmcmVzaCwgYSBzaWJsaW5nIHRhYiBvciBhIHRhYiBvcGVuZWQgbGF0ZXIgbmV2ZXJcbiAgICogcmUtYWRvcHRzIGl0IOKAlCBldmVuIHdoZW4gdGhlIHJldm9rZSBmYWlsZWQgKGl0IGlzIHJldHJpZWQgb25jZSwgdGhlbiBhZ2FpbiBpblxuICAgKiB0aGUgYmFja2dyb3VuZCkgYW5kIHRoZSByZWZyZXNoIGNvb2tpZSBpcyBzdGlsbCB2YWxpZC4gUmVzb2x2ZXNcbiAgICogYHsgcmV2b2tlZCwgYWN0aXZlU2Vzc2lvbklkPyB9YDsgd2l0aCBgeyBzdHJpY3Q6IHRydWUgfWAgYW4gdW5jb25maXJtZWQgcmV2b2tlXG4gICAqIHJlamVjdHMgd2l0aCBhIGBTaWduT3V0RXJyb3JgIGluc3RlYWQgKGFmdGVyIHRoZSBsb2NhbCBzaWduLW91dCkuIEEgcGFya2VkXG4gICAqIHNlc3Npb24gdGhlIHNlcnZlciBwcm9tb3RlZCBvbiByZXZva2UgaXMgYWRvcHRlZC4gRnJvbnQtY2hhbm5lbCBsb2dvdXQgcnVuc1xuICAgKiB1bmxlc3MgYHsgZnJvbnRjaGFubmVsOiBmYWxzZSB9YC5cbiAgICovXG4gIGFzeW5jIHNpZ25PdXQob3B0aW9uczogU2lnbk91dE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbk91dFJlc3VsdD4ge1xuICAgIC8vIFdpdGggbm8gY2FjaGVkIHRva2VuIHRoZSBndWFyZCBmaW5kcyB0aGUgY29va2llIHNlc3Npb24gaXRzZWxmXG4gICAgLy8gKEdFVCAvdjEvY2xpZW50KSwgc28gYSBtaXNzaW5nIEpXVCBuZXZlciBza2lwcyB0aGUgcmV2b2tlLlxuICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuY2FjaGUucGVlaygpPy5zZXNzaW9uSWQgPz8gdGhpcy5fc2Vzc2lvbi52YWx1ZT8uaWQgPz8gbnVsbDtcbiAgICBjb25zdCBhdHRlbXB0ID0gYXdhaXQgdGhpcy5ndWFyZC5yZXZva2Uoc2Vzc2lvbklkLCBvcHRpb25zKTtcbiAgICB0aGlzLmNsZWFyTG9jYWxTdGF0ZSgpO1xuICAgIGlmICh0aGlzLmd1YXJkLnByb21vdGVkKGF0dGVtcHQpKSBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIHJldHVybiB0aGlzLmd1YXJkLnNldHRsZShhdHRlbXB0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKG9yIGBudWxsYCBmb3IgdGhlIHBlcnNvbmFsIGFjY291bnQpLiBUaGVcbiAgICogbmV3IHRva2VuIGNhcnJpZXMgdGhlIG5ldyBvcmcgY2xhaW1zLCBzbyB0aGUgYXBwJ3MgcGVybWlzc2lvbiBjaGVja3MgdXBkYXRlXG4gICAqIHdpdGhvdXQgYSByZS1sb2dpbi5cbiAgICovXG4gIGFzeW5jIHNldEFjdGl2ZU9yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKGAvdjEvY2xpZW50L3Nlc3Npb25zLyR7Y3VycmVudC5zZXNzaW9uSWR9L3RvdWNoYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGl2ZV9vcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybjtcblxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGp3dDogc3RyaW5nIH07XG4gICAgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBjdXJyZW50LnNlc3Npb25JZCk7XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIC8qKiBSZS1yZWFkIGAvdjEvY2xpZW50YDogcmVmcmVzaCB1c2VyLCBzZXNzaW9uLCBtZW1iZXJzaGlwcyBhbmQgc3RhdHVzLiAqL1xuICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50Jyk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ2Jvb3QgZmFpbGVkJyk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIHNlc3Npb246IEF0bGFzU2Vzc2lvbiB8IG51bGw7XG4gICAgICAgIHVzZXI6IEF0bGFzVXNlciB8IG51bGw7XG4gICAgICAgIGp3dD86IHN0cmluZztcbiAgICAgICAgb3JnYW5pemF0aW9uX21lbWJlcnNoaXBzPzogQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW107XG4gICAgICB9O1xuXG4gICAgICAvLyBBIHNlc3Npb24gdGhpcyBicm93c2VyIHNpZ25lZCBvdXQgb2YgaXMgbmV2ZXIgcmUtYWRvcHRlZCBmcm9tIHRoZVxuICAgICAgLy8gcmVmcmVzaCBjb29raWU7IHRoZSBndWFyZCByZS10cmllcyBpdHMgcmV2b2tlIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgaWYgKCFib2R5LnNlc3Npb24gfHwgIWJvZHkudXNlciB8fCB0aGlzLmd1YXJkLnJlZnVzZShib2R5LnNlc3Npb24uaWQpKSB7XG4gICAgICAgIHRoaXMuY2xlYXJMb2NhbFN0YXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXNlci5uZXh0KGJvZHkudXNlcik7XG4gICAgICB0aGlzLl9zZXNzaW9uLm5leHQoYm9keS5zZXNzaW9uKTtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoYm9keS5vcmdhbml6YXRpb25fbWVtYmVyc2hpcHMgPz8gW10pO1xuICAgICAgaWYgKGJvZHkuand0KSB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbi5pZCk7XG4gICAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX2luJyk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBmYWlsZWQgYm9vdCBpcyBOT1Qgc2lnbmVkLW91dC4gUmVuZGVyaW5nIGEgc2lnbi1pbiBmb3JtIGJlY2F1c2UgdGhlXG4gICAgICAvLyBuZXR3b3JrIGhpY2N1cGVkIHRocm93cyBhd2F5IGEgcGVyZmVjdGx5IGdvb2Qgc2Vzc2lvbiBhbmQgZm9yY2VzIGFcbiAgICAgIC8vIG5lZWRsZXNzIHJlLWF1dGhlbnRpY2F0aW9uLiBPbmx5IHByb21vdGUgbG9hZGluZyDihpIgc2lnbmVkX291dC5cbiAgICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgPT09ICdsb2FkaW5nJykgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gSW50ZXJuYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIMKnNi4zIHN0ZXAgMzogY29tcGxldGUgYSByZWRpcmVjdC1iYXNlZCBzaWduLWluLCB0aGVuIGJvb3QuIEFuIE9BdXRoIG9yXG4gICAqIGhvc3RlZC1wYWdlIGZsb3cgbGFuZHMgYmFjayB3aXRoIGEgb25lLXRpbWUgdGlja2V0IGluIHRoZSBVUkw7IGV4Y2hhbmdlIGl0XG4gICAqIGZvciBjb29raWVzLCBzY3J1YiB0aGUgVVJMIHNvIGEgcmVsb2FkIGNhbm5vdCByZXBsYXkgaXQsIFRIRU4gcmVhZCB0aGVcbiAgICogc2Vzc2lvbi4gQSByZWRpcmVjdCBjYXJyeWluZyBvbmx5IGEgc3RhdHVzIChhIHNlY29uZCBmYWN0b3IgaXMgc3RpbGwgb3dlZClcbiAgICogaGFzIG5vIHRpY2tldCwgc28gbm90aGluZyBpcyBleGNoYW5nZWQgYW5kIHRoZSBhcHAgYm9vdHMgc2lnbmVkLW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmcm9tVXJsID0gcmVhZFJlZGlyZWN0UmVzdWx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIGxldCByZXN1bHQ6IFJlZGlyZWN0UmVzdWx0IHwgbnVsbCA9IGZyb21Vcmw7XG5cbiAgICAvLyDCp29hdXRoIHBvcHVwIG1vZGU6IHRoaXMgcGFnZSBtYXkgYmUgdGhlIGxhbmRpbmcgb2YgYSBzaWduLWluIHBvcHVwIHdob3NlXG4gICAgLy8gb3BlbmVyIGEgQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kgc2V2ZXJlZCAoYCNhdGxhc19wb3B1cF9yZXN1bHQ94oCmYCkuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyByZWxheWVkIHRvIHRoZSBvcGVuZXIsIHdoaWNoIHJlZGVlbXMgdGhlIHRpY2tldCwgYW5kIHRoaXNcbiAgICAvLyB3aW5kb3cgY2xvc2VzLiBJZiBubyBvcGVuZXIgdGFrZXMgaXQgKGl0cyB0YWIgaXMgZ29uZSksIGZpbmlzaCBoZXJlIGxpa2VcbiAgICAvLyBhIHJlZGlyZWN0LlxuICAgIGNvbnN0IGxhbmRpbmcgPSBhd2FpdCBjb21wbGV0ZU9BdXRoUG9wdXBMYW5kaW5nKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKGxhbmRpbmcgJiYgIWxhbmRpbmcuZGVsaXZlcmVkKSB7XG4gICAgICBjb25zdCBvdXRjb21lID0gbWFwT0F1dGhQb3B1cFBheWxvYWQobGFuZGluZy5wYXlsb2FkKTtcbiAgICAgIGlmIChvdXRjb21lPy50aWNrZXQgJiYgb3V0Y29tZS5hdHRlbXB0SWQpIHtcbiAgICAgICAgcmVzdWx0ID0geyBhdHRlbXB0SWQ6IG91dGNvbWUuYXR0ZW1wdElkLCB0aWNrZXQ6IG91dGNvbWUudGlja2V0IH07XG4gICAgICB9IGVsc2UgaWYgKG91dGNvbWU/LmNvbnRpbnVhdGlvblVybCkge1xuICAgICAgICAvLyBBIHNlY29uZCBmYWN0b3IgLyBjb25uZWN0IHN0ZXAgLyBwcm92aWRlciBlcnJvcjogdGhlIHJlZGlyZWN0IGZsb3cncyBwYWdlLlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShvdXRjb21lLmNvbnRpbnVhdGlvblVybCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXhjaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdD8udGlja2V0KSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdHRlbXB0X2lkOiByZXN1bHQuYXR0ZW1wdElkLCB0aWNrZXQ6IHJlc3VsdC50aWNrZXQgfSksXG4gICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgZXhjaGFuZ2VkID0gISFyZXNwb25zZT8ub2s7XG4gICAgfVxuICAgIGlmIChmcm9tVXJsKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBzdHJpcFJlZGlyZWN0UGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgLy8gU2lnbmVkIGluIGluc2lkZSB0aGUgQXRsYXMgcG9wdXAgKHRoZSByZWRpcmVjdCBmbG93IHJhbiBpbiBpdCk6IGhhbmQgYmFja1xuICAgIC8vIHRvIHRoZSB3YWl0aW5nIG9wZW5lciBhbmQgY2xvc2UuIEEgbm8tb3AgaW4gYW4gb3JkaW5hcnkgdGFiLlxuICAgIGlmIChleGNoYW5nZWQpIHZvaWQgY2xvc2VPQXV0aFBvcHVwQWZ0ZXJTaWduSW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFBlbmRpbmdBdHRlbXB0KCk6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRSZWRpcmVjdFJlc3VsdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4gcmVzdWx0Py5zdGF0dXMgJiYgIXJlc3VsdC50aWNrZXRcbiAgICAgID8geyBpZDogcmVzdWx0LmF0dGVtcHRJZCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChwYXRoOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5kb0ZldGNoKGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIC8vIENvb2tpZXMgY2FycnkgdGhlIHNlc3Npb247IGEgcmVxdWVzdCB3aXRob3V0IHRoaXMgaXMgaW5kaXN0aW5ndWlzaGFibGVcbiAgICAgIC8vIGZyb20gYmVpbmcgc2lnbmVkIG91dC5cbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXB1Ymxpc2hhYmxlLWtleSc6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICAgIC4uLihpbml0Py5ib2R5ID8geyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gOiB7fSksXG4gICAgICAgIC4uLmluaXQ/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRva2VuKGp3dDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEFuIGluLWZsaWdodCByZWZyZXNoIG11c3Qgbm90IHJlc3VycmVjdCBhIHNlc3Npb24gc2lnbmVkIG91dCBtZWFud2hpbGUuXG4gICAgaWYgKHRoaXMuZ3VhcmQuaXNTaWduZWRPdXQoc2Vzc2lvbklkKSkgcmV0dXJuO1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IHJlYWRFeHBpcnkoand0KTtcbiAgICBpZiAoIWV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoeyBqd3QsIGV4cGlyZXNBdCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KGRlY29kZUNsYWltcyhqd3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG9rZW5zYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdyZWZyZXNoIGZhaWxlZCcpO1xuXG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd3Q6IHN0cmluZzsgc2Vzc2lvbl9pZDogc3RyaW5nIH07XG4gICAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbl9pZCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHNlc3Npb24gbWF5IGdlbnVpbmVseSBiZSBnb25lLiBSZS1ib290IHJhdGhlciB0aGFuIGd1ZXNzLlxuICAgICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTG9jYWxTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgdGhpcy5fdXNlci5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Nlc3Npb24ubmV4dChudWxsKTtcbiAgICB0aGlzLl9jbGFpbXMubmV4dChudWxsKTtcbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5uZXh0KFtdKTtcbiAgfVxuXG4gIC8qKiDCpzcuNDogcHJvYWN0aXZlLCBqaXR0ZXJlZCByZWZyZXNoIHNjaGVkdWxlZCBmcm9tIHRoZSB0b2tlbidzIG93biBleHBpcnkuICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICBpZiAodGhpcy5fc3RhdHVzLnZhbHVlICE9PSAnc2lnbmVkX2luJykgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSByZXR1cm47XG5cbiAgICBjb25zdCBkZWxheSA9IG1zVW50aWxSZWZyZXNoKHsgdG9rZW4sIG5vdzogRGF0ZS5ub3coKSB9KTtcbiAgICB0aGlzLnJlZnJlc2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJlZnJlc2goKSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcik7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKiBEZWNvZGUgYSBKV1QgcGF5bG9hZCB3aXRob3V0IHZlcmlmeWluZyBpdCDigJQgYSBzY2hlZHVsaW5nL1VJIGhpbnQgb25seS4gKi9cbmZ1bmN0aW9uIGRlY29kZUNsYWltcyhqd3Q6IHN0cmluZyk6IFNlc3Npb25DbGFpbXMgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBqd3Quc3BsaXQoJy4nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBhdG9iKHBhcnRzWzFdIS5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpKSxcbiAgICApIGFzIFNlc3Npb25DbGFpbXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|