@atlasauth/angular 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/esm2022/lib/appearance.mjs +1 -1
  3. package/dist/esm2022/lib/atlas.service.mjs +40 -3
  4. package/dist/esm2022/lib/atlas.ui.mjs +7 -1
  5. package/dist/esm2022/lib/components/attempt-flow.component.mjs +419 -11
  6. package/dist/esm2022/lib/components/flow-controller.mjs +132 -2
  7. package/dist/esm2022/lib/components/impersonation-banner.component.mjs +75 -0
  8. package/dist/esm2022/lib/components/organization-audit-log.component.mjs +115 -0
  9. package/dist/esm2022/lib/components/organization-audit-log.mjs +40 -0
  10. package/dist/esm2022/lib/components/organization-profile.component.mjs +602 -27
  11. package/dist/esm2022/lib/components/policy-host.mjs +254 -0
  12. package/dist/esm2022/lib/components/recovery-codes.component.mjs +122 -0
  13. package/dist/esm2022/lib/components/sign-in.component.mjs +47 -4
  14. package/dist/esm2022/lib/components/sign-up-form.component.mjs +136 -10
  15. package/dist/esm2022/lib/components/sign-up.component.mjs +86 -8
  16. package/dist/esm2022/lib/i18n.mjs +61 -1
  17. package/dist/esm2022/lib/provide-atlas.mjs +4 -2
  18. package/dist/esm2022/lib/types.mjs +1 -1
  19. package/dist/esm2022/lib/version.mjs +2 -2
  20. package/dist/esm2022/public-api.mjs +6 -1
  21. package/dist/fesm2022/atlasauth-angular.mjs +2129 -95
  22. package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
  23. package/dist/lib/appearance.d.ts +1 -1
  24. package/dist/lib/atlas.service.d.ts +23 -1
  25. package/dist/lib/atlas.ui.d.ts +3 -1
  26. package/dist/lib/components/attempt-flow.component.d.ts +61 -2
  27. package/dist/lib/components/flow-controller.d.ts +73 -1
  28. package/dist/lib/components/impersonation-banner.component.d.ts +27 -0
  29. package/dist/lib/components/organization-audit-log.component.d.ts +34 -0
  30. package/dist/lib/components/organization-audit-log.d.ts +25 -0
  31. package/dist/lib/components/organization-profile.component.d.ts +55 -6
  32. package/dist/lib/components/policy-host.d.ts +88 -0
  33. package/dist/lib/components/recovery-codes.component.d.ts +26 -0
  34. package/dist/lib/components/sign-in.component.d.ts +2 -0
  35. package/dist/lib/components/sign-up-form.component.d.ts +22 -4
  36. package/dist/lib/components/sign-up.component.d.ts +13 -0
  37. package/dist/lib/provide-atlas.d.ts +3 -1
  38. package/dist/lib/types.d.ts +6 -0
  39. package/dist/lib/version.d.ts +1 -1
  40. package/dist/public-api.d.ts +5 -0
  41. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import { signal } from '@angular/core';
