@dbx-tools/cli-tunnel 0.6.53 → 0.6.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,12 +29,19 @@ address against an allow-list, verified by a code sent over
29
29
  code input carries `autocomplete="one-time-code"`. iOS, Gmail, Outlook, and
30
30
  Android detect a code from that shape and offer it directly from the
31
31
  notification; novel phrasing is what breaks the detection. Both MIME parts carry
32
- the code as visible text, never an image.
33
- - Domain-bound AutoFill on iOS, layered on top of that: when `--public-domain` is
34
- set, the email's last line is `@<domain> #<code>`, which binds the code to this
35
- host so the keyboard offers it only here - a code phished from another site will
36
- not autofill into it. Omitted when no public domain is configured, leaving the
37
- heuristic detection above untouched.
32
+ the code as visible text, never an image, and no trailer follows the copy.
33
+ - The two MIME parts are built separately, on purpose. The HTML part is the full
34
+ branded template with the code as a large styled heading; the `text/plain` part
35
+ is authored directly, keeping the prompt and the code on ONE line
36
+ (`Your verification code is: 123456`) because that is the shape client code
37
+ detection reads most reliably. A generated text part cannot hold it - the text
38
+ part is a rendering of the HTML, so the heading's CSS margin arrives as blank
39
+ lines and autofill stops being offered while the HTML still looks perfect. See
40
+ `codeEmailTextBody` in the `app` module.
41
+ - The sign-in code is SYSTEM mail: it sends from `no-reply@EMAIL_DOMAIN` (or
42
+ `EMAIL_SYSTEM_FROM`), never a person's address, since a reply to a
43
+ machine-generated code reaches nobody. `EMAIL_FROM` is not required - see
44
+ [`@dbx-tools/email`](../../node/email#sender-addresses).
38
45
  - Email one-time-code gate: a 6-digit code stored as a SHA-256 hash with an
39
46
  attempt counter, verified in constant time, in AppKit's `CacheManager` (memory
40
47
  by default, Lakebase when the app configures persistent `CacheStorage`) so TTL
package/lib/src/app.d.ts CHANGED
@@ -11,8 +11,10 @@
11
11
  *
12
12
  * It returns the {@link AuthGateApi} the proxy drives. `sendCode` is wired here
