@atlasauth/angular 0.12.0 → 0.14.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.
@@ -1,5 +1,5 @@
1
1
  import { signal } from '@angular/core';
2
- import { advanceWithCaptcha, atlasCaptchaLabels, createCaptchaController, createPasskeySignUp, createSignUp, finishPasskeySignUp, fetchInstanceSettings, fetchLastSignInMethod, createMfaEnrollment, acknowledgeRecoveryCodes, pendingRecoveryCodes, mfaChoicesFrom, prepareSecondFactorCode, resendSignUpVerification, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, PolicyAcceptanceController, loadPolicies, } from '@atlasauth/js';
2
+ import { advanceWithCaptcha, atlasCaptchaLabels, attemptPasswordHoldProof, preparePasswordHoldProof, createCaptchaController, createPasskeySignInController, createPasskeySignUp, createSignUp, finishPasskeySignUp, fetchInstanceSettings, fetchLastSignInMethod, startSignInWithAtlas, createMfaEnrollment, acknowledgeExistingAccount, acknowledgeRecoveryCodes, pendingExistingAccountNotice, pendingRecoveryCodes, mfaChoicesFrom, prepareSecondFactorCode, resendSignUpVerification, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, PolicyAcceptanceController, loadPolicies, } from '@atlasauth/js';
3
3
  import { EN_US, translate } from '../i18n';
4
4
  /**
5
5
  * The server-driven sign-in / sign-up engine, shared by `<atlas-sign-in>` and
@@ -19,6 +19,7 @@ export class AtlasFlowController {
19
19
  client;
20
20
  reload;
21
21
  t;
22
+ holdExistingAccountNotice;
22
23
  state;
23
24
  /**
24
25
  * The instance's public sign-in / sign-up settings (captcha, sign-up fields,
@@ -70,23 +71,60 @@ export class AtlasFlowController {
70
71
  * {@link create} sends their acceptances and reloads them after a refusal.
71
72
  */
72
73
  policies = new PolicyAcceptanceController([]);
74
+ /**
75
+ * Passkey sign-in (the "Sign in with a passkey" button and passkey autofill on
76
+ * the identifier field). The outcome goes through the same completion as every sign-in.
77
+ */
78
+ passkey;
79
+ /** Whether this browser can run WebAuthn; `<atlas-sign-in>` sets it after it is created in a browser. */
80
+ passkeySupported = signal(false);
73
81
  pollTimer = null;
74
82
  identifier = '';
75
83
  constructor(client, reload, pending,
76
84
  /** Resolves the captcha messages' catalog keys. Defaults to en-US. */
77
- t = (key) => translate(EN_US, key)) {
85
+ t = (key) => translate(EN_US, key),
86
+ /** Wait for {@link continueAfterExistingAccount} (`<atlas-sign-up>` draws the notice). */
87
+ holdExistingAccountNotice = false) {
78
88
  this.client = client;
79
89
  this.reload = reload;
80
90
  this.t = t;
91
+ this.holdExistingAccountNotice = holdExistingAccountNotice;
81
92
  // Seeded from a redirect that came back mid-flow (e.g. OAuth needing a second
82
93
  // factor) so the user resumes at the demanded step instead of starting over.
83
94
  this.state = signal(pending ? flowFromPending(pending) : initialFlow);
84
95
  this.enrollment = createMfaEnrollment(this.client, () => this.mfaChoices());
85
96
  this.enrollmentState = signal(this.enrollment.state);
86
97
  this.enrollment.subscribe((next) => this.enrollmentState.set(next));
98
+ this.passkey = createPasskeySignInController({
99
+ client: this.client,
100
+ onStart: () => this.state.update((current) => ({ ...current, busy: true, errors: [] })),
101
+ onResult: (next) => this.finish(next),
102
+ captcha: () => this.captcha,
103
+ cancelledMessage: () => this.t('signIn.passkeyCancelled'),
104
+ });
87
105
  this.syncCaptcha();
88
106
  this.syncEnrollment();
89
107
  }
108
+ /** Why "Continue with Atlas" could not start (the server's message); null otherwise. */
109
+ signInWithAtlasError = signal(null);
110
+ /**
111
+ * "Continue with Atlas" (when `settings().signInWithAtlas` is set): starts the
112
+ * SSO sign-in and sends the browser to Atlas.
113
+ */
114
+ async signInWithAtlas(connectionId) {
115
+ if (typeof window === 'undefined')
116
+ return;
117
+ this.signInWithAtlasError.set(null);
118
+ const started = await startSignInWithAtlas(this.client, connectionId, window.location.href);
119
+ if ('url' in started)
120
+ window.location.assign(started.url);
121
+ else
122
+ this.signInWithAtlasError.set(started.error);
123
+ }
124
+ /** "Sign in with a passkey" is offered: the first step, the instance turned passkey sign-in on, and the browser can. */
125
+ passkeyOffered() {
126
+ return this.passkeySupported() && !this.state().attempt && this.settings()?.passkeySignIn === true;
127
+ }
90
128
  /** What the app lets the MFA steps offer (from {@link settings}). */