2
- import { advanceWithCaptcha, atlasCaptchaLabels, createCaptchaController, createSignUp, fetchInstanceSettings, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, } from '@atlasauth/js';
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';
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
@@ -26,6 +26,11 @@ export class AtlasFlowController {
26
26
  * resolves, or when the server could not be reached.
27
27
  */
28
28
  settings = signal(null);
29
+ /**
30
+ * The method this browser last signed in with (`password`, `oauth_github`, …)
31
+ * for the "Last used" hint; null when none, or the instance turned it off.
32
+ */
33
+ lastMethod = signal(null);
29
34
  /** The sign-in captcha (identifier step / `needs_captcha` challenge). */
30
35
  captcha = createCaptchaController(undefined, {
31
36
  // The Atlas captcha's words follow the form's catalog (read when drawn).
@@ -45,6 +50,26 @@ export class AtlasFlowController {
45
50
  * otherwise.
46
51
  */
47
52
  preparedFactor = signal(null);
53
+ /**
54
+ * "Email me a code instead" at the second factor ({@link sendEmailSecondFactor}):
55
+ * in flight, where the code went, or why it was not sent. Null until asked,
56
+ * and again once the flow leaves that step.
57
+ */
58
+ emailSecondFactor = signal(null);
59
+ /** "Text me a code instead" at the second factor ({@link sendSmsSecondFactor}): as {@link emailSecondFactor}. */
60
+ smsSecondFactor = signal(null);
61
+ /**
62
+ * The MFA enrolment step (`needs_mfa_enrollment`): the authenticator app's
63
+ * setup (QR code, setup key) or a texted code. Started and reset with the flow.
64
+ */
65
+ enrollment;
66
+ /** {@link enrollment}'s state, for templates. */
67
+ enrollmentState;
68
+ /**
69
+ * The instance's policies (terms, privacy, …) for the create-account form:
70
+ * {@link create} sends their acceptances and reloads them after a refusal.
71
+ */
72
+ policies = new PolicyAcceptanceController([]);
48
73
  pollTimer = null;
49
74
  identifier = '';
50
75
  constructor(client, reload, pending,
@@ -56,7 +81,23 @@ export class AtlasFlowController {
56
81
  // Seeded from a redirect that came back mid-flow (e.g. OAuth needing a second
57
82
  // factor) so the user resumes at the demanded step instead of starting over.
58
83
  this.state = signal(pending ? flowFromPending(pending) : initialFlow);
84
+ this.enrollment = createMfaEnrollment(this.client, () => this.mfaChoices());
85
+ this.enrollmentState = signal(this.enrollment.state);
86
+ this.enrollment.subscribe((next) => this.enrollmentState.set(next));
59
87
  this.syncCaptcha();
88
+ this.syncEnrollment();
89
+ }
90
+ /** What the app lets the MFA steps offer (from {@link settings}). */
91
+ mfaChoices() {
92
+ return mfaChoicesFrom(this.settings()?.account);
93
+ }
94
+ /** Start the enrolment step for its attempt, or reset it once the flow leaves. */
95
+ syncEnrollment() {
96
+ const attempt = this.state().attempt;
97
+ if (attempt?.status === 'needs_mfa_enrollment' && attempt.id)
98
+ this.enrollment.start(attempt.id);
99
+ else
100
+ this.enrollment.reset();
60
101
  }
61
102
  /** Fetch the instance's public settings and draw whatever captcha they require. */
62
103
  async loadSettings() {
@@ -64,6 +105,8 @@ export class AtlasFlowController {
64
105
  if (loaded) {
65
106
  this.settings.set(loaded);
66
107
  this.syncCaptcha();
108
+ if (loaded.account.lastSignInMethod)
109
+ this.lastMethod.set(await fetchLastSignInMethod(this.client));
67
110
  }
68
111
  }
69
112
  /**
@@ -118,11 +161,18 @@ export class AtlasFlowController {
118
161
  this.signUpCaptchaDrawn.set(this.signUpCaptcha.needed);
119
162
  }
120
163
  setState(next) {
164
+ const previousId = this.state().attempt?.id ?? null;
121
165
  this.state.set(next);
122
166
  // A prepared factor belongs to the first-factor step it was sent for.
123
167
  if (next.attempt?.status !== 'needs_first_factor')
124
168
  this.preparedFactor.set(null);
169
+ // An emailed second-factor code belongs to the second-factor step of this attempt.
170
+ if (next.attempt?.status !== 'needs_second_factor' || (next.attempt?.id ?? null) !== previousId) {
171
+ this.emailSecondFactor.set(null);
172
+ this.smsSecondFactor.set(null);
173
+ }
125
174
  this.syncCaptcha();
175
+ this.syncEnrollment();
126
176
  this.autoSend();
127
177
  }
128
178
  autoSentFor = null;
@@ -156,6 +206,17 @@ export class AtlasFlowController {
156
206
  this.identifier = out.identifier;
157
207
  await this.finish(out.state);
158
208
  }
209
+ /** Load the sign-up's policies into {@link policies} (`<atlas-sign-up>` calls it on init). */
210
+ async loadPolicies(locale) {
211
+ this.policies.setPolicies(await loadPolicies(this.client, { locale }));
212
+ }
213
+ /** The user declined a policy a sign-in was waiting on: cancel the attempt and say why. */
214
+ declinePolicy(title) {
215
+ this.state.set({
216
+ ...initialFlow,
217
+ errors: [{ code: 'POLICY_DECLINED', message: this.t('policy.declined').replace('{policy}', title) }],
218
+ });
219
+ }
159
220
  /**
160
221
  * Create an account (`POST /v1/client/sign_ups`) from a create-account form's
161
222
  * values — email, password and any configured sign-up fields — carrying the
@@ -168,10 +229,76 @@ export class AtlasFlowController {
168
229
  consent,
169
230
  captcha: this.signUpCaptcha,
170
231
  t: this.t,
232
+ policies: this.policies,
171
233
  });
172
234
  await this.finish(next);
173
235
  }
236
+ /**
237
+ * "Email me a code instead" at the second factor (the instance's
238
+ * `account.emailSecondFactor`): mails a code to the account's verified email;
239
+ * it is then posted with {@link submit} like any 2FA code.
240
+ */
241
+ async sendEmailSecondFactor() {
242
+ await this.sendSecondFactorCode('email_code', this.emailSecondFactor);
243
+ }
244
+ /**
245
+ * "Text me a code instead" at the second factor (where the app offers texted
246
+ * codes, {@link mfaChoices}`().sms`): texts a code to the account's enrolled
247
+ * phone; it is then posted with {@link submit} like any 2FA code.
248
+ */
249
+ async sendSmsSecondFactor() {
250
+ await this.sendSecondFactorCode('sms', this.smsSecondFactor);
251
+ }
252
+ async sendSecondFactorCode(strategy, out) {
253
+ const id = this.state().attempt?.id;
254
+ if (!id)
255
+ return;
256
+ out.set({ busy: true });
257
+ try {
258
+ const { sentTo } = await prepareSecondFactorCode(this.client, id, strategy);
259
+ out.set({ sentTo });
260
+ }
261
+ catch (error) {
262
+ out.set({ error: error instanceof Error ? error.message : this.t('error.generic') });
263
+ }
264
+ }
265
+ /** Resend a sign-up's emailed code / link (the earlier one stops working). */
266
+ async resendSignUp() {
267
+ this.state.update((current) => ({ ...current, busy: true, errors: [] }));
268
+ this.state.set(await resendSignUpVerification(this.client, this.state()));
269
+ }
270
+ /**
271
+ * Start a passkey-only sign-up (`POST /v1/client/sign_ups/passkey`) from the
272
+ * create-account form's values — no password. Offered when the instance's
273
+ * `account.passkeySignUp` is set.
274
+ */
275
+ async createWithPasskey(values, consent = true) {
276
+ this.state.update((current) => ({ ...current, busy: true, errors: [] }));
277
+ await this.finish(await createPasskeySignUp(this.client, values, { consent, captcha: this.signUpCaptcha, t: this.t, policies: this.policies }));
278
+ }
279
+ /** The passkey-only sign-up's last step: create the passkey, and with it the account. */
280
+ async createPasskey() {
281
+ this.state.update((current) => ({ ...current, busy: true, errors: [] }));
282
+ await this.finish(await finishPasskeySignUp(this.client, this.state(), { t: this.t }));
283
+ }
284
+ /**
285
+ * The recovery codes an MFA enrolment just completed the sign-in with, shown
286
+ * once before it finishes ({@link saveRecoveryCodes}); null otherwise. They
287
+ * live only in this controller's memory.
288
+ */
289
+ recoveryCodes() {
290
+ return pendingRecoveryCodes(this.state());
291
+ }
292
+ /** "I've saved my codes": forget the recovery codes and finish the sign-in. */
293
+ async saveRecoveryCodes() {
294
+ await this.finish(acknowledgeRecoveryCodes(this.state()));
295
+ }
174
296
  async finish(next) {
297
+ // An enrolment's recovery codes are shown first; `saveRecoveryCodes` finishes.
298
+ if (pendingRecoveryCodes(next)) {
299
+ this.setState({ ...next, busy: false });
300
+ return;
301
+ }
175
302
  if (next.attempt?.status === 'complete') {
176
303
  // Stays busy until this browser actually holds the session: the completion
177
304
  // alone says nothing about whether the cookie was kept.
@@ -209,6 +336,9 @@ export class AtlasFlowController {
209
336
  void (async () => {
210
337
  const { state: next, ticket } = await pollAttempt(this.client, this.state());
211
338
  this.setState(next);
339
+ // e.g. a passkey sign-up whose email was just proven: only this tab can go on.
340
+ if (!ticket && !shouldKeepPolling(next))
341
+ this.stopPolling();
212
342
  if (!ticket || !next.attempt)
213
343
  return;
214
344
  // The ticket is exchanged by a normal request, so no session token ever
@@ -236,4 +366,4 @@ export class AtlasFlowController {
236
366
  this.signUpCaptcha.destroy();
237
367
  }
238
368
  }
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsR0FJbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUErQlg7SUFDQTtJQUdBO0lBbENWLEtBQUssQ0FBNEI7SUFDMUM7Ozs7T0FJRztJQUNNLFFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzFELHlFQUF5RTtJQUNoRSxPQUFPLEdBQXNCLHVCQUF1QixDQUFDLFNBQVMsRUFBRTtRQUN2RSx5RUFBeUU7UUFDekUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDOUMsQ0FBQyxDQUFDO0lBQ0gscURBQXFEO0lBQzVDLGFBQWEsR0FBc0IsdUJBQXVCLENBQUMsU0FBUyxFQUFFO1FBQzdFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQzlDLENBQUMsQ0FBQztJQUNILHdFQUF3RTtJQUMvRCxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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SUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELGdHQUFnRztJQUNoRyxPQUFPO1FBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZVNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBhZHZhbmNlV2l0aENhcHRjaGEsXG4gIGF0bGFzQ2FwdGNoYUxhYmVscyxcbiAgY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIGNyZWF0ZVNpZ25VcCxcbiAgZmV0Y2hJbnN0YW5jZVNldHRpbmdzLFxuICBmbG93TmVlZHNDYXB0Y2hhLFxuICBzaWduSW5DYXB0Y2hhT3B0aW9ucyxcbiAgZmxvd0Zyb21QZW5kaW5nLFxuICBpbml0aWFsRmxvdyxcbiAgbmV4dFN0ZXAsXG4gIG9mZmVyZWRGaXJzdEZhY3RvcnMsXG4gIHBvbGxBdHRlbXB0LFxuICBwcmVwYXJlRmFjdG9yLFxuICBwbGFuRmlyc3RGYWN0b3IsXG4gIHNob3VsZEtlZXBQb2xsaW5nLFxuICB0eXBlIENhcHRjaGFDb250cm9sbGVyLFxuICB0eXBlIEZsb3dTdGF0ZSxcbiAgdHlwZSBJbnN0YW5jZVNldHRpbmdzLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEVOX1VTLCB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBUaGUgc2VydmVyLWRyaXZlbiBzaWduLWluIC8gc2lnbi11cCBlbmdpbmUsIHNoYXJlZCBieSBgPGF0bGFzLXNpZ24taW4+YCBhbmRcbiAqIGA8YXRsYXMtc2lnbi11cD5gIOKAlCB0aGUgQW5ndWxhciBjb3VudGVycGFydCBvZiBSZWFjdCdzIGB1c2VGbG93YCBob29rLlxuICpcbiAqIEl0IG93bnMgbm8gZGVjaXNpb24gYWJvdXQgd2hhdCBjb21lcyBuZXh0OiBldmVyeSBzdGF0dXMgY29tZXMgYmFjayBmcm9tIHRoZVxuICogc2VydmVyIHZpYSBgYWR2YW5jZWAsIGFuZCB0aGlzIGNvbnRyb2xsZXIgb25seSBwb3N0cyB3aGF0ZXZlciB0aGUgY3VycmVudCBzdGVwXG4gKiBuZWVkcyBhbmQgcmUtcmVuZGVycyB0aGUgcmV0dXJuZWQgc3RhdHVzLiBTdGF0ZSBsaXZlcyBpbiBhIHNpZ25hbCBzbyB0ZW1wbGF0ZXNcbiAqIHVwZGF0ZSB3aGV0aGVyIHRoZSBhcHAgcnVucyB6b25lZCBvciB6b25lbGVzcy5cbiAqXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCBzdGFydHMgdGhlIGF0dGVtcHQgd2l0aCB7QGxpbmsgY3JlYXRlfVxuICogKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKTsgdGhlIGVtYWlsZWQtY29kZSBzdGVwIHRoZW4gcnVucyB0aHJvdWdoIHRoZSBzYW1lXG4gKiB7QGxpbmsgc3VibWl0fS4gQm90aCBmbG93cyBkcmF3IHRoZSBpbnN0YW5jZSdzIGNhcHRjaGEgKGZyb21cbiAqIHtAbGluayBsb2FkU2V0dGluZ3N9KSB3aGVuIGl0IGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgQXRsYXNGbG93Q29udHJvbGxlciB7XG4gIHJlYWRvbmx5IHN0YXRlOiBXcml0YWJsZVNpZ25hbDxGbG93U3RhdGU+O1xuICAvKipcbiAgICogVGhlIGluc3RhbmNlJ3MgcHVibGljIHNpZ24taW4gLyBzaWduLXVwIHNldHRpbmdzIChjYXB0Y2hhLCBzaWduLXVwIGZpZWxkcyxcbiAgICogbGVnYWwgY29uc2VudCkgZnJvbSBgR0VUIC92MS9hcHBlYXJhbmNlYDsgbnVsbCB1bnRpbCB7QGxpbmsgbG9hZFNldHRpbmdzfVxuICAgKiByZXNvbHZlcywgb3Igd2hlbiB0aGUgc2VydmVyIGNvdWxkIG5vdCBiZSByZWFjaGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ3MgPSBzaWduYWw8SW5zdGFuY2VTZXR0aW5ncyB8IG51bGw+KG51bGwpO1xuICAvKiogVGhlIHNpZ24taW4gY2FwdGNoYSAoaWRlbnRpZmllciBzdGVwIC8gYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuICovXG4gIHJlYWRvbmx5IGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgLy8gVGhlIEF0bGFzIGNhcHRjaGEncyB3b3JkcyBmb2xsb3cgdGhlIGZvcm0ncyBjYXRhbG9nIChyZWFkIHdoZW4gZHJhd24pLlxuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBUaGUgc2lnbi11cCBjYXB0Y2hhICh0aGUgY3JlYXRlLWFjY291bnQgc3RlcCkuICovXG4gIHJlYWRvbmx5IHNpZ25VcENhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgYXRsYXNMYWJlbHM6ICgpID0+IGF0bGFzQ2FwdGNoYUxhYmVscyh0aGlzLnQpLFxuICB9KTtcbiAgLyoqIFdoZXRoZXIge0BsaW5rIGNhcHRjaGF9IGN1cnJlbnRseSBkcmF3cyBhIHdpZGdldCAoZm9yIHRlbXBsYXRlcykuICovXG4gIHJlYWRvbmx5IGNhcHRjaGFEcmF3biA9IHNpZ25hbChmYWxzZSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBzaWduVXBDYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIHdhcyBhc2tlZCB0byBzZW5kICh7QGxpbmsgcHJlcGFyZX0pIG9uIHRoZVxuICAgKiBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgaXRzIGNvZGUuIE51bGxcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZWRGYWN0b3IgPSBzaWduYWw8J2VtYWlsX2NvZGUnIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpZGVudGlmaWVyID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEZhcGlDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWxvYWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gICAgcGVuZGluZzogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCxcbiAgICAvKiogUmVzb2x2ZXMgdGhlIGNhcHRjaGEgbWVzc2FnZXMnIGNhdGFsb2cga2V5cy4gRGVmYXVsdHMgdG8gZW4tVVMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyA9IChrZXkpID0+IHRyYW5zbGF0ZShFTl9VUywga2V5KSxcbiAgKSB7XG4gICAgLy8gU2VlZGVkIGZyb20gYSByZWRpcmVjdCB0aGF0IGNhbWUgYmFjayBtaWQtZmxvdyAoZS5nLiBPQXV0aCBuZWVkaW5nIGEgc2Vjb25kXG4gICAgLy8gZmFjdG9yKSBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSBkZW1hbmRlZCBzdGVwIGluc3RlYWQgb2Ygc3RhcnRpbmcgb3Zlci5cbiAgICB0aGlzLnN0YXRlID0gc2lnbmFsPEZsb3dTdGF0ZT4ocGVuZGluZyA/IGZsb3dGcm9tUGVuZGluZyhwZW5kaW5nKSA6IGluaXRpYWxGbG93KTtcbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIGluc3RhbmNlJ3MgcHVibGljIHNldHRpbmdzIGFuZCBkcmF3IHdoYXRldmVyIGNhcHRjaGEgdGhleSByZXF1aXJlLiAqL1xuICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgZmV0Y2hJbnN0YW5jZVNldHRpbmdzKHRoaXMuY2xpZW50KTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnNldChsb2FkZWQpO1xuICAgICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgZmFjdG9ycyB0byBvZmZlciBvbiBhIGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXA6IHRoZSBzZXJ2ZXIncyBsaXN0XG4gICAqIHdpdGhvdXQgZW1haWwgY29kZSAvIGxpbmsgd2hpbGUgdGhlIGFwcCBjYW5ub3QgZGVsaXZlciBlbWFpbFxuICAgKiAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkuYXZhaWxhYmxlID09PSBmYWxzZWApLiBFbXB0eSBvbiBhbnkgb3RoZXIgc3RlcC5cbiAgICovXG4gIGZpcnN0RmFjdG9ycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGNvbnN0IHN0ZXAgPSBhdHRlbXB0ID8gbmV4dFN0ZXAoYXR0ZW1wdCkgOiBudWxsO1xuICAgIHJldHVybiBzdGVwPy5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InXG4gICAgICA/IG9mZmVyZWRGaXJzdEZhY3RvcnMoc3RlcC5zdHJhdGVnaWVzLCB0aGlzLnNldHRpbmdzKCk/LmVtYWlsRGVsaXZlcnkpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBlbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGFwcCBjYW5ub3RcbiAgICogc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2VgKTpcbiAgICogYDxhdGxhcy1zaWduLXVwPmAgc2hvd3MgdGhlIFwiY2FuJ3Qgc2VuZCBlbWFpbFwiIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgc2lnblVwRW1haWxVbmF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBGYWxzZSB3aGVuIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgY2Fubm90IGJlIGRlbGl2ZXJlZCDigJQgaGlkZSBcIkZvcmdvdCBwYXNzd29yZD9cIi4gKi9cbiAgcGFzc3dvcmRSZXNldEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkUmVzZXQgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgc2VydmVyIHRvIGVtYWlsIGEgc2lnbi1pbiBjb2RlIGZvciB0aGUgY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYFxuICAgKiBzdGVwIChgUE9TVCDigKYvcHJlcGFyZV9maXJzdF9mYWN0b3JgKTsgdGhlIGZvcm0gdGhlbiBjb2xsZWN0cyB0aGUgY29kZSwgd2hpY2hcbiAgICoge0BsaW5rIHN1Ym1pdH0gcG9zdHMgYXMgdGhlIGBlbWFpbF9jb2RlYCBzdHJhdGVneS5cbiAgICovXG4gIGFzeW5jIHByZXBhcmUoc3RyYXRlZ3k6ICdlbWFpbF9jb2RlJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5maXJzdEZhY3RvcnMoKS5pbmNsdWRlcyhzdHJhdGVneSkpIHJldHVybjtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IHByZXBhcmVGYWN0b3IodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgc3RyYXRlZ3kpO1xuICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgaWYgKCFuZXh0LmVycm9ycy5sZW5ndGgpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KHN0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKiBLZWVwIGJvdGggY2FwdGNoYXMgaW4gc3RlcCB3aXRoIHRoZSBzZXR0aW5ncyBhbmQgdGhlIGZsb3cncyBjdXJyZW50IHN0ZXAuICovXG4gIHByaXZhdGUgc3luY0NhcHRjaGEoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgdGhpcy5jYXB0Y2hhLmNvbmZpZ3VyZShcbiAgICAgIHNpZ25JbkNhcHRjaGFPcHRpb25zKHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnbkluLCBzdGF0ZSwgKCkgPT4gdm9pZCB0aGlzLnN1Ym1pdCh7fSkpLFxuICAgICk7XG4gICAgY29uc3Qgc2lnblVwRmxvdyA9IHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnblVwO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYS5jb25maWd1cmUoe1xuICAgICAgZmxvdzogc2lnblVwRmxvdyxcbiAgICAgIGFjdGl2ZTogIXN0YXRlLmF0dGVtcHQgJiYgZmxvd05lZWRzQ2FwdGNoYShzaWduVXBGbG93KSxcbiAgICB9KTtcbiAgICB0aGlzLmNhcHRjaGFEcmF3bi5zZXQodGhpcy5jYXB0Y2hhLm5lZWRlZCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhRHJhd24uc2V0KHRoaXMuc2lnblVwQ2FwdGNoYS5uZWVkZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShuZXh0OiBGbG93U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnNldChuZXh0KTtcbiAgICAvLyBBIHByZXBhcmVkIGZhY3RvciBiZWxvbmdzIHRvIHRoZSBmaXJzdC1mYWN0b3Igc3RlcCBpdCB3YXMgc2VudCBmb3IuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfZmlyc3RfZmFjdG9yJykgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIHRoaXMuYXV0b1NlbmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1NlbnRGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogV2l0aCBubyBwYXNzd29yZCBvbiBvZmZlciwgZW1haWwgdGhlIGNvZGUgYXMgc29vbiBhcyB0aGUgc2VydmVyIGFza3MgZm9yIGFcbiAgICogZmlyc3QgZmFjdG9yIOKAlCBvbmNlIHBlciBhdHRlbXB0LCBzbyBhIGZhaWxlZCBzZW5kIHdhaXRzIGZvciB0aGUgdXNlcidzIHJldHJ5XG4gICAqICh0aGUgXCJFbWFpbCBtZSBhIGNvZGVcIiBidXR0b24pIGluc3RlYWQgb2YgbG9vcGluZy5cbiAgICovXG4gIHByaXZhdGUgYXV0b1NlbmQoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQgPz8gbnVsbDtcbiAgICBpZiAoIWlkIHx8IHRoaXMuYXV0b1NlbnRGb3IgPT09IGlkIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IoKSkgcmV0dXJuO1xuICAgIGlmIChwbGFuRmlyc3RGYWN0b3IodGhpcy5maXJzdEZhY3RvcnMoKSkuYXV0b1NlbmQgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuO1xuICAgIHRoaXMuYXV0b1NlbnRGb3IgPSBpZDtcbiAgICB2b2lkIHRoaXMucHJlcGFyZSgnZW1haWxfY29kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgdGhlIGZsb3cgd2l0aCB0aGUgdmFsdWVzIHRoZSB1c2VyIHR5cGVkLiBPbiBjb21wbGV0aW9uLCBleGNoYW5nZSB0aGVcbiAgICogb25lLXRpbWUgdGlja2V0IGZvciBjb29raWVzIG92ZXIgYSBzYW1lLW9yaWdpbiByZXF1ZXN0IChGQVBJIGlzIGNyb3NzLW9yaWdpblxuICAgKiBhbmQgY2Fubm90IHNldCB0aGUgY29va2llIG9uIGl0cyBvd24gcmVzcG9uc2UpLCB0aGVuIHJlLWJvb3Qgc28gdGhlIHJlc3Qgb2ZcbiAgICogdGhlIGFwcCBzZWVzIGEgc2lnbmVkLWluIHVzZXIuXG4gICAqL1xuICBhc3luYyBzdWJtaXQodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuXG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgYWR2YW5jZVdpdGhDYXB0Y2hhKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHZhbHVlcywge1xuICAgICAgY2FwdGNoYTogdGhpcy5jYXB0Y2hhLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIHRoaXMuaWRlbnRpZmllciA9IG91dC5pZGVudGlmaWVyO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG91dC5zdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGFjY291bnQgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKSBmcm9tIGEgY3JlYXRlLWFjY291bnQgZm9ybSdzXG4gICAqIHZhbHVlcyDigJQgZW1haWwsIHBhc3N3b3JkIGFuZCBhbnkgY29uZmlndXJlZCBzaWduLXVwIGZpZWxkcyDigJQgY2FycnlpbmcgdGhlXG4gICAqIHNpZ24tdXAgY2FwdGNoYSdzIHRva2VuIHdoZW4gdGhlIGluc3RhbmNlIHJlcXVpcmVzIG9uZS4gVGhlIGVtYWlsZWQgY29kZSBpc1xuICAgKiB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uc2VudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IGNyZWF0ZVNpZ25VcCh0aGlzLmNsaWVudCwgdmFsdWVzLCB7XG4gICAgICBjb25zZW50LFxuICAgICAgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2gobmV4dDogRmxvd1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzID09PSAnY29tcGxldGUnKSB7XG4gICAgICAvLyBTdGF5cyBidXN5IHVudGlsIHRoaXMgYnJvd3NlciBhY3R1YWxseSBob2xkcyB0aGUgc2Vzc2lvbjogdGhlIGNvbXBsZXRpb25cbiAgICAgIC8vIGFsb25lIHNheXMgbm90aGluZyBhYm91dCB3aGV0aGVyIHRoZSBjb29raWUgd2FzIGtlcHQuXG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogdHJ1ZSB9KTtcbiAgICAgIGxldCBleGNoYW5nZWQgPSB0cnVlO1xuICAgICAgaWYgKG5leHQudGlja2V0KSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHtcbiAgICAgICAgICBhdHRlbXB0X2lkOiAobmV4dC5hdHRlbXB0IGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQsXG4gICAgICAgICAgdGlja2V0OiBuZXh0LnRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4Y2hhbmdlZCA9IHJlcy5vaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtlcHQgPSBleGNoYW5nZWQgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IGZhbHNlLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgIC8vIEEgbWFnaWMtbGluayBzdGVwIG1heSBub3cgYmUgcG9sbGFibGUgKGEgbGluayBvcGVuZWQgb24gYW5vdGhlciBkZXZpY2UpLlxuICAgICAgdGhpcy5zeW5jUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGFydC9zdG9wIHRoZSDCpzUuMyBtYWdpYy1saW5rIHBvbGwgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUuICovXG4gIHN5bmNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmIChzaG91bGRLZWVwUG9sbGluZyh0aGlzLnN0YXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSByZXR1cm47XG4gICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGU6IG5leHQsIHRpY2tldCB9ID0gYXdhaXQgcG9sbEF0dGVtcHQodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgICAgIGlmICghdGlja2V0IHx8ICFuZXh0LmF0dGVtcHQpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgdGlja2V0IGlzIGV4Y2hhbmdlZCBieSBhIG5vcm1hbCByZXF1ZXN0LCBzbyBubyBzZXNzaW9uIHRva2VuIGV2ZXJcbiAgICAgICAgLy8gYXBwZWFycyBpbiBhIFVSTC5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBrZXB0ID0gcmVzLm9rICYmIChhd2FpdCB0aGlzLnJlbG9hZCgpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuc3RhdGUoKSwgc2Vzc2lvbktlcHQ6IGtlcHQgfSk7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgIH0pKCk7XG4gICAgfSwgMl8wMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoZSBwb2xsIHRpbWVyIGFuZCB0aGUgY2FwdGNoYSB3aWRnZXRzIOKAlCBjYWxsIGZyb20gdGhlIGNvbXBvbmVudCdzIGBuZ09uRGVzdHJveWAuICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIHRoaXMuY2FwdGNoYS5kZXN0cm95KCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
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==
@@ -0,0 +1,75 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Output, computed, inject, signal } from '@angular/core';
2
+ import { actorFromClaims } from '@atlasauth/js';
3
+ import { AtlasService } from '../atlas.service';
4
+ import { classFor } from '../appearance';
5
+ import { translate } from '../i18n';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * `<atlas-impersonation-banner>` — shown only while the active session is an
9
+ * impersonation, naming the user acted as, with "Return to admin" (or "End
10
+ * impersonation" when there is no session of the impersonator's to resume).
11
+ * Emits `ended` with the outcome. The Angular peer of React's
12
+ * `<ImpersonationBanner/>`.
13
+ */
14
+ export class ImpersonationBannerComponent {
15
+ atlas = inject(AtlasService);
16
+ ended = new EventEmitter();
17
+ busy = signal(false);
18
+ actor = computed(() => actorFromClaims(this.atlas.claims()) ?? this.atlas.session()?.actor ?? null);
19
+ canReturn = computed(() => this.actor() !== null && Boolean(this.atlas.session()?.actor_session_id));
20
+ name = computed(() => {
21
+ const u = this.atlas.user();
22
+ return ([u?.first_name, u?.last_name].filter(Boolean).join(' ') ||
23
+ u?.username ||
24
+ u?.email_addresses?.find((e) => e.primary)?.email_address ||
25
+ u?.id ||
26
+ '');
27
+ });
28
+ t(key, vars) {
29
+ return translate(this.atlas.localization, key, vars);
30
+ }
31
+ cls(key, base) {
32
+ return classFor(key, this.atlas.appearance, base);
33
+ }
34
+ async end() {
35
+ this.busy.set(true);
36
+ try {
37
+ this.ended.emit(await this.atlas.endImpersonation());
38
+ }
39
+ finally {
40
+ this.busy.set(false);
41
+ }
42
+ }
43
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImpersonationBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImpersonationBannerComponent, isStandalone: true, selector: "atlas-impersonation-banner", outputs: { ended: "ended" }, ngImport: i0, template: `
45
+ @if (actor()) {
46
+ <div [class]="cls('card', 'atlas-alert atlas-impersonation-banner')" role="status">
47
+ <span [class]="cls('headerSubtitle', 'atlas-text')">{{ t('impersonation.banner', { name: name() }) }}</span>
48
+ <button type="button" [class]="cls('formButtonPrimary', 'atlas-button')" [disabled]="busy()" (click)="end()">
49
+ {{ canReturn() ? t('impersonation.returnToAdmin') : t('impersonation.end') }}
50
+ </button>
51
+ </div>
52
+ }
53
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImpersonationBannerComponent, decorators: [{
56
+ type: Component,
57
+ args: [{
58
+ selector: 'atlas-impersonation-banner',
59
+ standalone: true,
60
+ changeDetection: ChangeDetectionStrategy.OnPush,
61
+ template: `
62
+ @if (actor()) {
63
+ <div [class]="cls('card', 'atlas-alert atlas-impersonation-banner')" role="status">
64
+ <span [class]="cls('headerSubtitle', 'atlas-text')">{{ t('impersonation.banner', { name: name() }) }}</span>
65
+ <button type="button" [class]="cls('formButtonPrimary', 'atlas-button')" [disabled]="busy()" (click)="end()">
66
+ {{ canReturn() ? t('impersonation.returnToAdmin') : t('impersonation.end') }}
67
+ </button>
68
+ </div>
69
+ }
70
+ `,
71
+ }]
72
+ }], propDecorators: { ended: [{
73
+ type: Output
74
+ }] } });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ltcGVyc29uYXRpb24tYmFubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLGVBQWUsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBRXBDOzs7Ozs7R0FNRztBQWdCSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3BCLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0IsS0FBSyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO0lBQ25ELElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFckIsS0FBSyxHQUFHLFFBQVEsQ0FDakMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQ2xGLENBQUM7SUFDaUIsU0FBUyxHQUFHLFFBQVEsQ0FDckMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUMvRSxDQUFDO0lBQ2lCLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUNMLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkQsQ0FBQyxFQUFFLFFBQVE7WUFDWCxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWE7WUFDekQsQ0FBQyxFQUFFLEVBQUU7WUFDTCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFlLEVBQUUsSUFBWTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVTLEtBQUssQ0FBQyxHQUFHO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7d0dBckNVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLG1IQVg3Qjs7Ozs7Ozs7O0dBU1Q7OzRGQUVVLDRCQUE0QjtrQkFmeEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7O0dBU1Q7aUJBQ0Y7OEJBR29CLEtBQUs7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhY3RvckZyb21DbGFpbXMsIHR5cGUgRW5kSW1wZXJzb25hdGlvblJlc3VsdCB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBgPGF0bGFzLWltcGVyc29uYXRpb24tYmFubmVyPmAg4oCUIHNob3duIG9ubHkgd2hpbGUgdGhlIGFjdGl2ZSBzZXNzaW9uIGlzIGFuXG4gKiBpbXBlcnNvbmF0aW9uLCBuYW1pbmcgdGhlIHVzZXIgYWN0ZWQgYXMsIHdpdGggXCJSZXR1cm4gdG8gYWRtaW5cIiAob3IgXCJFbmRcbiAqIGltcGVyc29uYXRpb25cIiB3aGVuIHRoZXJlIGlzIG5vIHNlc3Npb24gb2YgdGhlIGltcGVyc29uYXRvcidzIHRvIHJlc3VtZSkuXG4gKiBFbWl0cyBgZW5kZWRgIHdpdGggdGhlIG91dGNvbWUuIFRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3Qnc1xuICogYDxJbXBlcnNvbmF0aW9uQmFubmVyLz5gLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1pbXBlcnNvbmF0aW9uLWJhbm5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoYWN0b3IoKSkge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiY2xzKCdjYXJkJywgJ2F0bGFzLWFsZXJ0IGF0bGFzLWltcGVyc29uYXRpb24tYmFubmVyJylcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2hlYWRlclN1YnRpdGxlJywgJ2F0bGFzLXRleHQnKVwiPnt7IHQoJ2ltcGVyc29uYXRpb24uYmFubmVyJywgeyBuYW1lOiBuYW1lKCkgfSkgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgW2Rpc2FibGVkXT1cImJ1c3koKVwiIChjbGljayk9XCJlbmQoKVwiPlxuICAgICAgICAgIHt7IGNhblJldHVybigpID8gdCgnaW1wZXJzb25hdGlvbi5yZXR1cm5Ub0FkbWluJykgOiB0KCdpbXBlcnNvbmF0aW9uLmVuZCcpIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbXBlcnNvbmF0aW9uQmFubmVyQ29tcG9uZW50IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBlbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RW5kSW1wZXJzb25hdGlvblJlc3VsdD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RvciA9IGNvbXB1dGVkKFxuICAgICgpID0+IGFjdG9yRnJvbUNsYWltcyh0aGlzLmF0bGFzLmNsYWltcygpKSA/PyB0aGlzLmF0bGFzLnNlc3Npb24oKT8uYWN0b3IgPz8gbnVsbCxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhblJldHVybiA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuYWN0b3IoKSAhPT0gbnVsbCAmJiBCb29sZWFuKHRoaXMuYXRsYXMuc2Vzc2lvbigpPy5hY3Rvcl9zZXNzaW9uX2lkKSxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdSA9IHRoaXMuYXRsYXMudXNlcigpO1xuICAgIHJldHVybiAoXG4gICAgICBbdT8uZmlyc3RfbmFtZSwgdT8ubGFzdF9uYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpIHx8XG4gICAgICB1Py51c2VybmFtZSB8fFxuICAgICAgdT8uZW1haWxfYWRkcmVzc2VzPy5maW5kKChlKSA9PiBlLnByaW1hcnkpPy5lbWFpbF9hZGRyZXNzIHx8XG4gICAgICB1Py5pZCB8fFxuICAgICAgJydcbiAgICApO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xzKGtleTogRWxlbWVudEtleSwgYmFzZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2xhc3NGb3Ioa2V5LCB0aGlzLmF0bGFzLmFwcGVhcmFuY2UsIGJhc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGVuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVuZGVkLmVtaXQoYXdhaXQgdGhpcy5hdGxhcy5lbmRJbXBlcnNvbmF0aW9uKCkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,115 @@
1
+ import { ChangeDetectionStrategy, Component, Input, inject, } from '@angular/core';
2
+ import { describeAuditAction } from '@atlasauth/js';
3
+ import { AtlasService } from '../atlas.service';
4
+ import { classFor } from '../appearance';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * `<atlas-organization-audit-log>` — the active organization's audit trail for
8
+ * its admins, next to `<atlas-organization-profile>`. The Angular peer of
9
+ * React's `<OrganizationAuditLog/>`. Renders nothing for a member who may not
10
+ * read it (the server is the authority; the component just follows it). Labels
11
+ * are inputs so an app can localise them.
12
+ */
13
+ export class OrganizationAuditLogComponent {
14
+ /** Entries per page (the server caps it). */
15
+ pageSize;
16
+ /** Narrow to one action, or a prefix ending in `.`. */
17
+ action;
18
+ labels = {};
19
+ formatDate = (ms) => new Date(ms).toLocaleString();
20
+ atlas = inject(AtlasService);
21
+ /** Created in ngOnInit, once the inputs are set (templates render after it). */
22
+ log;
23
+ ngOnInit() {
24
+ this.log = this.atlas.organizationAuditLog({ pageSize: this.pageSize, action: this.action });
25
+ }
26
+ ngOnDestroy() {
27
+ this.log.destroy();
28
+ }
29
+ describe(action) {
30
+ return describeAuditAction(action);
31
+ }
32
+ cls(key, base) {
33
+ return classFor(key, this.atlas.appearance, base);
34
+ }
35
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrganizationAuditLogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
36
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OrganizationAuditLogComponent, isStandalone: true, selector: "atlas-organization-audit-log", inputs: { pageSize: "pageSize", action: "action", labels: "labels", formatDate: "formatDate" }, ngImport: i0, template: `
37
+ @if (atlas.organization() && !log.state().forbidden) {
38
+ <div [class]="cls('card', 'atlas-card')" data-atlas="organization-audit-log">
39
+ <h2 [class]="cls('headerTitle', 'atlas-title')">{{ labels.title ?? 'Audit log' }}</h2>
40
+ @if (log.state().entries.length === 0 && !log.state().loading) {
41
+ <p [class]="cls('headerSubtitle', 'atlas-subtitle')">{{ labels.empty ?? 'No activity recorded yet.' }}</p>
42
+ } @else {
43
+ <ul [class]="cls('list', 'atlas-audit-list')">
44
+ @for (entry of log.state().entries; track entry.id) {
45
+ <li [class]="cls('listItem', 'atlas-audit-item')" [attr.data-action]="entry.action">
46
+ <strong>{{ describe(entry.action) }}</strong>
47
+ <span class="atlas-audit-meta">
48
+ · {{ formatDate(entry.created_at) }}{{ entry.actor.id ? ' · ' + (labels.actor ?? 'by') + ' ' + entry.actor.type + ' ' + entry.actor.id : '' }}
49
+ </span>
50
+ </li>
51
+ }
52
+ </ul>
53
+ }
54
+ @if (log.state().hasMore) {
55
+ <button
56
+ type="button"
57
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
58
+ [disabled]="log.state().loading"
59
+ (click)="log.loadMore()"
60
+ >
61
+ {{ labels.loadMore ?? 'Load more' }}
62
+ </button>
63
+ }
64
+ </div>
65
+ }
66
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrganizationAuditLogComponent, decorators: [{
69
+ type: Component,
70
+ args: [{
71
+ selector: 'atlas-organization-audit-log',
72
+ standalone: true,
73
+ changeDetection: ChangeDetectionStrategy.OnPush,
74
+ template: `
75
+ @if (atlas.organization() && !log.state().forbidden) {
76
+ <div [class]="cls('card', 'atlas-card')" data-atlas="organization-audit-log">
77
+ <h2 [class]="cls('headerTitle', 'atlas-title')">{{ labels.title ?? 'Audit log' }}</h2>
78
+ @if (log.state().entries.length === 0 && !log.state().loading) {
79
+ <p [class]="cls('headerSubtitle', 'atlas-subtitle')">{{ labels.empty ?? 'No activity recorded yet.' }}</p>
80
+ } @else {
81
+ <ul [class]="cls('list', 'atlas-audit-list')">
82
+ @for (entry of log.state().entries; track entry.id) {
83
+ <li [class]="cls('listItem', 'atlas-audit-item')" [attr.data-action]="entry.action">
84
+ <strong>{{ describe(entry.action) }}</strong>
85
+ <span class="atlas-audit-meta">
86
+ · {{ formatDate(entry.created_at) }}{{ entry.actor.id ? ' · ' + (labels.actor ?? 'by') + ' ' + entry.actor.type + ' ' + entry.actor.id : '' }}
87
+ </span>
88
+ </li>
89
+ }
90
+ </ul>
91
+ }
92
+ @if (log.state().hasMore) {
93
+ <button
94
+ type="button"
95
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
96
+ [disabled]="log.state().loading"
97
+ (click)="log.loadMore()"
98
+ >
99
+ {{ labels.loadMore ?? 'Load more' }}
100
+ </button>
101
+ }
102
+ </div>
103
+ }
104
+ `,
105
+ }]
106
+ }], propDecorators: { pageSize: [{
107
+ type: Input
108
+ }], action: [{
109
+ type: Input
110
+ }], labels: [{
111
+ type: Input
112
+ }], formatDate: [{
113
+ type: Input
114
+ }] } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDOztBQUcxRDs7Ozs7O0dBTUc7QUFxQ0gsTUFBTSxPQUFPLDZCQUE2QjtJQUN4Qyw2Q0FBNkM7SUFDcEMsUUFBUSxDQUFVO0lBQzNCLHVEQUF1RDtJQUM5QyxNQUFNLENBQVU7SUFDaEIsTUFBTSxHQUEwRSxFQUFFLENBQUM7SUFDbkYsVUFBVSxHQUEyQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFakUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxnRkFBZ0Y7SUFDdEUsR0FBRyxDQUE2QjtJQUUxQyxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRVMsUUFBUSxDQUFDLE1BQWM7UUFDL0IsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRVMsR0FBRyxDQUFDLEdBQWUsRUFBRSxJQUFZO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO3dHQTFCVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qix3TEFoQzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4QlQ7OzRGQUVVLDZCQUE2QjtrQkFwQ3pDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtvQkFDeEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCVDtpQkFDRjs4QkFHVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZXNjcmliZUF1ZGl0QWN0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBBdGxhc1NlcnZpY2UgfSBmcm9tICcuLi9hdGxhcy5zZXJ2aWNlJztcbmltcG9ydCB7IGNsYXNzRm9yLCB0eXBlIEVsZW1lbnRLZXkgfSBmcm9tICcuLi9hcHBlYXJhbmNlJztcbmltcG9ydCB0eXBlIHsgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB9IGZyb20gJy4vb3JnYW5pemF0aW9uLWF1ZGl0LWxvZyc7XG5cbi8qKlxuICogYDxhdGxhcy1vcmdhbml6YXRpb24tYXVkaXQtbG9nPmAg4oCUIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uJ3MgYXVkaXQgdHJhaWwgZm9yXG4gKiBpdHMgYWRtaW5zLCBuZXh0IHRvIGA8YXRsYXMtb3JnYW5pemF0aW9uLXByb2ZpbGU+YC4gVGhlIEFuZ3VsYXIgcGVlciBvZlxuICogUmVhY3QncyBgPE9yZ2FuaXphdGlvbkF1ZGl0TG9nLz5gLiBSZW5kZXJzIG5vdGhpbmcgZm9yIGEgbWVtYmVyIHdobyBtYXkgbm90XG4gKiByZWFkIGl0ICh0aGUgc2VydmVyIGlzIHRoZSBhdXRob3JpdHk7IHRoZSBjb21wb25lbnQganVzdCBmb2xsb3dzIGl0KS4gTGFiZWxzXG4gKiBhcmUgaW5wdXRzIHNvIGFuIGFwcCBjYW4gbG9jYWxpc2UgdGhlbS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtb3JnYW5pemF0aW9uLWF1ZGl0LWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoYXRsYXMub3JnYW5pemF0aW9uKCkgJiYgIWxvZy5zdGF0ZSgpLmZvcmJpZGRlbikge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiY2xzKCdjYXJkJywgJ2F0bGFzLWNhcmQnKVwiIGRhdGEtYXRsYXM9XCJvcmdhbml6YXRpb24tYXVkaXQtbG9nXCI+XG4gICAgICAgIDxoMiBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgbGFiZWxzLnRpdGxlID8/ICdBdWRpdCBsb2cnIH19PC9oMj5cbiAgICAgICAgQGlmIChsb2cuc3RhdGUoKS5lbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiAhbG9nLnN0YXRlKCkubG9hZGluZykge1xuICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2hlYWRlclN1YnRpdGxlJywgJ2F0bGFzLXN1YnRpdGxlJylcIj57eyBsYWJlbHMuZW1wdHkgPz8gJ05vIGFjdGl2aXR5IHJlY29yZGVkIHlldC4nIH19PC9wPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8dWwgW2NsYXNzXT1cImNscygnbGlzdCcsICdhdGxhcy1hdWRpdC1saXN0JylcIj5cbiAgICAgICAgICAgIEBmb3IgKGVudHJ5IG9mIGxvZy5zdGF0ZSgpLmVudHJpZXM7IHRyYWNrIGVudHJ5LmlkKSB7XG4gICAgICAgICAgICAgIDxsaSBbY2xhc3NdPVwiY2xzKCdsaXN0SXRlbScsICdhdGxhcy1hdWRpdC1pdGVtJylcIiBbYXR0ci5kYXRhLWFjdGlvbl09XCJlbnRyeS5hY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGRlc2NyaWJlKGVudHJ5LmFjdGlvbikgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLWF1ZGl0LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgIMK3IHt7IGZvcm1hdERhdGUoZW50cnkuY3JlYXRlZF9hdCkgfX17eyBlbnRyeS5hY3Rvci5pZCA/ICcgwrcgJyArIChsYWJlbHMuYWN0b3IgPz8gJ2J5JykgKyAnICcgKyBlbnRyeS5hY3Rvci50eXBlICsgJyAnICsgZW50cnkuYWN0b3IuaWQgOiAnJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobG9nLnN0YXRlKCkuaGFzTW9yZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvZy5zdGF0ZSgpLmxvYWRpbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImxvZy5sb2FkTW9yZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBsYWJlbHMubG9hZE1vcmUgPz8gJ0xvYWQgbW9yZScgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25BdWRpdExvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEVudHJpZXMgcGVyIHBhZ2UgKHRoZSBzZXJ2ZXIgY2FwcyBpdCkuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplPzogbnVtYmVyO1xuICAvKiogTmFycm93IHRvIG9uZSBhY3Rpb24sIG9yIGEgcHJlZml4IGVuZGluZyBpbiBgLmAuICovXG4gIEBJbnB1dCgpIGFjdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWxzOiB7IHRpdGxlPzogc3RyaW5nOyBlbXB0eT86IHN0cmluZzsgbG9hZE1vcmU/OiBzdHJpbmc7IGFjdG9yPzogc3RyaW5nIH0gPSB7fTtcbiAgQElucHV0KCkgZm9ybWF0RGF0ZTogKG1zOiBudW1iZXIpID0+IHN0cmluZyA9IChtcykgPT4gbmV3IERhdGUobXMpLnRvTG9jYWxlU3RyaW5nKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIC8qKiBDcmVhdGVkIGluIG5nT25Jbml0LCBvbmNlIHRoZSBpbnB1dHMgYXJlIHNldCAodGVtcGxhdGVzIHJlbmRlciBhZnRlciBpdCkuICovXG4gIHByb3RlY3RlZCBsb2chOiBBdGxhc09yZ2FuaXphdGlvbkF1ZGl0TG9nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9nID0gdGhpcy5hdGxhcy5vcmdhbml6YXRpb25BdWRpdExvZyh7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBhY3Rpb246IHRoaXMuYWN0aW9uIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5sb2cuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2NyaWJlKGFjdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGVzY3JpYmVBdWRpdEFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,40 @@
1
+ import { signal } from '@angular/core';
2
+ import { distinctUntilChanged, map } from 'rxjs/operators';
3
+ import { createOrganizationAuditLog, } from '@atlasauth/js';
4
+ /**
5
+ * The active organization's audit trail, for its admins — the engine behind
6
+ * `<atlas-organization-audit-log>` and `AtlasService.organizationAuditLog()`
7
+ * (the Angular peer of React's `useOrganizationAuditLog`). `state` is a signal
8
+ * of `{ entries, loading, forbidden, hasMore }`, one page at a time, newest
9
+ * first. It follows the active organization until {@link destroy}.
10
+ */
11
+ export class AtlasOrganizationAuditLog {
12
+ _state;
13
+ log;
14
+ unsubscribe;
15
+ organizationSub;
16
+ state;
17
+ constructor(client, organization$, options = {}) {
18
+ this.log = createOrganizationAuditLog(client, options);
19
+ this._state = signal(this.log.getState());
20
+ this.state = this._state.asReadonly();
21
+ this.unsubscribe = this.log.subscribe((next) => this._state.set(next));
22
+ this.organizationSub = organization$
23
+ .pipe(map((membership) => membership?.organization.id ?? null), distinctUntilChanged())
24
+ .subscribe((id) => void this.log.load(id));
25
+ }
26
+ /** Append the next page, when there is one. */
27
+ loadMore() {
28
+ return this.log.loadMore();
29
+ }
30
+ /** Re-read from the newest entry. */
31
+ reload() {
32
+ return this.log.reload();
33
+ }
34
+ /** Stop following the active organization. */
35
+ destroy() {
36
+ this.organizationSub.unsubscribe();
37
+ this.unsubscribe();
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbml6YXRpb24tYXVkaXQtbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsMEJBQTBCLEdBSzNCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsTUFBTSxDQUE0QztJQUNsRCxHQUFHLENBQWlDO0lBQ3BDLFdBQVcsQ0FBYTtJQUN4QixlQUFlLENBQWU7SUFFdEMsS0FBSyxDQUFvQztJQUVsRCxZQUNFLE1BQStCLEVBQy9CLGFBQTZELEVBQzdELFVBQXVDLEVBQUU7UUFFekMsSUFBSSxDQUFDLEdBQUcsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYTthQUNqQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFDeEQsb0JBQW9CLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgdHlwZSBTaWduYWwsIHR5cGUgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlT3JnYW5pemF0aW9uQXVkaXRMb2csXG4gIHR5cGUgRmFwaUNsaWVudCxcbiAgdHlwZSBPcmdhbml6YXRpb25BdWRpdExvZ0NvbnRyb2xsZXIsXG4gIHR5cGUgT3JnYW5pemF0aW9uQXVkaXRMb2dPcHRpb25zLFxuICB0eXBlIE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGUsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHR5cGUgeyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24ncyBhdWRpdCB0cmFpbCwgZm9yIGl0cyBhZG1pbnMg4oCUIHRoZSBlbmdpbmUgYmVoaW5kXG4gKiBgPGF0bGFzLW9yZ2FuaXphdGlvbi1hdWRpdC1sb2c+YCBhbmQgYEF0bGFzU2VydmljZS5vcmdhbml6YXRpb25BdWRpdExvZygpYFxuICogKHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgdXNlT3JnYW5pemF0aW9uQXVkaXRMb2dgKS4gYHN0YXRlYCBpcyBhIHNpZ25hbFxuICogb2YgYHsgZW50cmllcywgbG9hZGluZywgZm9yYmlkZGVuLCBoYXNNb3JlIH1gLCBvbmUgcGFnZSBhdCBhIHRpbWUsIG5ld2VzdFxuICogZmlyc3QuIEl0IGZvbGxvd3MgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gdW50aWwge0BsaW5rIGRlc3Ryb3l9LlxuICovXG5leHBvcnQgY2xhc3MgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlOiBXcml0YWJsZVNpZ25hbDxPcmdhbml6YXRpb25BdWRpdExvZ1N0YXRlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IE9yZ2FuaXphdGlvbkF1ZGl0TG9nQ29udHJvbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcmdhbml6YXRpb25TdWI6IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBzdGF0ZTogU2lnbmFsPE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogUGljazxGYXBpQ2xpZW50LCAnZ2V0Jz4sXG4gICAgb3JnYW5pemF0aW9uJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPixcbiAgICBvcHRpb25zOiBPcmdhbml6YXRpb25BdWRpdExvZ09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5sb2cgPSBjcmVhdGVPcmdhbml6YXRpb25BdWRpdExvZyhjbGllbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuX3N0YXRlID0gc2lnbmFsKHRoaXMubG9nLmdldFN0YXRlKCkpO1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9zdGF0ZS5hc1JlYWRvbmx5KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMubG9nLnN1YnNjcmliZSgobmV4dCkgPT4gdGhpcy5fc3RhdGUuc2V0KG5leHQpKTtcbiAgICB0aGlzLm9yZ2FuaXphdGlvblN1YiA9IG9yZ2FuaXphdGlvbiRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG1lbWJlcnNoaXApID0+IG1lbWJlcnNoaXA/Lm9yZ2FuaXphdGlvbi5pZCA/PyBudWxsKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGlkKSA9PiB2b2lkIHRoaXMubG9nLmxvYWQoaWQpKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIG5leHQgcGFnZSwgd2hlbiB0aGVyZSBpcyBvbmUuICovXG4gIGxvYWRNb3JlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmxvZy5sb2FkTW9yZSgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgZnJvbSB0aGUgbmV3ZXN0IGVudHJ5LiAqL1xuICByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMubG9nLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFN0b3AgZm9sbG93aW5nIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uLiAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub3JnYW5pemF0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=