13
13
  * (the plugin can't resolve HOW to send on its own) to the email plugin's
14
- * transport, resolving the `From` from the email runtime config (EMAIL_FROM /
15
- * EMAIL_DOMAIN) since an OTP request has no on-behalf-of user.
14
+ * transport. A sign-in code is SYSTEM mail - no on-behalf-of user asked for it
15
+ * and no reply to it reaches anyone - so it sends from the email config's
16
+ * do-not-reply address (`no-reply@EMAIL_DOMAIN` unless EMAIL_SYSTEM_FROM names
17
+ * another).
16
18
  *
17
19
  * FAIL FAST: a gate that can't email a code is useless, so if email does not
18
20
  * resolve to SMTP mode (real delivery), this throws - unless `insecure` is set
@@ -21,7 +23,7 @@
21
23
  *
22
24
  * @module
23
25
  */
24
- import { type AuthGateApi, type AuthGateConfig } from "./plugin.ts";
26
+ import { type AuthGateApi, type AuthGateConfig, type SendCodeOptions } from "./plugin.ts";
25
27
  /**
26
28
  * A code TTL as the plain phrase the email states ("10 minutes", "45 seconds").
27
29
  *
@@ -30,6 +32,33 @@ import { type AuthGateApi, type AuthGateConfig } from "./plugin.ts";
30
32
  * never told the code lives longer than it does.
31
33
  */
32
34
  export declare function expiresIn(seconds: number): string;
35
+ /** The parts of {@link SendCodeOptions} the code email's copy is built from. */
36
+ type CodeCopy = Pick<SendCodeOptions, "message" | "codeTtlSeconds">;
37
+ /**
38
+ * The HTML part's source: the full branded template, with the code as a large
39
+ * styled heading (`## ` is what makes it prominent in an inbox).
40
+ */
41
+ export declare function codeEmailHtmlBody(code: string, opts: CodeCopy): string;
42
+ /**
43
+ * The `text/plain` part, supplied EXPLICITLY rather than rendered from the tree
44
+ * above. Both parts say the same thing; only the line layout differs.
45
+ *
46
+ * The prompt and the code share ONE line ("Your verification code is: 123456").
47
+ * That single-line shape is what iOS, Gmail, Outlook, and Android code detection
48
+ * keys on most reliably - the heuristics look for a code in the same sentence as
49
+ * a recognized prompt, so splitting them across lines makes detection dependent
50
+ * on the client, and any blank line between them defeats it outright.
51
+ *
52
+ * The GENERATED text part cannot hold that shape at all: it is a rendering of the
53
+ * HTML, so it carries the brand header/footer and turns the code heading's CSS
54
+ * margin into blank lines, arriving as `prompt\n\n\ncode`.
55
+ *
56
+ * The code is visible text in BOTH parts, never an image, so a client scraping
57
+ * either one finds it. No trailer line follows the copy - Apple's domain-bound
58
+ * `@domain #code` footer is deliberately NOT emitted, since it constrains the
59
+ * code to one origin and is not what the broadly-compatible shape needs.
60
+ */
61
+ export declare function codeEmailTextBody(code: string, opts: CodeCopy): string;
33
62
  /**
34
63
  * Boot the gate app and return the API the proxy calls. Throws when email is not
35
64
  * in SMTP mode (no way to deliver a code) so a misconfigured gate fails fast at
@@ -37,3 +66,4 @@ export declare function expiresIn(seconds: number): string;
37
66
  * fall back to insecure/open mode when the operator opted in.
38
67
  */
39
68
  export declare function startGateApp(config: AuthGateConfig): Promise<AuthGateApi>;
69
+ export {};
package/lib/src/app.js CHANGED
@@ -11,8 +11,10 @@
11
11
  *
12
12
  * It returns the {@link AuthGateApi} the proxy drives. `sendCode` is wired here
13
13
  * (the plugin can't resolve HOW to send on its own) to the email plugin's
14
- * transport, resolving the `From` from the email runtime config (EMAIL_FROM /
15
- * EMAIL_DOMAIN) since an OTP request has no on-behalf-of user.
14
+ * transport. A sign-in code is SYSTEM mail - no on-behalf-of user asked for it
15
+ * and no reply to it reaches anyone - so it sends from the email config's
16
+ * do-not-reply address (`no-reply@EMAIL_DOMAIN` unless EMAIL_SYSTEM_FROM names
17
+ * another).
16
18
  *
17
19
  * FAIL FAST: a gate that can't email a code is useless, so if email does not
18
20
  * resolve to SMTP mode (real delivery), this throws - unless `insecure` is set
@@ -24,8 +26,7 @@
24
26
  import { createApp as createAppNs } from "@dbx-tools/appkit";
25
27
  import { brand as nodeBrand } from "@dbx-tools/core";
26
28
  import { brand as emailBrand, email, sender, transport } from "@dbx-tools/email";
27
- import { log, object, string } from "@dbx-tools/shared-core";
28
- import { autofillTrailer } from "@dbx-tools/shared-email-template";
29
+ import { log, string } from "@dbx-tools/shared-core";
29
30
  import { authGate } from "./plugin.js";
30
31
  const logger = log.logger("tunnel:app");
31
32
  /**
@@ -40,8 +41,52 @@ export function expiresIn(seconds) {
40
41
  ? string.pluralize(seconds / 60, "minute")
41
42
  : string.pluralize(seconds, "second");
42
43
  }
44
+ /** The reassurance line closing both parts. */
45
+ const IGNORE_LINE = "If you did not request this code, you can ignore this email.";
46
+ /**
47
+ * The HTML part's source: the full branded template, with the code as a large
48
+ * styled heading (`## ` is what makes it prominent in an inbox).
49
+ */
50
+ export function codeEmailHtmlBody(code, opts) {
51
+ return [
52
+ opts.message,
53
+ "",
54
+ `## ${code}`,
55
+ "",
56
+ `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
57
+ "",
58
+ IGNORE_LINE,
59
+ ].join("\n");
60
+ }
61
+ /**
62
+ * The `text/plain` part, supplied EXPLICITLY rather than rendered from the tree
63
+ * above. Both parts say the same thing; only the line layout differs.
64
+ *
65
+ * The prompt and the code share ONE line ("Your verification code is: 123456").
66
+ * That single-line shape is what iOS, Gmail, Outlook, and Android code detection
67
+ * keys on most reliably - the heuristics look for a code in the same sentence as
68
+ * a recognized prompt, so splitting them across lines makes detection dependent
69
+ * on the client, and any blank line between them defeats it outright.
70
+ *
71
+ * The GENERATED text part cannot hold that shape at all: it is a rendering of the
72
+ * HTML, so it carries the brand header/footer and turns the code heading's CSS
73
+ * margin into blank lines, arriving as `prompt\n\n\ncode`.
74
+ *
75
+ * The code is visible text in BOTH parts, never an image, so a client scraping
76
+ * either one finds it. No trailer line follows the copy - Apple's domain-bound
77
+ * `@domain #code` footer is deliberately NOT emitted, since it constrains the
78
+ * code to one origin and is not what the broadly-compatible shape needs.
79
+ */
80
+ export function codeEmailTextBody(code, opts) {
81
+ return [
82
+ `${opts.message} ${code}`,
83
+ `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
84
+ "",
85
+ IGNORE_LINE,
86
+ ].join("\n");
87
+ }
43
88
  const { createApp } = createAppNs;
44
- const { resolveSenderAddress } = sender;
89
+ const { resolveSystemSenderAddress } = sender;
45
90
  const { getEmailRuntime, sendEmail } = transport;
46
91
  const { emailBrandFromContext } = emailBrand;
47
92
  const { loadBrandContext } = nodeBrand;
@@ -61,38 +106,16 @@ export async function startGateApp(config) {
61
106
  // `sendCode` delivers the OTP through the email plugin's SHARED transport, which
62
107
  // the `email()` plugin primes during its `setup()` (awaited by `createApp`
63
108
  // below). Using the module-level `sendEmail` avoids a circular dependency on the
64
- // app handle's inferred type. `From` is the app's configured sender (EMAIL_FROM /
65
- // EMAIL_DOMAIN); the code email has no OBO user, so it resolves with `undefined`.
109
+ // app handle's inferred type. The `From` is the SYSTEM sender: a verification
110
+ // code is machine-generated and unanswerable, so it must not arrive from a
111
+ // person's address inviting a reply.
66
112
  const sendCode = async (to, code, opts) => {
67
- const from = resolveSenderAddress(getEmailRuntime().config, undefined);
113
+ const from = resolveSystemSenderAddress(getEmailRuntime().config);
68
114
  await sendEmail({
69
115
  to: [to],
70
116
  subject: opts.subject,
71
- // Deliberately the conventional one-time-code layout: the prompt line,
72
- // then the bare code ALONE on the next line, then the expiry. iOS, Gmail,
73
- // Outlook, and Android all detect a code from this shape and offer to
74
- // autofill it, and anything more decorative is what breaks that. The code
75
- // stays visible TEXT in both MIME parts (the email plugin renders the
76
- // HTML and plain-text alternatives from one React Email tree), never an
77
- // image, so a client that scrapes the text part still finds it. The
78
- // `trailer` below adds Apple's domain-bound AutoFill on top.
79
- body: [
80
- opts.message,
81
- "",
82
- `## ${code}`,
83
- "",
84
- `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
85
- "",
86
- "If you did not request this code, you can ignore this email.",
87
- ].join("\n"),
88
- }, from, undefined,
89
- // Apple's domain-bound AutoFill, layered ON TOP of the conventional layout
90
- // above (which is what iOS/Gmail/Outlook/Android already detect
91
- // heuristically). Passed as a delivery OPTION rather than appended to the
92
- // body because iOS only honours `@<domain> #<code>` as the message's final
93
- // line, and the branded footer renders after the body. Omitted when no
94
- // public domain is configured - there is no host to bind the code to.
95
- object.optional("trailer", autofillTrailer(opts.publicDomain, code)));
117
+ body: codeEmailHtmlBody(code, opts),
118
+ }, from, undefined, { text: codeEmailTextBody(code, opts) });
96
119
  };
97
120
  // `createApp` namespaces each plugin's exports on the handle by manifest name;
98
121
  // `handle.authGate` is the in-process gate API the proxy drives.
@@ -120,4 +143,4 @@ export async function startGateApp(config) {
120
143
  logger.info("gate app ready (no server; proxy-driven)");
121
144
  return handle.authGate;
122
145
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxJQUFJLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUF5QyxNQUFNLGFBQWEsQ0FBQztBQUU5RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZTtJQUN2QyxPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFdBQVcsQ0FBQztBQUNsQyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFDeEMsTUFBTSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7QUFDakQsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsVUFBVSxDQUFDO0FBQzdDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFNBQVMsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLE1BQXNCO0lBQ3ZELDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO0lBRXpDLGlGQUFpRjtJQUNqRiwyRUFBMkU7SUFDM0UsaUZBQWlGO0lBQ2pGLGtGQUFrRjtJQUNsRixrRkFBa0Y7SUFDbEYsTUFBTSxRQUFRLEdBQTRDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pGLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLFNBQVMsQ0FDYjtZQUNFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQix1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUsc0VBQXNFO1lBQ3RFLHdFQUF3RTtZQUN4RSxvRUFBb0U7WUFDcEUsNkRBQTZEO1lBQzdELElBQUksRUFBRTtnQkFDSixJQUFJLENBQUMsT0FBTztnQkFDWixFQUFFO2dCQUNGLE1BQU0sSUFBSSxFQUFFO2dCQUNaLEVBQUU7Z0JBQ0Ysd0JBQXdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7Z0JBQ3pELEVBQUU7Z0JBQ0YsOERBQThEO2FBQy9ELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNiLEVBQ0QsSUFBSSxFQUNKLFNBQVM7UUFDVCwyRUFBMkU7UUFDM0UsZ0VBQWdFO1FBQ2hFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsK0VBQStFO0lBQy9FLGlFQUFpRTtJQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQztRQUM3QixPQUFPLEVBQUU7WUFDUCx3RUFBd0U7WUFDeEUsNEVBQTRFO1lBQzVFLDBFQUEwRTtZQUMxRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRCx3RUFBd0U7WUFDeEUsNEVBQTRFO1lBQzVFLHFFQUFxRTtZQUNyRSwyRUFBMkU7WUFDM0UsZ0VBQWdFO1lBQ2hFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDL0U7S0FDRixDQUFDLENBQUM7SUFFSCxpRkFBaUY7SUFDakYsZ0ZBQWdGO0lBQ2hGLGlGQUFpRjtJQUNqRixJQUFJLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEU7WUFDNUUsMEdBQTBHLENBQzdHLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sTUFBTSxDQUFDLFFBQXVCLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIHR1bm5lbCBnYXRlJ3MgdGlueSBBcHBLaXQgXCJhcHBcIiAtIGBjcmVhdGVBcHBgIFdJVEhPVVQgYSBgc2VydmVyKClgIHBsdWdpbi5cbiAqXG4gKiBUaGVyZSBpcyBubyBIVFRQIHNlcnZlciBoZXJlOiB0aGUgdHVubmVsIHByb3h5IGlzIHRoZSBzZXJ2ZXIsIGFuZCBpdCBjYWxscyB0aGVcbiAqIGdhdGUgaGFuZGxlcnMgaW4tcHJvY2Vzcy4gYGNyZWF0ZUFwcGAgaXMgdXNlZCBvbmx5IGZvciB3aGF0IGl0IGF1dG8td2lyZXM6XG4gKiAgIC0gYENhY2hlTWFuYWdlcmAgKG1lbW9yeSwgb3IgTGFrZWJhc2Ugd2hlbiB0aGUgZGVwbG95IGNvbmZpZ3VyZXMgcGVyc2lzdGVudFxuICogICAgIGNhY2hlIHN0b3JhZ2UpIC0gd2hpY2ggdGhlIE9UUCBgQ29kZVN0b3JlYCB1c2VzIGZvciBzdG9yYWdlICsgVFRMIGV2aWN0aW9uO1xuICogICAtIHRoZSBgZW1haWwoKWAgdHJhbnNwb3J0IChTTVRQIC8gb3V0Ym94KSwgcHJpbWVkIGZyb20gZW52LCBzbyBgc2VuZENvZGVgIGNhblxuICogICAgIGRlbGl2ZXIgdGhlIG9uZS10aW1lIGNvZGU7XG4gKiAgIC0gZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiArIGJyYW5kaW5nIHZpYSBgQGRieC10b29scy9hcHBraXRgLlxuICpcbiAqIEl0IHJldHVybnMgdGhlIHtAbGluayBBdXRoR2F0ZUFwaX0gdGhlIHByb3h5IGRyaXZlcy4gYHNlbmRDb2RlYCBpcyB3aXJlZCBoZXJlXG4gKiAodGhlIHBsdWdpbiBjYW4ndCByZXNvbHZlIEhPVyB0byBzZW5kIG9uIGl0cyBvd24pIHRvIHRoZSBlbWFpbCBwbHVnaW4nc1xuICogdHJhbnNwb3J0LCByZXNvbHZpbmcgdGhlIGBGcm9tYCBmcm9tIHRoZSBlbWFpbCBydW50aW1lIGNvbmZpZyAoRU1BSUxfRlJPTSAvXG4gKiBFTUFJTF9ET01BSU4pIHNpbmNlIGFuIE9UUCByZXF1ZXN0IGhhcyBubyBvbi1iZWhhbGYtb2YgdXNlci5cbiAqXG4gKiBGQUlMIEZBU1Q6IGEgZ2F0ZSB0aGF0IGNhbid0IGVtYWlsIGEgY29kZSBpcyB1c2VsZXNzLCBzbyBpZiBlbWFpbCBkb2VzIG5vdFxuICogcmVzb2x2ZSB0byBTTVRQIG1vZGUgKHJlYWwgZGVsaXZlcnkpLCB0aGlzIHRocm93cyAtIHVubGVzcyBgaW5zZWN1cmVgIGlzIHNldFxuICogKGAtLWluc2VjdXJlYCAvIGBUVU5ORUxfSU5TRUNVUkU9dHJ1ZWApLCBpbiB3aGljaCBjYXNlIHRoZSBjYWxsZXIgcnVucyB0aGVcbiAqIHR1bm5lbCBPUEVOIHdpdGggbm8gZ2F0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQXBwIGFzIGNyZWF0ZUFwcE5zIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBicmFuZCBhcyBub2RlQnJhbmQgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBicmFuZCBhcyBlbWFpbEJyYW5kLCBlbWFpbCwgc2VuZGVyLCB0cmFuc3BvcnQgfSBmcm9tIFwiQGRieC10b29scy9lbWFpbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBhdXRvZmlsbFRyYWlsZXIgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWwtdGVtcGxhdGVcIjtcbmltcG9ydCB7IGF1dGhHYXRlLCB0eXBlIEF1dGhHYXRlQXBpLCB0eXBlIEF1dGhHYXRlQ29uZmlnIH0gZnJvbSBcIi4vcGx1Z2luLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6YXBwXCIpO1xuXG4vKipcbiAqIEEgY29kZSBUVEwgYXMgdGhlIHBsYWluIHBocmFzZSB0aGUgZW1haWwgc3RhdGVzIChcIjEwIG1pbnV0ZXNcIiwgXCI0NSBzZWNvbmRzXCIpLlxuICpcbiAqIFdob2xlIG1pbnV0ZXMgcmVhZCBhcyBtaW51dGVzOyBhbnl0aGluZyBlbHNlIHN0YXlzIGluIHNlY29uZHMgcmF0aGVyIHRoYW5cbiAqIHJvdW5kaW5nLCBzbyBhIDkwLXNlY29uZCBUVEwgaXMgbm90IGFkdmVydGlzZWQgYXMgXCIxIG1pbnV0ZVwiIGFuZCBhIHJlY2lwaWVudCBpc1xuICogbmV2ZXIgdG9sZCB0aGUgY29kZSBsaXZlcyBsb25nZXIgdGhhbiBpdCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwaXJlc0luKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBzZWNvbmRzID49IDYwICYmIHNlY29uZHMgJSA2MCA9PT0gMFxuICAgID8gc3RyaW5nLnBsdXJhbGl6ZShzZWNvbmRzIC8gNjAsIFwibWludXRlXCIpXG4gICAgOiBzdHJpbmcucGx1cmFsaXplKHNlY29uZHMsIFwic2Vjb25kXCIpO1xufVxuXG5jb25zdCB7IGNyZWF0ZUFwcCB9ID0gY3JlYXRlQXBwTnM7XG5jb25zdCB7IHJlc29sdmVTZW5kZXJBZGRyZXNzIH0gPSBzZW5kZXI7XG5jb25zdCB7IGdldEVtYWlsUnVudGltZSwgc2VuZEVtYWlsIH0gPSB0cmFuc3BvcnQ7XG5jb25zdCB7IGVtYWlsQnJhbmRGcm9tQ29udGV4dCB9ID0gZW1haWxCcmFuZDtcbmNvbnN0IHsgbG9hZEJyYW5kQ29udGV4dCB9ID0gbm9kZUJyYW5kO1xuXG4vKipcbiAqIEJvb3QgdGhlIGdhdGUgYXBwIGFuZCByZXR1cm4gdGhlIEFQSSB0aGUgcHJveHkgY2FsbHMuIFRocm93cyB3aGVuIGVtYWlsIGlzIG5vdFxuICogaW4gU01UUCBtb2RlIChubyB3YXkgdG8gZGVsaXZlciBhIGNvZGUpIHNvIGEgbWlzY29uZmlndXJlZCBnYXRlIGZhaWxzIGZhc3QgYXRcbiAqIHN0YXJ0dXAgcmF0aGVyIHRoYW4gc2lsZW50bHkgYWNjZXB0aW5nIG5vYm9keTsgdGhlIGNhbGxlciBtYXkgY2F0Y2ggdGhpcyBhbmRcbiAqIGZhbGwgYmFjayB0byBpbnNlY3VyZS9vcGVuIG1vZGUgd2hlbiB0aGUgb3BlcmF0b3Igb3B0ZWQgaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydEdhdGVBcHAoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFByb21pc2U8QXV0aEdhdGVBcGk+IHtcbiAgLy8gVGhlIGhvc3QgYXBwJ3Mgb3duIGJyYW5kIChgYnJhbmRpbmcvYnJhbmQueWFtbGAgZGlzY292ZXJlZCBmcm9tIGN3ZCkgb3IgdGhlXG4gIC8vIGRieC10b29scyBkZWZhdWx0LiBUaGlzIGlzIHRoZSBPTkUgYnJhbmQgc291cmNlIGZvciB0aGUgZ2F0ZTogaXQgc3R5bGVzIHRoZVxuICAvLyBjb2RlIGVtYWlsIChhY2NlbnQgYmFuZCwgZm9udCwgbG9nbykgdmlhIHRoZSBlbWFpbCBwbHVnaW4gQU5EIHN1cHBsaWVzIHRoZVxuICAvLyBkaXNwbGF5IG5hbWUgdGhlIGNvcHkgdXNlcywgc28gYSBkZXBsb3ltZW50IHRoYXQgdGhlbWVzIGl0cyBhcHAgdGhlbWVzIGl0c1xuICAvLyBzaWduLWluIGVtYWlsIHdpdGggaXQuIEFuIGV4cGxpY2l0IGBicmFuZE5hbWVgIHN0aWxsIHdpbnMgKHNlZSBiZWxvdykuXG4gIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBsb2FkQnJhbmRDb250ZXh0KCk7XG5cbiAgLy8gYHNlbmRDb2RlYCBkZWxpdmVycyB0aGUgT1RQIHRocm91Z2ggdGhlIGVtYWlsIHBsdWdpbidzIFNIQVJFRCB0cmFuc3BvcnQsIHdoaWNoXG4gIC8vIHRoZSBgZW1haWwoKWAgcGx1Z2luIHByaW1lcyBkdXJpbmcgaXRzIGBzZXR1cCgpYCAoYXdhaXRlZCBieSBgY3JlYXRlQXBwYFxuICAvLyBiZWxvdykuIFVzaW5nIHRoZSBtb2R1bGUtbGV2ZWwgYHNlbmRFbWFpbGAgYXZvaWRzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBvbiB0aGVcbiAgLy8gYXBwIGhhbmRsZSdzIGluZmVycmVkIHR5cGUuIGBGcm9tYCBpcyB0aGUgYXBwJ3MgY29uZmlndXJlZCBzZW5kZXIgKEVNQUlMX0ZST00gL1xuICAvLyBFTUFJTF9ET01BSU4pOyB0aGUgY29kZSBlbWFpbCBoYXMgbm8gT0JPIHVzZXIsIHNvIGl0IHJlc29sdmVzIHdpdGggYHVuZGVmaW5lZGAuXG4gIGNvbnN0IHNlbmRDb2RlOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiA9IGFzeW5jICh0bywgY29kZSwgb3B0cykgPT4ge1xuICAgIGNvbnN0IGZyb20gPSByZXNvbHZlU2VuZGVyQWRkcmVzcyhnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcsIHVuZGVmaW5lZCk7XG4gICAgYXdhaXQgc2VuZEVtYWlsKFxuICAgICAge1xuICAgICAgICB0bzogW3RvXSxcbiAgICAgICAgc3ViamVjdDogb3B0cy5zdWJqZWN0LFxuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdGhlIGNvbnZlbnRpb25hbCBvbmUtdGltZS1jb2RlIGxheW91dDogdGhlIHByb21wdCBsaW5lLFxuICAgICAgICAvLyB0aGVuIHRoZSBiYXJlIGNvZGUgQUxPTkUgb24gdGhlIG5leHQgbGluZSwgdGhlbiB0aGUgZXhwaXJ5LiBpT1MsIEdtYWlsLFxuICAgICAgICAvLyBPdXRsb29rLCBhbmQgQW5kcm9pZCBhbGwgZGV0ZWN0IGEgY29kZSBmcm9tIHRoaXMgc2hhcGUgYW5kIG9mZmVyIHRvXG4gICAgICAgIC8vIGF1dG9maWxsIGl0LCBhbmQgYW55dGhpbmcgbW9yZSBkZWNvcmF0aXZlIGlzIHdoYXQgYnJlYWtzIHRoYXQuIFRoZSBjb2RlXG4gICAgICAgIC8vIHN0YXlzIHZpc2libGUgVEVYVCBpbiBib3RoIE1JTUUgcGFydHMgKHRoZSBlbWFpbCBwbHVnaW4gcmVuZGVycyB0aGVcbiAgICAgICAgLy8gSFRNTCBhbmQgcGxhaW4tdGV4dCBhbHRlcm5hdGl2ZXMgZnJvbSBvbmUgUmVhY3QgRW1haWwgdHJlZSksIG5ldmVyIGFuXG4gICAgICAgIC8vIGltYWdlLCBzbyBhIGNsaWVudCB0aGF0IHNjcmFwZXMgdGhlIHRleHQgcGFydCBzdGlsbCBmaW5kcyBpdC4gVGhlXG4gICAgICAgIC8vIGB0cmFpbGVyYCBiZWxvdyBhZGRzIEFwcGxlJ3MgZG9tYWluLWJvdW5kIEF1dG9GaWxsIG9uIHRvcC5cbiAgICAgICAgYm9keTogW1xuICAgICAgICAgIG9wdHMubWVzc2FnZSxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIGAjIyAke2NvZGV9YCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIGBUaGlzIGNvZGUgZXhwaXJlcyBpbiAke2V4cGlyZXNJbihvcHRzLmNvZGVUdGxTZWNvbmRzKX0uYCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIFwiSWYgeW91IGRpZCBub3QgcmVxdWVzdCB0aGlzIGNvZGUsIHlvdSBjYW4gaWdub3JlIHRoaXMgZW1haWwuXCIsXG4gICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgIH0sXG4gICAgICBmcm9tLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgLy8gQXBwbGUncyBkb21haW4tYm91bmQgQXV0b0ZpbGwsIGxheWVyZWQgT04gVE9QIG9mIHRoZSBjb252ZW50aW9uYWwgbGF5b3V0XG4gICAgICAvLyBhYm92ZSAod2hpY2ggaXMgd2hhdCBpT1MvR21haWwvT3V0bG9vay9BbmRyb2lkIGFscmVhZHkgZGV0ZWN0XG4gICAgICAvLyBoZXVyaXN0aWNhbGx5KS4gUGFzc2VkIGFzIGEgZGVsaXZlcnkgT1BUSU9OIHJhdGhlciB0aGFuIGFwcGVuZGVkIHRvIHRoZVxuICAgICAgLy8gYm9keSBiZWNhdXNlIGlPUyBvbmx5IGhvbm91cnMgYEA8ZG9tYWluPiAjPGNvZGU+YCBhcyB0aGUgbWVzc2FnZSdzIGZpbmFsXG4gICAgICAvLyBsaW5lLCBhbmQgdGhlIGJyYW5kZWQgZm9vdGVyIHJlbmRlcnMgYWZ0ZXIgdGhlIGJvZHkuIE9taXR0ZWQgd2hlbiBub1xuICAgICAgLy8gcHVibGljIGRvbWFpbiBpcyBjb25maWd1cmVkIC0gdGhlcmUgaXMgbm8gaG9zdCB0byBiaW5kIHRoZSBjb2RlIHRvLlxuICAgICAgb2JqZWN0Lm9wdGlvbmFsKFwidHJhaWxlclwiLCBhdXRvZmlsbFRyYWlsZXIob3B0cy5wdWJsaWNEb21haW4sIGNvZGUpKSxcbiAgICApO1xuICB9O1xuXG4gIC8vIGBjcmVhdGVBcHBgIG5hbWVzcGFjZXMgZWFjaCBwbHVnaW4ncyBleHBvcnRzIG9uIHRoZSBoYW5kbGUgYnkgbWFuaWZlc3QgbmFtZTtcbiAgLy8gYGhhbmRsZS5hdXRoR2F0ZWAgaXMgdGhlIGluLXByb2Nlc3MgZ2F0ZSBBUEkgdGhlIHByb3h5IGRyaXZlcy5cbiAgY29uc3QgaGFuZGxlID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBCcmFuZCB0aGUgY29kZSBlbWFpbCBmcm9tIHRoZSByZXNvbHZlZCBjb250ZXh0LCB0aGUgc2FtZSBicmlkZ2UgZXZlcnlcbiAgICAgIC8vIG90aGVyIGRieC10b29scyBlbWFpbCBzdXJmYWNlIHVzZXMgKGFjY2VudCArIGZvbnQgaW5saW5lZCwgbG9nbyBvbmx5IHdoZW5cbiAgICAgIC8vIGl0IGlzIGEgZmV0Y2hhYmxlIFVSTCAtIGEgcGFja2FnZS1leHBvcnQgcGF0aCBjYW5ub3QgbG9hZCBpbiBhbiBpbmJveCkuXG4gICAgICBlbWFpbCh7IGJyYW5kOiBlbWFpbEJyYW5kRnJvbUNvbnRleHQoY29udGV4dCkgfSksXG4gICAgICAvLyBgYnJhbmROYW1lYCBmYWxscyBiYWNrIHRvIHRoZSByZXNvbHZlZCBjb250ZXh0J3MgZGlzcGxheSBuYW1lLCBzbyB0aGVcbiAgICAgIC8vIGVtYWlsIGNvcHkgbmFtZXMgdGhlIGFwcCByYXRoZXIgdGhhbiBhIGdlbmVyaWMgcGxhY2Vob2xkZXIuIFNwZWxsZWQgYXMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IGA/P2AgcmF0aGVyIHRoYW4gYSBrZXkgYmVmb3JlIGAuLi5jb25maWdgOiBjb21tYW5kZXIgc2V0c1xuICAgICAgLy8gYGJyYW5kTmFtZWAgb24gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZXRoZXIgb3Igbm90IHRoZSBmbGFnIHdhcyBwYXNzZWQsIHNvXG4gICAgICAvLyBzcHJlYWRpbmcgaXQgd291bGQgY2xvYmJlciB0aGUgY29udGV4dCBuYW1lIHdpdGggYHVuZGVmaW5lZGAuXG4gICAgICBhdXRoR2F0ZSh7IC4uLmNvbmZpZywgYnJhbmROYW1lOiBjb25maWcuYnJhbmROYW1lID8/IGNvbnRleHQubmFtZSwgc2VuZENvZGUgfSksXG4gICAgXSxcbiAgfSk7XG5cbiAgLy8gRmFpbCBmYXN0OiB0aGUgZ2F0ZSBuZWVkcyBTTVRQIHRvIGVtYWlsIGNvZGVzLiBgZ2V0RW1haWxSdW50aW1lKClgIHJlc29sdmVzIHRvXG4gIC8vIGBtb2RlOiBcImZpbGVcImAgKG91dGJveCkgb3IgdGhyb3dzIHdoZW4gbm8gU01UUCBjcmVkcyBhcmUgY29uZmlndXJlZCAtIG5laXRoZXJcbiAgLy8gY2FuIGRlbGl2ZXIgdG8gYSByZWFsIGluYm94LCBzbyByZWZ1c2UgdG8gYnJpbmcgdXAgYSBnYXRlIHRoYXQgbGV0cyBub2JvZHkgaW4uXG4gIGlmIChnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcubW9kZSAhPT0gXCJzbXRwXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVtYWlsIGlzIG5vdCBjb25maWd1cmVkIGZvciBTTVRQIGRlbGl2ZXJ5IC0gdGhlIE9UUCBnYXRlIGNhbm5vdCBzZW5kIGNvZGVzLiBcIiArXG4gICAgICAgIFwiU2V0IFNNVFBfSE9TVC9TTVRQX1VTRVIvU01UUF9QQVNTV09SRCwgb3IgcGFzcyAtLWluc2VjdXJlIC8gVFVOTkVMX0lOU0VDVVJFPXRydWUgdG8gcnVuIHRoZSB0dW5uZWwgb3Blbi5cIixcbiAgICApO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oXCJnYXRlIGFwcCByZWFkeSAobm8gc2VydmVyOyBwcm94eS1kcml2ZW4pXCIpO1xuICByZXR1cm4gaGFuZGxlLmF1dGhHYXRlIGFzIEF1dGhHYXRlQXBpO1xufVxuIl19
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUErRCxNQUFNLGFBQWEsQ0FBQztBQUVwRyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZTtJQUN2QyxPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBS0QsK0NBQStDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLDhEQUE4RCxDQUFDO0FBRW5GOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsSUFBYztJQUM1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU87UUFDWixFQUFFO1FBQ0YsTUFBTSxJQUFJLEVBQUU7UUFDWixFQUFFO1FBQ0Ysd0JBQXdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7UUFDekQsRUFBRTtRQUNGLFdBQVc7S0FDWixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQVksRUFBRSxJQUFjO0lBQzVELE9BQU87UUFDTCxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ3pCLHdCQUF3QixTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHO1FBQ3pELEVBQUU7UUFDRixXQUFXO0tBQ1osQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFdBQVcsQ0FBQztBQUNsQyxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFDOUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7QUFDakQsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsVUFBVSxDQUFDO0FBQzdDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFNBQVMsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLE1BQXNCO0lBQ3ZELDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO0lBRXpDLGlGQUFpRjtJQUNqRiwyRUFBMkU7SUFDM0UsaUZBQWlGO0lBQ2pGLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UscUNBQXFDO0lBQ3JDLE1BQU0sUUFBUSxHQUE0QyxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNqRixNQUFNLElBQUksR0FBRywwQkFBMEIsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxNQUFNLFNBQVMsQ0FDYjtZQUNFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztTQUNwQyxFQUNELElBQUksRUFDSixTQUFTLEVBQ1QsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQ3hDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRiwrRUFBK0U7SUFDL0UsaUVBQWlFO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDO1FBQzdCLE9BQU8sRUFBRTtZQUNQLHdFQUF3RTtZQUN4RSw0RUFBNEU7WUFDNUUsMEVBQTBFO1lBQzFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hELHdFQUF3RTtZQUN4RSw0RUFBNEU7WUFDNUUscUVBQXFFO1lBQ3JFLDJFQUEyRTtZQUMzRSxnRUFBZ0U7WUFDaEUsUUFBUSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUMvRTtLQUNGLENBQUMsQ0FBQztJQUVILGlGQUFpRjtJQUNqRixnRkFBZ0Y7SUFDaEYsaUZBQWlGO0lBQ2pGLElBQUksZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksS0FBSyxDQUNiLDhFQUE4RTtZQUM1RSwwR0FBMEcsQ0FDN0csQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsUUFBdUIsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgdHVubmVsIGdhdGUncyB0aW55IEFwcEtpdCBcImFwcFwiIC0gYGNyZWF0ZUFwcGAgV0lUSE9VVCBhIGBzZXJ2ZXIoKWAgcGx1Z2luLlxuICpcbiAqIFRoZXJlIGlzIG5vIEhUVFAgc2VydmVyIGhlcmU6IHRoZSB0dW5uZWwgcHJveHkgaXMgdGhlIHNlcnZlciwgYW5kIGl0IGNhbGxzIHRoZVxuICogZ2F0ZSBoYW5kbGVycyBpbi1wcm9jZXNzLiBgY3JlYXRlQXBwYCBpcyB1c2VkIG9ubHkgZm9yIHdoYXQgaXQgYXV0by13aXJlczpcbiAqICAgLSBgQ2FjaGVNYW5hZ2VyYCAobWVtb3J5LCBvciBMYWtlYmFzZSB3aGVuIHRoZSBkZXBsb3kgY29uZmlndXJlcyBwZXJzaXN0ZW50XG4gKiAgICAgY2FjaGUgc3RvcmFnZSkgLSB3aGljaCB0aGUgT1RQIGBDb2RlU3RvcmVgIHVzZXMgZm9yIHN0b3JhZ2UgKyBUVEwgZXZpY3Rpb247XG4gKiAgIC0gdGhlIGBlbWFpbCgpYCB0cmFuc3BvcnQgKFNNVFAgLyBvdXRib3gpLCBwcmltZWQgZnJvbSBlbnYsIHNvIGBzZW5kQ29kZWAgY2FuXG4gKiAgICAgZGVsaXZlciB0aGUgb25lLXRpbWUgY29kZTtcbiAqICAgLSBkYngtdG9vbHMgYXV0by1jb25maWd1cmF0aW9uICsgYnJhbmRpbmcgdmlhIGBAZGJ4LXRvb2xzL2FwcGtpdGAuXG4gKlxuICogSXQgcmV0dXJucyB0aGUge0BsaW5rIEF1dGhHYXRlQXBpfSB0aGUgcHJveHkgZHJpdmVzLiBgc2VuZENvZGVgIGlzIHdpcmVkIGhlcmVcbiAqICh0aGUgcGx1Z2luIGNhbid0IHJlc29sdmUgSE9XIHRvIHNlbmQgb24gaXRzIG93bikgdG8gdGhlIGVtYWlsIHBsdWdpbidzXG4gKiB0cmFuc3BvcnQuIEEgc2lnbi1pbiBjb2RlIGlzIFNZU1RFTSBtYWlsIC0gbm8gb24tYmVoYWxmLW9mIHVzZXIgYXNrZWQgZm9yIGl0XG4gKiBhbmQgbm8gcmVwbHkgdG8gaXQgcmVhY2hlcyBhbnlvbmUgLSBzbyBpdCBzZW5kcyBmcm9tIHRoZSBlbWFpbCBjb25maWcnc1xuICogZG8tbm90LXJlcGx5IGFkZHJlc3MgKGBuby1yZXBseUBFTUFJTF9ET01BSU5gIHVubGVzcyBFTUFJTF9TWVNURU1fRlJPTSBuYW1lc1xuICogYW5vdGhlcikuXG4gKlxuICogRkFJTCBGQVNUOiBhIGdhdGUgdGhhdCBjYW4ndCBlbWFpbCBhIGNvZGUgaXMgdXNlbGVzcywgc28gaWYgZW1haWwgZG9lcyBub3RcbiAqIHJlc29sdmUgdG8gU01UUCBtb2RlIChyZWFsIGRlbGl2ZXJ5KSwgdGhpcyB0aHJvd3MgLSB1bmxlc3MgYGluc2VjdXJlYCBpcyBzZXRcbiAqIChgLS1pbnNlY3VyZWAgLyBgVFVOTkVMX0lOU0VDVVJFPXRydWVgKSwgaW4gd2hpY2ggY2FzZSB0aGUgY2FsbGVyIHJ1bnMgdGhlXG4gKiB0dW5uZWwgT1BFTiB3aXRoIG5vIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUFwcCBhcyBjcmVhdGVBcHBOcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYnJhbmQgYXMgbm9kZUJyYW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYnJhbmQgYXMgZW1haWxCcmFuZCwgZW1haWwsIHNlbmRlciwgdHJhbnNwb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbmltcG9ydCB7IGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGF1dGhHYXRlLCB0eXBlIEF1dGhHYXRlQXBpLCB0eXBlIEF1dGhHYXRlQ29uZmlnLCB0eXBlIFNlbmRDb2RlT3B0aW9ucyB9IGZyb20gXCIuL3BsdWdpbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmFwcFwiKTtcblxuLyoqXG4gKiBBIGNvZGUgVFRMIGFzIHRoZSBwbGFpbiBwaHJhc2UgdGhlIGVtYWlsIHN0YXRlcyAoXCIxMCBtaW51dGVzXCIsIFwiNDUgc2Vjb25kc1wiKS5cbiAqXG4gKiBXaG9sZSBtaW51dGVzIHJlYWQgYXMgbWludXRlczsgYW55dGhpbmcgZWxzZSBzdGF5cyBpbiBzZWNvbmRzIHJhdGhlciB0aGFuXG4gKiByb3VuZGluZywgc28gYSA5MC1zZWNvbmQgVFRMIGlzIG5vdCBhZHZlcnRpc2VkIGFzIFwiMSBtaW51dGVcIiBhbmQgYSByZWNpcGllbnQgaXNcbiAqIG5ldmVyIHRvbGQgdGhlIGNvZGUgbGl2ZXMgbG9uZ2VyIHRoYW4gaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZXNJbihzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gc2Vjb25kcyA+PSA2MCAmJiBzZWNvbmRzICUgNjAgPT09IDBcbiAgICA/IHN0cmluZy5wbHVyYWxpemUoc2Vjb25kcyAvIDYwLCBcIm1pbnV0ZVwiKVxuICAgIDogc3RyaW5nLnBsdXJhbGl6ZShzZWNvbmRzLCBcInNlY29uZFwiKTtcbn1cblxuLyoqIFRoZSBwYXJ0cyBvZiB7QGxpbmsgU2VuZENvZGVPcHRpb25zfSB0aGUgY29kZSBlbWFpbCdzIGNvcHkgaXMgYnVpbHQgZnJvbS4gKi9cbnR5cGUgQ29kZUNvcHkgPSBQaWNrPFNlbmRDb2RlT3B0aW9ucywgXCJtZXNzYWdlXCIgfCBcImNvZGVUdGxTZWNvbmRzXCI+O1xuXG4vKiogVGhlIHJlYXNzdXJhbmNlIGxpbmUgY2xvc2luZyBib3RoIHBhcnRzLiAqL1xuY29uc3QgSUdOT1JFX0xJTkUgPSBcIklmIHlvdSBkaWQgbm90IHJlcXVlc3QgdGhpcyBjb2RlLCB5b3UgY2FuIGlnbm9yZSB0aGlzIGVtYWlsLlwiO1xuXG4vKipcbiAqIFRoZSBIVE1MIHBhcnQncyBzb3VyY2U6IHRoZSBmdWxsIGJyYW5kZWQgdGVtcGxhdGUsIHdpdGggdGhlIGNvZGUgYXMgYSBsYXJnZVxuICogc3R5bGVkIGhlYWRpbmcgKGAjIyBgIGlzIHdoYXQgbWFrZXMgaXQgcHJvbWluZW50IGluIGFuIGluYm94KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVFbWFpbEh0bWxCb2R5KGNvZGU6IHN0cmluZywgb3B0czogQ29kZUNvcHkpOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgIG9wdHMubWVzc2FnZSxcbiAgICBcIlwiLFxuICAgIGAjIyAke2NvZGV9YCxcbiAgICBcIlwiLFxuICAgIGBUaGlzIGNvZGUgZXhwaXJlcyBpbiAke2V4cGlyZXNJbihvcHRzLmNvZGVUdGxTZWNvbmRzKX0uYCxcbiAgICBcIlwiLFxuICAgIElHTk9SRV9MSU5FLFxuICBdLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICogVGhlIGB0ZXh0L3BsYWluYCBwYXJ0LCBzdXBwbGllZCBFWFBMSUNJVExZIHJhdGhlciB0aGFuIHJlbmRlcmVkIGZyb20gdGhlIHRyZWVcbiAqIGFib3ZlLiBCb3RoIHBhcnRzIHNheSB0aGUgc2FtZSB0aGluZzsgb25seSB0aGUgbGluZSBsYXlvdXQgZGlmZmVycy5cbiAqXG4gKiBUaGUgcHJvbXB0IGFuZCB0aGUgY29kZSBzaGFyZSBPTkUgbGluZSAoXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOiAxMjM0NTZcIikuXG4gKiBUaGF0IHNpbmdsZS1saW5lIHNoYXBlIGlzIHdoYXQgaU9TLCBHbWFpbCwgT3V0bG9vaywgYW5kIEFuZHJvaWQgY29kZSBkZXRlY3Rpb25cbiAqIGtleXMgb24gbW9zdCByZWxpYWJseSAtIHRoZSBoZXVyaXN0aWNzIGxvb2sgZm9yIGEgY29kZSBpbiB0aGUgc2FtZSBzZW50ZW5jZSBhc1xuICogYSByZWNvZ25pemVkIHByb21wdCwgc28gc3BsaXR0aW5nIHRoZW0gYWNyb3NzIGxpbmVzIG1ha2VzIGRldGVjdGlvbiBkZXBlbmRlbnRcbiAqIG9uIHRoZSBjbGllbnQsIGFuZCBhbnkgYmxhbmsgbGluZSBiZXR3ZWVuIHRoZW0gZGVmZWF0cyBpdCBvdXRyaWdodC5cbiAqXG4gKiBUaGUgR0VORVJBVEVEIHRleHQgcGFydCBjYW5ub3QgaG9sZCB0aGF0IHNoYXBlIGF0IGFsbDogaXQgaXMgYSByZW5kZXJpbmcgb2YgdGhlXG4gKiBIVE1MLCBzbyBpdCBjYXJyaWVzIHRoZSBicmFuZCBoZWFkZXIvZm9vdGVyIGFuZCB0dXJucyB0aGUgY29kZSBoZWFkaW5nJ3MgQ1NTXG4gKiBtYXJnaW4gaW50byBibGFuayBsaW5lcywgYXJyaXZpbmcgYXMgYHByb21wdFxcblxcblxcbmNvZGVgLlxuICpcbiAqIFRoZSBjb2RlIGlzIHZpc2libGUgdGV4dCBpbiBCT1RIIHBhcnRzLCBuZXZlciBhbiBpbWFnZSwgc28gYSBjbGllbnQgc2NyYXBpbmdcbiAqIGVpdGhlciBvbmUgZmluZHMgaXQuIE5vIHRyYWlsZXIgbGluZSBmb2xsb3dzIHRoZSBjb3B5IC0gQXBwbGUncyBkb21haW4tYm91bmRcbiAqIGBAZG9tYWluICNjb2RlYCBmb290ZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCBlbWl0dGVkLCBzaW5jZSBpdCBjb25zdHJhaW5zIHRoZVxuICogY29kZSB0byBvbmUgb3JpZ2luIGFuZCBpcyBub3Qgd2hhdCB0aGUgYnJvYWRseS1jb21wYXRpYmxlIHNoYXBlIG5lZWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZUVtYWlsVGV4dEJvZHkoY29kZTogc3RyaW5nLCBvcHRzOiBDb2RlQ29weSk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgYCR7b3B0cy5tZXNzYWdlfSAke2NvZGV9YCxcbiAgICBgVGhpcyBjb2RlIGV4cGlyZXMgaW4gJHtleHBpcmVzSW4ob3B0cy5jb2RlVHRsU2Vjb25kcyl9LmAsXG4gICAgXCJcIixcbiAgICBJR05PUkVfTElORSxcbiAgXS5qb2luKFwiXFxuXCIpO1xufVxuXG5jb25zdCB7IGNyZWF0ZUFwcCB9ID0gY3JlYXRlQXBwTnM7XG5jb25zdCB7IHJlc29sdmVTeXN0ZW1TZW5kZXJBZGRyZXNzIH0gPSBzZW5kZXI7XG5jb25zdCB7IGdldEVtYWlsUnVudGltZSwgc2VuZEVtYWlsIH0gPSB0cmFuc3BvcnQ7XG5jb25zdCB7IGVtYWlsQnJhbmRGcm9tQ29udGV4dCB9ID0gZW1haWxCcmFuZDtcbmNvbnN0IHsgbG9hZEJyYW5kQ29udGV4dCB9ID0gbm9kZUJyYW5kO1xuXG4vKipcbiAqIEJvb3QgdGhlIGdhdGUgYXBwIGFuZCByZXR1cm4gdGhlIEFQSSB0aGUgcHJveHkgY2FsbHMuIFRocm93cyB3aGVuIGVtYWlsIGlzIG5vdFxuICogaW4gU01UUCBtb2RlIChubyB3YXkgdG8gZGVsaXZlciBhIGNvZGUpIHNvIGEgbWlzY29uZmlndXJlZCBnYXRlIGZhaWxzIGZhc3QgYXRcbiAqIHN0YXJ0dXAgcmF0aGVyIHRoYW4gc2lsZW50bHkgYWNjZXB0aW5nIG5vYm9keTsgdGhlIGNhbGxlciBtYXkgY2F0Y2ggdGhpcyBhbmRcbiAqIGZhbGwgYmFjayB0byBpbnNlY3VyZS9vcGVuIG1vZGUgd2hlbiB0aGUgb3BlcmF0b3Igb3B0ZWQgaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydEdhdGVBcHAoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFByb21pc2U8QXV0aEdhdGVBcGk+IHtcbiAgLy8gVGhlIGhvc3QgYXBwJ3Mgb3duIGJyYW5kIChgYnJhbmRpbmcvYnJhbmQueWFtbGAgZGlzY292ZXJlZCBmcm9tIGN3ZCkgb3IgdGhlXG4gIC8vIGRieC10b29scyBkZWZhdWx0LiBUaGlzIGlzIHRoZSBPTkUgYnJhbmQgc291cmNlIGZvciB0aGUgZ2F0ZTogaXQgc3R5bGVzIHRoZVxuICAvLyBjb2RlIGVtYWlsIChhY2NlbnQgYmFuZCwgZm9udCwgbG9nbykgdmlhIHRoZSBlbWFpbCBwbHVnaW4gQU5EIHN1cHBsaWVzIHRoZVxuICAvLyBkaXNwbGF5IG5hbWUgdGhlIGNvcHkgdXNlcywgc28gYSBkZXBsb3ltZW50IHRoYXQgdGhlbWVzIGl0cyBhcHAgdGhlbWVzIGl0c1xuICAvLyBzaWduLWluIGVtYWlsIHdpdGggaXQuIEFuIGV4cGxpY2l0IGBicmFuZE5hbWVgIHN0aWxsIHdpbnMgKHNlZSBiZWxvdykuXG4gIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBsb2FkQnJhbmRDb250ZXh0KCk7XG5cbiAgLy8gYHNlbmRDb2RlYCBkZWxpdmVycyB0aGUgT1RQIHRocm91Z2ggdGhlIGVtYWlsIHBsdWdpbidzIFNIQVJFRCB0cmFuc3BvcnQsIHdoaWNoXG4gIC8vIHRoZSBgZW1haWwoKWAgcGx1Z2luIHByaW1lcyBkdXJpbmcgaXRzIGBzZXR1cCgpYCAoYXdhaXRlZCBieSBgY3JlYXRlQXBwYFxuICAvLyBiZWxvdykuIFVzaW5nIHRoZSBtb2R1bGUtbGV2ZWwgYHNlbmRFbWFpbGAgYXZvaWRzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBvbiB0aGVcbiAgLy8gYXBwIGhhbmRsZSdzIGluZmVycmVkIHR5cGUuIFRoZSBgRnJvbWAgaXMgdGhlIFNZU1RFTSBzZW5kZXI6IGEgdmVyaWZpY2F0aW9uXG4gIC8vIGNvZGUgaXMgbWFjaGluZS1nZW5lcmF0ZWQgYW5kIHVuYW5zd2VyYWJsZSwgc28gaXQgbXVzdCBub3QgYXJyaXZlIGZyb20gYVxuICAvLyBwZXJzb24ncyBhZGRyZXNzIGludml0aW5nIGEgcmVwbHkuXG4gIGNvbnN0IHNlbmRDb2RlOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiA9IGFzeW5jICh0bywgY29kZSwgb3B0cykgPT4ge1xuICAgIGNvbnN0IGZyb20gPSByZXNvbHZlU3lzdGVtU2VuZGVyQWRkcmVzcyhnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcpO1xuICAgIGF3YWl0IHNlbmRFbWFpbChcbiAgICAgIHtcbiAgICAgICAgdG86IFt0b10sXG4gICAgICAgIHN1YmplY3Q6IG9wdHMuc3ViamVjdCxcbiAgICAgICAgYm9keTogY29kZUVtYWlsSHRtbEJvZHkoY29kZSwgb3B0cyksXG4gICAgICB9LFxuICAgICAgZnJvbSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgdGV4dDogY29kZUVtYWlsVGV4dEJvZHkoY29kZSwgb3B0cykgfSxcbiAgICApO1xuICB9O1xuXG4gIC8vIGBjcmVhdGVBcHBgIG5hbWVzcGFjZXMgZWFjaCBwbHVnaW4ncyBleHBvcnRzIG9uIHRoZSBoYW5kbGUgYnkgbWFuaWZlc3QgbmFtZTtcbiAgLy8gYGhhbmRsZS5hdXRoR2F0ZWAgaXMgdGhlIGluLXByb2Nlc3MgZ2F0ZSBBUEkgdGhlIHByb3h5IGRyaXZlcy5cbiAgY29uc3QgaGFuZGxlID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBCcmFuZCB0aGUgY29kZSBlbWFpbCBmcm9tIHRoZSByZXNvbHZlZCBjb250ZXh0LCB0aGUgc2FtZSBicmlkZ2UgZXZlcnlcbiAgICAgIC8vIG90aGVyIGRieC10b29scyBlbWFpbCBzdXJmYWNlIHVzZXMgKGFjY2VudCArIGZvbnQgaW5saW5lZCwgbG9nbyBvbmx5IHdoZW5cbiAgICAgIC8vIGl0IGlzIGEgZmV0Y2hhYmxlIFVSTCAtIGEgcGFja2FnZS1leHBvcnQgcGF0aCBjYW5ub3QgbG9hZCBpbiBhbiBpbmJveCkuXG4gICAgICBlbWFpbCh7IGJyYW5kOiBlbWFpbEJyYW5kRnJvbUNvbnRleHQoY29udGV4dCkgfSksXG4gICAgICAvLyBgYnJhbmROYW1lYCBmYWxscyBiYWNrIHRvIHRoZSByZXNvbHZlZCBjb250ZXh0J3MgZGlzcGxheSBuYW1lLCBzbyB0aGVcbiAgICAgIC8vIGVtYWlsIGNvcHkgbmFtZXMgdGhlIGFwcCByYXRoZXIgdGhhbiBhIGdlbmVyaWMgcGxhY2Vob2xkZXIuIFNwZWxsZWQgYXMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IGA/P2AgcmF0aGVyIHRoYW4gYSBrZXkgYmVmb3JlIGAuLi5jb25maWdgOiBjb21tYW5kZXIgc2V0c1xuICAgICAgLy8gYGJyYW5kTmFtZWAgb24gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZXRoZXIgb3Igbm90IHRoZSBmbGFnIHdhcyBwYXNzZWQsIHNvXG4gICAgICAvLyBzcHJlYWRpbmcgaXQgd291bGQgY2xvYmJlciB0aGUgY29udGV4dCBuYW1lIHdpdGggYHVuZGVmaW5lZGAuXG4gICAgICBhdXRoR2F0ZSh7IC4uLmNvbmZpZywgYnJhbmROYW1lOiBjb25maWcuYnJhbmROYW1lID8/IGNvbnRleHQubmFtZSwgc2VuZENvZGUgfSksXG4gICAgXSxcbiAgfSk7XG5cbiAgLy8gRmFpbCBmYXN0OiB0aGUgZ2F0ZSBuZWVkcyBTTVRQIHRvIGVtYWlsIGNvZGVzLiBgZ2V0RW1haWxSdW50aW1lKClgIHJlc29sdmVzIHRvXG4gIC8vIGBtb2RlOiBcImZpbGVcImAgKG91dGJveCkgb3IgdGhyb3dzIHdoZW4gbm8gU01UUCBjcmVkcyBhcmUgY29uZmlndXJlZCAtIG5laXRoZXJcbiAgLy8gY2FuIGRlbGl2ZXIgdG8gYSByZWFsIGluYm94LCBzbyByZWZ1c2UgdG8gYnJpbmcgdXAgYSBnYXRlIHRoYXQgbGV0cyBub2JvZHkgaW4uXG4gIGlmIChnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcubW9kZSAhPT0gXCJzbXRwXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVtYWlsIGlzIG5vdCBjb25maWd1cmVkIGZvciBTTVRQIGRlbGl2ZXJ5IC0gdGhlIE9UUCBnYXRlIGNhbm5vdCBzZW5kIGNvZGVzLiBcIiArXG4gICAgICAgIFwiU2V0IFNNVFBfSE9TVC9TTVRQX1VTRVIvU01UUF9QQVNTV09SRCwgb3IgcGFzcyAtLWluc2VjdXJlIC8gVFVOTkVMX0lOU0VDVVJFPXRydWUgdG8gcnVuIHRoZSB0dW5uZWwgb3Blbi5cIixcbiAgICApO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oXCJnYXRlIGFwcCByZWFkeSAobm8gc2VydmVyOyBwcm94eS1kcml2ZW4pXCIpO1xuICByZXR1cm4gaGFuZGxlLmF1dGhHYXRlIGFzIEF1dGhHYXRlQXBpO1xufVxuIl19
package/lib/src/cli.js CHANGED
@@ -102,9 +102,6 @@ export async function runCli(argv) {
102
102
  sessionTtlSeconds: opts.sessionTtl ? Number(opts.sessionTtl) : undefined,
103
103
  codeTtlSeconds: opts.codeTtl ? Number(opts.codeTtl) : undefined,
104
104
  sessionCutoff: opts.sessionCutoff,
105
- // Also given to portr below; the gate uses it only to bind the emailed code
106
- // to this host for Apple's AutoFill.
107
- publicDomain: opts.publicDomain,
108
105
  };
109
106
  // 1. Spawn the wrapped app with the PRIVATE port. It binds loopback; only the
110
107
  // proxy reaches it.
@@ -159,4 +156,4 @@ export async function runCli(argv) {
159
156
  // Any child exit (or a signal) tears the whole thing down.
160
157
  superviseExit(children);
161
158
  }
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyxxRkFBcUY7QUFDckYsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFnQkQsb0ZBQW9GO0FBQ3BGLFNBQVMsT0FBTztJQUNkLE9BQU8sSUFBSSxPQUFPLEVBQUU7U0FDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3hCLFdBQVcsQ0FBQywwREFBMEQsQ0FBQztTQUN2RSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsMkRBQTJELENBQUM7U0FDdkYsTUFBTSxDQUNMLG9CQUFvQixFQUNwQixtRkFBbUYsQ0FDcEY7U0FDQSxNQUFN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QUUsQ0FBQztRQUNoQixNQUFNLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsSUFBSSxDQUNULHNGQUFzRixDQUN2RixDQUFDO0lBQ0osQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGRieC10b29scy10dW5uZWxgIC8gYGRieHQtdHVubmVsYCBDTEkuXG4gKlxuICogV3JhcHMgYW4gYXBwJ3Mgc3RhcnQgY29tbWFuZCB3aXRoIGEgcHVibGljIHBvcnRyIHR1bm5lbCBhbmQgYW4gZW1haWwtT1RQXG4gKiBhY2Nlc3MgZ2F0ZS4gRXZlcnl0aGluZyBhZnRlciBgLS1gIGlzIHRoZSBSRUFMIGFwcCBzdGFydCBjb21tYW5kOlxuICpcbiAqICAgZGJ4dC10dW5uZWwgLS1zdWJqZWN0IFwiSGVyZSdzIHlvdXIgT1RQXCIgLS1hbGxvdyBleGFtcGxlLmNvbSAtLSBidW4gc3JjL3NlcnZlci50c1xuICpcbiAqIEJvb3Qgc2VxdWVuY2U6XG4gKiAgIDEuIFBpY2sgYSByYW5kb20gUFJJVkFURSBwb3J0IGFuZCBzcGF3biB0aGUgYXBwIGNvbW1hbmQgd2l0aFxuICogICAgICBgREFUQUJSSUNLU19BUFBfUE9SVGAgc2V0IHRvIGl0IChzbyB0aGUgYXBwIGJpbmRzIGxvb3BiYWNrLXByaXZhdGUpLiBUaGF0XG4gKiAgICAgIHZhcmlhYmxlIG5hbWUgaXMgdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0OyB0aGUgZ2F0ZSBpdHNlbGYgaXNcbiAqICAgICAgcGxhdGZvcm0tbmV1dHJhbCBhbmQgaG9ub3VycyB3aGF0ZXZlciBwb3J0IGl0IGZpbmRzIHRoZXJlLlxuICogICAyLiBCb290IHRoZSB0aW55IGdhdGUgQXBwS2l0IGFwcCAobm8gc2VydmVyKTogaW5pdHMgYENhY2hlTWFuYWdlcmAgKyB0aGVcbiAqICAgICAgZW1haWwgdHJhbnNwb3J0LCB5aWVsZHMgdGhlIGluLXByb2Nlc3MgZ2F0ZSBBUEkuXG4gKiAgIDMuIFN0YXJ0IHRoZSBnYXRlIFBST1hZIG9uIHRoZSBPUklHSU5BTCBwdWJsaWMgcG9ydCwgZm9yd2FyZGluZyB0byB0aGUgYXBwLlxuICogICA0LiBJbnN0YWxsICsgcnVuIHBvcnRyIHBvaW50ZWQgYXQgdGhlIHB1YmxpYyBwb3J0ICh3aGVuIGEgdHVubmVsIGlzXG4gKiAgICAgIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSB0aGUgcHJveHkgc3RpbGwgZ2F0ZXMgbm90aGluZyBhbmQgZm9yd2FyZHMpLlxuICpcbiAqIFN1cGVydmlzaW9uOiB0aGUgYXBwIGNoaWxkLCBwb3J0ciBjaGlsZCwgYW5kIHRoaXMgcHJvY2VzcyBhcmUgdGllZCB0b2dldGhlciAtXG4gKiBpZiBBTlkgZXhpdHMsIGV2ZXJ5dGhpbmcgY29tZXMgZG93biAoY29uY3VycmVudGx5LXN0eWxlIGBraWxsT3RoZXJzYCkuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gZmxhZ3MgT1IgZW52OyBzZWUgdGhlIG9wdGlvbiBkZWZpbml0aW9ucyBiZWxvdy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZW52LCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBzdGFydEdhdGVBcHAgfSBmcm9tIFwiLi9hcHAudHNcIjtcbmltcG9ydCB7IEZPUldBUkRfSEVBREVSU19FTlYsIElOU0VDVVJFX0VOViB9IGZyb20gXCIuL2Vudi50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoR2F0ZUNvbmZpZyB9IGZyb20gXCIuL3BsdWdpbi50c1wiO1xuaW1wb3J0IHsgaW5zdGFsbFBvcnRyLCByZXNvbHZlUG9ydHJDb25maWcsIHN0YXJ0UG9ydHIsIHdyaXRlUG9ydHJDb25maWcgfSBmcm9tIFwiLi9wb3J0ci50c1wiO1xuaW1wb3J0IHsgc3RhcnRQcm94eSB9IGZyb20gXCIuL3Byb3h5LnRzXCI7XG5cbmV4cG9ydCB7IENvbW1hbmRlckVycm9yIH07XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWxcIik7XG5cbi8qKiBBIHJhbmRvbSBlcGhlbWVyYWwgcG9ydCBmb3IgdGhlIGFwcCB0byBiaW5kICh0aGUgcHJveHkgZnJvbnRzIHRoZSBwdWJsaWMgb25lKS4gKi9cbmZ1bmN0aW9uIHJhbmRvbVBvcnQoKTogbnVtYmVyIHtcbiAgcmV0dXJuIDIwMDAwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjAwMDApO1xufVxuXG5pbnRlcmZhY2UgVHVubmVsT3B0cyB7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIGFsbG93Pzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBzZXNzaW9uVHRsPzogc3RyaW5nO1xuICBjb2RlVHRsPzogc3RyaW5nO1xuICBzZXNzaW9uQ3V0b2ZmPzogc3RyaW5nO1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nO1xufVxuXG4vKiogQnVpbGQgdGhlIGNvbW1hbmRlciBwcm9ncmFtLiBgLS1gIHNlcGFyYXRlcyBmbGFncyBmcm9tIHRoZSBhcHAgc3RhcnQgY29tbWFuZC4gKi9cbmZ1bmN0aW9uIHByb2dyYW0oKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkYngtdG9vbHMtdHVubmVsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRnJvbnQgYW4gYXBwIHdpdGggYSBwdWJsaWMgcG9ydHIgdHVubmVsICsgZW1haWwtT1RQIGdhdGVcIilcbiAgICAub3B0aW9uKFwiLS1zdWJqZWN0IDx0ZXh0PlwiLCBcIlN1YmplY3QgbGluZSBmb3IgdGhlIGNvZGUgZW1haWwgKGVudiBUVU5ORUxfQVVUSF9TVUJKRUNUKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tYWxsb3cgPHBhdHRlcm5zPlwiLFxuICAgICAgXCJDb21tYS9zcGFjZS1zZXBhcmF0ZWQgYWxsb3ctbGlzdDogZG9tYWluIC8gZ2xvYiAvIC9yZWdleC8gKGVudiBUVU5ORUxfQVVUSF9BTExPVylcIixcbiAgICApXG4gICAgLm9wdGlvbihcIi0tc3ViZG9tYWluIDxuYW1lPlwiLCBcInBvcnRyIHN1YmRvbWFpbiAoZWxzZSBkZXJpdmVkIGZyb20gVFVOTkVMX1BVQkxJQ19ET01BSU4pXCIpXG4gICAgLm9wdGlvbihcIi0tcHVibGljLWRvbWFpbiA8aG9zdD5cIiwgXCJwb3J0ciA8c3ViZG9tYWluPi48c2VydmVyPiAoZW52IFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tYnJhbmQtbmFtZSA8bmFtZT5cIixcbiAgICAgIFwiRGlzcGxheSBuYW1lIGluIHRoZSBjb2RlIGVtYWlsIGNvcHkgKGVudiBUVU5ORUxfQVVUSF9CUkFORF9OQU1FOyBkZWZhdWx0cyB0byB0aGUgYnJhbmQgY29udGV4dCBuYW1lKVwiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLS1tZXNzYWdlIDx0ZXh0PlwiLCBcIkxpbmUgc2hvd24gYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsIChlbnYgVFVOTkVMX0FVVEhfTUVTU0FHRSlcIilcbiAgICAub3B0aW9uKFwiLS1zZXNzaW9uLXR0bCA8c2Vjb25kcz5cIiwgXCJTZXNzaW9uIGxpZmV0aW1lIChlbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9UVEwpXCIpXG4gICAgLm9wdGlvbihcIi0tY29kZS10dGwgPHNlY29uZHM+XCIsIFwiT25lLXRpbWUtY29kZSBsaWZldGltZSAoZW52IFRVTk5FTF9BVVRIX0NPREVfVFRMKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tc2Vzc2lvbi1jdXRvZmYgPHdoZW4+XCIsXG4gICAgICBcIkludmFsaWRhdGUgc2Vzc2lvbnMgaXNzdWVkIGJlZm9yZSB0aGlzIHBvaW50LCBzaWduaW5nIGV2ZXJ5b25lIG91dDogYSBkYXRlLCBJU08gaW5zdGFudCwgZXBvY2ggc2Vjb25kcywgb3IgcmVsYXRpdmUgZHVyYXRpb24gbGlrZSAtMzBkIChlbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9DVVRPRkYpXCIsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tZm9yd2FyZC1oZWFkZXJzIDxwYXR0ZXJucz5cIixcbiAgICAgIFwiRXh0cmEgeC0gcmVxdWVzdCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkOiBsaXRlcmFsIC8gZ2xvYiAvIC9yZWdleC8gKGVudiBUVU5ORUxfRk9SV0FSRF9IRUFERVJTKVwiLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgXCItLWluc2VjdXJlXCIsXG4gICAgICBcIlJ1biB0aGUgdHVubmVsIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgVFVOTkVMX0lOU0VDVVJFPXRydWUpLiBPdGhlcndpc2UgdGhlIENMSSBmYWlscyBmYXN0IHdoZW4gZW1haWwgU01UUCBpcyBub3QgY29uZmlndXJlZC5cIixcbiAgICApXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKHRydWUpXG4gICAgLmhlbHBPcHRpb24oXCItaCwgLS1oZWxwXCIsIFwiU2hvdyBoZWxwXCIpO1xufVxuXG4vKiogVGllIGEgY2hpbGQncyBleGl0IHRvIGZ1bGwgdGVhcmRvd246IGFueSBleGl0IGJyaW5ncyB0aGUgd2hvbGUgdHVubmVsIGRvd24uICovXG5mdW5jdGlvbiBzdXBlcnZpc2VFeGl0KGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSk6IHZvaWQge1xuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGNvbnN0IHNodXRkb3duID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9XG4gICAgLy8gR2l2ZSBjaGlsZHJlbiBhIG1vbWVudCwgdGhlbiBleGl0IHdpdGggdGhlIGZpcnN0IG5vbi16ZXJvIGNvZGUgc2Vlbi5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdChjb2RlKSwgMzAwMCkudW5yZWYoKTtcbiAgfTtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oYGNoaWxkIGV4aXRlZCAoJHtjb2RlID8/IFwic2lnbmFsXCJ9KTsgYnJpbmdpbmcgdHVubmVsIGRvd25gKTtcbiAgICAgIHNodXRkb3duKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH1cbiAgZm9yIChjb25zdCBzaWcgb2YgW1wiU0lHVEVSTVwiLCBcIlNJR0lOVFwiLCBcIlNJR0hVUFwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnLCAoKSA9PiBzaHV0ZG93bigwKSk7XG4gIH1cbn1cblxuLyoqIFBhcnNlIGFyZ3YgYW5kIHJ1biB0aGUgdHVubmVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGxpdCBmbGFncyBmcm9tIHRoZSB3cmFwcGVkIGNvbW1hbmQgYXQgdGhlIGZpcnN0IGAtLWAuXG4gIGNvbnN0IHNlcCA9IGFyZ3YuaW5kZXhPZihcIi0tXCIpO1xuICBjb25zdCBmbGFncyA9IHNlcCA+PSAwID8gYXJndi5zbGljZSgwLCBzZXApIDogYXJndjtcbiAgY29uc3QgY29tbWFuZCA9IHNlcCA+PSAwID8gYXJndi5zbGljZShzZXAgKyAxKSA6IFtdO1xuXG4gIGNvbnN0IHByb2cgPSBwcm9ncmFtKCk7XG4gIHByb2cucGFyc2UoZmxhZ3MpO1xuICBjb25zdCBvcHRzID0gcHJvZy5vcHRzPFR1bm5lbE9wdHM+KCk7XG5cbiAgaWYgKGNvbW1hbmQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRlckVycm9yKDEsIFwidHVubmVsLm5vLWNvbW1hbmRcIiwgXCJubyBzdGFydCBjb21tYW5kIGdpdmVuIGFmdGVyIGAtLWBcIik7XG4gIH1cblxuICBjb25zdCBwdWJsaWNQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQgPz8gODAwMCk7XG4gIGNvbnN0IGFwcFBvcnQgPSByYW5kb21Qb3J0KCk7XG5cbiAgY29uc3QgZ2F0ZUNvbmZpZzogQXV0aEdhdGVDb25maWcgPSB7XG4gICAgYWxsb3c6IG9wdHMuYWxsb3csXG4gICAgc3ViamVjdDogb3B0cy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTogb3B0cy5icmFuZE5hbWUsXG4gICAgbWVzc2FnZTogb3B0cy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBvcHRzLnNlc3Npb25UdGwgPyBOdW1iZXIob3B0cy5zZXNzaW9uVHRsKSA6IHVuZGVmaW5lZCxcbiAgICBjb2RlVHRsU2Vjb25kczogb3B0cy5jb2RlVHRsID8gTnVtYmVyKG9wdHMuY29kZVR0bCkgOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbkN1dG9mZjogb3B0cy5zZXNzaW9uQ3V0b2ZmLFxuICAgIC8vIEFsc28gZ2l2ZW4gdG8gcG9ydHIgYmVsb3c7IHRoZSBnYXRlIHVzZXMgaXQgb25seSB0byBiaW5kIHRoZSBlbWFpbGVkIGNvZGVcbiAgICAvLyB0byB0aGlzIGhvc3QgZm9yIEFwcGxlJ3MgQXV0b0ZpbGwuXG4gICAgcHVibGljRG9tYWluOiBvcHRzLnB1YmxpY0RvbWFpbixcbiAgfTtcblxuICAvLyAxLiBTcGF3biB0aGUgd3JhcHBlZCBhcHAgd2l0aCB0aGUgUFJJVkFURSBwb3J0LiBJdCBiaW5kcyBsb29wYmFjazsgb25seSB0aGVcbiAgLy8gICAgcHJveHkgcmVhY2hlcyBpdC5cbiAgbG9nZ2VyLmluZm8oYHNwYXduaW5nIGFwcCBvbiBwcml2YXRlIHBvcnQgJHthcHBQb3J0fTogJHtjb21tYW5kLmpvaW4oXCIgXCIpfWApO1xuICBjb25zdCBbY21kLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gIGNvbnN0IGFwcCA9IHNwYXduKGNtZCEsIGFyZ3MsIHtcbiAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIERBVEFCUklDS1NfQVBQX1BPUlQ6IFN0cmluZyhhcHBQb3J0KSwgSE9TVDogXCIxMjcuMC4wLjFcIiB9LFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgLy8gMi4gQm9vdCB0aGUgZ2F0ZSBhcHAgKGNhY2hlICsgZW1haWwgdHJhbnNwb3J0ICsgZ2F0ZSBBUEkpLiBgc3RhcnRHYXRlQXBwYFxuICAvLyAgICBGQUlMUyBGQVNUIHdoZW4gZW1haWwgY2FuJ3Qgc2VuZCBjb2RlcyAobm8gU01UUCkuIEluc2VjdXJlIG1vZGVcbiAgLy8gICAgKGAtLWluc2VjdXJlYCAvIFRVTk5FTF9JTlNFQ1VSRSkgc2tpcHMgdGhlIGdhdGUgYW5kIHJ1bnMgdGhlIHR1bm5lbCBvcGVuLlxuICBjb25zdCBpbnNlY3VyZSA9IGVudi5ib29sZWFuKG9wdHMuaW5zZWN1cmUsIElOU0VDVVJFX0VOVikgPz8gZmFsc2U7XG4gIGxldCBnYXRlOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHN0YXJ0R2F0ZUFwcD4+IHwgdW5kZWZpbmVkO1xuICBpZiAoaW5zZWN1cmUpIHtcbiAgICBsb2dnZXIud2FybihcImluc2VjdXJlIG1vZGUgLSB0dW5uZWwgcnVucyBPUEVOIHdpdGggbm8gZW1haWwtT1RQIGdhdGVcIik7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGdhdGUgPSBhd2FpdCBzdGFydEdhdGVBcHAoZ2F0ZUNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZmFzdDogZG9uJ3Qgc2lsZW50bHkgZXhwb3NlIGFuIHVuZ2F0ZWQgdHVubmVsLiBUaGUgb3BlcmF0b3IgbXVzdCBmaXhcbiAgICAgIC8vIFNNVFAgb3IgZXhwbGljaXRseSBvcHQgaW50byBgLS1pbnNlY3VyZWAuXG4gICAgICBsb2dnZXIuZXJyb3IoXCJjYW5ub3Qgc3RhcnQgdGhlIE9UUCBnYXRlXCIsIHsgZXJyb3I6IChlcnJvciBhcyBFcnJvcikubWVzc2FnZSB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFN0YXJ0IHRoZSBnYXRlIHByb3h5IG9uIHRoZSBwdWJsaWMgcG9ydCAob3BlbiB3aGVuIGBnYXRlYCBpcyB1bmRlZmluZWQpLlxuICAvLyAgICBgZm9yd2FyZEhlYWRlcnNgIG9ubHkgQUREUyB0byB0aGUgYnVpbHQtaW4gYWxsb3ctbGlzdDsgc2VlIGAuL2hlYWRlcnMudHNgLlxuICBhd2FpdCBzdGFydFByb3h5KHtcbiAgICBwdWJsaWNQb3J0LFxuICAgIGFwcFBvcnQsXG4gICAgZ2F0ZSxcbiAgICBmb3J3YXJkSGVhZGVyczogZW52Lmxpc3Qob3B0cy5mb3J3YXJkSGVhZGVycywgRk9SV0FSRF9IRUFERVJTX0VOViksXG4gIH0pO1xuXG4gIC8vIDQuIEluc3RhbGwgKyBydW4gcG9ydHIgd2hlbiBhIHR1bm5lbCBpcyBjb25maWd1cmVkLlxuICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgcHVibGljRG9tYWluOiBvcHRzLnB1YmxpY0RvbWFpbixcbiAgICBzdWJkb21haW46IG9wdHMuc3ViZG9tYWluLFxuICAgIHBvcnQ6IHB1YmxpY1BvcnQsXG4gIH0pO1xuICBjb25zdCBjaGlsZHJlbjogQ2hpbGRQcm9jZXNzW10gPSBbYXBwXTtcbiAgaWYgKHBvcnRyQ29uZmlnKSB7XG4gICAgY29uc3QgcG9ydHJFbnYgPSBpbnN0YWxsUG9ydHIoKTtcbiAgICB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgY2hpbGRyZW4ucHVzaChzdGFydFBvcnRyKHBvcnRyQ29uZmlnLCBwb3J0ckVudikpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgXCJubyBQT1JUUl9UT0tFTi9UVU5ORUxfUFVCTElDX0RPTUFJTiAtIHNlcnZpbmcgdGhlIGdhdGUgcHJveHkgd2l0aG91dCBhIHB1YmxpYyB0dW5uZWxcIixcbiAgICApO1xuICB9XG5cbiAgLy8gQW55IGNoaWxkIGV4aXQgKG9yIGEgc2lnbmFsKSB0ZWFycyB0aGUgd2hvbGUgdGhpbmcgZG93bi5cbiAgc3VwZXJ2aXNlRXhpdChjaGlsZHJlbik7XG59XG4iXX0=
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyxxRkFBcUY7QUFDckYsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFnQkQsb0ZBQW9GO0FBQ3BGLFNBQVMsT0FBTztJQUNkLE9BQU8sSUFBSSxPQUFPLEVBQUU7U0FDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3hCLFdBQVcsQ0FBQywwREFBMEQsQ0FBQztTQUN2RSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsMkRBQTJELENBQUM7U0FDdkYsTUFBTSxDQUNMLG9CQUFvQixFQUNwQixtRkFBbUYsQ0FDcEY7U0FDQSxNQUFN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Q0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsSUFBSSxDQUNULHNGQUFzRixDQUN2RixDQUFDO0lBQ0osQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGRieC10b29scy10dW5uZWxgIC8gYGRieHQtdHVubmVsYCBDTEkuXG4gKlxuICogV3JhcHMgYW4gYXBwJ3Mgc3RhcnQgY29tbWFuZCB3aXRoIGEgcHVibGljIHBvcnRyIHR1bm5lbCBhbmQgYW4gZW1haWwtT1RQXG4gKiBhY2Nlc3MgZ2F0ZS4gRXZlcnl0aGluZyBhZnRlciBgLS1gIGlzIHRoZSBSRUFMIGFwcCBzdGFydCBjb21tYW5kOlxuICpcbiAqICAgZGJ4dC10dW5uZWwgLS1zdWJqZWN0IFwiSGVyZSdzIHlvdXIgT1RQXCIgLS1hbGxvdyBleGFtcGxlLmNvbSAtLSBidW4gc3JjL3NlcnZlci50c1xuICpcbiAqIEJvb3Qgc2VxdWVuY2U6XG4gKiAgIDEuIFBpY2sgYSByYW5kb20gUFJJVkFURSBwb3J0IGFuZCBzcGF3biB0aGUgYXBwIGNvbW1hbmQgd2l0aFxuICogICAgICBgREFUQUJSSUNLU19BUFBfUE9SVGAgc2V0IHRvIGl0IChzbyB0aGUgYXBwIGJpbmRzIGxvb3BiYWNrLXByaXZhdGUpLiBUaGF0XG4gKiAgICAgIHZhcmlhYmxlIG5hbWUgaXMgdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0OyB0aGUgZ2F0ZSBpdHNlbGYgaXNcbiAqICAgICAgcGxhdGZvcm0tbmV1dHJhbCBhbmQgaG9ub3VycyB3aGF0ZXZlciBwb3J0IGl0IGZpbmRzIHRoZXJlLlxuICogICAyLiBCb290IHRoZSB0aW55IGdhdGUgQXBwS2l0IGFwcCAobm8gc2VydmVyKTogaW5pdHMgYENhY2hlTWFuYWdlcmAgKyB0aGVcbiAqICAgICAgZW1haWwgdHJhbnNwb3J0LCB5aWVsZHMgdGhlIGluLXByb2Nlc3MgZ2F0ZSBBUEkuXG4gKiAgIDMuIFN0YXJ0IHRoZSBnYXRlIFBST1hZIG9uIHRoZSBPUklHSU5BTCBwdWJsaWMgcG9ydCwgZm9yd2FyZGluZyB0byB0aGUgYXBwLlxuICogICA0LiBJbnN0YWxsICsgcnVuIHBvcnRyIHBvaW50ZWQgYXQgdGhlIHB1YmxpYyBwb3J0ICh3aGVuIGEgdHVubmVsIGlzXG4gKiAgICAgIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSB0aGUgcHJveHkgc3RpbGwgZ2F0ZXMgbm90aGluZyBhbmQgZm9yd2FyZHMpLlxuICpcbiAqIFN1cGVydmlzaW9uOiB0aGUgYXBwIGNoaWxkLCBwb3J0ciBjaGlsZCwgYW5kIHRoaXMgcHJvY2VzcyBhcmUgdGllZCB0b2dldGhlciAtXG4gKiBpZiBBTlkgZXhpdHMsIGV2ZXJ5dGhpbmcgY29tZXMgZG93biAoY29uY3VycmVudGx5LXN0eWxlIGBraWxsT3RoZXJzYCkuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gZmxhZ3MgT1IgZW52OyBzZWUgdGhlIG9wdGlvbiBkZWZpbml0aW9ucyBiZWxvdy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZW52LCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBzdGFydEdhdGVBcHAgfSBmcm9tIFwiLi9hcHAudHNcIjtcbmltcG9ydCB7IEZPUldBUkRfSEVBREVSU19FTlYsIElOU0VDVVJFX0VOViB9IGZyb20gXCIuL2Vudi50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoR2F0ZUNvbmZpZyB9IGZyb20gXCIuL3BsdWdpbi50c1wiO1xuaW1wb3J0IHsgaW5zdGFsbFBvcnRyLCByZXNvbHZlUG9ydHJDb25maWcsIHN0YXJ0UG9ydHIsIHdyaXRlUG9ydHJDb25maWcgfSBmcm9tIFwiLi9wb3J0ci50c1wiO1xuaW1wb3J0IHsgc3RhcnRQcm94eSB9IGZyb20gXCIuL3Byb3h5LnRzXCI7XG5cbmV4cG9ydCB7IENvbW1hbmRlckVycm9yIH07XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWxcIik7XG5cbi8qKiBBIHJhbmRvbSBlcGhlbWVyYWwgcG9ydCBmb3IgdGhlIGFwcCB0byBiaW5kICh0aGUgcHJveHkgZnJvbnRzIHRoZSBwdWJsaWMgb25lKS4gKi9cbmZ1bmN0aW9uIHJhbmRvbVBvcnQoKTogbnVtYmVyIHtcbiAgcmV0dXJuIDIwMDAwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjAwMDApO1xufVxuXG5pbnRlcmZhY2UgVHVubmVsT3B0cyB7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIGFsbG93Pzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBzZXNzaW9uVHRsPzogc3RyaW5nO1xuICBjb2RlVHRsPzogc3RyaW5nO1xuICBzZXNzaW9uQ3V0b2ZmPzogc3RyaW5nO1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nO1xufVxuXG4vKiogQnVpbGQgdGhlIGNvbW1hbmRlciBwcm9ncmFtLiBgLS1gIHNlcGFyYXRlcyBmbGFncyBmcm9tIHRoZSBhcHAgc3RhcnQgY29tbWFuZC4gKi9cbmZ1bmN0aW9uIHByb2dyYW0oKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkYngtdG9vbHMtdHVubmVsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRnJvbnQgYW4gYXBwIHdpdGggYSBwdWJsaWMgcG9ydHIgdHVubmVsICsgZW1haWwtT1RQIGdhdGVcIilcbiAgICAub3B0aW9uKFwiLS1zdWJqZWN0IDx0ZXh0PlwiLCBcIlN1YmplY3QgbGluZSBmb3IgdGhlIGNvZGUgZW1haWwgKGVudiBUVU5ORUxfQVVUSF9TVUJKRUNUKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tYWxsb3cgPHBhdHRlcm5zPlwiLFxuICAgICAgXCJDb21tYS9zcGFjZS1zZXBhcmF0ZWQgYWxsb3ctbGlzdDogZG9tYWluIC8gZ2xvYiAvIC9yZWdleC8gKGVudiBUVU5ORUxfQVVUSF9BTExPVylcIixcbiAgICApXG4gICAgLm9wdGlvbihcIi0tc3ViZG9tYWluIDxuYW1lPlwiLCBcInBvcnRyIHN1YmRvbWFpbiAoZWxzZSBkZXJpdmVkIGZyb20gVFVOTkVMX1BVQkxJQ19ET01BSU4pXCIpXG4gICAgLm9wdGlvbihcIi0tcHVibGljLWRvbWFpbiA8aG9zdD5cIiwgXCJwb3J0ciA8c3ViZG9tYWluPi48c2VydmVyPiAoZW52IFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tYnJhbmQtbmFtZSA8bmFtZT5cIixcbiAgICAgIFwiRGlzcGxheSBuYW1lIGluIHRoZSBjb2RlIGVtYWlsIGNvcHkgKGVudiBUVU5ORUxfQVVUSF9CUkFORF9OQU1FOyBkZWZhdWx0cyB0byB0aGUgYnJhbmQgY29udGV4dCBuYW1lKVwiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLS1tZXNzYWdlIDx0ZXh0PlwiLCBcIkxpbmUgc2hvd24gYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsIChlbnYgVFVOTkVMX0FVVEhfTUVTU0FHRSlcIilcbiAgICAub3B0aW9uKFwiLS1zZXNzaW9uLXR0bCA8c2Vjb25kcz5cIiwgXCJTZXNzaW9uIGxpZmV0aW1lIChlbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9UVEwpXCIpXG4gICAgLm9wdGlvbihcIi0tY29kZS10dGwgPHNlY29uZHM+XCIsIFwiT25lLXRpbWUtY29kZSBsaWZldGltZSAoZW52IFRVTk5FTF9BVVRIX0NPREVfVFRMKVwiKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tc2Vzc2lvbi1jdXRvZmYgPHdoZW4+XCIsXG4gICAgICBcIkludmFsaWRhdGUgc2Vzc2lvbnMgaXNzdWVkIGJlZm9yZSB0aGlzIHBvaW50LCBzaWduaW5nIGV2ZXJ5b25lIG91dDogYSBkYXRlLCBJU08gaW5zdGFudCwgZXBvY2ggc2Vjb25kcywgb3IgcmVsYXRpdmUgZHVyYXRpb24gbGlrZSAtMzBkIChlbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9DVVRPRkYpXCIsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi0tZm9yd2FyZC1oZWFkZXJzIDxwYXR0ZXJucz5cIixcbiAgICAgIFwiRXh0cmEgeC0gcmVxdWVzdCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkOiBsaXRlcmFsIC8gZ2xvYiAvIC9yZWdleC8gKGVudiBUVU5ORUxfRk9SV0FSRF9IRUFERVJTKVwiLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgXCItLWluc2VjdXJlXCIsXG4gICAgICBcIlJ1biB0aGUgdHVubmVsIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgVFVOTkVMX0lOU0VDVVJFPXRydWUpLiBPdGhlcndpc2UgdGhlIENMSSBmYWlscyBmYXN0IHdoZW4gZW1haWwgU01UUCBpcyBub3QgY29uZmlndXJlZC5cIixcbiAgICApXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKHRydWUpXG4gICAgLmhlbHBPcHRpb24oXCItaCwgLS1oZWxwXCIsIFwiU2hvdyBoZWxwXCIpO1xufVxuXG4vKiogVGllIGEgY2hpbGQncyBleGl0IHRvIGZ1bGwgdGVhcmRvd246IGFueSBleGl0IGJyaW5ncyB0aGUgd2hvbGUgdHVubmVsIGRvd24uICovXG5mdW5jdGlvbiBzdXBlcnZpc2VFeGl0KGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSk6IHZvaWQge1xuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGNvbnN0IHNodXRkb3duID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9XG4gICAgLy8gR2l2ZSBjaGlsZHJlbiBhIG1vbWVudCwgdGhlbiBleGl0IHdpdGggdGhlIGZpcnN0IG5vbi16ZXJvIGNvZGUgc2Vlbi5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdChjb2RlKSwgMzAwMCkudW5yZWYoKTtcbiAgfTtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oYGNoaWxkIGV4aXRlZCAoJHtjb2RlID8/IFwic2lnbmFsXCJ9KTsgYnJpbmdpbmcgdHVubmVsIGRvd25gKTtcbiAgICAgIHNodXRkb3duKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH1cbiAgZm9yIChjb25zdCBzaWcgb2YgW1wiU0lHVEVSTVwiLCBcIlNJR0lOVFwiLCBcIlNJR0hVUFwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnLCAoKSA9PiBzaHV0ZG93bigwKSk7XG4gIH1cbn1cblxuLyoqIFBhcnNlIGFyZ3YgYW5kIHJ1biB0aGUgdHVubmVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGxpdCBmbGFncyBmcm9tIHRoZSB3cmFwcGVkIGNvbW1hbmQgYXQgdGhlIGZpcnN0IGAtLWAuXG4gIGNvbnN0IHNlcCA9IGFyZ3YuaW5kZXhPZihcIi0tXCIpO1xuICBjb25zdCBmbGFncyA9IHNlcCA+PSAwID8gYXJndi5zbGljZSgwLCBzZXApIDogYXJndjtcbiAgY29uc3QgY29tbWFuZCA9IHNlcCA+PSAwID8gYXJndi5zbGljZShzZXAgKyAxKSA6IFtdO1xuXG4gIGNvbnN0IHByb2cgPSBwcm9ncmFtKCk7XG4gIHByb2cucGFyc2UoZmxhZ3MpO1xuICBjb25zdCBvcHRzID0gcHJvZy5vcHRzPFR1bm5lbE9wdHM+KCk7XG5cbiAgaWYgKGNvbW1hbmQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRlckVycm9yKDEsIFwidHVubmVsLm5vLWNvbW1hbmRcIiwgXCJubyBzdGFydCBjb21tYW5kIGdpdmVuIGFmdGVyIGAtLWBcIik7XG4gIH1cblxuICBjb25zdCBwdWJsaWNQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQgPz8gODAwMCk7XG4gIGNvbnN0IGFwcFBvcnQgPSByYW5kb21Qb3J0KCk7XG5cbiAgY29uc3QgZ2F0ZUNvbmZpZzogQXV0aEdhdGVDb25maWcgPSB7XG4gICAgYWxsb3c6IG9wdHMuYWxsb3csXG4gICAgc3ViamVjdDogb3B0cy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTogb3B0cy5icmFuZE5hbWUsXG4gICAgbWVzc2FnZTogb3B0cy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBvcHRzLnNlc3Npb25UdGwgPyBOdW1iZXIob3B0cy5zZXNzaW9uVHRsKSA6IHVuZGVmaW5lZCxcbiAgICBjb2RlVHRsU2Vjb25kczogb3B0cy5jb2RlVHRsID8gTnVtYmVyKG9wdHMuY29kZVR0bCkgOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbkN1dG9mZjogb3B0cy5zZXNzaW9uQ3V0b2ZmLFxuICB9O1xuXG4gIC8vIDEuIFNwYXduIHRoZSB3cmFwcGVkIGFwcCB3aXRoIHRoZSBQUklWQVRFIHBvcnQuIEl0IGJpbmRzIGxvb3BiYWNrOyBvbmx5IHRoZVxuICAvLyAgICBwcm94eSByZWFjaGVzIGl0LlxuICBsb2dnZXIuaW5mbyhgc3Bhd25pbmcgYXBwIG9uIHByaXZhdGUgcG9ydCAke2FwcFBvcnR9OiAke2NvbW1hbmQuam9pbihcIiBcIil9YCk7XG4gIGNvbnN0IFtjbWQsIC4uLmFyZ3NdID0gY29tbWFuZDtcbiAgY29uc3QgYXBwID0gc3Bhd24oY21kISwgYXJncywge1xuICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgREFUQUJSSUNLU19BUFBfUE9SVDogU3RyaW5nKGFwcFBvcnQpLCBIT1NUOiBcIjEyNy4wLjAuMVwiIH0sXG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICB9KTtcblxuICAvLyAyLiBCb290IHRoZSBnYXRlIGFwcCAoY2FjaGUgKyBlbWFpbCB0cmFuc3BvcnQgKyBnYXRlIEFQSSkuIGBzdGFydEdhdGVBcHBgXG4gIC8vICAgIEZBSUxTIEZBU1Qgd2hlbiBlbWFpbCBjYW4ndCBzZW5kIGNvZGVzIChubyBTTVRQKS4gSW5zZWN1cmUgbW9kZVxuICAvLyAgICAoYC0taW5zZWN1cmVgIC8gVFVOTkVMX0lOU0VDVVJFKSBza2lwcyB0aGUgZ2F0ZSBhbmQgcnVucyB0aGUgdHVubmVsIG9wZW4uXG4gIGNvbnN0IGluc2VjdXJlID0gZW52LmJvb2xlYW4ob3B0cy5pbnNlY3VyZSwgSU5TRUNVUkVfRU5WKSA/PyBmYWxzZTtcbiAgbGV0IGdhdGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygc3RhcnRHYXRlQXBwPj4gfCB1bmRlZmluZWQ7XG4gIGlmIChpbnNlY3VyZSkge1xuICAgIGxvZ2dlci53YXJuKFwiaW5zZWN1cmUgbW9kZSAtIHR1bm5lbCBydW5zIE9QRU4gd2l0aCBubyBlbWFpbC1PVFAgZ2F0ZVwiKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgZ2F0ZSA9IGF3YWl0IHN0YXJ0R2F0ZUFwcChnYXRlQ29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBmYXN0OiBkb24ndCBzaWxlbnRseSBleHBvc2UgYW4gdW5nYXRlZCB0dW5uZWwuIFRoZSBvcGVyYXRvciBtdXN0IGZpeFxuICAgICAgLy8gU01UUCBvciBleHBsaWNpdGx5IG9wdCBpbnRvIGAtLWluc2VjdXJlYC5cbiAgICAgIGxvZ2dlci5lcnJvcihcImNhbm5vdCBzdGFydCB0aGUgT1RQIGdhdGVcIiwgeyBlcnJvcjogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gU3RhcnQgdGhlIGdhdGUgcHJveHkgb24gdGhlIHB1YmxpYyBwb3J0IChvcGVuIHdoZW4gYGdhdGVgIGlzIHVuZGVmaW5lZCkuXG4gIC8vICAgIGBmb3J3YXJkSGVhZGVyc2Agb25seSBBRERTIHRvIHRoZSBidWlsdC1pbiBhbGxvdy1saXN0OyBzZWUgYC4vaGVhZGVycy50c2AuXG4gIGF3YWl0IHN0YXJ0UHJveHkoe1xuICAgIHB1YmxpY1BvcnQsXG4gICAgYXBwUG9ydCxcbiAgICBnYXRlLFxuICAgIGZvcndhcmRIZWFkZXJzOiBlbnYubGlzdChvcHRzLmZvcndhcmRIZWFkZXJzLCBGT1JXQVJEX0hFQURFUlNfRU5WKSxcbiAgfSk7XG5cbiAgLy8gNC4gSW5zdGFsbCArIHJ1biBwb3J0ciB3aGVuIGEgdHVubmVsIGlzIGNvbmZpZ3VyZWQuXG4gIGNvbnN0IHBvcnRyQ29uZmlnID0gcmVzb2x2ZVBvcnRyQ29uZmlnKHtcbiAgICBwdWJsaWNEb21haW46IG9wdHMucHVibGljRG9tYWluLFxuICAgIHN1YmRvbWFpbjogb3B0cy5zdWJkb21haW4sXG4gICAgcG9ydDogcHVibGljUG9ydCxcbiAgfSk7XG4gIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFthcHBdO1xuICBpZiAocG9ydHJDb25maWcpIHtcbiAgICBjb25zdCBwb3J0ckVudiA9IGluc3RhbGxQb3J0cigpO1xuICAgIHdyaXRlUG9ydHJDb25maWcocG9ydHJDb25maWcsIHBvcnRyRW52KTtcbiAgICBjaGlsZHJlbi5wdXNoKHN0YXJ0UG9ydHIocG9ydHJDb25maWcsIHBvcnRyRW52KSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBcIm5vIFBPUlRSX1RPS0VOL1RVTk5FTF9QVUJMSUNfRE9NQUlOIC0gc2VydmluZyB0aGUgZ2F0ZSBwcm94eSB3aXRob3V0IGEgcHVibGljIHR1bm5lbFwiLFxuICAgICk7XG4gIH1cblxuICAvLyBBbnkgY2hpbGQgZXhpdCAob3IgYSBzaWduYWwpIHRlYXJzIHRoZSB3aG9sZSB0aGluZyBkb3duLlxuICBzdXBlcnZpc2VFeGl0KGNoaWxkcmVuKTtcbn1cbiJdfQ==
@@ -67,15 +67,6 @@ export interface AuthGateConfig extends BasePluginConfig {
67
67
  * means no cutoff.
68
68
  */
69
69
  sessionCutoff?: string | number | Date;
70
- /**
71
- * The public host the gate is served on. Env TUNNEL_PUBLIC_DOMAIN.
72
- *
73
- * Only used to bind the emailed code to this site for Apple's domain-bound
74
- * AutoFill (see {@link SendCodeOptions.publicDomain}); the gate does not route
75
- * on it. Absent, the code email simply omits that trailer and still relies on
76
- * the conventional layout every client detects heuristically.
77
- */
78
- publicDomain?: string;
79
70
  /** Deliver a code to an address. Wired by the app to the email plugin. */
80
71
  sendCode?: (email: string, code: string, opts: SendCodeOptions) => Promise<void>;
81
72
  }
@@ -91,16 +82,6 @@ export interface SendCodeOptions {
91
82
  * that drifts from the configured TTL.
92
83
  */
93
84
  codeTtlSeconds: number;
94
- /**
95
- * The public host the gate is served on, when one is configured.
96
- *
97
- * `sendCode` turns this into Apple's `@<domain> #<code>` trailer, which binds
98
- * the code to THIS site: iOS then offers it only for a matching domain, so a
99
- * code phished from elsewhere is not autofilled here. Undefined simply omits
100
- * the trailer - every client still detects the code from the conventional
101
- * layout.
102
- */
103
- publicDomain?: string;
104
85
  }
105
86
  /** Resolved gate config with env fallbacks + defaults applied. */
106
87
  export interface ResolvedAuthGateConfig {
@@ -113,8 +94,6 @@ export interface ResolvedAuthGateConfig {
113
94
  maxAttempts: number;
114
95
  /** Force-clear cutoff in epoch ms; `0` when unset. */
115
96
  sessionCutoffMs: number;
116
- /** Public host for the AutoFill trailer, when configured. */
117
- publicDomain?: string;
118
97
  }
119
98
  /** Merge {@link AuthGateConfig} over env over defaults into a resolved config. */
120
99
  export declare function resolveAuthGateConfig(config: AuthGateConfig): ResolvedAuthGateConfig;
package/lib/src/plugin.js CHANGED
@@ -18,7 +18,7 @@
18
18
  import { Plugin, toPlugin } from "@databricks/appkit";
19
19
  import { brand, env, log, object, string } from "@dbx-tools/shared-core";
20
20
  import { looksLikeEmail, matchesAllowlist } from "./allowlist.js";
21
- import { ALLOW_ENV, BRAND_NAME_ENV, CODE_TTL_ENV, MESSAGE_ENV, PUBLIC_DOMAIN_ENV, SESSION_TTL_ENV, SUBJECT_ENV, } from "./env.js";
21
+ import { ALLOW_ENV, BRAND_NAME_ENV, CODE_TTL_ENV, MESSAGE_ENV, SESSION_TTL_ENV, SUBJECT_ENV, } from "./env.js";
22
22
  import { CodeStore, signSession, verifySession } from "./otp.js";
23
23
  import { RateLimiter } from "./rate-limit.js";
24
24
  import { KEY_TTL_SECONDS, resolveSessionCutoff, signingKey } from "./signing-key.js";
@@ -53,7 +53,6 @@ export function resolveAuthGateConfig(config) {
53
53
  codeTtlSeconds: env.positiveInt(config.codeTtlSeconds, CODE_TTL_ENV, DEFAULTS.codeTtlSeconds),
54
54
  maxAttempts: config.maxAttempts ?? DEFAULTS.maxAttempts,
55
55
  sessionCutoffMs: resolveSessionCutoff(config.sessionCutoff),
56
- ...object.optional("publicDomain", env.string(config.publicDomain, PUBLIC_DOMAIN_ENV)),
57
56
  };
58
57
  }
59
58
  /** AppKit plugin owning the email-OTP gate's logic (no HTTP routes; proxy-driven). */
@@ -112,7 +111,6 @@ export class AuthGatePlugin extends Plugin {
112
111
  brandName: this.resolved.brandName,
113
112
  message: this.resolved.message,
114
113
  codeTtlSeconds: this.resolved.codeTtlSeconds,
115
- ...object.optional("publicDomain", this.resolved.publicDomain),
116
114
  });
117
115
  }
118
116
  catch (error) {
@@ -137,4 +135,4 @@ export class AuthGatePlugin extends Plugin {
137
135
  }
138
136
  /** Factory: `authGate({ allow, subject, ... })` for an AppKit `plugins` array. */
139
137
  export const authGate = toPlugin(AuthGatePlugin);
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUNkLFlBQVksRUFDWixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixXQUFXLEdBQ1osTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUF3R3pDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsT0FBTyxFQUFFLHdCQUF3QjtJQUNqQyw4RUFBOEU7SUFDOUUsK0VBQStFO0lBQy9FLGtFQUFrRTtJQUNsRSxpRUFBaUU7SUFDakUsZ0ZBQWdGO0lBQ2hGLDhDQUE4QztJQUM5QyxTQUFTLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUk7SUFDekMsT0FBTyxFQUFFLDRCQUE0QjtJQUNyQyx1RUFBdUU7SUFDdkUsaUJBQWlCLEVBQUUsZUFBZTtJQUNsQyxjQUFjLEVBQUUsR0FBRztJQUNu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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBhdXRoR2F0ZSgpYCAtIHRoZSBBcHBLaXQgcGx1Z2luIGJlaGluZCB0aGUgdHVubmVsJ3MgZW1haWwtT1RQIGdhdGUuXG4gKlxuICogSXQgaGFzIE5PIHJvdXRlcyBvZiBpdHMgb3duOiB0aGUgdHVubmVsIFBST1hZIChub3QgYW4gSFRUUCBzZXJ2ZXIpIGNhbGxzIHRoZVxuICogaGFuZGxlcnMgdGhpcyBwbHVnaW4gZXhwb3NlcyB2aWEge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9LiBUaGUgcGx1Z2luXG4gKiBvd25zIHRoZSBhbGxvdy1saXN0LCB0aGUgcGVyLWVtYWlsL3Blci1JUCByYXRlIGxpbWl0ZXJzLCB0aGUgQ2FjaGVNYW5hZ2VyLWJhY2tlZFxuICogb25lLXRpbWUtY29kZSBzdG9yZSwgYW5kIHRoZSBzZXNzaW9uIEpXVC4gYGNyZWF0ZUFwcGAgKHdpdGggbm8gYHNlcnZlcigpYCkgaXNcbiAqIHVzZWQgb25seSB0byBhdXRvLWluaXQgYENhY2hlTWFuYWdlcmAgKyBwcmltZSB0aGUgc2libGluZyBgZW1haWxgIHRyYW5zcG9ydDtcbiAqIHRoaXMgcGx1Z2luIGlzIHdoZXJlIHRoZSBnYXRlIGxvZ2ljIGxpdmVzLlxuICpcbiAqIE9wdGlvbnMgY29tZSBmcm9tIENMSSBmbGFncyBPUiBlbnYsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMgLSBzZWVcbiAqIHtAbGluayByZXNvbHZlQXV0aEdhdGVDb25maWd9LiBUaGUgb25lIHJ1bnRpbWUgZGVwZW5kZW5jeSB0aGUgcGx1Z2luIGNhbid0XG4gKiByZXNvbHZlIGl0c2VsZiBpcyBIT1cgdG8gZW1haWwgdGhlIGNvZGUsIHNvIGl0IHRha2VzIGEgYHNlbmRDb2RlYCBjYWxsYmFjayB0aGVcbiAqIGFwcCB3aXJlcyB0byB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBQbHVnaW4sIHRvUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBicmFuZCwgZW52LCBsb2csIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHsgbG9va3NMaWtlRW1haWwsIG1hdGNoZXNBbGxvd2xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcbmltcG9ydCB7XG4gIEFMTE9XX0VOVixcbiAgQlJBTkRfTkFNRV9FTlYsXG4gIENPREVfVFRMX0VOVixcbiAgTUVTU0FHRV9FTlYsXG4gIFBVQkxJQ19ET01BSU5fRU5WLFxuICBTRVNTSU9OX1RUTF9FTlYsXG4gIFNVQkpFQ1RfRU5WLFxufSBmcm9tIFwiLi9lbnYudHNcIjtcbmltcG9ydCB7IENvZGVTdG9yZSwgc2lnblNlc3Npb24sIHZlcmlmeVNlc3Npb24gfSBmcm9tIFwiLi9vdHAudHNcIjtcbmltcG9ydCB7IFJhdGVMaW1pdGVyIH0gZnJvbSBcIi4vcmF0ZS1saW1pdC50c1wiO1xuaW1wb3J0IHsgS0VZX1RUTF9TRUNPTkRTLCByZXNvbHZlU2Vzc2lvbkN1dG9mZiwgc2lnbmluZ0tleSB9IGZyb20gXCIuL3NpZ25pbmcta2V5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6YXV0aFwiKTtcblxuLyoqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgYXV0aEdhdGV9IHBsdWdpbiAoYWxsIHJlc29sdmFibGUgZnJvbSBlbnYgLSBzZWUgYmVsb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogQWxsb3ctbGlzdCBwYXR0ZXJucyAoZG9tYWluIC8gZ2xvYiAvIGAvcmVnZXgvYCkuIEVtcHR5ID0gYWxsb3cgbm9ib2R5LiBFbnYgVFVOTkVMX0FVVEhfQUxMT1cuICovXG4gIGFsbG93Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBTdWJqZWN0IGxpbmUgZm9yIHRoZSBjb2RlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfU1VCSkVDVC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIuIFRoZSB3b3JkaW5nIG9mIHRoZSBzdWJqZWN0IGFuZFxuICAgKiB7QGxpbmsgbWVzc2FnZX0gaXMgZGVsaWJlcmF0ZWx5IHRoZSBjb252ZW50aW9uYWwgcGhyYXNpbmcgcmF0aGVyIHRoYW5cbiAgICogYW55dGhpbmcgYnJhbmRlZDogaU9TLCBHbWFpbCwgT3V0bG9vaywgYW5kIEFuZHJvaWQgYWxsIGRldGVjdCBhIG9uZS10aW1lXG4gICAqIGNvZGUgZnJvbSB0aGlzIHNoYXBlIGFuZCBvZmZlciB0byBhdXRvZmlsbCBpdCwgYW5kIGEgbm92ZWwgcGhyYXNpbmcgaXMgd2hhdFxuICAgKiBicmVha3MgdGhhdCBkZXRlY3Rpb24uXG4gICAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGlzcGxheSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgZW1haWwgY29weS4gRW52IFRVTk5FTF9BVVRIX0JSQU5EX05BTUUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicmFuZCBjb250ZXh0J3MgYG5hbWVgIC0gdGhlIGFwcCdzIG93biBgYnJhbmRpbmcvYnJhbmQueWFtbGBcbiAgICogd2hlbiBpdCBoYXMgb25lLCBlbHNlIHRoZSBkYngtdG9vbHMgZGVmYXVsdC4gU2V0IHRoaXMgb25seSB0byBvdmVycmlkZSB0aGVcbiAgICogYnJhbmQgZm9yIHRoaXMgZ2F0ZS5cbiAgICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIExpbmUgc2hvd24gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfTUVTU0FHRS5cbiAgICpcbiAgICogS2VlcCB0aGUgY29kZSBvbiBpdHMgT1dOIGxpbmUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyB0ZXh0IC0gdGhhdCBhZGphY2VuY3kgaXNcbiAgICogd2hhdCB0aGUgcGxhdGZvcm0gY29kZS1kZXRlY3Rpb24gaGV1cmlzdGljcyBrZXkgb24uXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2Vzc2lvbiBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX1RUTC4gRGVmYXVsdCAyNTkyMDAwICgzMGQpLlxuICAgKlxuICAgKiBNYXRjaGVkIHRvIHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkncyBvd24gMzAtZGF5IFRUTCAoc2VlXG4gICAqIGAuL3NpZ25pbmcta2V5LnRzYCk6IHRoZSBjb29raWUgYW5kIHRoZSBrZXkgdGhhdCB2YWxpZGF0ZXMgaXQgc2hvdWxkIGV4cGlyZVxuICAgKiB0b2dldGhlciwgb3Igb25lIHNpbGVudGx5IG91dGxpdmVzIHRoZSBvdGhlci5cbiAgICovXG4gIHNlc3Npb25UdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogT25lLXRpbWUtY29kZSBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9DT0RFX1RUTC4gRGVmYXVsdCA2MDAgKDEwbSkuICovXG4gIGNvZGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogTWF4IHZlcmlmeSBhdHRlbXB0cyBwZXIgaXNzdWVkIGNvZGUuIERlZmF1bHQgNS4gKi9cbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3JjZS1jbGVhciBjdXRvZmY6IGV2ZXJ5IHNlc3Npb24gaXNzdWVkIEJFRk9SRSBpdCBzdG9wcyB2ZXJpZnlpbmcsIHNvIG1vdmluZ1xuICAgKiBpdCBmb3J3YXJkIHNpZ25zIGV2ZXJ5b25lIG91dC4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGLlxuICAgKlxuICAgKiBBbnl0aGluZyBgb2JqZWN0LnRvRGF0ZWAgYWNjZXB0czogYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPIGluc3RhbnQsXG4gICAqIGVwb2NoIHNlY29uZHMvbWlsbGlzLCBvciBhIHJlbGF0aXZlIGR1cmF0aW9uIChgLTMwZGAsIGA3IGRheXMgYWdvYCkuIFVuc2V0XG4gICAqIG1lYW5zIG5vIGN1dG9mZi5cbiAgICovXG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBob3N0IHRoZSBnYXRlIGlzIHNlcnZlZCBvbi4gRW52IFRVTk5FTF9QVUJMSUNfRE9NQUlOLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgdG8gYmluZCB0aGUgZW1haWxlZCBjb2RlIHRvIHRoaXMgc2l0ZSBmb3IgQXBwbGUncyBkb21haW4tYm91bmRcbiAgICogQXV0b0ZpbGwgKHNlZSB7QGxpbmsgU2VuZENvZGVPcHRpb25zLnB1YmxpY0RvbWFpbn0pOyB0aGUgZ2F0ZSBkb2VzIG5vdCByb3V0ZVxuICAgKiBvbiBpdC4gQWJzZW50LCB0aGUgY29kZSBlbWFpbCBzaW1wbHkgb21pdHMgdGhhdCB0cmFpbGVyIGFuZCBzdGlsbCByZWxpZXMgb25cbiAgICogdGhlIGNvbnZlbnRpb25hbCBsYXlvdXQgZXZlcnkgY2xpZW50IGRldGVjdHMgaGV1cmlzdGljYWxseS5cbiAgICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIERlbGl2ZXIgYSBjb2RlIHRvIGFuIGFkZHJlc3MuIFdpcmVkIGJ5IHRoZSBhcHAgdG8gdGhlIGVtYWlsIHBsdWdpbi4gKi9cbiAgc2VuZENvZGU/OiAoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBvcHRzOiBTZW5kQ29kZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBCcmFuZGluZy9tZXNzYWdpbmcgcGFzc2VkIHRvIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5zZW5kQ29kZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRDb2RlT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIExpZmV0aW1lIG9mIHRoZSBjb2RlIGJlaW5nIHNlbnQsIGluIHNlY29uZHMgLSB0aGUgUkVTT0xWRURcbiAgICoge0BsaW5rIEF1dGhHYXRlQ29uZmlnLmNvZGVUdGxTZWNvbmRzfSwgc28gdGhlIGVtYWlsIGNhbiBzdGF0ZSB0aGUgcmVhbFxuICAgKiBleHBpcnkgKFwiVGhpcyBjb2RlIGV4cGlyZXMgaW4gMTAgbWludXRlc1wiKSBpbnN0ZWFkIG9mIGEgdmFndWUgXCJzaG9ydGx5XCJcbiAgICogdGhhdCBkcmlmdHMgZnJvbSB0aGUgY29uZmlndXJlZCBUVEwuXG4gICAqL1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBob3N0IHRoZSBnYXRlIGlzIHNlcnZlZCBvbiwgd2hlbiBvbmUgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogYHNlbmRDb2RlYCB0dXJucyB0aGlzIGludG8gQXBwbGUncyBgQDxkb21haW4+ICM8Y29kZT5gIHRyYWlsZXIsIHdoaWNoIGJpbmRzXG4gICAqIHRoZSBjb2RlIHRvIFRISVMgc2l0ZTogaU9TIHRoZW4gb2ZmZXJzIGl0IG9ubHkgZm9yIGEgbWF0Y2hpbmcgZG9tYWluLCBzbyBhXG4gICAqIGNvZGUgcGhpc2hlZCBmcm9tIGVsc2V3aGVyZSBpcyBub3QgYXV0b2ZpbGxlZCBoZXJlLiBVbmRlZmluZWQgc2ltcGx5IG9taXRzXG4gICAqIHRoZSB0cmFpbGVyIC0gZXZlcnkgY2xpZW50IHN0aWxsIGRldGVjdHMgdGhlIGNvZGUgZnJvbSB0aGUgY29udmVudGlvbmFsXG4gICAqIGxheW91dC5cbiAgICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIGdhdGUgY29uZmlnIHdpdGggZW52IGZhbGxiYWNrcyArIGRlZmF1bHRzIGFwcGxpZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBhbGxvdzogc3RyaW5nW107XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIEZvcmNlLWNsZWFyIGN1dG9mZiBpbiBlcG9jaCBtczsgYDBgIHdoZW4gdW5zZXQuICovXG4gIHNlc3Npb25DdXRvZmZNczogbnVtYmVyO1xuICAvKiogUHVibGljIGhvc3QgZm9yIHRoZSBBdXRvRmlsbCB0cmFpbGVyLCB3aGVuIGNvbmZpZ3VyZWQuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgIChzZWVcbiAgLy8ge0BsaW5rIHN0YXJ0R2F0ZUFwcH0sIHdoaWNoIHJlc29sdmVzIHRoZSBvbi1kaXNrIGNvbnRleHQpOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICByZXR1cm4ge1xuICAgIC8vIEJvdGggc291cmNlcyBhcmUgdW5pb25lZCByYXRoZXIgdGhhbiBvbmUgb3ZlcnJpZGluZzogYSBkZXBsb3ltZW50LXdpZGVcbiAgICAvLyBUVU5ORUxfQVVUSF9BTExPVyBhbmQgYSBwZXItaW52b2NhdGlvbiBgLS1hbGxvd2Agc2hvdWxkIGJvdGggZ3JhbnQgYWNjZXNzLlxuICAgIC8vIEhlbmNlIGBwYXJzZUxpc3RgIG9uIGVhY2ggcmF0aGVyIHRoYW4gYGVudi5saXN0YCwgd2hpY2ggc3RvcHMgYXQgdGhlIGZpcnN0XG4gICAgLy8gc291cmNlIHRoYXQgeWllbGRzIGFueXRoaW5nLlxuICAgIGFsbG93OiBbLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuYWxsb3cpLCAuLi5zdHJpbmcucGFyc2VMaXN0KGVudi50ZXh0KEFMTE9XX0VOVikpXSxcbiAgICBzdWJqZWN0OiBlbnYuc3RyaW5nKGNvbmZpZy5zdWJqZWN0LCBTVUJKRUNUX0VOVikgPz8gREVGQVVMVFMuc3ViamVjdCxcbiAgICBicmFuZE5hbWU6IGVudi5zdHJpbmcoY29uZmlnLmJyYW5kTmFtZSwgQlJBTkRfTkFNRV9FTlYpID8/IERFRkFVTFRTLmJyYW5kTmFtZSxcbiAgICBtZXNzYWdlOiBlbnYuc3RyaW5nKGNvbmZpZy5tZXNzYWdlLCBNRVNTQUdFX0VOVikgPz8gREVGQVVMVFMubWVzc2FnZSxcbiAgICBzZXNzaW9uVHRsU2Vjb25kczogZW52LnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgU0VTU0lPTl9UVExfRU5WLFxuICAgICAgREVGQVVMVFMuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgKSxcbiAgICBjb2RlVHRsU2Vjb25kczogZW52LnBvc2l0aXZlSW50KGNvbmZpZy5jb2RlVHRsU2Vjb25kcywgQ09ERV9UVExfRU5WLCBERUZBVUxUUy5jb2RlVHRsU2Vjb25kcyksXG4gICAgbWF4QXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyA/PyBERUZBVUxUUy5tYXhBdHRlbXB0cyxcbiAgICBzZXNzaW9uQ3V0b2ZmTXM6IHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmKSxcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJwdWJsaWNEb21haW5cIiwgZW52LnN0cmluZyhjb25maWcucHVibGljRG9tYWluLCBQVUJMSUNfRE9NQUlOX0VOVikpLFxuICB9O1xufVxuXG4vKiogVGhlIGhhbmRsZXJzIHRoZSBwcm94eSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBIYW5kbGUgYSBjb2RlIHJlcXVlc3QuIEFsd2F5cyByZXNvbHZlcyBgeyBvazogdHJ1ZSB9YCAoYW50aS1lbnVtZXJhdGlvbikuICovXG4gIHJlcXVlc3QoZW1haWw6IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8eyBvazogdHJ1ZTsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIEhhbmRsZSBhIGNvZGUgdmVyaWZpY2F0aW9uLiBPbiBzdWNjZXNzIHJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gdG8gY29va2llLiAqL1xuICB2ZXJpZnkoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgaXA6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IG9rOiBib29sZWFuOyB0b2tlbj86IHN0cmluZzsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIFJlc29sdmUgdGhlIGF1dGhlbnRpY2F0ZWQgZW1haWwgZm9yIGEgc2Vzc2lvbiB0b2tlbiwgb3IgdW5kZWZpbmVkLiAqL1xuICBzZXNzaW9uKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKiBTZXNzaW9uIFRUTCBpbiBzZWNvbmRzIChmb3IgdGhlIGNvb2tpZSBNYXgtQWdlKS4gKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkIChgZW5hYmxlZGAgaXMgYWx3YXlzIHRydWUgd2hlbiB0aGlzIHBsdWdpbiBydW5zKS4gKi9cbiAgc3RhdHVzKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xufVxuXG4vKiogQXBwS2l0IHBsdWdpbiBvd25pbmcgdGhlIGVtYWlsLU9UUCBnYXRlJ3MgbG9naWMgKG5vIEhUVFAgcm91dGVzOyBwcm94eS1kcml2ZW4pLiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEF1dGhHYXRlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImF1dGhHYXRlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQXV0aCBHYXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW1haWwgb25lLXRpbWUtcGFzc3dvcmQgYWNjZXNzIGdhdGUgZm9yIGEgcHVibGljIHR1bm5lbC5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImF1dGhHYXRlXCI+O1xuXG4gIHByaXZhdGUgcmVzb2x2ZWQhOiBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnO1xuICBwcml2YXRlIGNvZGVzITogQ29kZVN0b3JlO1xuICAvLyBSZXF1ZXN0aW5nIGEgY29kZSBpcyBlbWFpbC1zcGFtLXByb25lOyB2ZXJpZnlpbmcgaXMgYSBicnV0ZS1mb3JjZSBzdXJmYWNlLlxuICAvLyBQZXItZW1haWwgQU5EIHBlci1JUCBzbyBuZWl0aGVyIGF4aXMgYWxvbmUgaXMgYSBieXBhc3MuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdExpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoNSwgMTUgKiA2MCAqIDEwMDApO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmeUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoMTAsIDE1ICogNjAgKiAxMDAwKTtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmNvZGVzID0gbmV3IENvZGVTdG9yZSh0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLCB0aGlzLnJlc29sdmVkLm1heEF0dGVtcHRzKTtcbiAgICAvLyBSZXNvbHZlIHRoZSBzaWduaW5nIGtleSBIRVJFIHJhdGhlciB0aGFuIGxhemlseSBvbiB0aGUgZmlyc3Qgc2lnbi1pbiwgc28gYVxuICAgIC8vIGNhY2hlIHRoYXQgY2Fubm90IGhvbGQgaXQgKGFuZCB0aGUgcmVzdWx0aW5nIFwic2Vzc2lvbnMgd29uJ3Qgc3Vydml2ZSBhXG4gICAgLy8gcmVzdGFydFwiIHdhcm5pbmcpIHNob3dzIHVwIGluIHRoZSBzdGFydHVwIGxvZywgbm90IGhvdXJzIGxhdGVyLlxuICAgIGNvbnN0IHsgY3V0b2ZmTXMgfSA9IGF3YWl0IHNpZ25pbmdLZXkodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpO1xuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgcGF0dGVybnM6IHRoaXMucmVzb2x2ZWQuYWxsb3cubGVuZ3RoLFxuICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJzZXNzaW9uQ3V0b2ZmXCIsIGN1dG9mZk1zID4gMCA/IG5ldyBEYXRlKGN1dG9mZk1zKS50b0lTT1N0cmluZygpIDogbnVsbCksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCk6IEF1dGhHYXRlQXBpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICByZXF1ZXN0OiAoZW1haWwsIGlwKSA9PiB0aGlzLmhhbmRsZVJlcXVlc3QoZW1haWwsIGlwKSxcbiAgICAgIHZlcmlmeTogKGVtYWlsLCBjb2RlLCBpcCkgPT4gdGhpcy5oYW5kbGVWZXJpZnkoZW1haWwsIGNvZGUsIGlwKSxcbiAgICAgIHNlc3Npb246ICh0b2tlbikgPT4gdmVyaWZ5U2Vzc2lvbih0b2tlbiksXG4gICAgICBzdGF0dXM6IGFzeW5jICh0b2tlbikgPT4gKHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihhd2FpdCB2ZXJpZnlTZXNzaW9uKHRva2VuKSksXG4gICAgICAgIGVtYWlsOiAoYXdhaXQgdmVyaWZ5U2Vzc2lvbih0b2tlbikpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlcXVlc3QoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBpcDogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgb2s6IHRydWU7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBieUlwID0gdGhpcy5yZXF1ZXN0TGltaXRlci5oaXQoYGlwOiR7aXB9YCk7XG4gICAgY29uc3QgYnlFbWFpbCA9IHRoaXMucmVxdWVzdExpbWl0ZXIuaGl0KGBlbWFpbDoke2FkZHJlc3N9YCk7XG4gICAgaWYgKCFieUlwLmFsbG93ZWQgfHwgIWJ5RW1haWwuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHJldHJ5QWZ0ZXI6IGJ5SXAucmV0cnlBZnRlciA/PyBieUVtYWlsLnJldHJ5QWZ0ZXIgfTtcbiAgICB9XG4gICAgaWYgKGxvb2tzTGlrZUVtYWlsKGFkZHJlc3MpICYmIG1hdGNoZXNBbGxvd2xpc3QoYWRkcmVzcywgdGhpcy5yZXNvbHZlZC5hbGxvdykpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0aGlzLmNvZGVzLmlzc3VlKGFkZHJlc3MpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWcuc2VuZENvZGU/LihhZGRyZXNzLCBjb2RlLCB7XG4gICAgICAgICAgc3ViamVjdDogdGhpcy5yZXNvbHZlZC5zdWJqZWN0LFxuICAgICAgICAgIGJyYW5kTmFtZTogdGhpcy5yZXNvbHZlZC5icmFuZE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5yZXNvbHZlZC5tZXNzYWdlLFxuICAgICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICAgIC4uLm9iamVjdC5vcHRpb25hbChcInB1YmxpY0RvbWFpblwiLCB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbiksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gc2VuZCBPVFAgZW1haWxcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVmVyaWZ5KFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIGlwOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBvazogYm9vbGVhbjsgdG9rZW4/OiBzdHJpbmc7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBieUlwID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgaXA6JHtpcH1gKTtcbiAgICBjb25zdCBieUVtYWlsID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIGlmICghYnlJcC5hbGxvd2VkIHx8ICFieUVtYWlsLmFsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmV0cnlBZnRlcjogYnlJcC5yZXRyeUFmdGVyID8/IGJ5RW1haWwucmV0cnlBZnRlciB9O1xuICAgIH1cbiAgICBpZiAoKGF3YWl0IHRoaXMuY29kZXMudmVyaWZ5KGFkZHJlc3MsIGNvZGUudHJpbSgpKSkgIT09IFwib2tcIikgcmV0dXJuIHsgb2s6IGZhbHNlIH07XG4gICAgdGhpcy5yZXF1ZXN0TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIHRoaXMudmVyaWZ5TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCB0b2tlbjogYXdhaXQgc2lnblNlc3Npb24oYWRkcmVzcywgdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcykgfTtcbiAgfVxufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUNkLFlBQVksRUFDWixXQUFXLEVBQ1gsZUFBZSxFQUNmLFdBQVcsR0FDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQW1GekMsTUFBTSxRQUFRLEdBQUc7SUFDZixPQUFPLEVBQUUsd0JBQXdCO0lBQ2pDLDhFQUE4RTtJQUM5RSwrRUFBK0U7SUFDL0Usa0VBQWtFO0lBQ2xFLGlFQUFpRTtJQUNqRSxnRkFBZ0Y7SUFDaEYsOENBQThDO0lBQzlDLFNBQVMsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSTtJQUN6QyxPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLHVFQUF1RTtJQUN2RSxpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLGNBQWMsRUFBRSxHQUFHO0lBQ25CLFdBQVcsRUFBRSxD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LEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO0lBQzFGLENBQUM7O0FBR0gsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBhdXRoR2F0ZSgpYCAtIHRoZSBBcHBLaXQgcGx1Z2luIGJlaGluZCB0aGUgdHVubmVsJ3MgZW1haWwtT1RQIGdhdGUuXG4gKlxuICogSXQgaGFzIE5PIHJvdXRlcyBvZiBpdHMgb3duOiB0aGUgdHVubmVsIFBST1hZIChub3QgYW4gSFRUUCBzZXJ2ZXIpIGNhbGxzIHRoZVxuICogaGFuZGxlcnMgdGhpcyBwbHVnaW4gZXhwb3NlcyB2aWEge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9LiBUaGUgcGx1Z2luXG4gKiBvd25zIHRoZSBhbGxvdy1saXN0LCB0aGUgcGVyLWVtYWlsL3Blci1JUCByYXRlIGxpbWl0ZXJzLCB0aGUgQ2FjaGVNYW5hZ2VyLWJhY2tlZFxuICogb25lLXRpbWUtY29kZSBzdG9yZSwgYW5kIHRoZSBzZXNzaW9uIEpXVC4gYGNyZWF0ZUFwcGAgKHdpdGggbm8gYHNlcnZlcigpYCkgaXNcbiAqIHVzZWQgb25seSB0byBhdXRvLWluaXQgYENhY2hlTWFuYWdlcmAgKyBwcmltZSB0aGUgc2libGluZyBgZW1haWxgIHRyYW5zcG9ydDtcbiAqIHRoaXMgcGx1Z2luIGlzIHdoZXJlIHRoZSBnYXRlIGxvZ2ljIGxpdmVzLlxuICpcbiAqIE9wdGlvbnMgY29tZSBmcm9tIENMSSBmbGFncyBPUiBlbnYsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMgLSBzZWVcbiAqIHtAbGluayByZXNvbHZlQXV0aEdhdGVDb25maWd9LiBUaGUgb25lIHJ1bnRpbWUgZGVwZW5kZW5jeSB0aGUgcGx1Z2luIGNhbid0XG4gKiByZXNvbHZlIGl0c2VsZiBpcyBIT1cgdG8gZW1haWwgdGhlIGNvZGUsIHNvIGl0IHRha2VzIGEgYHNlbmRDb2RlYCBjYWxsYmFjayB0aGVcbiAqIGFwcCB3aXJlcyB0byB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBQbHVnaW4sIHRvUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBicmFuZCwgZW52LCBsb2csIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHsgbG9va3NMaWtlRW1haWwsIG1hdGNoZXNBbGxvd2xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcbmltcG9ydCB7XG4gIEFMTE9XX0VOVixcbiAgQlJBTkRfTkFNRV9FTlYsXG4gIENPREVfVFRMX0VOVixcbiAgTUVTU0FHRV9FTlYsXG4gIFNFU1NJT05fVFRMX0VOVixcbiAgU1VCSkVDVF9FTlYsXG59IGZyb20gXCIuL2Vudi50c1wiO1xuaW1wb3J0IHsgQ29kZVN0b3JlLCBzaWduU2Vzc2lvbiwgdmVyaWZ5U2Vzc2lvbiB9IGZyb20gXCIuL290cC50c1wiO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tIFwiLi9yYXRlLWxpbWl0LnRzXCI7XG5pbXBvcnQgeyBLRVlfVFRMX1NFQ09ORFMsIHJlc29sdmVTZXNzaW9uQ3V0b2ZmLCBzaWduaW5nS2V5IH0gZnJvbSBcIi4vc2lnbmluZy1rZXkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDphdXRoXCIpO1xuXG4vKiogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBhdXRoR2F0ZX0gcGx1Z2luIChhbGwgcmVzb2x2YWJsZSBmcm9tIGVudiAtIHNlZSBiZWxvdykuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHYXRlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBBbGxvdy1saXN0IHBhdHRlcm5zIChkb21haW4gLyBnbG9iIC8gYC9yZWdleC9gKS4gRW1wdHkgPSBhbGxvdyBub2JvZHkuIEVudiBUVU5ORUxfQVVUSF9BTExPVy4gKi9cbiAgYWxsb3c/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFN1YmplY3QgbGluZSBmb3IgdGhlIGNvZGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9TVUJKRUNULlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGVcIi4gVGhlIHdvcmRpbmcgb2YgdGhlIHN1YmplY3QgYW5kXG4gICAqIHtAbGluayBtZXNzYWdlfSBpcyBkZWxpYmVyYXRlbHkgdGhlIGNvbnZlbnRpb25hbCBwaHJhc2luZyByYXRoZXIgdGhhblxuICAgKiBhbnl0aGluZyBicmFuZGVkOiBpT1MsIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCBhbGwgZGV0ZWN0IGEgb25lLXRpbWVcbiAgICogY29kZSBmcm9tIHRoaXMgc2hhcGUgYW5kIG9mZmVyIHRvIGF1dG9maWxsIGl0LCBhbmQgYSBub3ZlbCBwaHJhc2luZyBpcyB3aGF0XG4gICAqIGJyZWFrcyB0aGF0IGRldGVjdGlvbi5cbiAgICovXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgdXNlZCBpbiB0aGUgY29kZSBlbWFpbCBjb3B5LiBFbnYgVFVOTkVMX0FVVEhfQlJBTkRfTkFNRS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGJyYW5kIGNvbnRleHQncyBgbmFtZWAgLSB0aGUgYXBwJ3Mgb3duIGBicmFuZGluZy9icmFuZC55YW1sYFxuICAgKiB3aGVuIGl0IGhhcyBvbmUsIGVsc2UgdGhlIGRieC10b29scyBkZWZhdWx0LiBTZXQgdGhpcyBvbmx5IHRvIG92ZXJyaWRlIHRoZVxuICAgKiBicmFuZCBmb3IgdGhpcyBnYXRlLlxuICAgKi9cbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogTGluZSBzaG93biBpbW1lZGlhdGVseSBhYm92ZSB0aGUgY29kZSBpbiB0aGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9NRVNTQUdFLlxuICAgKlxuICAgKiBLZWVwIHRoZSBjb2RlIG9uIGl0cyBPV04gbGluZSBkaXJlY3RseSBhZnRlciB0aGlzIHRleHQgLSB0aGF0IGFkamFjZW5jeSBpc1xuICAgKiB3aGF0IHRoZSBwbGF0Zm9ybSBjb2RlLWRldGVjdGlvbiBoZXVyaXN0aWNzIGtleSBvbi5cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXNzaW9uIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fVFRMLiBEZWZhdWx0IDI1OTIwMDAgKDMwZCkuXG4gICAqXG4gICAqIE1hdGNoZWQgdG8gdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSdzIG93biAzMC1kYXkgVFRMIChzZWVcbiAgICogYC4vc2lnbmluZy1rZXkudHNgKTogdGhlIGNvb2tpZSBhbmQgdGhlIGtleSB0aGF0IHZhbGlkYXRlcyBpdCBzaG91bGQgZXhwaXJlXG4gICAqIHRvZ2V0aGVyLCBvciBvbmUgc2lsZW50bHkgb3V0bGl2ZXMgdGhlIG90aGVyLlxuICAgKi9cbiAgc2Vzc2lvblR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBPbmUtdGltZS1jb2RlIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX0NPREVfVFRMLiBEZWZhdWx0IDYwMCAoMTBtKS4gKi9cbiAgY29kZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBNYXggdmVyaWZ5IGF0dGVtcHRzIHBlciBpc3N1ZWQgY29kZS4gRGVmYXVsdCA1LiAqL1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvcmNlLWNsZWFyIGN1dG9mZjogZXZlcnkgc2Vzc2lvbiBpc3N1ZWQgQkVGT1JFIGl0IHN0b3BzIHZlcmlmeWluZywgc28gbW92aW5nXG4gICAqIGl0IGZvcndhcmQgc2lnbnMgZXZlcnlvbmUgb3V0LiBFbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9DVVRPRkYuXG4gICAqXG4gICAqIEFueXRoaW5nIGBvYmplY3QudG9EYXRlYCBhY2NlcHRzOiBhIGBEYXRlYCwgYDIwMjYtMDgtMDJgLCBhbiBJU08gaW5zdGFudCxcbiAgICogZXBvY2ggc2Vjb25kcy9taWxsaXMsIG9yIGEgcmVsYXRpdmUgZHVyYXRpb24gKGAtMzBkYCwgYDcgZGF5cyBhZ29gKS4gVW5zZXRcbiAgICogbWVhbnMgbm8gY3V0b2ZmLlxuICAgKi9cbiAgc2Vzc2lvbkN1dG9mZj86IHN0cmluZyB8IG51bWJlciB8IERhdGU7XG4gIC8qKiBEZWxpdmVyIGEgY29kZSB0byBhbiBhZGRyZXNzLiBXaXJlZCBieSB0aGUgYXBwIHRvIHRoZSBlbWFpbCBwbHVnaW4uICovXG4gIHNlbmRDb2RlPzogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0czogU2VuZENvZGVPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQnJhbmRpbmcvbWVzc2FnaW5nIHBhc3NlZCB0byB7QGxpbmsgQXV0aEdhdGVDb25maWcuc2VuZENvZGV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kQ29kZU9wdGlvbnMge1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaWZldGltZSBvZiB0aGUgY29kZSBiZWluZyBzZW50LCBpbiBzZWNvbmRzIC0gdGhlIFJFU09MVkVEXG4gICAqIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5jb2RlVHRsU2Vjb25kc30sIHNvIHRoZSBlbWFpbCBjYW4gc3RhdGUgdGhlIHJlYWxcbiAgICogZXhwaXJ5IChcIlRoaXMgY29kZSBleHBpcmVzIGluIDEwIG1pbnV0ZXNcIikgaW5zdGVhZCBvZiBhIHZhZ3VlIFwic2hvcnRseVwiXG4gICAqIHRoYXQgZHJpZnRzIGZyb20gdGhlIGNvbmZpZ3VyZWQgVFRMLlxuICAgKi9cbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIFJlc29sdmVkIGdhdGUgY29uZmlnIHdpdGggZW52IGZhbGxiYWNrcyArIGRlZmF1bHRzIGFwcGxpZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBhbGxvdzogc3RyaW5nW107XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIEZvcmNlLWNsZWFyIGN1dG9mZiBpbiBlcG9jaCBtczsgYDBgIHdoZW4gdW5zZXQuICovXG4gIHNlc3Npb25DdXRvZmZNczogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUUyA9IHtcbiAgc3ViamVjdDogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gIC8vIFRoZSByZXBvLXdpZGUgYnJhbmQgY29udGV4dCdzIGRpc3BsYXkgbmFtZSwgTk9UIGEgaGFyZGNvZGVkIHByb2R1Y3Qgc3RyaW5nOlxuICAvLyB0aGlzIG5hbWUgaXMgd2hhdCB0aGUgcmVjaXBpZW50IHJlYWRzIGluIHRoZSBjb2RlIGVtYWlsLCBzbyBpdCBoYXMgdG8gYmUgdGhlXG4gIC8vIHNhbWUgaWRlbnRpdHkgdGhlIHJlc3Qgb2YgdGhlIGFwcCBwcmVzZW50cy4gQSBob3N0IHdpdGggaXRzIG93blxuICAvLyBgYnJhbmRpbmcvYnJhbmQueWFtbGAgb3ZlcnJpZGVzIGl0IGJ5IHBhc3NpbmcgYGJyYW5kTmFtZWAgKHNlZVxuICAvLyB7QGxpbmsgc3RhcnRHYXRlQXBwfSwgd2hpY2ggcmVzb2x2ZXMgdGhlIG9uLWRpc2sgY29udGV4dCk7IHRoZSBzaGFyZWQgZGVmYXVsdFxuICAvLyBpcyB0aGUgZmFsbGJhY2sgd2hlbiBub3RoaW5nIGlzIGNvbmZpZ3VyZWQuXG4gIGJyYW5kTmFtZTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICBtZXNzYWdlOiBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gIC8vIDMwIGRheXMsIHRoZSBzYW1lIHdpbmRvdyB0aGUgY2FjaGUtYmFja2VkIHNpZ25pbmcga2V5IGlzIHN0b3JlZCBmb3IuXG4gIHNlc3Npb25UdGxTZWNvbmRzOiBLRVlfVFRMX1NFQ09ORFMsXG4gIGNvZGVUdGxTZWNvbmRzOiA2MDAsXG4gIG1heEF0dGVtcHRzOiA1LFxufTtcblxuLyoqIE1lcmdlIHtAbGluayBBdXRoR2F0ZUNvbmZpZ30gb3ZlciBlbnYgb3ZlciBkZWZhdWx0cyBpbnRvIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBdXRoR2F0ZUNvbmZpZyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgLy8gQm90aCBzb3VyY2VzIGFyZSB1bmlvbmVkIHJhdGhlciB0aGFuIG9uZSBvdmVycmlkaW5nOiBhIGRlcGxveW1lbnQtd2lkZVxuICAgIC8vIFRVTk5FTF9BVVRIX0FMTE9XIGFuZCBhIHBlci1pbnZvY2F0aW9uIGAtLWFsbG93YCBzaG91bGQgYm90aCBncmFudCBhY2Nlc3MuXG4gICAgLy8gSGVuY2UgYHBhcnNlTGlzdGAgb24gZWFjaCByYXRoZXIgdGhhbiBgZW52Lmxpc3RgLCB3aGljaCBzdG9wcyBhdCB0aGUgZmlyc3RcbiAgICAvLyBzb3VyY2UgdGhhdCB5aWVsZHMgYW55dGhpbmcuXG4gICAgYWxsb3c6IFsuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5hbGxvdyksIC4uLnN0cmluZy5wYXJzZUxpc3QoZW52LnRleHQoQUxMT1dfRU5WKSldLFxuICAgIHN1YmplY3Q6IGVudi5zdHJpbmcoY29uZmlnLnN1YmplY3QsIFNVQkpFQ1RfRU5WKSA/PyBERUZBVUxUUy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTogZW52LnN0cmluZyhjb25maWcuYnJhbmROYW1lLCBCUkFORF9OQU1FX0VOVikgPz8gREVGQVVMVFMuYnJhbmROYW1lLFxuICAgIG1lc3NhZ2U6IGVudi5zdHJpbmcoY29uZmlnLm1lc3NhZ2UsIE1FU1NBR0VfRU5WKSA/PyBERUZBVUxUUy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBlbnYucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBTRVNTSU9OX1RUTF9FTlYsXG4gICAgICBERUZBVUxUUy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICApLFxuICAgIGNvZGVUdGxTZWNvbmRzOiBlbnYucG9zaXRpdmVJbnQoY29uZmlnLmNvZGVUdGxTZWNvbmRzLCBDT0RFX1RUTF9FTlYsIERFRkFVTFRTLmNvZGVUdGxTZWNvbmRzKSxcbiAgICBtYXhBdHRlbXB0czogY29uZmlnLm1heEF0dGVtcHRzID8/IERFRkFVTFRTLm1heEF0dGVtcHRzLFxuICAgIHNlc3Npb25DdXRvZmZNczogcmVzb2x2ZVNlc3Npb25DdXRvZmYoY29uZmlnLnNlc3Npb25DdXRvZmYpLFxuICB9O1xufVxuXG4vKiogVGhlIGhhbmRsZXJzIHRoZSBwcm94eSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBIYW5kbGUgYSBjb2RlIHJlcXVlc3QuIEFsd2F5cyByZXNvbHZlcyBgeyBvazogdHJ1ZSB9YCAoYW50aS1lbnVtZXJhdGlvbikuICovXG4gIHJlcXVlc3QoZW1haWw6IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8eyBvazogdHJ1ZTsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIEhhbmRsZSBhIGNvZGUgdmVyaWZpY2F0aW9uLiBPbiBzdWNjZXNzIHJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gdG8gY29va2llLiAqL1xuICB2ZXJpZnkoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgaXA6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IG9rOiBib29sZWFuOyB0b2tlbj86IHN0cmluZzsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIFJlc29sdmUgdGhlIGF1dGhlbnRpY2F0ZWQgZW1haWwgZm9yIGEgc2Vzc2lvbiB0b2tlbiwgb3IgdW5kZWZpbmVkLiAqL1xuICBzZXNzaW9uKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKiBTZXNzaW9uIFRUTCBpbiBzZWNvbmRzIChmb3IgdGhlIGNvb2tpZSBNYXgtQWdlKS4gKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkIChgZW5hYmxlZGAgaXMgYWx3YXlzIHRydWUgd2hlbiB0aGlzIHBsdWdpbiBydW5zKS4gKi9cbiAgc3RhdHVzKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xufVxuXG4vKiogQXBwS2l0IHBsdWdpbiBvd25pbmcgdGhlIGVtYWlsLU9UUCBnYXRlJ3MgbG9naWMgKG5vIEhUVFAgcm91dGVzOyBwcm94eS1kcml2ZW4pLiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEF1dGhHYXRlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImF1dGhHYXRlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQXV0aCBHYXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW1haWwgb25lLXRpbWUtcGFzc3dvcmQgYWNjZXNzIGdhdGUgZm9yIGEgcHVibGljIHR1bm5lbC5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImF1dGhHYXRlXCI+O1xuXG4gIHByaXZhdGUgcmVzb2x2ZWQhOiBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnO1xuICBwcml2YXRlIGNvZGVzITogQ29kZVN0b3JlO1xuICAvLyBSZXF1ZXN0aW5nIGEgY29kZSBpcyBlbWFpbC1zcGFtLXByb25lOyB2ZXJpZnlpbmcgaXMgYSBicnV0ZS1mb3JjZSBzdXJmYWNlLlxuICAvLyBQZXItZW1haWwgQU5EIHBlci1JUCBzbyBuZWl0aGVyIGF4aXMgYWxvbmUgaXMgYSBieXBhc3MuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdExpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoNSwgMTUgKiA2MCAqIDEwMDApO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmeUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoMTAsIDE1ICogNjAgKiAxMDAwKTtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmNvZGVzID0gbmV3IENvZGVTdG9yZSh0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLCB0aGlzLnJlc29sdmVkLm1heEF0dGVtcHRzKTtcbiAgICAvLyBSZXNvbHZlIHRoZSBzaWduaW5nIGtleSBIRVJFIHJhdGhlciB0aGFuIGxhemlseSBvbiB0aGUgZmlyc3Qgc2lnbi1pbiwgc28gYVxuICAgIC8vIGNhY2hlIHRoYXQgY2Fubm90IGhvbGQgaXQgKGFuZCB0aGUgcmVzdWx0aW5nIFwic2Vzc2lvbnMgd29uJ3Qgc3Vydml2ZSBhXG4gICAgLy8gcmVzdGFydFwiIHdhcm5pbmcpIHNob3dzIHVwIGluIHRoZSBzdGFydHVwIGxvZywgbm90IGhvdXJzIGxhdGVyLlxuICAgIGNvbnN0IHsgY3V0b2ZmTXMgfSA9IGF3YWl0IHNpZ25pbmdLZXkodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpO1xuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgcGF0dGVybnM6IHRoaXMucmVzb2x2ZWQuYWxsb3cubGVuZ3RoLFxuICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJzZXNzaW9uQ3V0b2ZmXCIsIGN1dG9mZk1zID4gMCA/IG5ldyBEYXRlKGN1dG9mZk1zKS50b0lTT1N0cmluZygpIDogbnVsbCksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCk6IEF1dGhHYXRlQXBpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICByZXF1ZXN0OiAoZW1haWwsIGlwKSA9PiB0aGlzLmhhbmRsZVJlcXVlc3QoZW1haWwsIGlwKSxcbiAgICAgIHZlcmlmeTogKGVtYWlsLCBjb2RlLCBpcCkgPT4gdGhpcy5oYW5kbGVWZXJpZnkoZW1haWwsIGNvZGUsIGlwKSxcbiAgICAgIHNlc3Npb246ICh0b2tlbikgPT4gdmVyaWZ5U2Vzc2lvbih0b2tlbiksXG4gICAgICBzdGF0dXM6IGFzeW5jICh0b2tlbikgPT4gKHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihhd2FpdCB2ZXJpZnlTZXNzaW9uKHRva2VuKSksXG4gICAgICAgIGVtYWlsOiAoYXdhaXQgdmVyaWZ5U2Vzc2lvbih0b2tlbikpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlcXVlc3QoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBpcDogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgb2s6IHRydWU7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBieUlwID0gdGhpcy5yZXF1ZXN0TGltaXRlci5oaXQoYGlwOiR7aXB9YCk7XG4gICAgY29uc3QgYnlFbWFpbCA9IHRoaXMucmVxdWVzdExpbWl0ZXIuaGl0KGBlbWFpbDoke2FkZHJlc3N9YCk7XG4gICAgaWYgKCFieUlwLmFsbG93ZWQgfHwgIWJ5RW1haWwuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHJldHJ5QWZ0ZXI6IGJ5SXAucmV0cnlBZnRlciA/PyBieUVtYWlsLnJldHJ5QWZ0ZXIgfTtcbiAgICB9XG4gICAgaWYgKGxvb2tzTGlrZUVtYWlsKGFkZHJlc3MpICYmIG1hdGNoZXNBbGxvd2xpc3QoYWRkcmVzcywgdGhpcy5yZXNvbHZlZC5hbGxvdykpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0aGlzLmNvZGVzLmlzc3VlKGFkZHJlc3MpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWcuc2VuZENvZGU/LihhZGRyZXNzLCBjb2RlLCB7XG4gICAgICAgICAgc3ViamVjdDogdGhpcy5yZXNvbHZlZC5zdWJqZWN0LFxuICAgICAgICAgIGJyYW5kTmFtZTogdGhpcy5yZXNvbHZlZC5icmFuZE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5yZXNvbHZlZC5tZXNzYWdlLFxuICAgICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHNlbmQgT1RQIGVtYWlsXCIsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVZlcmlmeShcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBpcDogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgb2s6IGJvb2xlYW47IHRva2VuPzogc3RyaW5nOyByZXRyeUFmdGVyPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYnlJcCA9IHRoaXMudmVyaWZ5TGltaXRlci5oaXQoYGlwOiR7aXB9YCk7XG4gICAgY29uc3QgYnlFbWFpbCA9IHRoaXMudmVyaWZ5TGltaXRlci5oaXQoYGVtYWlsOiR7YWRkcmVzc31gKTtcbiAgICBpZiAoIWJ5SXAuYWxsb3dlZCB8fCAhYnlFbWFpbC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIHJldHJ5QWZ0ZXI6IGJ5SXAucmV0cnlBZnRlciA/PyBieUVtYWlsLnJldHJ5QWZ0ZXIgfTtcbiAgICB9XG4gICAgaWYgKChhd2FpdCB0aGlzLmNvZGVzLnZlcmlmeShhZGRyZXNzLCBjb2RlLnRyaW0oKSkpICE9PSBcIm9rXCIpIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICAgIHRoaXMucmVxdWVzdExpbWl0ZXIucmVzZXQoYGVtYWlsOiR7YWRkcmVzc31gKTtcbiAgICB0aGlzLnZlcmlmeUxpbWl0ZXIucmVzZXQoYGVtYWlsOiR7YWRkcmVzc31gKTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdG9rZW46IGF3YWl0IHNpZ25TZXNzaW9uKGFkZHJlc3MsIHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMpIH07XG4gIH1cbn1cblxuLyoqIEZhY3Rvcnk6IGBhdXRoR2F0ZSh7IGFsbG93LCBzdWJqZWN0LCAuLi4gfSlgIGZvciBhbiBBcHBLaXQgYHBsdWdpbnNgIGFycmF5LiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhHYXRlID0gdG9QbHVnaW4oQXV0aEdhdGVQbHVnaW4pO1xuIl19
package/package.json CHANGED
@@ -29,12 +29,11 @@
29
29
  "dependencies": {
30
30
  "@clack/prompts": "^1.7.0",
31
31
  "@databricks/appkit": "^0.43.0",
32
- "@dbx-tools/appkit": "0.6.53",
33
- "@dbx-tools/core": "0.6.53",
34
- "@dbx-tools/email": "0.6.53",
35
- "@dbx-tools/shared-core": "0.6.53",
36
- "@dbx-tools/shared-email": "0.6.53",
37
- "@dbx-tools/shared-email-template": "0.6.53",
32
+ "@dbx-tools/appkit": "0.6.55",
33
+ "@dbx-tools/core": "0.6.55",
34
+ "@dbx-tools/email": "0.6.55",
35
+ "@dbx-tools/shared-core": "0.6.55",
36
+ "@dbx-tools/shared-email": "0.6.55",
38
37
  "commander": "^15.0.0",
39
38
  "http-proxy-3": "^1.23.3",
40
39
  "jose": "^6.2.3"
@@ -101,7 +100,7 @@
101
100
  "./package.json": "./package.json"
102
101
  }
103
102
  },
104
- "version": "0.6.53",
103
+ "version": "0.6.55",
105
104
  "types": "./lib/index.d.ts",
106
105
  "type": "module",
107
106
  "exports": {
package/src/app.ts CHANGED
@@ -11,8 +11,10 @@
11
11
  *
12
12
  * It returns the {@link AuthGateApi} the proxy drives. `sendCode` is wired here
13
13
  * (the plugin can't resolve HOW to send on its own) to the email plugin's
14
- * transport, resolving the `From` from the email runtime config (EMAIL_FROM /
15
- * EMAIL_DOMAIN) since an OTP request has no on-behalf-of user.
14
+ * transport. A sign-in code is SYSTEM mail - no on-behalf-of user asked for it
15
+ * and no reply to it reaches anyone - so it sends from the email config's
16
+ * do-not-reply address (`no-reply@EMAIL_DOMAIN` unless EMAIL_SYSTEM_FROM names
17
+ * another).
16
18
  *
17
19
  * FAIL FAST: a gate that can't email a code is useless, so if email does not
18
20
  * resolve to SMTP mode (real delivery), this throws - unless `insecure` is set
@@ -25,9 +27,8 @@
25
27
  import { createApp as createAppNs } from "@dbx-tools/appkit";
26
28
  import { brand as nodeBrand } from "@dbx-tools/core";
27
29
  import { brand as emailBrand, email, sender, transport } from "@dbx-tools/email";
28
- import { log, object, string } from "@dbx-tools/shared-core";
29
- import { autofillTrailer } from "@dbx-tools/shared-email-template";
30
- import { authGate, type AuthGateApi, type AuthGateConfig } from "./plugin.ts";
30
+ import { log, string } from "@dbx-tools/shared-core";
31
+ import { authGate, type AuthGateApi, type AuthGateConfig, type SendCodeOptions } from "./plugin.ts";
31
32
 
32
33
  const logger = log.logger("tunnel:app");
33
34
 
@@ -44,8 +45,58 @@ export function expiresIn(seconds: number): string {
44
45
  : string.pluralize(seconds, "second");
45
46
  }
46
47
 
48
+ /** The parts of {@link SendCodeOptions} the code email's copy is built from. */
49
+ type CodeCopy = Pick<SendCodeOptions, "message" | "codeTtlSeconds">;
50
+
51
+ /** The reassurance line closing both parts. */
52
+ const IGNORE_LINE = "If you did not request this code, you can ignore this email.";
53
+
54
+ /**
55
+ * The HTML part's source: the full branded template, with the code as a large
56
+ * styled heading (`## ` is what makes it prominent in an inbox).
57
+ */
58
+ export function codeEmailHtmlBody(code: string, opts: CodeCopy): string {
59
+ return [
60
+ opts.message,
61
+ "",
62
+ `## ${code}`,
63
+ "",
64
+ `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
65
+ "",
66
+ IGNORE_LINE,
67
+ ].join("\n");
68
+ }
69
+
70
+ /**
71
+ * The `text/plain` part, supplied EXPLICITLY rather than rendered from the tree
72
+ * above. Both parts say the same thing; only the line layout differs.
73
+ *
74
+ * The prompt and the code share ONE line ("Your verification code is: 123456").
75
+ * That single-line shape is what iOS, Gmail, Outlook, and Android code detection
76
+ * keys on most reliably - the heuristics look for a code in the same sentence as
77
+ * a recognized prompt, so splitting them across lines makes detection dependent
78
+ * on the client, and any blank line between them defeats it outright.
79
+ *
80
+ * The GENERATED text part cannot hold that shape at all: it is a rendering of the
81
+ * HTML, so it carries the brand header/footer and turns the code heading's CSS
82
+ * margin into blank lines, arriving as `prompt\n\n\ncode`.
83
+ *
84
+ * The code is visible text in BOTH parts, never an image, so a client scraping
85
+ * either one finds it. No trailer line follows the copy - Apple's domain-bound
86
+ * `@domain #code` footer is deliberately NOT emitted, since it constrains the
87
+ * code to one origin and is not what the broadly-compatible shape needs.
88
+ */
89
+ export function codeEmailTextBody(code: string, opts: CodeCopy): string {
90
+ return [
91
+ `${opts.message} ${code}`,
92
+ `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
93
+ "",
94
+ IGNORE_LINE,
95
+ ].join("\n");
96
+ }
97
+
47
98
  const { createApp } = createAppNs;
48
- const { resolveSenderAddress } = sender;
99
+ const { resolveSystemSenderAddress } = sender;
49
100
  const { getEmailRuntime, sendEmail } = transport;
50
101
  const { emailBrandFromContext } = emailBrand;
51
102
  const { loadBrandContext } = nodeBrand;
@@ -67,41 +118,20 @@ export async function startGateApp(config: AuthGateConfig): Promise<AuthGateApi>
67
118
  // `sendCode` delivers the OTP through the email plugin's SHARED transport, which
68
119
  // the `email()` plugin primes during its `setup()` (awaited by `createApp`
69
120
  // below). Using the module-level `sendEmail` avoids a circular dependency on the
70
- // app handle's inferred type. `From` is the app's configured sender (EMAIL_FROM /
71
- // EMAIL_DOMAIN); the code email has no OBO user, so it resolves with `undefined`.
121
+ // app handle's inferred type. The `From` is the SYSTEM sender: a verification
122
+ // code is machine-generated and unanswerable, so it must not arrive from a
123
+ // person's address inviting a reply.
72
124
  const sendCode: NonNullable<AuthGateConfig["sendCode"]> = async (to, code, opts) => {
73
- const from = resolveSenderAddress(getEmailRuntime().config, undefined);
125
+ const from = resolveSystemSenderAddress(getEmailRuntime().config);
74
126
  await sendEmail(
75
127
  {
76
128
  to: [to],
77
129
  subject: opts.subject,
78
- // Deliberately the conventional one-time-code layout: the prompt line,
79
- // then the bare code ALONE on the next line, then the expiry. iOS, Gmail,
80
- // Outlook, and Android all detect a code from this shape and offer to
81
- // autofill it, and anything more decorative is what breaks that. The code
82
- // stays visible TEXT in both MIME parts (the email plugin renders the
83
- // HTML and plain-text alternatives from one React Email tree), never an
84
- // image, so a client that scrapes the text part still finds it. The
85
- // `trailer` below adds Apple's domain-bound AutoFill on top.
86
- body: [
87
- opts.message,
88
- "",
89
- `## ${code}`,
90
- "",
91
- `This code expires in ${expiresIn(opts.codeTtlSeconds)}.`,
92
- "",
93
- "If you did not request this code, you can ignore this email.",
94
- ].join("\n"),
130
+ body: codeEmailHtmlBody(code, opts),
95
131
  },
96
132
  from,
97
133
  undefined,
98
- // Apple's domain-bound AutoFill, layered ON TOP of the conventional layout
99
- // above (which is what iOS/Gmail/Outlook/Android already detect
100
- // heuristically). Passed as a delivery OPTION rather than appended to the
101
- // body because iOS only honours `@<domain> #<code>` as the message's final
102
- // line, and the branded footer renders after the body. Omitted when no
103
- // public domain is configured - there is no host to bind the code to.
104
- object.optional("trailer", autofillTrailer(opts.publicDomain, code)),
134
+ { text: codeEmailTextBody(code, opts) },
105
135
  );
106
136
  };
107
137
 
package/src/cli.ts CHANGED
@@ -141,9 +141,6 @@ export async function runCli(argv: string[]): Promise<void> {
141
141
  sessionTtlSeconds: opts.sessionTtl ? Number(opts.sessionTtl) : undefined,
142
142
  codeTtlSeconds: opts.codeTtl ? Number(opts.codeTtl) : undefined,
143
143
  sessionCutoff: opts.sessionCutoff,
144
- // Also given to portr below; the gate uses it only to bind the emailed code
145
- // to this host for Apple's AutoFill.
146
- publicDomain: opts.publicDomain,
147
144
  };
148
145
 
149
146
  // 1. Spawn the wrapped app with the PRIVATE port. It binds loopback; only the
package/src/plugin.ts CHANGED
@@ -25,7 +25,6 @@ import {
25
25
  BRAND_NAME_ENV,
26
26
  CODE_TTL_ENV,
27
27
  MESSAGE_ENV,
28
- PUBLIC_DOMAIN_ENV,
29
28
  SESSION_TTL_ENV,
30
29
  SUBJECT_ENV,
31
30
  } from "./env.ts";
@@ -85,15 +84,6 @@ export interface AuthGateConfig extends BasePluginConfig {
85
84
  * means no cutoff.
86
85
  */
87
86
  sessionCutoff?: string | number | Date;
88
- /**
89
- * The public host the gate is served on. Env TUNNEL_PUBLIC_DOMAIN.
90
- *
91
- * Only used to bind the emailed code to this site for Apple's domain-bound
92
- * AutoFill (see {@link SendCodeOptions.publicDomain}); the gate does not route
93
- * on it. Absent, the code email simply omits that trailer and still relies on
94
- * the conventional layout every client detects heuristically.
95
- */
96
- publicDomain?: string;
97
87
  /** Deliver a code to an address. Wired by the app to the email plugin. */
98
88
  sendCode?: (email: string, code: string, opts: SendCodeOptions) => Promise<void>;
99
89
  }
@@ -110,16 +100,6 @@ export interface SendCodeOptions {
110
100
  * that drifts from the configured TTL.
111
101
  */
112
102
  codeTtlSeconds: number;
113
- /**
114
- * The public host the gate is served on, when one is configured.
115
- *
116
- * `sendCode` turns this into Apple's `@<domain> #<code>` trailer, which binds
117
- * the code to THIS site: iOS then offers it only for a matching domain, so a
118
- * code phished from elsewhere is not autofilled here. Undefined simply omits
119
- * the trailer - every client still detects the code from the conventional
120
- * layout.
121
- */
122
- publicDomain?: string;
123
103
  }
124
104
 
125
105
  /** Resolved gate config with env fallbacks + defaults applied. */
@@ -133,8 +113,6 @@ export interface ResolvedAuthGateConfig {
133
113
  maxAttempts: number;
134
114
  /** Force-clear cutoff in epoch ms; `0` when unset. */
135
115
  sessionCutoffMs: number;
136
- /** Public host for the AutoFill trailer, when configured. */
137
- publicDomain?: string;
138
116
  }
139
117
 
140
118
  const DEFAULTS = {
@@ -172,7 +150,6 @@ export function resolveAuthGateConfig(config: AuthGateConfig): ResolvedAuthGateC
172
150
  codeTtlSeconds: env.positiveInt(config.codeTtlSeconds, CODE_TTL_ENV, DEFAULTS.codeTtlSeconds),
173
151
  maxAttempts: config.maxAttempts ?? DEFAULTS.maxAttempts,
174
152
  sessionCutoffMs: resolveSessionCutoff(config.sessionCutoff),
175
- ...object.optional("publicDomain", env.string(config.publicDomain, PUBLIC_DOMAIN_ENV)),
176
153
  };
177
154
  }
178
155
 
@@ -257,7 +234,6 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
257
234
  brandName: this.resolved.brandName,
258
235
  message: this.resolved.message,
259
236
  codeTtlSeconds: this.resolved.codeTtlSeconds,
260
- ...object.optional("publicDomain", this.resolved.publicDomain),
261
237
  });
262
238
  } catch (error) {
263
239
  logger.warn("failed to send OTP email", { error });