91
129
  mfaChoices() {
92
130
  return mfaChoicesFrom(this.settings()?.account);
@@ -117,9 +155,27 @@ export class AtlasFlowController {
117
155
  firstFactors() {
118
156
  const attempt = this.state().attempt;
119
157
  const step = attempt ? nextStep(attempt) : null;
120
- return step?.kind === 'collect_first_factor'
121
- ? offeredFirstFactors(step.strategies, this.settings()?.emailDelivery)
122
- : [];
158
+ if (step?.kind !== 'collect_first_factor')
159
+ return [];
160
+ const offered = offeredFirstFactors(step.strategies, this.settings()?.emailDelivery);
161
+ const proof = this.holdProof();
162
+ return proof && !offered.includes(proof) ? [...offered, proof] : offered;
163
+ }
164
+ /**
165
+ * The emailed proof a password hold still waits on (`FlowState.passwordHold`): the
166
+ * code, or a link where the instance verifies by link only. Null with no hold, once
167
+ * proven, or while the app cannot deliver email.
168
+ */
169
+ holdProof() {
170
+ const hold = this.state().passwordHold;
171
+ if (!hold || hold.released || this.settings()?.emailDelivery?.available === false)
172
+ return null;
173
+ return this.settings()?.account?.emailVerification === 'link' ? 'email_link' : 'email_code';
174
+ }
175
+ /** Back from the emailed factor to the password field. */
176
+ usePassword() {
177
+ this.preparedFactor.set(null);
178
+ this.state.update((current) => ({ ...current, prepared: null, pollSecret: null, errors: [] }));
123
179
  }
124
180
  /**
125
181
  * True when email + password sign-up cannot complete because the app cannot
@@ -136,16 +192,21 @@ export class AtlasFlowController {
136
192
  /**
137
193
  * Ask the server to email a sign-in code for the current `needs_first_factor`
138
194
  * step (`POST …/prepare_first_factor`); the form then collects the code, which
139
- * {@link submit} posts as the `email_code` strategy.
195
+ * {@link submit} posts as the `email_code` strategy. While a password hold waits
196
+ * on it ({@link holdProof}), this emails that proof instead.
140
197
  */
141
198
  async prepare(strategy) {
142
199
  if (!this.firstFactors().includes(strategy))
143
200
  return;
201
+ const proof = this.holdProof();
144
202
  this.state.update((current) => ({ ...current, busy: true, errors: [] }));
145
- const next = await prepareFactor(this.client, this.state(), strategy);
203
+ const next = strategy === proof
204
+ ? await preparePasswordHoldProof(this.client, this.state(), proof)
205
+ : await prepareFactor(this.client, this.state(), strategy);
146
206
  this.setState(next);
147
207
  if (!next.errors.length)
148
208
  this.preparedFactor.set(strategy);
209
+ this.syncPolling();
149
210
  }
150
211
  /** Keep both captchas in step with the settings and the flow's current step. */
151
212
  syncCaptcha() {
@@ -161,8 +222,12 @@ export class AtlasFlowController {
161
222
  this.signUpCaptchaDrawn.set(this.signUpCaptcha.needed);
162
223
  }
163
224
  setState(next) {
164
- const previousId = this.state().attempt?.id ?? null;
225
+ const previous = this.state();
226
+ const previousId = previous.attempt?.id ?? null;
165
227
  this.state.set(next);
228
+ // A proven hold goes back to the password field.
229
+ if (next.passwordHold?.released && !previous.passwordHold?.released)
230
+ this.preparedFactor.set(null);
166
231
  // A prepared factor belongs to the first-factor step it was sent for.
167
232
  if (next.attempt?.status !== 'needs_first_factor')
168
233
  this.preparedFactor.set(null);
@@ -198,6 +263,11 @@ export class AtlasFlowController {
198
263
  */
199
264
  async submit(values) {
200
265
  this.state.update((current) => ({ ...current, busy: true, errors: [] }));
266
+ // A code that lifts a password hold goes to its own attempt, not this sign-in.
267
+ if (this.preparedFactor() === 'email_code' && this.holdProof() === 'email_code') {
268
+ this.setState(await attemptPasswordHoldProof(this.client, this.state(), values.code ?? ''));
269
+ return;
270
+ }
201
271
  const out = await advanceWithCaptcha(this.client, this.state(), values, {
202
272
  captcha: this.captcha,
203
273
  identifier: this.identifier,
@@ -293,6 +363,14 @@ export class AtlasFlowController {
293
363
  async saveRecoveryCodes() {
294
364
  await this.finish(acknowledgeRecoveryCodes(this.state()));
295
365
  }
366
+ /** The address belonged to an existing account: the notice is up until {@link continueAfterExistingAccount}. */
367
+ existingAccountNotice() {
368
+ return pendingExistingAccountNotice(this.state());
369
+ }
370
+ /** The user read the notice: finish the sign-up. */
371
+ async continueAfterExistingAccount() {
372
+ await this.finish(acknowledgeExistingAccount(this.state()));
373
+ }
296
374
  async finish(next) {
297
375
  // An enrolment's recovery codes are shown first; `saveRecoveryCodes` finishes.
298
376
  if (pendingRecoveryCodes(next)) {
@@ -311,6 +389,10 @@ export class AtlasFlowController {
311
389
  });
312
390
  exchanged = res.ok;
313
391
  }
392
+ if (exchanged && this.holdExistingAccountNotice && pendingExistingAccountNotice(next)) {
393
+ this.setState({ ...next, ticket: null, busy: false });
394
+ return;
395
+ }
314
396
  const kept = exchanged && (await this.reload());
315
397
  this.setState({ ...next, busy: false, sessionKept: kept });
316
398
  }
@@ -361,9 +443,10 @@ export class AtlasFlowController {
361
443
  }
362
444
  /** Release the poll timer and the captcha widgets — call from the component's `ngOnDestroy`. */
363
445
  destroy() {
446
+ this.passkey.stopAutofill();
364
447
  this.stopPolling();
365
448
  this.captcha.destroy();
366
449
  this.signUpCaptcha.destroy();
367
450
  }
368
451
  }
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLFlBQVksR0FPYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQXdEWDtJQUNBO0lBR0E7SUEzRFYsS0FBSyxDQUE0QjtJQUMxQzs7OztPQUlHO0lBQ00sUUFBUSxHQUFHLE1BQU0sQ0FBMEIsSUFBSSxDQUFDLENBQUM7SUFDMUQ7OztPQUdHO0lBQ00sVUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDbEQseUVBQXlFO0lBQ2hFLE9BQU8sR0FBc0IsdUJBQXVCLENBQUMsU0FBUyxFQUFFO1FBQ3ZFLHlFQUF5RTtRQUN6RSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5QyxD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QUNQLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsT0FBTztRQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRmFwaUNsaWVudCxcbiAgYWR2YW5jZVdpdGhDYXB0Y2hhLFxuICBhdGxhc0NhcHRjaGFMYWJlbHMsXG4gIGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyLFxuICBjcmVhdGVQYXNza2V5U2lnblVwLFxuICBjcmVhdGVTaWduVXAsXG4gIGZpbmlzaFBhc3NrZXlTaWduVXAsXG4gIGZldGNoSW5zdGFuY2VTZXR0aW5ncyxcbiAgZmV0Y2hMYXN0U2lnbkluTWV0aG9kLFxuICBjcmVhdGVNZmFFbnJvbGxtZW50LFxuICBhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXMsXG4gIHBlbmRpbmdSZWNvdmVyeUNvZGVzLFxuICBtZmFDaG9pY2VzRnJvbSxcbiAgcHJlcGFyZVNlY29uZEZhY3RvckNvZGUsXG4gIHJlc2VuZFNpZ25VcFZlcmlmaWNhdGlvbixcbiAgZmxvd05lZWRzQ2FwdGNoYSxcbiAgc2lnbkluQ2FwdGNoYU9wdGlvbnMsXG4gIGZsb3dGcm9tUGVuZGluZyxcbiAgaW5pdGlhbEZsb3csXG4gIG5leHRTdGVwLFxuICBvZmZlcmVkRmlyc3RGYWN0b3JzLFxuICBwb2xsQXR0ZW1wdCxcbiAgcHJlcGFyZUZhY3RvcixcbiAgcGxhbkZpcnN0RmFjdG9yLFxuICBzaG91bGRLZWVwUG9sbGluZyxcbiAgUG9saWN5QWNjZXB0YW5jZUNvbnRyb2xsZXIsXG4gIGxvYWRQb2xpY2llcyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGbG93U3RhdGUsXG4gIHR5cGUgSW5zdGFuY2VTZXR0aW5ncyxcbiAgdHlwZSBNZmFDaG9pY2VzLFxuICB0eXBlIE1mYUVucm9sbG1lbnRDb250cm9sbGVyLFxuICB0eXBlIE1mYUVucm9sbG1lbnRTdGF0ZSxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBFTl9VUywgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5cbi8qKlxuICogVGhlIHNlcnZlci1kcml2ZW4gc2lnbi1pbiAvIHNpZ24tdXAgZW5naW5lLCBzaGFyZWQgYnkgYDxhdGxhcy1zaWduLWluPmAgYW5kXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCDigJQgdGhlIEFuZ3VsYXIgY291bnRlcnBhcnQgb2YgUmVhY3QncyBgdXNlRmxvd2AgaG9vay5cbiAqXG4gKiBJdCBvd25zIG5vIGRlY2lzaW9uIGFib3V0IHdoYXQgY29tZXMgbmV4dDogZXZlcnkgc3RhdHVzIGNvbWVzIGJhY2sgZnJvbSB0aGVcbiAqIHNlcnZlciB2aWEgYGFkdmFuY2VgLCBhbmQgdGhpcyBjb250cm9sbGVyIG9ubHkgcG9zdHMgd2hhdGV2ZXIgdGhlIGN1cnJlbnQgc3RlcFxuICogbmVlZHMgYW5kIHJlLXJlbmRlcnMgdGhlIHJldHVybmVkIHN0YXR1cy4gU3RhdGUgbGl2ZXMgaW4gYSBzaWduYWwgc28gdGVtcGxhdGVzXG4gKiB1cGRhdGUgd2hldGhlciB0aGUgYXBwIHJ1bnMgem9uZWQgb3Igem9uZWxlc3MuXG4gKlxuICogYDxhdGxhcy1zaWduLXVwPmAgc3RhcnRzIHRoZSBhdHRlbXB0IHdpdGgge0BsaW5rIGNyZWF0ZX1cbiAqIChgUE9TVCAvdjEvY2xpZW50L3NpZ25fdXBzYCk7IHRoZSBlbWFpbGVkLWNvZGUgc3RlcCB0aGVuIHJ1bnMgdGhyb3VnaCB0aGUgc2FtZVxuICoge0BsaW5rIHN1Ym1pdH0uIEJvdGggZmxvd3MgZHJhdyB0aGUgaW5zdGFuY2UncyBjYXB0Y2hhIChmcm9tXG4gKiB7QGxpbmsgbG9hZFNldHRpbmdzfSkgd2hlbiBpdCBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0bGFzRmxvd0NvbnRyb2xsZXIge1xuICByZWFkb25seSBzdGF0ZTogV3JpdGFibGVTaWduYWw8Rmxvd1N0YXRlPjtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzaWduLWluIC8gc2lnbi11cCBzZXR0aW5ncyAoY2FwdGNoYSwgc2lnbi11cCBmaWVsZHMsXG4gICAqIGxlZ2FsIGNvbnNlbnQpIGZyb20gYEdFVCAvdjEvYXBwZWFyYW5jZWA7IG51bGwgdW50aWwge0BsaW5rIGxvYWRTZXR0aW5nc31cbiAgICogcmVzb2x2ZXMsIG9yIHdoZW4gdGhlIHNlcnZlciBjb3VsZCBub3QgYmUgcmVhY2hlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRpbmdzID0gc2lnbmFsPEluc3RhbmNlU2V0dGluZ3MgfCBudWxsPihudWxsKTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhpcyBicm93c2VyIGxhc3Qgc2lnbmVkIGluIHdpdGggKGBwYXNzd29yZGAsIGBvYXV0aF9naXRodWJgLCDigKYpXG4gICAqIGZvciB0aGUgXCJMYXN0IHVzZWRcIiBoaW50OyBudWxsIHdoZW4gbm9uZSwgb3IgdGhlIGluc3RhbmNlIHR1cm5lZCBpdCBvZmYuXG4gICAqL1xuICByZWFkb25seSBsYXN0TWV0aG9kID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAvKiogVGhlIHNpZ24taW4gY2FwdGNoYSAoaWRlbnRpZmllciBzdGVwIC8gYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuICovXG4gIHJlYWRvbmx5IGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgLy8gVGhlIEF0bGFzIGNhcHRjaGEncyB3b3JkcyBmb2xsb3cgdGhlIGZvcm0ncyBjYXRhbG9nIChyZWFkIHdoZW4gZHJhd24pLlxuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBUaGUgc2lnbi11cCBjYXB0Y2hhICh0aGUgY3JlYXRlLWFjY291bnQgc3RlcCkuICovXG4gIHJlYWRvbmx5IHNpZ25VcENhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgYXRsYXNMYWJlbHM6ICgpID0+IGF0bGFzQ2FwdGNoYUxhYmVscyh0aGlzLnQpLFxuICB9KTtcbiAgLyoqIFdoZXRoZXIge0BsaW5rIGNhcHRjaGF9IGN1cnJlbnRseSBkcmF3cyBhIHdpZGdldCAoZm9yIHRlbXBsYXRlcykuICovXG4gIHJlYWRvbmx5IGNhcHRjaGFEcmF3biA9IHNpZ25hbChmYWxzZSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBzaWduVXBDYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIHdhcyBhc2tlZCB0byBzZW5kICh7QGxpbmsgcHJlcGFyZX0pIG9uIHRoZVxuICAgKiBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgaXRzIGNvZGUuIE51bGxcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZWRGYWN0b3IgPSBzaWduYWw8J2VtYWlsX2NvZGUnIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHtAbGluayBzZW5kRW1haWxTZWNvbmRGYWN0b3J9KTpcbiAgICogaW4gZmxpZ2h0LCB3aGVyZSB0aGUgY29kZSB3ZW50LCBvciB3aHkgaXQgd2FzIG5vdCBzZW50LiBOdWxsIHVudGlsIGFza2VkLFxuICAgKiBhbmQgYWdhaW4gb25jZSB0aGUgZmxvdyBsZWF2ZXMgdGhhdCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWxTZWNvbmRGYWN0b3IgPSBzaWduYWw8eyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAoe0BsaW5rIHNlbmRTbXNTZWNvbmRGYWN0b3J9KTogYXMge0BsaW5rIGVtYWlsU2Vjb25kRmFjdG9yfS4gKi9cbiAgcmVhZG9ubHkgc21zU2Vjb25kRmFjdG9yID0gc2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICAvKipcbiAgICogVGhlIE1GQSBlbnJvbG1lbnQgc3RlcCAoYG5lZWRzX21mYV9lbnJvbGxtZW50YCk6IHRoZSBhdXRoZW50aWNhdG9yIGFwcCdzXG4gICAqIHNldHVwIChRUiBjb2RlLCBzZXR1cCBrZXkpIG9yIGEgdGV4dGVkIGNvZGUuIFN0YXJ0ZWQgYW5kIHJlc2V0IHdpdGggdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50Q29udHJvbGxlcjtcbiAgLyoqIHtAbGluayBlbnJvbGxtZW50fSdzIHN0YXRlLCBmb3IgdGVtcGxhdGVzLiAqL1xuICByZWFkb25seSBlbnJvbGxtZW50U3RhdGU6IFdyaXRhYmxlU2lnbmFsPE1mYUVucm9sbG1lbnRTdGF0ZT47XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBwb2xpY2llcyAodGVybXMsIHByaXZhY3ksIOKApikgZm9yIHRoZSBjcmVhdGUtYWNjb3VudCBmb3JtOlxuICAgKiB7QGxpbmsgY3JlYXRlfSBzZW5kcyB0aGVpciBhY2NlcHRhbmNlcyBhbmQgcmVsb2FkcyB0aGVtIGFmdGVyIGEgcmVmdXNhbC5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljaWVzID0gbmV3IFBvbGljeUFjY2VwdGFuY2VDb250cm9sbGVyKFtdKTtcbiAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlkZW50aWZpZXIgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRmFwaUNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbG9hZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICBwZW5kaW5nOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsLFxuICAgIC8qKiBSZXNvbHZlcyB0aGUgY2FwdGNoYSBtZXNzYWdlcycgY2F0YWxvZyBrZXlzLiBEZWZhdWx0cyB0byBlbi1VUy4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHQ6IChrZXk6IHN0cmluZykgPT4gc3RyaW5nID0gKGtleSkgPT4gdHJhbnNsYXRlKEVOX1VTLCBrZXkpLFxuICApIHtcbiAgICAvLyBTZWVkZWQgZnJvbSBhIHJlZGlyZWN0IHRoYXQgY2FtZSBiYWNrIG1pZC1mbG93IChlLmcuIE9BdXRoIG5lZWRpbmcgYSBzZWNvbmRcbiAgICAvLyBmYWN0b3IpIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIGRlbWFuZGVkIHN0ZXAgaW5zdGVhZCBvZiBzdGFydGluZyBvdmVyLlxuICAgIHRoaXMuc3RhdGUgPSBzaWduYWw8Rmxvd1N0YXRlPihwZW5kaW5nID8gZmxvd0Zyb21QZW5kaW5nKHBlbmRpbmcpIDogaW5pdGlhbEZsb3cpO1xuICAgIHRoaXMuZW5yb2xsbWVudCA9IGNyZWF0ZU1mYUVucm9sbG1lbnQodGhpcy5jbGllbnQsICgpID0+IHRoaXMubWZhQ2hvaWNlcygpKTtcbiAgICB0aGlzLmVucm9sbG1lbnRTdGF0ZSA9IHNpZ25hbDxNZmFFbnJvbGxtZW50U3RhdGU+KHRoaXMuZW5yb2xsbWVudC5zdGF0ZSk7XG4gICAgdGhpcy5lbnJvbGxtZW50LnN1YnNjcmliZSgobmV4dCkgPT4gdGhpcy5lbnJvbGxtZW50U3RhdGUuc2V0KG5leHQpKTtcbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gICAgdGhpcy5zeW5jRW5yb2xsbWVudCgpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGFwcCBsZXRzIHRoZSBNRkEgc3RlcHMgb2ZmZXIgKGZyb20ge0BsaW5rIHNldHRpbmdzfSkuICovXG4gIG1mYUNob2ljZXMoKTogTWZhQ2hvaWNlcyB7XG4gICAgcmV0dXJuIG1mYUNob2ljZXNGcm9tKHRoaXMuc2V0dGluZ3MoKT8uYWNjb3VudCk7XG4gIH1cblxuICAvKiogU3RhcnQgdGhlIGVucm9sbWVudCBzdGVwIGZvciBpdHMgYXR0ZW1wdCwgb3IgcmVzZXQgaXQgb25jZSB0aGUgZmxvdyBsZWF2ZXMuICovXG4gIHByaXZhdGUgc3luY0Vucm9sbG1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGlmIChhdHRlbXB0Py5zdGF0dXMgPT09ICduZWVkc19tZmFfZW5yb2xsbWVudCcgJiYgYXR0ZW1wdC5pZCkgdGhpcy5lbnJvbGxtZW50LnN0YXJ0KGF0dGVtcHQuaWQpO1xuICAgIGVsc2UgdGhpcy5lbnJvbGxtZW50LnJlc2V0KCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIGluc3RhbmNlJ3MgcHVibGljIHNldHRpbmdzIGFuZCBkcmF3IHdoYXRldmVyIGNhcHRjaGEgdGhleSByZXF1aXJlLiAqL1xuICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgZmV0Y2hJbnN0YW5jZVNldHRpbmdzKHRoaXMuY2xpZW50KTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnNldChsb2FkZWQpO1xuICAgICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgICAgaWYgKGxvYWRlZC5hY2NvdW50Lmxhc3RTaWduSW5NZXRob2QpIHRoaXMubGFzdE1ldGhvZC5zZXQoYXdhaXQgZmV0Y2hMYXN0U2lnbkluTWV0aG9kKHRoaXMuY2xpZW50KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3JzIHRvIG9mZmVyIG9uIGEgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcDogdGhlIHNlcnZlcidzIGxpc3RcbiAgICogd2l0aG91dCBlbWFpbCBjb2RlIC8gbGluayB3aGlsZSB0aGUgYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsXG4gICAqIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5hdmFpbGFibGUgPT09IGZhbHNlYCkuIEVtcHR5IG9uIGFueSBvdGhlciBzdGVwLlxuICAgKi9cbiAgZmlyc3RGYWN0b3JzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ7XG4gICAgY29uc3Qgc3RlcCA9IGF0dGVtcHQgPyBuZXh0U3RlcChhdHRlbXB0KSA6IG51bGw7XG4gICAgcmV0dXJuIHN0ZXA/LmtpbmQgPT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcidcbiAgICAgID8gb2ZmZXJlZEZpcnN0RmFjdG9ycyhzdGVwLnN0cmF0ZWdpZXMsIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeSlcbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIGVtYWlsICsgcGFzc3dvcmQgc2lnbi11cCBjYW5ub3QgY29tcGxldGUgYmVjYXVzZSB0aGUgYXBwIGNhbm5vdFxuICAgKiBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwgKGBzZXR0aW5ncy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZWApOlxuICAgKiBgPGF0bGFzLXNpZ24tdXA+YCBzaG93cyB0aGUgXCJjYW4ndCBzZW5kIGVtYWlsXCIgbm90aWNlIGluc3RlYWQgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBzaWduVXBFbWFpbFVuYXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzKCk/LmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlO1xuICB9XG5cbiAgLyoqIEZhbHNlIHdoZW4gYSBwYXNzd29yZCByZXNldCBlbWFpbCBjYW5ub3QgYmUgZGVsaXZlcmVkIOKAlCBoaWRlIFwiRm9yZ290IHBhc3N3b3JkP1wiLiAqL1xuICBwYXNzd29yZFJlc2V0QXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzKCk/LmVtYWlsRGVsaXZlcnkucGFzc3dvcmRSZXNldCAhPT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSBzZXJ2ZXIgdG8gZW1haWwgYSBzaWduLWluIGNvZGUgZm9yIHRoZSBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgXG4gICAqIHN0ZXAgKGBQT1NUIOKApi9wcmVwYXJlX2ZpcnN0X2ZhY3RvcmApOyB0aGUgZm9ybSB0aGVuIGNvbGxlY3RzIHRoZSBjb2RlLCB3aGljaFxuICAgKiB7QGxpbmsgc3VibWl0fSBwb3N0cyBhcyB0aGUgYGVtYWlsX2NvZGVgIHN0cmF0ZWd5LlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZShzdHJhdGVneTogJ2VtYWlsX2NvZGUnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmZpcnN0RmFjdG9ycygpLmluY2x1ZGVzKHN0cmF0ZWd5KSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID0gYXdhaXQgcHJlcGFyZUZhY3Rvcih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpLCBzdHJhdGVneSk7XG4gICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICBpZiAoIW5leHQuZXJyb3JzLmxlbmd0aCkgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQoc3RyYXRlZ3kpO1xuICB9XG5cbiAgLyoqIEtlZXAgYm90aCBjYXB0Y2hhcyBpbiBzdGVwIHdpdGggdGhlIHNldHRpbmdzIGFuZCB0aGUgZmxvdydzIGN1cnJlbnQgc3RlcC4gKi9cbiAgcHJpdmF0ZSBzeW5jQ2FwdGNoYSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICB0aGlzLmNhcHRjaGEuY29uZmlndXJlKFxuICAgICAgc2lnbkluQ2FwdGNoYU9wdGlvbnMoc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduSW4sIHN0YXRlLCAoKSA9PiB2b2lkIHRoaXMuc3VibWl0KHt9KSksXG4gICAgKTtcbiAgICBjb25zdCBzaWduVXBGbG93ID0gc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduVXA7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmNvbmZpZ3VyZSh7XG4gICAgICBmbG93OiBzaWduVXBGbG93LFxuICAgICAgYWN0aXZlOiAhc3RhdGUuYXR0ZW1wdCAmJiBmbG93TmVlZHNDYXB0Y2hhKHNpZ25VcEZsb3cpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FwdGNoYURyYXduLnNldCh0aGlzLmNhcHRjaGEubmVlZGVkKTtcbiAgICB0aGlzLnNpZ25VcENhcHRjaGFEcmF3bi5zZXQodGhpcy5zaWduVXBDYXB0Y2hhLm5lZWRlZCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXRlKG5leHQ6IEZsb3dTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzSWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQgPz8gbnVsbDtcbiAgICB0aGlzLnN0YXRlLnNldChuZXh0KTtcbiAgICAvLyBBIHByZXBhcmVkIGZhY3RvciBiZWxvbmdzIHRvIHRoZSBmaXJzdC1mYWN0b3Igc3RlcCBpdCB3YXMgc2VudCBmb3IuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfZmlyc3RfZmFjdG9yJykgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgLy8gQW4gZW1haWxlZCBzZWNvbmQtZmFjdG9yIGNvZGUgYmVsb25ncyB0byB0aGUgc2Vjb25kLWZhY3RvciBzdGVwIG9mIHRoaXMgYXR0ZW1wdC5cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgIT09ICduZWVkc19zZWNvbmRfZmFjdG9yJyB8fCAobmV4dC5hdHRlbXB0Py5pZCA/PyBudWxsKSAhPT0gcHJldmlvdXNJZCkge1xuICAgICAgdGhpcy5lbWFpbFNlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNtc1NlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhcHRjaGEoKTtcbiAgICB0aGlzLnN5bmNFbnJvbGxtZW50KCk7XG4gICAgdGhpcy5hdXRvU2VuZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvU2VudEZvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBXaXRoIG5vIHBhc3N3b3JkIG9uIG9mZmVyLCBlbWFpbCB0aGUgY29kZSBhcyBzb29uIGFzIHRoZSBzZXJ2ZXIgYXNrcyBmb3IgYVxuICAgKiBmaXJzdCBmYWN0b3Ig4oCUIG9uY2UgcGVyIGF0dGVtcHQsIHNvIGEgZmFpbGVkIHNlbmQgd2FpdHMgZm9yIHRoZSB1c2VyJ3MgcmV0cnlcbiAgICogKHRoZSBcIkVtYWlsIG1lIGEgY29kZVwiIGJ1dHRvbikgaW5zdGVhZCBvZiBsb29waW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhdXRvU2VuZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0Py5pZCA/PyBudWxsO1xuICAgIGlmICghaWQgfHwgdGhpcy5hdXRvU2VudEZvciA9PT0gaWQgfHwgdGhpcy5wcmVwYXJlZEZhY3RvcigpKSByZXR1cm47XG4gICAgaWYgKHBsYW5GaXJzdEZhY3Rvcih0aGlzLmZpcnN0RmFjdG9ycygpKS5hdXRvU2VuZCAhPT0gJ2VtYWlsX2NvZGUnKSByZXR1cm47XG4gICAgdGhpcy5hdXRvU2VudEZvciA9IGlkO1xuICAgIHZvaWQgdGhpcy5wcmVwYXJlKCdlbWFpbF9jb2RlJyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgZmxvdyB3aXRoIHRoZSB2YWx1ZXMgdGhlIHVzZXIgdHlwZWQuIE9uIGNvbXBsZXRpb24sIGV4Y2hhbmdlIHRoZVxuICAgKiBvbmUtdGltZSB0aWNrZXQgZm9yIGNvb2tpZXMgb3ZlciBhIHNhbWUtb3JpZ2luIHJlcXVlc3QgKEZBUEkgaXMgY3Jvc3Mtb3JpZ2luXG4gICAqIGFuZCBjYW5ub3Qgc2V0IHRoZSBjb29raWUgb24gaXRzIG93biByZXNwb25zZSksIHRoZW4gcmUtYm9vdCBzbyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgYXBwIHNlZXMgYSBzaWduZWQtaW4gdXNlci5cbiAgICovXG4gIGFzeW5jIHN1Ym1pdCh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG5cbiAgICBjb25zdCBvdXQgPSBhd2FpdCBhZHZhbmNlV2l0aENhcHRjaGEodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgdmFsdWVzLCB7XG4gICAgICBjYXB0Y2hhOiB0aGlzLmNhcHRjaGEsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgfSk7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gb3V0LmlkZW50aWZpZXI7XG4gICAgYXdhaXQgdGhpcy5maW5pc2gob3V0LnN0YXRlKTtcbiAgfVxuXG4gIC8qKiBMb2FkIHRoZSBzaWduLXVwJ3MgcG9saWNpZXMgaW50byB7QGxpbmsgcG9saWNpZXN9IChgPGF0bGFzLXNpZ24tdXA+YCBjYWxscyBpdCBvbiBpbml0KS4gKi9cbiAgYXN5bmMgbG9hZFBvbGljaWVzKGxvY2FsZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucG9saWNpZXMuc2V0UG9saWNpZXMoYXdhaXQgbG9hZFBvbGljaWVzKHRoaXMuY2xpZW50LCB7IGxvY2FsZSB9KSk7XG4gIH1cblxuICAvKiogVGhlIHVzZXIgZGVjbGluZWQgYSBwb2xpY3kgYSBzaWduLWluIHdhcyB3YWl0aW5nIG9uOiBjYW5jZWwgdGhlIGF0dGVtcHQgYW5kIHNheSB3aHkuICovXG4gIGRlY2xpbmVQb2xpY3kodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuc2V0KHtcbiAgICAgIC4uLmluaXRpYWxGbG93LFxuICAgICAgZXJyb3JzOiBbeyBjb2RlOiAnUE9MSUNZX0RFQ0xJTkVEJywgbWVzc2FnZTogdGhpcy50KCdwb2xpY3kuZGVjbGluZWQnKS5yZXBsYWNlKCd7cG9saWN5fScsIHRpdGxlKSB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYWNjb3VudCAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwc2ApIGZyb20gYSBjcmVhdGUtYWNjb3VudCBmb3JtJ3NcbiAgICogdmFsdWVzIOKAlCBlbWFpbCwgcGFzc3dvcmQgYW5kIGFueSBjb25maWd1cmVkIHNpZ24tdXAgZmllbGRzIOKAlCBjYXJyeWluZyB0aGVcbiAgICogc2lnbi11cCBjYXB0Y2hhJ3MgdG9rZW4gd2hlbiB0aGUgaW5zdGFuY2UgcmVxdWlyZXMgb25lLiBUaGUgZW1haWxlZCBjb2RlIGlzXG4gICAqIHRoZW4gcG9zdGVkIHdpdGgge0BsaW5rIHN1Ym1pdH0uXG4gICAqL1xuICBhc3luYyBjcmVhdGUodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID0gYXdhaXQgY3JlYXRlU2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHtcbiAgICAgIGNvbnNlbnQsXG4gICAgICBjYXB0Y2hhOiB0aGlzLnNpZ25VcENhcHRjaGEsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgICBwb2xpY2llczogdGhpcy5wb2xpY2llcyxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LmVtYWlsU2Vjb25kRmFjdG9yYCk6IG1haWxzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIHZlcmlmaWVkIGVtYWlsO1xuICAgKiBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEVtYWlsU2Vjb25kRmFjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZFNlY29uZEZhY3RvckNvZGUoJ2VtYWlsX2NvZGUnLCB0aGlzLmVtYWlsU2Vjb25kRmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAod2hlcmUgdGhlIGFwcCBvZmZlcnMgdGV4dGVkXG4gICAqIGNvZGVzLCB7QGxpbmsgbWZhQ2hvaWNlc31gKCkuc21zYCk6IHRleHRzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIGVucm9sbGVkXG4gICAqIHBob25lOyBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZFNtc1NlY29uZEZhY3RvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRTZWNvbmRGYWN0b3JDb2RlKCdzbXMnLCB0aGlzLnNtc1NlY29uZEZhY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRTZWNvbmRGYWN0b3JDb2RlKFxuICAgIHN0cmF0ZWd5OiAnc21zJyB8ICdlbWFpbF9jb2RlJyxcbiAgICBvdXQ6IFdyaXRhYmxlU2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0Py5pZDtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgb3V0LnNldCh7IGJ1c3k6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc2VudFRvIH0gPSBhd2FpdCBwcmVwYXJlU2Vjb25kRmFjdG9yQ29kZSh0aGlzLmNsaWVudCwgaWQsIHN0cmF0ZWd5KTtcbiAgICAgIG91dC5zZXQoeyBzZW50VG8gfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG91dC5zZXQoeyBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiB0aGlzLnQoJ2Vycm9yLmdlbmVyaWMnKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzZW5kIGEgc2lnbi11cCdzIGVtYWlsZWQgY29kZSAvIGxpbmsgKHRoZSBlYXJsaWVyIG9uZSBzdG9wcyB3b3JraW5nKS4gKi9cbiAgYXN5bmMgcmVzZW5kU2lnblVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICB0aGlzLnN0YXRlLnNldChhd2FpdCByZXNlbmRTaWduVXBWZXJpZmljYXRpb24odGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgcGFzc2tleS1vbmx5IHNpZ24tdXAgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHMvcGFzc2tleWApIGZyb20gdGhlXG4gICAqIGNyZWF0ZS1hY2NvdW50IGZvcm0ncyB2YWx1ZXMg4oCUIG5vIHBhc3N3b3JkLiBPZmZlcmVkIHdoZW4gdGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQucGFzc2tleVNpZ25VcGAgaXMgc2V0LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2l0aFBhc3NrZXkodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhd2FpdCBjcmVhdGVQYXNza2V5U2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHsgY29uc2VudCwgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLCB0OiB0aGlzLnQsIHBvbGljaWVzOiB0aGlzLnBvbGljaWVzIH0pKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGFzc2tleS1vbmx5IHNpZ24tdXAncyBsYXN0IHN0ZXA6IGNyZWF0ZSB0aGUgcGFzc2tleSwgYW5kIHdpdGggaXQgdGhlIGFjY291bnQuICovXG4gIGFzeW5jIGNyZWF0ZVBhc3NrZXkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGF3YWl0IGZpbmlzaFBhc3NrZXlTaWduVXAodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgeyB0OiB0aGlzLnQgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb2RlcyBhbiBNRkEgZW5yb2xtZW50IGp1c3QgY29tcGxldGVkIHRoZSBzaWduLWluIHdpdGgsIHNob3duXG4gICAqIG9uY2UgYmVmb3JlIGl0IGZpbmlzaGVzICh7QGxpbmsgc2F2ZVJlY292ZXJ5Q29kZXN9KTsgbnVsbCBvdGhlcndpc2UuIFRoZXlcbiAgICogbGl2ZSBvbmx5IGluIHRoaXMgY29udHJvbGxlcidzIG1lbW9yeS5cbiAgICovXG4gIHJlY292ZXJ5Q29kZXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gcGVuZGluZ1JlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIC8qKiBcIkkndmUgc2F2ZWQgbXkgY29kZXNcIjogZm9yZ2V0IHRoZSByZWNvdmVyeSBjb2RlcyBhbmQgZmluaXNoIHRoZSBzaWduLWluLiAqL1xuICBhc3luYyBzYXZlUmVjb3ZlcnlDb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmlzaChuZXh0OiBGbG93U3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBbiBlbnJvbG1lbnQncyByZWNvdmVyeSBjb2RlcyBhcmUgc2hvd24gZmlyc3Q7IGBzYXZlUmVjb3ZlcnlDb2Rlc2AgZmluaXNoZXMuXG4gICAgaWYgKHBlbmRpbmdSZWNvdmVyeUNvZGVzKG5leHQpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZXh0LmF0dGVtcHQ/LnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgLy8gU3RheXMgYnVzeSB1bnRpbCB0aGlzIGJyb3dzZXIgYWN0dWFsbHkgaG9sZHMgdGhlIHNlc3Npb246IHRoZSBjb21wbGV0aW9uXG4gICAgICAvLyBhbG9uZSBzYXlzIG5vdGhpbmcgYWJvdXQgd2hldGhlciB0aGUgY29va2llIHdhcyBrZXB0LlxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IHRydWUgfSk7XG4gICAgICBsZXQgZXhjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGlmIChuZXh0LnRpY2tldCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0KCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgICAgYXR0ZW1wdF9pZDogKG5leHQuYXR0ZW1wdCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkLFxuICAgICAgICAgIHRpY2tldDogbmV4dC50aWNrZXQsXG4gICAgICAgIH0pO1xuICAgICAgICBleGNoYW5nZWQgPSByZXMub2s7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXB0ID0gZXhjaGFuZ2VkICYmIChhd2FpdCB0aGlzLnJlbG9hZCgpKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiBmYWxzZSwgc2Vzc2lvbktlcHQ6IGtlcHQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgICAvLyBBIG1hZ2ljLWxpbmsgc3RlcCBtYXkgbm93IGJlIHBvbGxhYmxlIChhIGxpbmsgb3BlbmVkIG9uIGFub3RoZXIgZGV2aWNlKS5cbiAgICAgIHRoaXMuc3luY1BvbGxpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RhcnQvc3RvcCB0aGUgwqc1LjMgbWFnaWMtbGluayBwb2xsIHRvIG1hdGNoIHRoZSBjdXJyZW50IHN0YXRlLiAqL1xuICBzeW5jUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAoc2hvdWxkS2VlcFBvbGxpbmcodGhpcy5zdGF0ZSgpKSkge1xuICAgICAgdGhpcy5zdGFydFBvbGxpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGxUaW1lcikgcmV0dXJuO1xuICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXRlOiBuZXh0LCB0aWNrZXQgfSA9IGF3YWl0IHBvbGxBdHRlbXB0KHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgICAgICAvLyBlLmcuIGEgcGFzc2tleSBzaWduLXVwIHdob3NlIGVtYWlsIHdhcyBqdXN0IHByb3Zlbjogb25seSB0aGlzIHRhYiBjYW4gZ28gb24uXG4gICAgICAgIGlmICghdGlja2V0ICYmICFzaG91bGRLZWVwUG9sbGluZyhuZXh0KSkgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgICBpZiAoIXRpY2tldCB8fCAhbmV4dC5hdHRlbXB0KSByZXR1cm47XG5cbiAgICAgICAgLy8gVGhlIHRpY2tldCBpcyBleGNoYW5nZWQgYnkgYSBub3JtYWwgcmVxdWVzdCwgc28gbm8gc2Vzc2lvbiB0b2tlbiBldmVyXG4gICAgICAgIC8vIGFwcGVhcnMgaW4gYSBVUkwuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHtcbiAgICAgICAgICBhdHRlbXB0X2lkOiAobmV4dC5hdHRlbXB0IGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQsXG4gICAgICAgICAgdGlja2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qga2VwdCA9IHJlcy5vayAmJiAoYXdhaXQgdGhpcy5yZWxvYWQoKSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi50aGlzLnN0YXRlKCksIHNlc3Npb25LZXB0OiBrZXB0IH0pO1xuICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgICB9KSgpO1xuICAgIH0sIDJfMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGUgcG9sbCB0aW1lciBhbmQgdGhlIGNhcHRjaGEgd2lkZ2V0cyDigJQgY2FsbCBmcm9tIHRoZSBjb21wb25lbnQncyBgbmdPbkRlc3Ryb3lgLiAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB0aGlzLmNhcHRjaGEuZGVzdHJveSgpO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYS5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsNEJBQTRCLEVBQzVCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLFlBQVksR0FRYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQStEWDtJQUNBO0lBR0E7SUFFQTtJQXBFVixLQUFLLENBQTRCO0lBQzFDOzs7O09BSUc7SUFDTSxRQUFRLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMxRDs7O09BR0c7SUFDTSxVQUFVLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUNsRCx5RUFBeUU7SUFDaEUsT0FBTyxHQUFzQix1QkFBdUIsQ0FBQyxTQUFTLEVBQUU7UUFDdkUseUVBQXlFO1FBQ3pFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQzlDLENBQUMsQ0FBQztJQUNILHFEQUFxRDtJQUM1QyxhQUFhLEdBQXNCLHVCQUF1QixDQUFDLFNBQVMsRUFBRTtRQUM3RSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5QyxDQUFDLENBQUM7SUFDSCx3RUFBd0U7SUFDL0QsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0Qyw4RUFBOEU7SUFDckUsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDOzs7O09BSUc7SUFDTSxjQUFjLEdBQUcsTUFBTSxDQUFxQyxJQUFJLENBQUMsQ0FBQztJQUMzRTs7OztPQUlHO0lBQ00saUJBQWlCLEdBQUcsTUFBTSxDQUE2RCxJQUFJLENBQUMsQ0FBQztJQUN0RyxpSEFBaUg7SUFDeEcsZUFBZSxHQUFHLE1BQU0sQ0FBNkQsSUFBSSxDQUFDLENBQUM7SUFDcEc7OztPQUdHO0lBQ00sVUFBVSxDQUEwQjtJQUM3QyxpREFBaUQ7SUFDeEMsZUFBZSxDQUFxQztJQUM3RDs7O09BR0c7SUFDTSxRQUFRLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RDs7O09BR0c7SUFDTSxPQUFPLENBQTBCO0lBQzFDLHlHQUF5RztJQUNoRyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsU0FBUyxHQUEwQyxJQUFJLENBQUM7SUFDeEQsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUV4QixZQUNtQixNQUFrQixFQUNsQixNQUE4QixFQUMvQyxPQUE4QztJQUM5QyxzRUFBc0U7SUFDckQsSUFBNkIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0lBQzVFLDBGQUEwRjtJQUN6RSw0QkFBNEIsS0FBSztRQU5qQyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQXdCO1FBRzlCLE1BQUMsR0FBRCxDQUFDLENBQTBEO1FBRTNELDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBUTtRQUVsRCw4RUFBOEU7UUFDOUUsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsVUFBVSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQXFCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyw2QkFBNkIsQ0FBQztZQUMzQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3JDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUMzQixnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO1NBQzFELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELHdGQUF3RjtJQUMvRSxvQkFBb0IsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBb0I7UUFDeEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTztRQUMxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RixJQUFJLEtBQUssSUFBSSxPQUFPO1lBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUNyRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0hBQXdIO0lBQ3hILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxLQUFLLElBQUksQ0FBQztJQUNyRyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLFVBQVU7UUFDUixPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGtGQUFrRjtJQUMxRSxjQUFjO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDckMsSUFBSSxPQUFPLEVBQUUsTUFBTSxLQUFLLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxFQUFFO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUMzRixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsS0FBSyxDQUFDLFlBQVk7UUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO2dCQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckcsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRCxJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssc0JBQXNCO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDckYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUztRQUNQLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsU0FBUyxLQUFLLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUM5RixDQUFDO0lBRUQsMERBQTBEO0lBQzFELFdBQVc7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDO0lBQ2pFLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBcUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTztRQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxJQUFJLEdBQ1IsUUFBUSxLQUFLLEtBQUs7WUFDaEIsQ0FBQyxDQUFDLE1BQU0sd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxXQUFXO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3BCLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkYsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQzNCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1NBQ3ZELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxRQUFRLENBQUMsSUFBZTtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxRQUFRO1lBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkcsc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUssb0JBQW9CO1lBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakYsbUZBQW1GO1FBQ25GLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUsscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8sV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDMUM7Ozs7T0FJRztJQUNLLFFBQVE7UUFDZCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFDNUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQUUsT0FBTztRQUNwRSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUFFLE9BQU87UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBOEI7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekUsK0VBQStFO1FBQy9FLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1RixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQ3RFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWU7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ2IsR0FBRyxXQUFXO1lBQ2QsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDckcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUE4QixFQUFFLE9BQU8sR0FBRyxJQUFJO1FBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO1lBQ25ELE9BQU87WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxxQkFBcUI7UUFDekIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQjtRQUN2QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQ2hDLFFBQThCLEVBQzlCLEdBQStFO1FBRS9FLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLEtBQUssQ0FBQyxZQUFZO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQThCLEVBQUUsT0FBTyxHQUFHLElBQUk7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEosQ0FBQztJQUVELHlGQUF5RjtJQUN6RixLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxnSEFBZ0g7SUFDaEgscUJBQXFCO1FBQ25CLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxLQUFLLENBQUMsNEJBQTRCO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQWU7UUFDbEMsK0VBQStFO1FBQy9FLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLDJFQUEyRTtZQUMzRSx3REFBd0Q7WUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtvQkFDaEUsVUFBVSxFQUFHLElBQUksQ0FBQyxPQUEyQixDQUFDLEVBQUU7b0JBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLENBQUM7WUFDRCxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMseUJBQXlCLElBQUksNEJBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxXQUFXO1FBQ1QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2hDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDZixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQiwrRUFBK0U7Z0JBQy9FLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTztnQkFFckMsd0VBQXdFO2dCQUN4RSxvQkFBb0I7Z0JBQ3BCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7b0JBQ2hFLFVBQVUsRUFBRyxJQUFJLENBQUMsT0FBMkIsQ0FBQyxFQUFFO29CQUNoRCxNQUFNO2lCQUNQLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZVNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBhZHZhbmNlV2l0aENhcHRjaGEsXG4gIGF0bGFzQ2FwdGNoYUxhYmVscyxcbiAgYXR0ZW1wdFBhc3N3b3JkSG9sZFByb29mLFxuICBwcmVwYXJlUGFzc3dvcmRIb2xkUHJvb2YsXG4gIGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyLFxuICBjcmVhdGVQYXNza2V5U2lnbkluQ29udHJvbGxlcixcbiAgY3JlYXRlUGFzc2tleVNpZ25VcCxcbiAgY3JlYXRlU2lnblVwLFxuICBmaW5pc2hQYXNza2V5U2lnblVwLFxuICBmZXRjaEluc3RhbmNlU2V0dGluZ3MsXG4gIGZldGNoTGFzdFNpZ25Jbk1ldGhvZCxcbiAgc3RhcnRTaWduSW5XaXRoQXRsYXMsXG4gIGNyZWF0ZU1mYUVucm9sbG1lbnQsXG4gIGFja25vd2xlZGdlRXhpc3RpbmdBY2NvdW50LFxuICBhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXMsXG4gIHBlbmRpbmdFeGlzdGluZ0FjY291bnROb3RpY2UsXG4gIHBlbmRpbmdSZWNvdmVyeUNvZGVzLFxuICBtZmFDaG9pY2VzRnJvbSxcbiAgcHJlcGFyZVNlY29uZEZhY3RvckNvZGUsXG4gIHJlc2VuZFNpZ25VcFZlcmlmaWNhdGlvbixcbiAgZmxvd05lZWRzQ2FwdGNoYSxcbiAgc2lnbkluQ2FwdGNoYU9wdGlvbnMsXG4gIGZsb3dGcm9tUGVuZGluZyxcbiAgaW5pdGlhbEZsb3csXG4gIG5leHRTdGVwLFxuICBvZmZlcmVkRmlyc3RGYWN0b3JzLFxuICBwb2xsQXR0ZW1wdCxcbiAgcHJlcGFyZUZhY3RvcixcbiAgcGxhbkZpcnN0RmFjdG9yLFxuICBzaG91bGRLZWVwUG9sbGluZyxcbiAgUG9saWN5QWNjZXB0YW5jZUNvbnRyb2xsZXIsXG4gIGxvYWRQb2xpY2llcyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGbG93U3RhdGUsXG4gIHR5cGUgSW5zdGFuY2VTZXR0aW5ncyxcbiAgdHlwZSBNZmFDaG9pY2VzLFxuICB0eXBlIE1mYUVucm9sbG1lbnRDb250cm9sbGVyLFxuICB0eXBlIE1mYUVucm9sbG1lbnRTdGF0ZSxcbiAgdHlwZSBQYXNza2V5U2lnbkluQ29udHJvbGxlcixcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBFTl9VUywgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5cbi8qKlxuICogVGhlIHNlcnZlci1kcml2ZW4gc2lnbi1pbiAvIHNpZ24tdXAgZW5naW5lLCBzaGFyZWQgYnkgYDxhdGxhcy1zaWduLWluPmAgYW5kXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCDigJQgdGhlIEFuZ3VsYXIgY291bnRlcnBhcnQgb2YgUmVhY3QncyBgdXNlRmxvd2AgaG9vay5cbiAqXG4gKiBJdCBvd25zIG5vIGRlY2lzaW9uIGFib3V0IHdoYXQgY29tZXMgbmV4dDogZXZlcnkgc3RhdHVzIGNvbWVzIGJhY2sgZnJvbSB0aGVcbiAqIHNlcnZlciB2aWEgYGFkdmFuY2VgLCBhbmQgdGhpcyBjb250cm9sbGVyIG9ubHkgcG9zdHMgd2hhdGV2ZXIgdGhlIGN1cnJlbnQgc3RlcFxuICogbmVlZHMgYW5kIHJlLXJlbmRlcnMgdGhlIHJldHVybmVkIHN0YXR1cy4gU3RhdGUgbGl2ZXMgaW4gYSBzaWduYWwgc28gdGVtcGxhdGVzXG4gKiB1cGRhdGUgd2hldGhlciB0aGUgYXBwIHJ1bnMgem9uZWQgb3Igem9uZWxlc3MuXG4gKlxuICogYDxhdGxhcy1zaWduLXVwPmAgc3RhcnRzIHRoZSBhdHRlbXB0IHdpdGgge0BsaW5rIGNyZWF0ZX1cbiAqIChgUE9TVCAvdjEvY2xpZW50L3NpZ25fdXBzYCk7IHRoZSBlbWFpbGVkLWNvZGUgc3RlcCB0aGVuIHJ1bnMgdGhyb3VnaCB0aGUgc2FtZVxuICoge0BsaW5rIHN1Ym1pdH0uIEJvdGggZmxvd3MgZHJhdyB0aGUgaW5zdGFuY2UncyBjYXB0Y2hhIChmcm9tXG4gKiB7QGxpbmsgbG9hZFNldHRpbmdzfSkgd2hlbiBpdCBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0bGFzRmxvd0NvbnRyb2xsZXIge1xuICByZWFkb25seSBzdGF0ZTogV3JpdGFibGVTaWduYWw8Rmxvd1N0YXRlPjtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzaWduLWluIC8gc2lnbi11cCBzZXR0aW5ncyAoY2FwdGNoYSwgc2lnbi11cCBmaWVsZHMsXG4gICAqIGxlZ2FsIGNvbnNlbnQpIGZyb20gYEdFVCAvdjEvYXBwZWFyYW5jZWA7IG51bGwgdW50aWwge0BsaW5rIGxvYWRTZXR0aW5nc31cbiAgICogcmVzb2x2ZXMsIG9yIHdoZW4gdGhlIHNlcnZlciBjb3VsZCBub3QgYmUgcmVhY2hlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRpbmdzID0gc2lnbmFsPEluc3RhbmNlU2V0dGluZ3MgfCBudWxsPihudWxsKTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhpcyBicm93c2VyIGxhc3Qgc2lnbmVkIGluIHdpdGggKGBwYXNzd29yZGAsIGBvYXV0aF9naXRodWJgLCDigKYpXG4gICAqIGZvciB0aGUgXCJMYXN0IHVzZWRcIiBoaW50OyBudWxsIHdoZW4gbm9uZSwgb3IgdGhlIGluc3RhbmNlIHR1cm5lZCBpdCBvZmYuXG4gICAqL1xuICByZWFkb25seSBsYXN0TWV0aG9kID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAvKiogVGhlIHNpZ24taW4gY2FwdGNoYSAoaWRlbnRpZmllciBzdGVwIC8gYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuICovXG4gIHJlYWRvbmx5IGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgLy8gVGhlIEF0bGFzIGNhcHRjaGEncyB3b3JkcyBmb2xsb3cgdGhlIGZvcm0ncyBjYXRhbG9nIChyZWFkIHdoZW4gZHJhd24pLlxuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBUaGUgc2lnbi11cCBjYXB0Y2hhICh0aGUgY3JlYXRlLWFjY291bnQgc3RlcCkuICovXG4gIHJlYWRvbmx5IHNpZ25VcENhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgYXRsYXNMYWJlbHM6ICgpID0+IGF0bGFzQ2FwdGNoYUxhYmVscyh0aGlzLnQpLFxuICB9KTtcbiAgLyoqIFdoZXRoZXIge0BsaW5rIGNhcHRjaGF9IGN1cnJlbnRseSBkcmF3cyBhIHdpZGdldCAoZm9yIHRlbXBsYXRlcykuICovXG4gIHJlYWRvbmx5IGNhcHRjaGFEcmF3biA9IHNpZ25hbChmYWxzZSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBzaWduVXBDYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIHdhcyBhc2tlZCB0byBzZW5kICh7QGxpbmsgcHJlcGFyZX0pIG9uIHRoZVxuICAgKiBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgaXRzIGNvZGUuIE51bGxcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZWRGYWN0b3IgPSBzaWduYWw8J2VtYWlsX2NvZGUnIHwgJ2VtYWlsX2xpbmsnIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHtAbGluayBzZW5kRW1haWxTZWNvbmRGYWN0b3J9KTpcbiAgICogaW4gZmxpZ2h0LCB3aGVyZSB0aGUgY29kZSB3ZW50LCBvciB3aHkgaXQgd2FzIG5vdCBzZW50LiBOdWxsIHVudGlsIGFza2VkLFxuICAgKiBhbmQgYWdhaW4gb25jZSB0aGUgZmxvdyBsZWF2ZXMgdGhhdCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWxTZWNvbmRGYWN0b3IgPSBzaWduYWw8eyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAoe0BsaW5rIHNlbmRTbXNTZWNvbmRGYWN0b3J9KTogYXMge0BsaW5rIGVtYWlsU2Vjb25kRmFjdG9yfS4gKi9cbiAgcmVhZG9ubHkgc21zU2Vjb25kRmFjdG9yID0gc2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICAvKipcbiAgICogVGhlIE1GQSBlbnJvbG1lbnQgc3RlcCAoYG5lZWRzX21mYV9lbnJvbGxtZW50YCk6IHRoZSBhdXRoZW50aWNhdG9yIGFwcCdzXG4gICAqIHNldHVwIChRUiBjb2RlLCBzZXR1cCBrZXkpIG9yIGEgdGV4dGVkIGNvZGUuIFN0YXJ0ZWQgYW5kIHJlc2V0IHdpdGggdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50Q29udHJvbGxlcjtcbiAgLyoqIHtAbGluayBlbnJvbGxtZW50fSdzIHN0YXRlLCBmb3IgdGVtcGxhdGVzLiAqL1xuICByZWFkb25seSBlbnJvbGxtZW50U3RhdGU6IFdyaXRhYmxlU2lnbmFsPE1mYUVucm9sbG1lbnRTdGF0ZT47XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBwb2xpY2llcyAodGVybXMsIHByaXZhY3ksIOKApikgZm9yIHRoZSBjcmVhdGUtYWNjb3VudCBmb3JtOlxuICAgKiB7QGxpbmsgY3JlYXRlfSBzZW5kcyB0aGVpciBhY2NlcHRhbmNlcyBhbmQgcmVsb2FkcyB0aGVtIGFmdGVyIGEgcmVmdXNhbC5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljaWVzID0gbmV3IFBvbGljeUFjY2VwdGFuY2VDb250cm9sbGVyKFtdKTtcbiAgLyoqXG4gICAqIFBhc3NrZXkgc2lnbi1pbiAodGhlIFwiU2lnbiBpbiB3aXRoIGEgcGFzc2tleVwiIGJ1dHRvbiBhbmQgcGFzc2tleSBhdXRvZmlsbCBvblxuICAgKiB0aGUgaWRlbnRpZmllciBmaWVsZCkuIFRoZSBvdXRjb21lIGdvZXMgdGhyb3VnaCB0aGUgc2FtZSBjb21wbGV0aW9uIGFzIGV2ZXJ5IHNpZ24taW4uXG4gICAqL1xuICByZWFkb25seSBwYXNza2V5OiBQYXNza2V5U2lnbkluQ29udHJvbGxlcjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBicm93c2VyIGNhbiBydW4gV2ViQXV0aG47IGA8YXRsYXMtc2lnbi1pbj5gIHNldHMgaXQgYWZ0ZXIgaXQgaXMgY3JlYXRlZCBpbiBhIGJyb3dzZXIuICovXG4gIHJlYWRvbmx5IHBhc3NrZXlTdXBwb3J0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHBvbGxUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRlbnRpZmllciA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBGYXBpQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVsb2FkOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+LFxuICAgIHBlbmRpbmc6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGwsXG4gICAgLyoqIFJlc29sdmVzIHRoZSBjYXB0Y2hhIG1lc3NhZ2VzJyBjYXRhbG9nIGtleXMuIERlZmF1bHRzIHRvIGVuLVVTLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdDogKGtleTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoa2V5KSA9PiB0cmFuc2xhdGUoRU5fVVMsIGtleSksXG4gICAgLyoqIFdhaXQgZm9yIHtAbGluayBjb250aW51ZUFmdGVyRXhpc3RpbmdBY2NvdW50fSAoYDxhdGxhcy1zaWduLXVwPmAgZHJhd3MgdGhlIG5vdGljZSkuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBob2xkRXhpc3RpbmdBY2NvdW50Tm90aWNlID0gZmFsc2UsXG4gICkge1xuICAgIC8vIFNlZWRlZCBmcm9tIGEgcmVkaXJlY3QgdGhhdCBjYW1lIGJhY2sgbWlkLWZsb3cgKGUuZy4gT0F1dGggbmVlZGluZyBhIHNlY29uZFxuICAgIC8vIGZhY3Rvcikgc28gdGhlIHVzZXIgcmVzdW1lcyBhdCB0aGUgZGVtYW5kZWQgc3RlcCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIG92ZXIuXG4gICAgdGhpcy5zdGF0ZSA9IHNpZ25hbDxGbG93U3RhdGU+KHBlbmRpbmcgPyBmbG93RnJvbVBlbmRpbmcocGVuZGluZykgOiBpbml0aWFsRmxvdyk7XG4gICAgdGhpcy5lbnJvbGxtZW50ID0gY3JlYXRlTWZhRW5yb2xsbWVudCh0aGlzLmNsaWVudCwgKCkgPT4gdGhpcy5tZmFDaG9pY2VzKCkpO1xuICAgIHRoaXMuZW5yb2xsbWVudFN0YXRlID0gc2lnbmFsPE1mYUVucm9sbG1lbnRTdGF0ZT4odGhpcy5lbnJvbGxtZW50LnN0YXRlKTtcbiAgICB0aGlzLmVucm9sbG1lbnQuc3Vic2NyaWJlKChuZXh0KSA9PiB0aGlzLmVucm9sbG1lbnRTdGF0ZS5zZXQobmV4dCkpO1xuICAgIHRoaXMucGFzc2tleSA9IGNyZWF0ZVBhc3NrZXlTaWduSW5Db250cm9sbGVyKHtcbiAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICBvblN0YXJ0OiAoKSA9PiB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSksXG4gICAgICBvblJlc3VsdDogKG5leHQpID0+IHRoaXMuZmluaXNoKG5leHQpLFxuICAgICAgY2FwdGNoYTogKCkgPT4gdGhpcy5jYXB0Y2hhLFxuICAgICAgY2FuY2VsbGVkTWVzc2FnZTogKCkgPT4gdGhpcy50KCdzaWduSW4ucGFzc2tleUNhbmNlbGxlZCcpLFxuICAgIH0pO1xuICAgIHRoaXMuc3luY0NhcHRjaGEoKTtcbiAgICB0aGlzLnN5bmNFbnJvbGxtZW50KCk7XG4gIH1cblxuICAvKiogV2h5IFwiQ29udGludWUgd2l0aCBBdGxhc1wiIGNvdWxkIG5vdCBzdGFydCAodGhlIHNlcnZlcidzIG1lc3NhZ2UpOyBudWxsIG90aGVyd2lzZS4gKi9cbiAgcmVhZG9ubHkgc2lnbkluV2l0aEF0bGFzRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFwiQ29udGludWUgd2l0aCBBdGxhc1wiICh3aGVuIGBzZXR0aW5ncygpLnNpZ25JbldpdGhBdGxhc2AgaXMgc2V0KTogc3RhcnRzIHRoZVxuICAgKiBTU08gc2lnbi1pbiBhbmQgc2VuZHMgdGhlIGJyb3dzZXIgdG8gQXRsYXMuXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQXRsYXMoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICB0aGlzLnNpZ25JbldpdGhBdGxhc0Vycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3RhcnRTaWduSW5XaXRoQXRsYXModGhpcy5jbGllbnQsIGNvbm5lY3Rpb25JZCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGlmICgndXJsJyBpbiBzdGFydGVkKSB3aW5kb3cubG9jYXRpb24uYXNzaWduKHN0YXJ0ZWQudXJsKTtcbiAgICBlbHNlIHRoaXMuc2lnbkluV2l0aEF0bGFzRXJyb3Iuc2V0KHN0YXJ0ZWQuZXJyb3IpO1xuICB9XG5cbiAgLyoqIFwiU2lnbiBpbiB3aXRoIGEgcGFzc2tleVwiIGlzIG9mZmVyZWQ6IHRoZSBmaXJzdCBzdGVwLCB0aGUgaW5zdGFuY2UgdHVybmVkIHBhc3NrZXkgc2lnbi1pbiBvbiwgYW5kIHRoZSBicm93c2VyIGNhbi4gKi9cbiAgcGFzc2tleU9mZmVyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFzc2tleVN1cHBvcnRlZCgpICYmICF0aGlzLnN0YXRlKCkuYXR0ZW1wdCAmJiB0aGlzLnNldHRpbmdzKCk/LnBhc3NrZXlTaWduSW4gPT09IHRydWU7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgYXBwIGxldHMgdGhlIE1GQSBzdGVwcyBvZmZlciAoZnJvbSB7QGxpbmsgc2V0dGluZ3N9KS4gKi9cbiAgbWZhQ2hvaWNlcygpOiBNZmFDaG9pY2VzIHtcbiAgICByZXR1cm4gbWZhQ2hvaWNlc0Zyb20odGhpcy5zZXR0aW5ncygpPy5hY2NvdW50KTtcbiAgfVxuXG4gIC8qKiBTdGFydCB0aGUgZW5yb2xtZW50IHN0ZXAgZm9yIGl0cyBhdHRlbXB0LCBvciByZXNldCBpdCBvbmNlIHRoZSBmbG93IGxlYXZlcy4gKi9cbiAgcHJpdmF0ZSBzeW5jRW5yb2xsbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ7XG4gICAgaWYgKGF0dGVtcHQ/LnN0YXR1cyA9PT0gJ25lZWRzX21mYV9lbnJvbGxtZW50JyAmJiBhdHRlbXB0LmlkKSB0aGlzLmVucm9sbG1lbnQuc3RhcnQoYXR0ZW1wdC5pZCk7XG4gICAgZWxzZSB0aGlzLmVucm9sbG1lbnQucmVzZXQoKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCB0aGUgaW5zdGFuY2UncyBwdWJsaWMgc2V0dGluZ3MgYW5kIGRyYXcgd2hhdGV2ZXIgY2FwdGNoYSB0aGV5IHJlcXVpcmUuICovXG4gIGFzeW5jIGxvYWRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBmZXRjaEluc3RhbmNlU2V0dGluZ3ModGhpcy5jbGllbnQpO1xuICAgIGlmIChsb2FkZWQpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3Muc2V0KGxvYWRlZCk7XG4gICAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gICAgICBpZiAobG9hZGVkLmFjY291bnQubGFzdFNpZ25Jbk1ldGhvZCkgdGhpcy5sYXN0TWV0aG9kLnNldChhd2FpdCBmZXRjaExhc3RTaWduSW5NZXRob2QodGhpcy5jbGllbnQpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvcnMgdG8gb2ZmZXIgb24gYSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwOiB0aGUgc2VydmVyJ3MgbGlzdFxuICAgKiB3aXRob3V0IGVtYWlsIGNvZGUgLyBsaW5rIHdoaWxlIHRoZSBhcHAgY2Fubm90IGRlbGl2ZXIgZW1haWxcbiAgICogKGBzZXR0aW5ncy5lbWFpbERlbGl2ZXJ5LmF2YWlsYWJsZSA9PT0gZmFsc2VgKS4gRW1wdHkgb24gYW55IG90aGVyIHN0ZXAuXG4gICAqL1xuICBmaXJzdEZhY3RvcnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdDtcbiAgICBjb25zdCBzdGVwID0gYXR0ZW1wdCA/IG5leHRTdGVwKGF0dGVtcHQpIDogbnVsbDtcbiAgICBpZiAoc3RlcD8ua2luZCAhPT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG9mZmVyZWQgPSBvZmZlcmVkRmlyc3RGYWN0b3JzKHN0ZXAuc3RyYXRlZ2llcywgdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5KTtcbiAgICBjb25zdCBwcm9vZiA9IHRoaXMuaG9sZFByb29mKCk7XG4gICAgcmV0dXJuIHByb29mICYmICFvZmZlcmVkLmluY2x1ZGVzKHByb29mKSA/IFsuLi5vZmZlcmVkLCBwcm9vZl0gOiBvZmZlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbWFpbGVkIHByb29mIGEgcGFzc3dvcmQgaG9sZCBzdGlsbCB3YWl0cyBvbiAoYEZsb3dTdGF0ZS5wYXNzd29yZEhvbGRgKTogdGhlXG4gICAqIGNvZGUsIG9yIGEgbGluayB3aGVyZSB0aGUgaW5zdGFuY2UgdmVyaWZpZXMgYnkgbGluayBvbmx5LiBOdWxsIHdpdGggbm8gaG9sZCwgb25jZVxuICAgKiBwcm92ZW4sIG9yIHdoaWxlIHRoZSBhcHAgY2Fubm90IGRlbGl2ZXIgZW1haWwuXG4gICAqL1xuICBob2xkUHJvb2YoKTogJ2VtYWlsX2NvZGUnIHwgJ2VtYWlsX2xpbmsnIHwgbnVsbCB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuc3RhdGUoKS5wYXNzd29yZEhvbGQ7XG4gICAgaWYgKCFob2xkIHx8IGhvbGQucmVsZWFzZWQgfHwgdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5Py5hdmFpbGFibGUgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5hY2NvdW50Py5lbWFpbFZlcmlmaWNhdGlvbiA9PT0gJ2xpbmsnID8gJ2VtYWlsX2xpbmsnIDogJ2VtYWlsX2NvZGUnO1xuICB9XG5cbiAgLyoqIEJhY2sgZnJvbSB0aGUgZW1haWxlZCBmYWN0b3IgdG8gdGhlIHBhc3N3b3JkIGZpZWxkLiAqL1xuICB1c2VQYXNzd29yZCgpOiB2b2lkIHtcbiAgICB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChudWxsKTtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgcHJlcGFyZWQ6IG51bGwsIHBvbGxTZWNyZXQ6IG51bGwsIGVycm9yczogW10gfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBlbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGFwcCBjYW5ub3RcbiAgICogc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2VgKTpcbiAgICogYDxhdGxhcy1zaWduLXVwPmAgc2hvd3MgdGhlIFwiY2FuJ3Qgc2VuZCBlbWFpbFwiIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgc2lnblVwRW1haWxVbmF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBGYWxzZSB3aGVuIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgY2Fubm90IGJlIGRlbGl2ZXJlZCDigJQgaGlkZSBcIkZvcmdvdCBwYXNzd29yZD9cIi4gKi9cbiAgcGFzc3dvcmRSZXNldEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkUmVzZXQgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgc2VydmVyIHRvIGVtYWlsIGEgc2lnbi1pbiBjb2RlIGZvciB0aGUgY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYFxuICAgKiBzdGVwIChgUE9TVCDigKYvcHJlcGFyZV9maXJzdF9mYWN0b3JgKTsgdGhlIGZvcm0gdGhlbiBjb2xsZWN0cyB0aGUgY29kZSwgd2hpY2hcbiAgICoge0BsaW5rIHN1Ym1pdH0gcG9zdHMgYXMgdGhlIGBlbWFpbF9jb2RlYCBzdHJhdGVneS4gV2hpbGUgYSBwYXNzd29yZCBob2xkIHdhaXRzXG4gICAqIG9uIGl0ICh7QGxpbmsgaG9sZFByb29mfSksIHRoaXMgZW1haWxzIHRoYXQgcHJvb2YgaW5zdGVhZC5cbiAgICovXG4gIGFzeW5jIHByZXBhcmUoc3RyYXRlZ3k6ICdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5maXJzdEZhY3RvcnMoKS5pbmNsdWRlcyhzdHJhdGVneSkpIHJldHVybjtcbiAgICBjb25zdCBwcm9vZiA9IHRoaXMuaG9sZFByb29mKCk7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIGNvbnN0IG5leHQgPVxuICAgICAgc3RyYXRlZ3kgPT09IHByb29mXG4gICAgICAgID8gYXdhaXQgcHJlcGFyZVBhc3N3b3JkSG9sZFByb29mKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHByb29mKVxuICAgICAgICA6IGF3YWl0IHByZXBhcmVGYWN0b3IodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgc3RyYXRlZ3kpO1xuICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgaWYgKCFuZXh0LmVycm9ycy5sZW5ndGgpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KHN0cmF0ZWd5KTtcbiAgICB0aGlzLnN5bmNQb2xsaW5nKCk7XG4gIH1cblxuICAvKiogS2VlcCBib3RoIGNhcHRjaGFzIGluIHN0ZXAgd2l0aCB0aGUgc2V0dGluZ3MgYW5kIHRoZSBmbG93J3MgY3VycmVudCBzdGVwLiAqL1xuICBwcml2YXRlIHN5bmNDYXB0Y2hhKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncygpO1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIHRoaXMuY2FwdGNoYS5jb25maWd1cmUoXG4gICAgICBzaWduSW5DYXB0Y2hhT3B0aW9ucyhzZXR0aW5ncz8uY2FwdGNoYUZsb3dzLnNpZ25Jbiwgc3RhdGUsICgpID0+IHZvaWQgdGhpcy5zdWJtaXQoe30pKSxcbiAgICApO1xuICAgIGNvbnN0IHNpZ25VcEZsb3cgPSBzZXR0aW5ncz8uY2FwdGNoYUZsb3dzLnNpZ25VcDtcbiAgICB0aGlzLnNpZ25VcENhcHRjaGEuY29uZmlndXJlKHtcbiAgICAgIGZsb3c6IHNpZ25VcEZsb3csXG4gICAgICBhY3RpdmU6ICFzdGF0ZS5hdHRlbXB0ICYmIGZsb3dOZWVkc0NhcHRjaGEoc2lnblVwRmxvdyksXG4gICAgfSk7XG4gICAgdGhpcy5jYXB0Y2hhRHJhd24uc2V0KHRoaXMuY2FwdGNoYS5uZWVkZWQpO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYURyYXduLnNldCh0aGlzLnNpZ25VcENhcHRjaGEubmVlZGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhdGUobmV4dDogRmxvd1N0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnN0YXRlKCk7XG4gICAgY29uc3QgcHJldmlvdXNJZCA9IHByZXZpb3VzLmF0dGVtcHQ/LmlkID8/IG51bGw7XG4gICAgdGhpcy5zdGF0ZS5zZXQobmV4dCk7XG4gICAgLy8gQSBwcm92ZW4gaG9sZCBnb2VzIGJhY2sgdG8gdGhlIHBhc3N3b3JkIGZpZWxkLlxuICAgIGlmIChuZXh0LnBhc3N3b3JkSG9sZD8ucmVsZWFzZWQgJiYgIXByZXZpb3VzLnBhc3N3b3JkSG9sZD8ucmVsZWFzZWQpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KG51bGwpO1xuICAgIC8vIEEgcHJlcGFyZWQgZmFjdG9yIGJlbG9uZ3MgdG8gdGhlIGZpcnN0LWZhY3RvciBzdGVwIGl0IHdhcyBzZW50IGZvci5cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgIT09ICduZWVkc19maXJzdF9mYWN0b3InKSB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChudWxsKTtcbiAgICAvLyBBbiBlbWFpbGVkIHNlY29uZC1mYWN0b3IgY29kZSBiZWxvbmdzIHRvIHRoZSBzZWNvbmQtZmFjdG9yIHN0ZXAgb2YgdGhpcyBhdHRlbXB0LlxuICAgIGlmIChuZXh0LmF0dGVtcHQ/LnN0YXR1cyAhPT0gJ25lZWRzX3NlY29uZF9mYWN0b3InIHx8IChuZXh0LmF0dGVtcHQ/LmlkID8/IG51bGwpICE9PSBwcmV2aW91c0lkKSB7XG4gICAgICB0aGlzLmVtYWlsU2Vjb25kRmFjdG9yLnNldChudWxsKTtcbiAgICAgIHRoaXMuc21zU2Vjb25kRmFjdG9yLnNldChudWxsKTtcbiAgICB9XG4gICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIHRoaXMuc3luY0Vucm9sbG1lbnQoKTtcbiAgICB0aGlzLmF1dG9TZW5kKCk7XG4gIH1cblxuICBwcml2YXRlIGF1dG9TZW50Rm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFdpdGggbm8gcGFzc3dvcmQgb24gb2ZmZXIsIGVtYWlsIHRoZSBjb2RlIGFzIHNvb24gYXMgdGhlIHNlcnZlciBhc2tzIGZvciBhXG4gICAqIGZpcnN0IGZhY3RvciDigJQgb25jZSBwZXIgYXR0ZW1wdCwgc28gYSBmYWlsZWQgc2VuZCB3YWl0cyBmb3IgdGhlIHVzZXIncyByZXRyeVxuICAgKiAodGhlIFwiRW1haWwgbWUgYSBjb2RlXCIgYnV0dG9uKSBpbnN0ZWFkIG9mIGxvb3BpbmcuXG4gICAqL1xuICBwcml2YXRlIGF1dG9TZW5kKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ/LmlkID8/IG51bGw7XG4gICAgaWYgKCFpZCB8fCB0aGlzLmF1dG9TZW50Rm9yID09PSBpZCB8fCB0aGlzLnByZXBhcmVkRmFjdG9yKCkpIHJldHVybjtcbiAgICBpZiAocGxhbkZpcnN0RmFjdG9yKHRoaXMuZmlyc3RGYWN0b3JzKCkpLmF1dG9TZW5kICE9PSAnZW1haWxfY29kZScpIHJldHVybjtcbiAgICB0aGlzLmF1dG9TZW50Rm9yID0gaWQ7XG4gICAgdm9pZCB0aGlzLnByZXBhcmUoJ2VtYWlsX2NvZGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBmbG93IHdpdGggdGhlIHZhbHVlcyB0aGUgdXNlciB0eXBlZC4gT24gY29tcGxldGlvbiwgZXhjaGFuZ2UgdGhlXG4gICAqIG9uZS10aW1lIHRpY2tldCBmb3IgY29va2llcyBvdmVyIGEgc2FtZS1vcmlnaW4gcmVxdWVzdCAoRkFQSSBpcyBjcm9zcy1vcmlnaW5cbiAgICogYW5kIGNhbm5vdCBzZXQgdGhlIGNvb2tpZSBvbiBpdHMgb3duIHJlc3BvbnNlKSwgdGhlbiByZS1ib290IHNvIHRoZSByZXN0IG9mXG4gICAqIHRoZSBhcHAgc2VlcyBhIHNpZ25lZC1pbiB1c2VyLlxuICAgKi9cbiAgYXN5bmMgc3VibWl0KHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcblxuICAgIC8vIEEgY29kZSB0aGF0IGxpZnRzIGEgcGFzc3dvcmQgaG9sZCBnb2VzIHRvIGl0cyBvd24gYXR0ZW1wdCwgbm90IHRoaXMgc2lnbi1pbi5cbiAgICBpZiAodGhpcy5wcmVwYXJlZEZhY3RvcigpID09PSAnZW1haWxfY29kZScgJiYgdGhpcy5ob2xkUHJvb2YoKSA9PT0gJ2VtYWlsX2NvZGUnKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGF3YWl0IGF0dGVtcHRQYXNzd29yZEhvbGRQcm9vZih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpLCB2YWx1ZXMuY29kZSA/PyAnJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBhd2FpdCBhZHZhbmNlV2l0aENhcHRjaGEodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgdmFsdWVzLCB7XG4gICAgICBjYXB0Y2hhOiB0aGlzLmNhcHRjaGEsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgfSk7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gb3V0LmlkZW50aWZpZXI7XG4gICAgYXdhaXQgdGhpcy5maW5pc2gob3V0LnN0YXRlKTtcbiAgfVxuXG4gIC8qKiBMb2FkIHRoZSBzaWduLXVwJ3MgcG9saWNpZXMgaW50byB7QGxpbmsgcG9saWNpZXN9IChgPGF0bGFzLXNpZ24tdXA+YCBjYWxscyBpdCBvbiBpbml0KS4gKi9cbiAgYXN5bmMgbG9hZFBvbGljaWVzKGxvY2FsZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucG9saWNpZXMuc2V0UG9saWNpZXMoYXdhaXQgbG9hZFBvbGljaWVzKHRoaXMuY2xpZW50LCB7IGxvY2FsZSB9KSk7XG4gIH1cblxuICAvKiogVGhlIHVzZXIgZGVjbGluZWQgYSBwb2xpY3kgYSBzaWduLWluIHdhcyB3YWl0aW5nIG9uOiBjYW5jZWwgdGhlIGF0dGVtcHQgYW5kIHNheSB3aHkuICovXG4gIGRlY2xpbmVQb2xpY3kodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuc2V0KHtcbiAgICAgIC4uLmluaXRpYWxGbG93LFxuICAgICAgZXJyb3JzOiBbeyBjb2RlOiAnUE9MSUNZX0RFQ0xJTkVEJywgbWVzc2FnZTogdGhpcy50KCdwb2xpY3kuZGVjbGluZWQnKS5yZXBsYWNlKCd7cG9saWN5fScsIHRpdGxlKSB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYWNjb3VudCAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwc2ApIGZyb20gYSBjcmVhdGUtYWNjb3VudCBmb3JtJ3NcbiAgICogdmFsdWVzIOKAlCBlbWFpbCwgcGFzc3dvcmQgYW5kIGFueSBjb25maWd1cmVkIHNpZ24tdXAgZmllbGRzIOKAlCBjYXJyeWluZyB0aGVcbiAgICogc2lnbi11cCBjYXB0Y2hhJ3MgdG9rZW4gd2hlbiB0aGUgaW5zdGFuY2UgcmVxdWlyZXMgb25lLiBUaGUgZW1haWxlZCBjb2RlIGlzXG4gICAqIHRoZW4gcG9zdGVkIHdpdGgge0BsaW5rIHN1Ym1pdH0uXG4gICAqL1xuICBhc3luYyBjcmVhdGUodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID0gYXdhaXQgY3JlYXRlU2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHtcbiAgICAgIGNvbnNlbnQsXG4gICAgICBjYXB0Y2hhOiB0aGlzLnNpZ25VcENhcHRjaGEsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgICBwb2xpY2llczogdGhpcy5wb2xpY2llcyxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LmVtYWlsU2Vjb25kRmFjdG9yYCk6IG1haWxzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIHZlcmlmaWVkIGVtYWlsO1xuICAgKiBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEVtYWlsU2Vjb25kRmFjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZFNlY29uZEZhY3RvckNvZGUoJ2VtYWlsX2NvZGUnLCB0aGlzLmVtYWlsU2Vjb25kRmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAod2hlcmUgdGhlIGFwcCBvZmZlcnMgdGV4dGVkXG4gICAqIGNvZGVzLCB7QGxpbmsgbWZhQ2hvaWNlc31gKCkuc21zYCk6IHRleHRzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIGVucm9sbGVkXG4gICAqIHBob25lOyBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZFNtc1NlY29uZEZhY3RvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRTZWNvbmRGYWN0b3JDb2RlKCdzbXMnLCB0aGlzLnNtc1NlY29uZEZhY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRTZWNvbmRGYWN0b3JDb2RlKFxuICAgIHN0cmF0ZWd5OiAnc21zJyB8ICdlbWFpbF9jb2RlJyxcbiAgICBvdXQ6IFdyaXRhYmxlU2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0Py5pZDtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgb3V0LnNldCh7IGJ1c3k6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc2VudFRvIH0gPSBhd2FpdCBwcmVwYXJlU2Vjb25kRmFjdG9yQ29kZSh0aGlzLmNsaWVudCwgaWQsIHN0cmF0ZWd5KTtcbiAgICAgIG91dC5zZXQoeyBzZW50VG8gfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG91dC5zZXQoeyBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiB0aGlzLnQoJ2Vycm9yLmdlbmVyaWMnKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzZW5kIGEgc2lnbi11cCdzIGVtYWlsZWQgY29kZSAvIGxpbmsgKHRoZSBlYXJsaWVyIG9uZSBzdG9wcyB3b3JraW5nKS4gKi9cbiAgYXN5bmMgcmVzZW5kU2lnblVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICB0aGlzLnN0YXRlLnNldChhd2FpdCByZXNlbmRTaWduVXBWZXJpZmljYXRpb24odGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgcGFzc2tleS1vbmx5IHNpZ24tdXAgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHMvcGFzc2tleWApIGZyb20gdGhlXG4gICAqIGNyZWF0ZS1hY2NvdW50IGZvcm0ncyB2YWx1ZXMg4oCUIG5vIHBhc3N3b3JkLiBPZmZlcmVkIHdoZW4gdGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQucGFzc2tleVNpZ25VcGAgaXMgc2V0LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2l0aFBhc3NrZXkodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhd2FpdCBjcmVhdGVQYXNza2V5U2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHsgY29uc2VudCwgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLCB0OiB0aGlzLnQsIHBvbGljaWVzOiB0aGlzLnBvbGljaWVzIH0pKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGFzc2tleS1vbmx5IHNpZ24tdXAncyBsYXN0IHN0ZXA6IGNyZWF0ZSB0aGUgcGFzc2tleSwgYW5kIHdpdGggaXQgdGhlIGFjY291bnQuICovXG4gIGFzeW5jIGNyZWF0ZVBhc3NrZXkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGF3YWl0IGZpbmlzaFBhc3NrZXlTaWduVXAodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgeyB0OiB0aGlzLnQgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb2RlcyBhbiBNRkEgZW5yb2xtZW50IGp1c3QgY29tcGxldGVkIHRoZSBzaWduLWluIHdpdGgsIHNob3duXG4gICAqIG9uY2UgYmVmb3JlIGl0IGZpbmlzaGVzICh7QGxpbmsgc2F2ZVJlY292ZXJ5Q29kZXN9KTsgbnVsbCBvdGhlcndpc2UuIFRoZXlcbiAgICogbGl2ZSBvbmx5IGluIHRoaXMgY29udHJvbGxlcidzIG1lbW9yeS5cbiAgICovXG4gIHJlY292ZXJ5Q29kZXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gcGVuZGluZ1JlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIC8qKiBcIkkndmUgc2F2ZWQgbXkgY29kZXNcIjogZm9yZ2V0IHRoZSByZWNvdmVyeSBjb2RlcyBhbmQgZmluaXNoIHRoZSBzaWduLWluLiAqL1xuICBhc3luYyBzYXZlUmVjb3ZlcnlDb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKSk7XG4gIH1cblxuICAvKiogVGhlIGFkZHJlc3MgYmVsb25nZWQgdG8gYW4gZXhpc3RpbmcgYWNjb3VudDogdGhlIG5vdGljZSBpcyB1cCB1bnRpbCB7QGxpbmsgY29udGludWVBZnRlckV4aXN0aW5nQWNjb3VudH0uICovXG4gIGV4aXN0aW5nQWNjb3VudE5vdGljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVuZGluZ0V4aXN0aW5nQWNjb3VudE5vdGljZSh0aGlzLnN0YXRlKCkpO1xuICB9XG5cbiAgLyoqIFRoZSB1c2VyIHJlYWQgdGhlIG5vdGljZTogZmluaXNoIHRoZSBzaWduLXVwLiAqL1xuICBhc3luYyBjb250aW51ZUFmdGVyRXhpc3RpbmdBY2NvdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGFja25vd2xlZGdlRXhpc3RpbmdBY2NvdW50KHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2gobmV4dDogRmxvd1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW4gZW5yb2xtZW50J3MgcmVjb3ZlcnkgY29kZXMgYXJlIHNob3duIGZpcnN0OyBgc2F2ZVJlY292ZXJ5Q29kZXNgIGZpbmlzaGVzLlxuICAgIGlmIChwZW5kaW5nUmVjb3ZlcnlDb2RlcyhuZXh0KSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIC8vIFN0YXlzIGJ1c3kgdW50aWwgdGhpcyBicm93c2VyIGFjdHVhbGx5IGhvbGRzIHRoZSBzZXNzaW9uOiB0aGUgY29tcGxldGlvblxuICAgICAgLy8gYWxvbmUgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgdGhlIGNvb2tpZSB3YXMga2VwdC5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiB0cnVlIH0pO1xuICAgICAgbGV0IGV4Y2hhbmdlZCA9IHRydWU7XG4gICAgICBpZiAobmV4dC50aWNrZXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQ6IG5leHQudGlja2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgZXhjaGFuZ2VkID0gcmVzLm9rO1xuICAgICAgfVxuICAgICAgaWYgKGV4Y2hhbmdlZCAmJiB0aGlzLmhvbGRFeGlzdGluZ0FjY291bnROb3RpY2UgJiYgcGVuZGluZ0V4aXN0aW5nQWNjb3VudE5vdGljZShuZXh0KSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgdGlja2V0OiBudWxsLCBidXN5OiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qga2VwdCA9IGV4Y2hhbmdlZCAmJiAoYXdhaXQgdGhpcy5yZWxvYWQoKSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogZmFsc2UsIHNlc3Npb25LZXB0OiBrZXB0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgICAgLy8gQSBtYWdpYy1saW5rIHN0ZXAgbWF5IG5vdyBiZSBwb2xsYWJsZSAoYSBsaW5rIG9wZW5lZCBvbiBhbm90aGVyIGRldmljZSkuXG4gICAgICB0aGlzLnN5bmNQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0L3N0b3AgdGhlIMKnNS4zIG1hZ2ljLWxpbmsgcG9sbCB0byBtYXRjaCB0aGUgY3VycmVudCBzdGF0ZS4gKi9cbiAgc3luY1BvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZEtlZXBQb2xsaW5nKHRoaXMuc3RhdGUoKSkpIHtcbiAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHJldHVybjtcbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGF0ZTogbmV4dCwgdGlja2V0IH0gPSBhd2FpdCBwb2xsQXR0ZW1wdCh0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgICAgLy8gZS5nLiBhIHBhc3NrZXkgc2lnbi11cCB3aG9zZSBlbWFpbCB3YXMganVzdCBwcm92ZW46IG9ubHkgdGhpcyB0YWIgY2FuIGdvIG9uLlxuICAgICAgICBpZiAoIXRpY2tldCAmJiAhc2hvdWxkS2VlcFBvbGxpbmcobmV4dCkpIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgICAgaWYgKCF0aWNrZXQgfHwgIW5leHQuYXR0ZW1wdCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFRoZSB0aWNrZXQgaXMgZXhjaGFuZ2VkIGJ5IGEgbm9ybWFsIHJlcXVlc3QsIHNvIG5vIHNlc3Npb24gdG9rZW4gZXZlclxuICAgICAgICAvLyBhcHBlYXJzIGluIGEgVVJMLlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0KCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgICAgYXR0ZW1wdF9pZDogKG5leHQuYXR0ZW1wdCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkLFxuICAgICAgICAgIHRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGtlcHQgPSByZXMub2sgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgLi4udGhpcy5zdGF0ZSgpLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgfSkoKTtcbiAgICB9LCAyXzAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvbGwgdGltZXIgYW5kIHRoZSBjYXB0Y2hhIHdpZGdldHMg4oCUIGNhbGwgZnJvbSB0aGUgY29tcG9uZW50J3MgYG5nT25EZXN0cm95YC4gKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhc3NrZXkuc3RvcEF1dG9maWxsKCk7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIHRoaXMuY2FwdGNoYS5kZXN0cm95KCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
- import { ChangeDetectionStrategy, Component, Input, inject, } from '@angular/core';
2
- import { lastUsedMethodLabel, signUp as hostedSignUp } from '@atlasauth/js';
1
+ import { ChangeDetectionStrategy, Component, Input, computed, effect, inject, } from '@angular/core';
2
+ import { lastUsedMethodLabel, passkeysSupported, signUp as hostedSignUp } from '@atlasauth/js';
3
3
  import { AtlasService } from '../atlas.service';
4
4
  import { translate } from '../i18n';
5
5
  import { AttemptFlowComponent } from './attempt-flow.component';
@@ -35,6 +35,12 @@ export class SignInComponent {
35
35
  return null;
36
36
  return lastUsedMethodLabel(this.flow.lastMethod(), (key) => this.t(key));
37
37
  }
38
+ /** The "Sign in with Atlas" connection, on the first step, when the instance has it on. */
39
+ atlasConnection() {
40
+ if (this.flow.state().attempt || this.flow.recoveryCodes())
41
+ return null;
42
+ return this.flow.settings()?.signInWithAtlas?.connectionId ?? null;
43
+ }
38
44
  signUpHref() {
39
45
  if (this.signUpUrl === null)
40
46
  return null;
@@ -54,7 +60,16 @@ export class SignInComponent {
54
60
  flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(),
55
61
  // Resume mid-flow if an OAuth redirect came back owing a second factor.
56
62
  this.atlas.pendingAttempt, (key) => translate(this.atlas.localization, key));
63
+ // Passkey autofill runs while the first step offers passkeys (a computed, so it re-arms only when that changes).
64
+ passkeyOffered = computed(() => this.flow.passkeyOffered());
65
+ passkeyAutofill = effect(() => (this.passkeyOffered() ? this.flow.passkey.armAutofill() : this.flow.passkey.stopAutofill()));
66
+ submitIdentifier(values) {
67
+ this.flow.passkey.stopAutofill();
68
+ void this.flow.submit(values);
69
+ }
57
70
  ngOnInit() {
71
+ if (typeof window !== 'undefined')
72
+ this.flow.passkeySupported.set(passkeysSupported());
58
73
  // If seeded from a pending attempt that is already pollable, start polling.
59
74
  this.flow.syncPolling();
60
75
  // §5 the instance's captcha settings (switching captcha on in the dashboard
@@ -73,6 +88,14 @@ export class SignInComponent {
73
88
  {{ t('signIn.lastUsed') }}: {{ label }}
74
89
  </p>
75
90
  }
91
+ @if (atlasConnection(); as connectionId) {
92
+ <button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
93
+ {{ t('signIn.continueWithAtlas') }}
94
+ </button>
95
+ @if (flow.signInWithAtlasError(); as message) {
96
+ <p class="atlas-error" role="alert">{{ message }}</p>
97
+ }
98
+ }
76
99
  @if (flow.recoveryCodes(); as codes) {
77
100
  <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
78
101
  } @else {
@@ -85,9 +108,12 @@ export class SignInComponent {
85
108
  [captcha]="flow.captchaDrawn() ? flow.captcha : null"
86
109
  [firstFactors]="flow.firstFactors()"
87
110
  [preparedFactor]="flow.preparedFactor()"
111
+ [passwordHold]="flow.state().passwordHold ?? null"
112
+ [holdProof]="flow.holdProof()"
113
+ (usePassword)="flow.usePassword()"
88
114
  [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
89
115
  [emailedSecondFactor]="flow.emailSecondFactor()"
90
- (submitFlow)="flow.submit($event)"
116
+ (submitFlow)="submitIdentifier($event)"
91
117
  (chooseFactor)="flow.prepare($event)"
92
118
  [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
93
119
  [textedSecondFactor]="flow.smsSecondFactor()"
@@ -98,12 +124,23 @@ export class SignInComponent {
98
124
  (policyDeclined)="flow.declinePolicy($event)"
99
125
  ></atlas-attempt-flow>
100
126
  }
127
+ @if (flow.passkeyOffered() && !flow.recoveryCodes()) {
128
+ <button
129
+ type="button"
130
+ class="atlas-social-button atlas-passkey-button"
131
+ data-atlas-passkey-sign-in=""
132
+ [disabled]="flow.state().busy"
133
+ (click)="flow.passkey.signIn()"
134
+ >
135
+ {{ t('signIn.passkeyButton') }}
136
+ </button>
137
+ }
101
138
  @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
102
139
  <p class="atlas-footer" data-atlas-sign-up-prompt="">
103
140
  {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
104
141
  </p>
105
142
  }
106
- `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "sessionKept", "titleKey", "captcha", "firstFactors", "preparedFactor", "offerEmailSecondFactor", "emailedSecondFactor", "offerSmsSecondFactor", "textedSecondFactor", "enrollment", "enrollmentState", "emailVerification"], outputs: ["submitFlow", "chooseFactor", "emailSecondFactor", "smsSecondFactor", "resend", "policyDeclined"] }, { kind: "component", type: RecoveryCodesComponent, selector: "atlas-recovery-codes", inputs: ["codes", "busy"], outputs: ["saved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
143
+ `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "sessionKept", "titleKey", "captcha", "firstFactors", "preparedFactor", "passwordHold", "holdProof", "offerEmailSecondFactor", "emailedSecondFactor", "offerSmsSecondFactor", "textedSecondFactor", "enrollment", "enrollmentState", "emailVerification"], outputs: ["submitFlow", "chooseFactor", "usePassword", "emailSecondFactor", "smsSecondFactor", "resend", "policyDeclined"] }, { kind: "component", type: RecoveryCodesComponent, selector: "atlas-recovery-codes", inputs: ["codes", "busy"], outputs: ["saved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
107
144
  }
108
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignInComponent, decorators: [{
109
146
  type: Component,
@@ -118,6 +155,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
118
155
  {{ t('signIn.lastUsed') }}: {{ label }}
119
156
  </p>
120
157
  }
158
+ @if (atlasConnection(); as connectionId) {
159
+ <button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
160
+ {{ t('signIn.continueWithAtlas') }}
161
+ </button>
162
+ @if (flow.signInWithAtlasError(); as message) {
163
+ <p class="atlas-error" role="alert">{{ message }}</p>
164
+ }
165
+ }
121
166
  @if (flow.recoveryCodes(); as codes) {
122
167
  <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
123
168
  } @else {
@@ -130,9 +175,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
130
175
  [captcha]="flow.captchaDrawn() ? flow.captcha : null"
131
176
  [firstFactors]="flow.firstFactors()"
132
177
  [preparedFactor]="flow.preparedFactor()"
178
+ [passwordHold]="flow.state().passwordHold ?? null"
179
+ [holdProof]="flow.holdProof()"
180
+ (usePassword)="flow.usePassword()"
133
181
  [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
134
182
  [emailedSecondFactor]="flow.emailSecondFactor()"
135
- (submitFlow)="flow.submit($event)"
183
+ (submitFlow)="submitIdentifier($event)"
136
184
  (chooseFactor)="flow.prepare($event)"
137
185
  [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
138
186
  [textedSecondFactor]="flow.smsSecondFactor()"
@@ -143,6 +191,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
143
191
  (policyDeclined)="flow.declinePolicy($event)"
144
192
  ></atlas-attempt-flow>
145
193
  }
194
+ @if (flow.passkeyOffered() && !flow.recoveryCodes()) {
195
+ <button
196
+ type="button"
197
+ class="atlas-social-button atlas-passkey-button"
198
+ data-atlas-passkey-sign-in=""
199
+ [disabled]="flow.state().busy"
200
+ (click)="flow.passkey.signIn()"
201
+ >
202
+ {{ t('signIn.passkeyButton') }}
203
+ </button>
204
+ }
146
205
  @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
147
206
  <p class="atlas-footer" data-atlas-sign-up-prompt="">
148
207
  {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
@@ -155,4 +214,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
155
214
  }], signUpUrl: [{
156
215
  type: Input
157
216
  }] } });
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFeEQ7Ozs7Ozs7OztHQVNHO0FBNENILE1BQU0sT0FBTyxlQUFlO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxpRkFBaUY7SUFDeEUsUUFBUSxDQUFVO0lBQzNCOzs7O09BSUc7SUFDTSxTQUFTLENBQWlCO0lBRXpCLENBQUMsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxzRkFBc0Y7SUFDNUUsYUFBYTtRQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFUyxVQUFVO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUM7WUFDSCxPQUFPLFlBQVksQ0FBQztnQkFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hHLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRWtCLElBQUksR0FBRyxJQUFJLG1CQUFtQixDQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEVBQzdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0lBQ3pCLHdFQUF3RTtJQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFDekIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FDakQsQ0FBQztJQUVGLFFBQVE7UUFDTiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4Qiw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLDJDQUEyQztRQUMzQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7WUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7d0dBdkRVLGVBQWU7NEZBQWYsZUFBZSxtSUF0Q2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ1QsNERBckNTLG9CQUFvQixnYkFBRSxzQkFBc0I7OzRGQXVDM0MsZUFBZTtrQkEzQzNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsc0JBQXNCLENBQUM7b0JBQ3ZELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUO2lCQUNGOzhCQUtVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGxhc3RVc2VkTWV0aG9kTGFiZWwsIHNpZ25VcCBhcyBob3N0ZWRTaWduVXAgfSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBBdHRlbXB0Rmxvd0NvbXBvbmVudCB9IGZyb20gJy4vYXR0ZW1wdC1mbG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWNvdmVyeUNvZGVzQ29tcG9uZW50IH0gZnJvbSAnLi9yZWNvdmVyeS1jb2Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXRsYXNGbG93Q29udHJvbGxlciB9IGZyb20gJy4vZmxvdy1jb250cm9sbGVyJztcblxuLyoqXG4gKiBgPGF0bGFzLXNpZ24taW4+YCDigJQgdGhlIGZ1bGwsIG11bHRpLXN0ZXAgc2lnbi1pbiBmbG93IGRyaXZlbiBlbnRpcmVseSBieSB0aGVcbiAqIHNlcnZlci1zaWRlIGF0dGVtcHQgc3RhdHVzLiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3MgYDxTaWduSW4vPmAuIERyYXdzIHRoZVxuICogaW5zdGFuY2UncyBzaWduLWluIGNhcHRjaGEgd2hlbiBpdCBpcyByZXF1aXJlZCAoYWx3YXlzLW9uLCBvciBhXG4gKiBgbmVlZHNfY2FwdGNoYWAgY2hhbGxlbmdlKS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YXRsYXMtc2lnbi1pbiAqYXRsYXNTaWduZWRPdXQgYWZ0ZXJVcmw9XCIvZGFzaGJvYXJkXCI+PC9hdGxhcy1zaWduLWluPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0bGFzLXNpZ24taW4nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0dGVtcHRGbG93Q29tcG9uZW50LCBSZWNvdmVyeUNvZGVzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGxhc3RVc2VkTGFiZWwoKTsgYXMgbGFiZWwpIHtcbiAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dCBhdGxhcy1sYXN0LXVzZWQtaGludFwiIGRhdGEtYXRsYXM9XCJsYXN0LXVzZWRcIiBbYXR0ci5kYXRhLWF0bGFzLW1ldGhvZF09XCJmbG93Lmxhc3RNZXRob2QoKVwiPlxuICAgICAgICB7eyB0KCdzaWduSW4ubGFzdFVzZWQnKSB9fToge3sgbGFiZWwgfX1cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChmbG93LnJlY292ZXJ5Q29kZXMoKTsgYXMgY29kZXMpIHtcbiAgICAgIDxhdGxhcy1yZWNvdmVyeS1jb2RlcyBbY29kZXNdPVwiY29kZXNcIiBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiIChzYXZlZCk9XCJmbG93LnNhdmVSZWNvdmVyeUNvZGVzKClcIj48L2F0bGFzLXJlY292ZXJ5LWNvZGVzPlxuICAgIH0gQGVsc2Uge1xuICAgIDxhdGxhcy1hdHRlbXB0LWZsb3dcbiAgICAgIFthdHRlbXB0XT1cImZsb3cuc3RhdGUoKS5hdHRlbXB0XCJcbiAgICAgIFtidXN5XT1cImZsb3cuc3RhdGUoKS5idXN5XCJcbiAgICAgIFtlcnJvcnNdPVwiZmxvdy5zdGF0ZSgpLmVycm9yc1wiXG4gICAgICBbc2Vzc2lvbktlcHRdPVwiZmxvdy5zdGF0ZSgpLnNlc3Npb25LZXB0XCJcbiAgICAgIHRpdGxlS2V5PVwic2lnbkluLnRpdGxlXCJcbiAgICAgIFtjYXB0Y2hhXT1cImZsb3cuY2FwdGNoYURyYXduKCkgPyBmbG93LmNhcHRjaGEgOiBudWxsXCJcbiAgICAgIFtmaXJzdEZhY3RvcnNdPVwiZmxvdy5maXJzdEZhY3RvcnMoKVwiXG4gICAgICBbcHJlcGFyZWRGYWN0b3JdPVwiZmxvdy5wcmVwYXJlZEZhY3RvcigpXCJcbiAgICAgIFtvZmZlckVtYWlsU2Vjb25kRmFjdG9yXT1cImZsb3cuc2V0dGluZ3MoKT8uYWNjb3VudD8uZW1haWxTZWNvbmRGYWN0b3IgPT09IHRydWVcIlxuICAgICAgW2VtYWlsZWRTZWNvbmRGYWN0b3JdPVwiZmxvdy5lbWFpbFNlY29uZEZhY3RvcigpXCJcbiAgICAgIChzdWJtaXRGbG93KT1cImZsb3cuc3VibWl0KCRldmVudClcIlxuICAgICAgKGNob29zZUZhY3Rvcik9XCJmbG93LnByZXBhcmUoJGV2ZW50KVwiXG4gICAgICBbb2ZmZXJTbXNTZWNvbmRGYWN0b3JdPVwiZmxvdy5zZXR0aW5ncygpICE9PSBudWxsICYmIGZsb3cubWZhQ2hvaWNlcygpLnNtc1wiXG4gICAgICBbdGV4dGVkU2Vjb25kRmFjdG9yXT1cImZsb3cuc21zU2Vjb25kRmFjdG9yKClcIlxuICAgICAgW2Vucm9sbG1lbnRdPVwiZmxvdy5lbnJvbGxtZW50XCJcbiAgICAgIFtlbnJvbGxtZW50U3RhdGVdPVwiZmxvdy5lbnJvbGxtZW50U3RhdGUoKVwiXG4gICAgICAoZW1haWxTZWNvbmRGYWN0b3IpPVwiZmxvdy5zZW5kRW1haWxTZWNvbmRGYWN0b3IoKVwiXG4gICAgICAoc21zU2Vjb25kRmFjdG9yKT1cImZsb3cuc2VuZFNtc1NlY29uZEZhY3RvcigpXCJcbiAgICAgIChwb2xpY3lEZWNsaW5lZCk9XCJmbG93LmRlY2xpbmVQb2xpY3koJGV2ZW50KVwiXG4gICAgPjwvYXRsYXMtYXR0ZW1wdC1mbG93PlxuICAgIH1cbiAgICBAaWYgKGZsb3cuc3RhdGUoKS5hdHRlbXB0Py5zdGF0dXMgIT09ICdjb21wbGV0ZScgJiYgc2lnblVwSHJlZigpOyBhcyBocmVmKSB7XG4gICAgICA8cCBjbGFzcz1cImF0bGFzLWZvb3RlclwiIGRhdGEtYXRsYXMtc2lnbi11cC1wcm9tcHQ9XCJcIj5cbiAgICAgICAge3sgdCgnc2lnbkluLm5vQWNjb3VudCcpIH19IDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cImhyZWZcIj57eyB0KCdzaWduSW4uc2lnblVwTGluaycpIH19PC9hPlxuICAgICAgPC9wPlxuICAgIH1cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbkluQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgLyoqIFdoZXJlIHRvIHNlbmQgdGhlIHVzZXIgb25jZSB0aGUgZmxvdyBjb21wbGV0ZXMuIFJlc2VydmVkIGZvciBob3N0IHJvdXRpbmcuICovXG4gIEBJbnB1dCgpIGFmdGVyVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlcmUgXCJObyBhY2NvdW50PyBTaWduIHVwXCIgZ29lcy4gRGVmYXVsdDogdGhlIGluc3RhbmNlJ3MgaG9zdGVkIHNpZ24tdXBcbiAgICogcGFnZSAoY2FycnlpbmcgdGhlIHZpc2l0b3IncyByZWZlcnJhbCkuIGBudWxsYCBoaWRlcyBpdC4gQWx3YXlzIHNob3duLCBuZXZlclxuICAgKiBvbmx5IGFmdGVyIGEgZmFpbGVkIHNpZ24taW4sIHNvIGl0IHNheXMgbm90aGluZyBhYm91dCB3aGV0aGVyIGFuIGVtYWlsIGhhcyBhbiBhY2NvdW50LlxuICAgKi9cbiAgQElucHV0KCkgc2lnblVwVXJsPzogc3RyaW5nIHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KTtcbiAgfVxuXG4gIC8qKiBcIkxhc3QgdXNlZDogUGFzc3dvcmRcIiBvbiB0aGUgaWRlbnRpZmllciBzdGVwLCB3aGVuIHRoZSBpbnN0YW5jZSBzaG93cyB0aGUgaGludC4gKi9cbiAgcHJvdGVjdGVkIGxhc3RVc2VkTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZmxvdy5zdGF0ZSgpLmF0dGVtcHQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsYXN0VXNlZE1ldGhvZExhYmVsKHRoaXMuZmxvdy5sYXN0TWV0aG9kKCksIChrZXkpID0+IHRoaXMudChrZXkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaWduVXBIcmVmKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNpZ25VcFVybCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuc2lnblVwVXJsKSByZXR1cm4gdGhpcy5zaWduVXBVcmw7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBob3N0ZWRTaWduVXAoe1xuICAgICAgICBmcm9udGVuZEFwaTogdGhpcy5hdGxhcy5mcm9udGVuZEFwaSxcbiAgICAgICAgcmVkaXJlY3RVcmw6IHRoaXMuYWZ0ZXJVcmwgPz8gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpLFxuICAgICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBmbG93ID0gbmV3IEF0bGFzRmxvd0NvbnRyb2xsZXIoXG4gICAgdGhpcy5hdGxhcy5jcmVhdGVGYXBpQ2xpZW50KCksXG4gICAgKCkgPT4gdGhpcy5hdGxhcy5yZWxvYWQoKSxcbiAgICAvLyBSZXN1bWUgbWlkLWZsb3cgaWYgYW4gT0F1dGggcmVkaXJlY3QgY2FtZSBiYWNrIG93aW5nIGEgc2Vjb25kIGZhY3Rvci5cbiAgICB0aGlzLmF0bGFzLnBlbmRpbmdBdHRlbXB0LFxuICAgIChrZXkpID0+IHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KSxcbiAgKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJZiBzZWVkZWQgZnJvbSBhIHBlbmRpbmcgYXR0ZW1wdCB0aGF0IGlzIGFscmVhZHkgcG9sbGFibGUsIHN0YXJ0IHBvbGxpbmcuXG4gICAgdGhpcy5mbG93LnN5bmNQb2xsaW5nKCk7XG4gICAgLy8gwqc1IHRoZSBpbnN0YW5jZSdzIGNhcHRjaGEgc2V0dGluZ3MgKHN3aXRjaGluZyBjYXB0Y2hhIG9uIGluIHRoZSBkYXNoYm9hcmRcbiAgICAvLyBkcmF3cyBpdCBoZXJlIHdpdGggbm8gY29kZSBjaGFuZ2UpIGFuZCBlbWFpbCBkZWxpdmVyeSAobm8gZW1haWxlZC1jb2RlXG4gICAgLy8gb3B0aW9uIHdoaWxlIHRoZSBhcHAgY2Fubm90IHNlbmQgZW1haWwpLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgdm9pZCB0aGlzLmZsb3cubG9hZFNldHRpbmdzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3cuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLElBQUksWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUV4RDs7Ozs7Ozs7O0dBU0c7QUFrRUgsTUFBTSxPQUFPLGVBQWU7SUFDVCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTlDLGlGQUFpRjtJQUN4RSxRQUFRLENBQVU7SUFDM0I7Ozs7T0FJRztJQUNNLFNBQVMsQ0FBaUI7SUFFekIsQ0FBQyxDQUFDLEdBQVc7UUFDckIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELHNGQUFzRjtJQUM1RSxhQUFhO1FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0MsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMs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SUE1RGhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERULDREQTNEUyxvQkFBb0IsNGRBQUUsc0JBQXNCOzs0RkE2RDNDLGVBQWU7a0JBakUzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixFQUFFLHNCQUFzQixDQUFDO29CQUN2RCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwRFQ7aUJBQ0Y7OEJBS1UsUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbGFzdFVzZWRNZXRob2RMYWJlbCwgcGFzc2tleXNTdXBwb3J0ZWQsIHNpZ25VcCBhcyBob3N0ZWRTaWduVXAgfSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBBdHRlbXB0Rmxvd0NvbXBvbmVudCB9IGZyb20gJy4vYXR0ZW1wdC1mbG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWNvdmVyeUNvZGVzQ29tcG9uZW50IH0gZnJvbSAnLi9yZWNvdmVyeS1jb2Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXRsYXNGbG93Q29udHJvbGxlciB9IGZyb20gJy4vZmxvdy1jb250cm9sbGVyJztcblxuLyoqXG4gKiBgPGF0bGFzLXNpZ24taW4+YCDigJQgdGhlIGZ1bGwsIG11bHRpLXN0ZXAgc2lnbi1pbiBmbG93IGRyaXZlbiBlbnRpcmVseSBieSB0aGVcbiAqIHNlcnZlci1zaWRlIGF0dGVtcHQgc3RhdHVzLiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3MgYDxTaWduSW4vPmAuIERyYXdzIHRoZVxuICogaW5zdGFuY2UncyBzaWduLWluIGNhcHRjaGEgd2hlbiBpdCBpcyByZXF1aXJlZCAoYWx3YXlzLW9uLCBvciBhXG4gKiBgbmVlZHNfY2FwdGNoYWAgY2hhbGxlbmdlKS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YXRsYXMtc2lnbi1pbiAqYXRsYXNTaWduZWRPdXQgYWZ0ZXJVcmw9XCIvZGFzaGJvYXJkXCI+PC9hdGxhcy1zaWduLWluPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0bGFzLXNpZ24taW4nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0dGVtcHRGbG93Q29tcG9uZW50LCBSZWNvdmVyeUNvZGVzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGxhc3RVc2VkTGFiZWwoKTsgYXMgbGFiZWwpIHtcbiAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dCBhdGxhcy1sYXN0LXVzZWQtaGludFwiIGRhdGEtYXRsYXM9XCJsYXN0LXVzZWRcIiBbYXR0ci5kYXRhLWF0bGFzLW1ldGhvZF09XCJmbG93Lmxhc3RNZXRob2QoKVwiPlxuICAgICAgICB7eyB0KCdzaWduSW4ubGFzdFVzZWQnKSB9fToge3sgbGFiZWwgfX1cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChhdGxhc0Nvbm5lY3Rpb24oKTsgYXMgY29ubmVjdGlvbklkKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF0bGFzLXNvY2lhbC1idXR0b25cIiBkYXRhLWF0bGFzLXByb3ZpZGVyPVwiYXRsYXNcIiAoY2xpY2spPVwiZmxvdy5zaWduSW5XaXRoQXRsYXMoY29ubmVjdGlvbklkKVwiPlxuICAgICAgICB7eyB0KCdzaWduSW4uY29udGludWVXaXRoQXRsYXMnKSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKGZsb3cuc2lnbkluV2l0aEF0bGFzRXJyb3IoKTsgYXMgbWVzc2FnZSkge1xuICAgICAgICA8cCBjbGFzcz1cImF0bGFzLWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgbWVzc2FnZSB9fTwvcD5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmIChmbG93LnJlY292ZXJ5Q29kZXMoKTsgYXMgY29kZXMpIHtcbiAgICAgIDxhdGxhcy1yZWNvdmVyeS1jb2RlcyBbY29kZXNdPVwiY29kZXNcIiBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiIChzYXZlZCk9XCJmbG93LnNhdmVSZWNvdmVyeUNvZGVzKClcIj48L2F0bGFzLXJlY292ZXJ5LWNvZGVzPlxuICAgIH0gQGVsc2Uge1xuICAgIDxhdGxhcy1hdHRlbXB0LWZsb3dcbiAgICAgIFthdHRlbXB0XT1cImZsb3cuc3RhdGUoKS5hdHRlbXB0XCJcbiAgICAgIFtidXN5XT1cImZsb3cuc3RhdGUoKS5idXN5XCJcbiAgICAgIFtlcnJvcnNdPVwiZmxvdy5zdGF0ZSgpLmVycm9yc1wiXG4gICAgICBbc2Vzc2lvbktlcHRdPVwiZmxvdy5zdGF0ZSgpLnNlc3Npb25LZXB0XCJcbiAgICAgIHRpdGxlS2V5PVwic2lnbkluLnRpdGxlXCJcbiAgICAgIFtjYXB0Y2hhXT1cImZsb3cuY2FwdGNoYURyYXduKCkgPyBmbG93LmNhcHRjaGEgOiBudWxsXCJcbiAgICAgIFtmaXJzdEZhY3RvcnNdPVwiZmxvdy5maXJzdEZhY3RvcnMoKVwiXG4gICAgICBbcHJlcGFyZWRGYWN0b3JdPVwiZmxvdy5wcmVwYXJlZEZhY3RvcigpXCJcbiAgICAgIFtwYXNzd29yZEhvbGRdPVwiZmxvdy5zdGF0ZSgpLnBhc3N3b3JkSG9sZCA/PyBudWxsXCJcbiAgICAgIFtob2xkUHJvb2ZdPVwiZmxvdy5ob2xkUHJvb2YoKVwiXG4gICAgICAodXNlUGFzc3dvcmQpPVwiZmxvdy51c2VQYXNzd29yZCgpXCJcbiAgICAgIFtvZmZlckVtYWlsU2Vjb25kRmFjdG9yXT1cImZsb3cuc2V0dGluZ3MoKT8uYWNjb3VudD8uZW1haWxTZWNvbmRGYWN0b3IgPT09IHRydWVcIlxuICAgICAgW2VtYWlsZWRTZWNvbmRGYWN0b3JdPVwiZmxvdy5lbWFpbFNlY29uZEZhY3RvcigpXCJcbiAgICAgIChzdWJtaXRGbG93KT1cInN1Ym1pdElkZW50aWZpZXIoJGV2ZW50KVwiXG4gICAgICAoY2hvb3NlRmFjdG9yKT1cImZsb3cucHJlcGFyZSgkZXZlbnQpXCJcbiAgICAgIFtvZmZlclNtc1NlY29uZEZhY3Rvcl09XCJmbG93LnNldHRpbmdzKCkgIT09IG51bGwgJiYgZmxvdy5tZmFDaG9pY2VzKCkuc21zXCJcbiAgICAgIFt0ZXh0ZWRTZWNvbmRGYWN0b3JdPVwiZmxvdy5zbXNTZWNvbmRGYWN0b3IoKVwiXG4gICAgICBbZW5yb2xsbWVudF09XCJmbG93LmVucm9sbG1lbnRcIlxuICAgICAgW2Vucm9sbG1lbnRTdGF0ZV09XCJmbG93LmVucm9sbG1lbnRTdGF0ZSgpXCJcbiAgICAgIChlbWFpbFNlY29uZEZhY3Rvcik9XCJmbG93LnNlbmRFbWFpbFNlY29uZEZhY3RvcigpXCJcbiAgICAgIChzbXNTZWNvbmRGYWN0b3IpPVwiZmxvdy5zZW5kU21zU2Vjb25kRmFjdG9yKClcIlxuICAgICAgKHBvbGljeURlY2xpbmVkKT1cImZsb3cuZGVjbGluZVBvbGljeSgkZXZlbnQpXCJcbiAgICA+PC9hdGxhcy1hdHRlbXB0LWZsb3c+XG4gICAgfVxuICAgIEBpZiAoZmxvdy5wYXNza2V5T2ZmZXJlZCgpICYmICFmbG93LnJlY292ZXJ5Q29kZXMoKSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJhdGxhcy1zb2NpYWwtYnV0dG9uIGF0bGFzLXBhc3NrZXktYnV0dG9uXCJcbiAgICAgICAgZGF0YS1hdGxhcy1wYXNza2V5LXNpZ24taW49XCJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmxvdy5zdGF0ZSgpLmJ1c3lcIlxuICAgICAgICAoY2xpY2spPVwiZmxvdy5wYXNza2V5LnNpZ25JbigpXCJcbiAgICAgID5cbiAgICAgICAge3sgdCgnc2lnbkluLnBhc3NrZXlCdXR0b24nKSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoZmxvdy5zdGF0ZSgpLmF0dGVtcHQ/LnN0YXR1cyAhPT0gJ2NvbXBsZXRlJyAmJiBzaWduVXBIcmVmKCk7IGFzIGhyZWYpIHtcbiAgICAgIDxwIGNsYXNzPVwiYXRsYXMtZm9vdGVyXCIgZGF0YS1hdGxhcy1zaWduLXVwLXByb21wdD1cIlwiPlxuICAgICAgICB7eyB0KCdzaWduSW4ubm9BY2NvdW50JykgfX0gPGEgY2xhc3M9XCJhdGxhcy1saW5rXCIgW2hyZWZdPVwiaHJlZlwiPnt7IHQoJ3NpZ25Jbi5zaWduVXBMaW5rJykgfX08L2E+XG4gICAgICA8L3A+XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduSW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcblxuICAvKiogV2hlcmUgdG8gc2VuZCB0aGUgdXNlciBvbmNlIHRoZSBmbG93IGNvbXBsZXRlcy4gUmVzZXJ2ZWQgZm9yIGhvc3Qgcm91dGluZy4gKi9cbiAgQElucHV0KCkgYWZ0ZXJVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVyZSBcIk5vIGFjY291bnQ/IFNpZ24gdXBcIiBnb2VzLiBEZWZhdWx0OiB0aGUgaW5zdGFuY2UncyBob3N0ZWQgc2lnbi11cFxuICAgKiBwYWdlIChjYXJyeWluZyB0aGUgdmlzaXRvcidzIHJlZmVycmFsKS4gYG51bGxgIGhpZGVzIGl0LiBBbHdheXMgc2hvd24sIG5ldmVyXG4gICAqIG9ubHkgYWZ0ZXIgYSBmYWlsZWQgc2lnbi1pbiwgc28gaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgYW4gZW1haWwgaGFzIGFuIGFjY291bnQuXG4gICAqL1xuICBASW5wdXQoKSBzaWduVXBVcmw/OiBzdHJpbmcgfCBudWxsO1xuXG4gIHByb3RlY3RlZCB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXkpO1xuICB9XG5cbiAgLyoqIFwiTGFzdCB1c2VkOiBQYXNzd29yZFwiIG9uIHRoZSBpZGVudGlmaWVyIHN0ZXAsIHdoZW4gdGhlIGluc3RhbmNlIHNob3dzIHRoZSBoaW50LiAqL1xuICBwcm90ZWN0ZWQgbGFzdFVzZWRMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5mbG93LnN0YXRlKCkuYXR0ZW1wdCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGxhc3RVc2VkTWV0aG9kTGFiZWwodGhpcy5mbG93Lmxhc3RNZXRob2QoKSwgKGtleSkgPT4gdGhpcy50KGtleSkpO1xuICB9XG5cbiAgLyoqIFRoZSBcIlNpZ24gaW4gd2l0aCBBdGxhc1wiIGNvbm5lY3Rpb24sIG9uIHRoZSBmaXJzdCBzdGVwLCB3aGVuIHRoZSBpbnN0YW5jZSBoYXMgaXQgb24uICovXG4gIHByb3RlY3RlZCBhdGxhc0Nvbm5lY3Rpb24oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZmxvdy5zdGF0ZSgpLmF0dGVtcHQgfHwgdGhpcy5mbG93LnJlY292ZXJ5Q29kZXMoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZmxvdy5zZXR0aW5ncygpPy5zaWduSW5XaXRoQXRsYXM/LmNvbm5lY3Rpb25JZCA/PyBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNpZ25VcEhyZWYoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2lnblVwVXJsID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5zaWduVXBVcmwpIHJldHVybiB0aGlzLnNpZ25VcFVybDtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGhvc3RlZFNpZ25VcCh7XG4gICAgICAgIGZyb250ZW5kQXBpOiB0aGlzLmF0bGFzLmZyb250ZW5kQXBpLFxuICAgICAgICByZWRpcmVjdFVybDogdGhpcy5hZnRlclVybCA/PyAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCksXG4gICAgICAgIG5hdmlnYXRlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZsb3cgPSBuZXcgQXRsYXNGbG93Q29udHJvbGxlcihcbiAgICB0aGlzLmF0bGFzLmNyZWF0ZUZhcGlDbGllbnQoKSxcbiAgICAoKSA9PiB0aGlzLmF0bGFzLnJlbG9hZCgpLFxuICAgIC8vIFJlc3VtZSBtaWQtZmxvdyBpZiBhbiBPQXV0aCByZWRpcmVjdCBjYW1lIGJhY2sgb3dpbmcgYSBzZWNvbmQgZmFjdG9yLlxuICAgIHRoaXMuYXRsYXMucGVuZGluZ0F0dGVtcHQsXG4gICAgKGtleSkgPT4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXkpLFxuICApO1xuXG4gIC8vIFBhc3NrZXkgYXV0b2ZpbGwgcnVucyB3aGlsZSB0aGUgZmlyc3Qgc3RlcCBvZmZlcnMgcGFzc2tleXMgKGEgY29tcHV0ZWQsIHNvIGl0IHJlLWFybXMgb25seSB3aGVuIHRoYXQgY2hhbmdlcykuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFzc2tleU9mZmVyZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZsb3cucGFzc2tleU9mZmVyZWQoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwYXNza2V5QXV0b2ZpbGwgPSBlZmZlY3QoKCkgPT4gKHRoaXMucGFzc2tleU9mZmVyZWQoKSA/IHRoaXMuZmxvdy5wYXNza2V5LmFybUF1dG9maWxsKCkgOiB0aGlzLmZsb3cucGFzc2tleS5zdG9wQXV0b2ZpbGwoKSkpO1xuXG4gIHByb3RlY3RlZCBzdWJtaXRJZGVudGlmaWVyKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuZmxvdy5wYXNza2V5LnN0b3BBdXRvZmlsbCgpO1xuICAgIHZvaWQgdGhpcy5mbG93LnN1Ym1pdCh2YWx1ZXMpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB0aGlzLmZsb3cucGFzc2tleVN1cHBvcnRlZC5zZXQocGFzc2tleXNTdXBwb3J0ZWQoKSk7XG4gICAgLy8gSWYgc2VlZGVkIGZyb20gYSBwZW5kaW5nIGF0dGVtcHQgdGhhdCBpcyBhbHJlYWR5IHBvbGxhYmxlLCBzdGFydCBwb2xsaW5nLlxuICAgIHRoaXMuZmxvdy5zeW5jUG9sbGluZygpO1xuICAgIC8vIMKnNSB0aGUgaW5zdGFuY2UncyBjYXB0Y2hhIHNldHRpbmdzIChzd2l0Y2hpbmcgY2FwdGNoYSBvbiBpbiB0aGUgZGFzaGJvYXJkXG4gICAgLy8gZHJhd3MgaXQgaGVyZSB3aXRoIG5vIGNvZGUgY2hhbmdlKSBhbmQgZW1haWwgZGVsaXZlcnkgKG5vIGVtYWlsZWQtY29kZVxuICAgIC8vIG9wdGlvbiB3aGlsZSB0aGUgYXBwIGNhbm5vdCBzZW5kIGVtYWlsKS5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHZvaWQgdGhpcy5mbG93LmxvYWRTZXR0aW5ncygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mbG93LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19