@dbx-tools/shared-email-template 0.6.52 → 0.6.53
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 +32 -2
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/template.d.ts +41 -0
- package/lib/src/template.js +63 -2
- package/package.json +2 -2
- package/src/template.tsx +90 -0
package/README.md
CHANGED
|
@@ -40,6 +40,36 @@ import { EmailDocument } from "@dbx-tools/shared-email-template";
|
|
|
40
40
|
Node runtimes should pass this component to `@react-email/render`.
|
|
41
41
|
`@dbx-tools/email` does that automatically for SMTP and local outbox delivery.
|
|
42
42
|
|
|
43
|
+
## Bind A One-Time Code To Your Domain
|
|
44
|
+
|
|
45
|
+
Apple's AutoFill can tie a code to a specific website, so the keyboard offers it
|
|
46
|
+
only on the matching domain - which is what stops a code phished from one site
|
|
47
|
+
being autofilled into another. The format is `@<domain> #<code>` and iOS honours
|
|
48
|
+
it only as the message's **final** line, so it is a document-level `trailer` prop
|
|
49
|
+
rather than something a caller appends to `body` (the branded footer renders after
|
|
50
|
+
the body).
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import { autofillTrailer, EmailDocument } from "@dbx-tools/shared-email-template";
|
|
54
|
+
|
|
55
|
+
<EmailDocument
|
|
56
|
+
subject="Your verification code"
|
|
57
|
+
body={"Your verification code is:\n\n## 123456"}
|
|
58
|
+
trailer={autofillTrailer("demo.apps.dbx.tools", "123456")}
|
|
59
|
+
/>;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`autofillTrailer()` normalizes a configured URL down to the bare host iOS matches
|
|
63
|
+
on (scheme, `www.`, port, path, and trailing dot are stripped) and returns
|
|
64
|
+
`undefined` when there is nothing to match - no domain, no code, or a hostless
|
|
65
|
+
value like `localhost`. Passing `undefined` renders no trailer, so a deployment
|
|
66
|
+
without a public domain simply omits it.
|
|
67
|
+
|
|
68
|
+
This is a strict upgrade on top of the conventional layout, never a replacement:
|
|
69
|
+
a prompt line followed by the bare code alone is what iOS, Gmail, Outlook, and
|
|
70
|
+
Android already detect heuristically. `@dbx-tools/email` accepts the built string
|
|
71
|
+
as a delivery option (`sendEmail(message, from, signal, { trailer })`).
|
|
72
|
+
|
|
43
73
|
## Reuse The Body Preview
|
|
44
74
|
|
|
45
75
|
```tsx
|
|
@@ -74,8 +104,8 @@ font, name, tagline, website, and fetchable logo URL.
|
|
|
74
104
|
|
|
75
105
|
## Modules
|
|
76
106
|
|
|
77
|
-
- `.` - `EmailDocument`, `EmailCard`, `EmailBody`, brand
|
|
78
|
-
content normalization.
|
|
107
|
+
- `.` - `EmailDocument`, `EmailCard`, `EmailBody`, `autofillTrailer()`, brand
|
|
108
|
+
types/defaults, and content normalization.
|
|
79
109
|
|
|
80
110
|
Pair this package with [`@dbx-tools/shared-email`](../email) for wire schemas,
|
|
81
111
|
[`@dbx-tools/email`](../../node/email) for delivery, and
|
package/index.ts
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export * as template from "./src/template.tsx";
|
|
6
|
-
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
|
|
6
|
+
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
|
|
7
7
|
export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * as template from "./src/template.tsx";
|
|
2
|
-
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
|
|
2
|
+
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
|
|
3
3
|
export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
|
package/lib/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export * as template from "./src/template.js";
|
|
5
|
-
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.js";
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.js";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIHRlbXBsYXRlIGZyb20gXCIuL3NyYy90ZW1wbGF0ZS50c3hcIjtcbmV4cG9ydCB7IGVtYWlsQnJhbmRGcm9tQ29udGV4dCwgZGVmYXVsdEVtYWlsQnJhbmQsIHJlc29sdmVFbWFpbEJyYW5kLCBub3JtYWxpemVFbWFpbE1hcmtkb3duLCBFbWFpbEJvZHksIGF1dG9maWxsVHJhaWxlciwgRW1haWxDYXJkLCBFbWFpbERvY3VtZW50IH0gZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEJyYW5kLCBSZXNvbHZlZEVtYWlsQnJhbmQsIEVtYWlsQm9keVByb3BzLCBFbWFpbERvY3VtZW50UHJvcHMgfSBmcm9tIFwiLi9zcmMvdGVtcGxhdGUudHN4XCI7XG4iXX0=
|
package/lib/src/template.d.ts
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* the body component is reused directly by browser approval and compose views.
|
|
6
6
|
* Both default to the repository brand while accepting a consumer override.
|
|
7
7
|
*
|
|
8
|
+
* {@link autofillTrailer} + the document's `trailer` prop cover Apple's
|
|
9
|
+
* domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
|
|
10
|
+
* the message's final line - hence a document-level prop rather than something a
|
|
11
|
+
* caller can append to `body`.
|
|
12
|
+
*
|
|
8
13
|
* @module
|
|
9
14
|
*/
|
|
10
15
|
import { type BrandContext } from "@dbx-tools/shared-core";
|
|
@@ -46,7 +51,43 @@ export interface EmailDocumentProps extends EmailBodyProps {
|
|
|
46
51
|
subject?: string;
|
|
47
52
|
headers?: ReadonlyArray<readonly [string, string]>;
|
|
48
53
|
footer?: string;
|
|
54
|
+
/**
|
|
55
|
+
* A machine-read line emitted as the very LAST line of both MIME parts, after
|
|
56
|
+
* the branded footer and outside the card.
|
|
57
|
+
*
|
|
58
|
+
* This exists for Apple's domain-bound one-time-code AutoFill, whose format is
|
|
59
|
+
* `@<domain> #<code>` and which iOS only honours when it is the final line of
|
|
60
|
+
* the message - so it cannot be appended to `body`, which the branded footer
|
|
61
|
+
* would then follow. Rendered as visible-but-quiet text rather than hidden
|
|
62
|
+
* (`display: none` content is a spam signal, and a client that ignores the
|
|
63
|
+
* convention should show something innocuous rather than nothing).
|
|
64
|
+
*
|
|
65
|
+
* See {@link autofillTrailer}, which builds the string.
|
|
66
|
+
*/
|
|
67
|
+
trailer?: string;
|
|
49
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
|
|
71
|
+
* when either part is missing.
|
|
72
|
+
*
|
|
73
|
+
* iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
|
|
74
|
+
* offers the code only for the matching domain, which is what stops a code
|
|
75
|
+
* phished from one site being autofilled into another. Without it, iOS still
|
|
76
|
+
* detects a code heuristically from the conventional layout (prompt line, bare
|
|
77
|
+
* code alone on the next line), as do Gmail, Outlook, and Android - so this is a
|
|
78
|
+
* strict upgrade on top of that baseline, never a replacement for it.
|
|
79
|
+
*
|
|
80
|
+
* The domain is normalized to bare host form: a scheme, a `www.` prefix, any
|
|
81
|
+
* path, and a trailing dot are stripped, since iOS matches the host the site is
|
|
82
|
+
* served from. A domain with no dot (`localhost`) is rejected - it cannot be the
|
|
83
|
+
* public host of a real deployment, and a trailer iOS will never match is just a
|
|
84
|
+
* confusing line in the email.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
|
|
88
|
+
* autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
|
|
89
|
+
*/
|
|
90
|
+
export declare const autofillTrailer: (domain: string | undefined, code: string | undefined) => string | undefined;
|
|
50
91
|
/** Branded message card shared by the full document and browser previews. */
|
|
51
92
|
export declare const EmailCard: ({ body, subject, headers, footer, brand: brandInput, }: EmailDocumentProps) => React.JSX.Element;
|
|
52
93
|
/** Complete responsive, branded React Email document. */
|
package/lib/src/template.js
CHANGED
|
@@ -6,6 +6,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* the body component is reused directly by browser approval and compose views.
|
|
7
7
|
* Both default to the repository brand while accepting a consumer override.
|
|
8
8
|
*
|
|
9
|
+
* {@link autofillTrailer} + the document's `trailer` prop cover Apple's
|
|
10
|
+
* domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
|
|
11
|
+
* the message's final line - hence a document-level prop rather than something a
|
|
12
|
+
* caller can append to `body`.
|
|
13
|
+
*
|
|
9
14
|
* @module
|
|
10
15
|
*/
|
|
11
16
|
import { brand } from "@dbx-tools/shared-core";
|
|
@@ -124,6 +129,42 @@ export const EmailBody = ({ body, brand: brandInput }) => {
|
|
|
124
129
|
},
|
|
125
130
|
}, children: normalizeEmailMarkdown(body) }));
|
|
126
131
|
};
|
|
132
|
+
/**
|
|
133
|
+
* Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
|
|
134
|
+
* when either part is missing.
|
|
135
|
+
*
|
|
136
|
+
* iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
|
|
137
|
+
* offers the code only for the matching domain, which is what stops a code
|
|
138
|
+
* phished from one site being autofilled into another. Without it, iOS still
|
|
139
|
+
* detects a code heuristically from the conventional layout (prompt line, bare
|
|
140
|
+
* code alone on the next line), as do Gmail, Outlook, and Android - so this is a
|
|
141
|
+
* strict upgrade on top of that baseline, never a replacement for it.
|
|
142
|
+
*
|
|
143
|
+
* The domain is normalized to bare host form: a scheme, a `www.` prefix, any
|
|
144
|
+
* path, and a trailing dot are stripped, since iOS matches the host the site is
|
|
145
|
+
* served from. A domain with no dot (`localhost`) is rejected - it cannot be the
|
|
146
|
+
* public host of a real deployment, and a trailer iOS will never match is just a
|
|
147
|
+
* confusing line in the email.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
|
|
151
|
+
* autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
|
|
152
|
+
*/
|
|
153
|
+
export const autofillTrailer = (domain, code) => {
|
|
154
|
+
if (!domain || !code)
|
|
155
|
+
return undefined;
|
|
156
|
+
const host = domain
|
|
157
|
+
.trim()
|
|
158
|
+
.toLowerCase()
|
|
159
|
+
.replace(/^[a-z][a-z\d+.-]*:\/\//, "")
|
|
160
|
+
.replace(/^www\./, "")
|
|
161
|
+
.replace(/[/?#].*$/, "")
|
|
162
|
+
.replace(/\.$/, "")
|
|
163
|
+
.replace(/:\d+$/, "");
|
|
164
|
+
if (!host.includes("."))
|
|
165
|
+
return undefined;
|
|
166
|
+
return `@${host} #${code.trim()}`;
|
|
167
|
+
};
|
|
127
168
|
function BrandMark({ theme }) {
|
|
128
169
|
if (theme.logoUrl) {
|
|
129
170
|
return (_jsx(Img, { src: theme.logoUrl, alt: theme.name, height: "34", style: { display: "block", height: "34px", width: "auto" } }));
|
|
@@ -180,6 +221,26 @@ export const EmailCard = ({ body, subject = "Message", headers, footer, brand: b
|
|
|
180
221
|
textDecoration: "none",
|
|
181
222
|
}, children: theme.name })) : null] }) })] }));
|
|
182
223
|
};
|
|
224
|
+
/**
|
|
225
|
+
* The machine-read trailer line, rendered LAST and outside the card.
|
|
226
|
+
*
|
|
227
|
+
* Deliberately the final element of `<Body>`: iOS only binds a code to a domain
|
|
228
|
+
* when `@<domain> #<code>` is the last line of the message, so nothing - not even
|
|
229
|
+
* the branded footer - may follow it. Styled small and muted rather than hidden,
|
|
230
|
+
* because `display: none` text is a spam-filter signal.
|
|
231
|
+
*/
|
|
232
|
+
function AutofillTrailer({ trailer, theme, }) {
|
|
233
|
+
if (!trailer)
|
|
234
|
+
return null;
|
|
235
|
+
return (_jsx(Text, { style: {
|
|
236
|
+
color: theme.muted,
|
|
237
|
+
fontFamily: theme.fontFamily,
|
|
238
|
+
fontSize: "11px",
|
|
239
|
+
margin: "16px auto 0",
|
|
240
|
+
maxWidth: "620px",
|
|
241
|
+
textAlign: "center",
|
|
242
|
+
}, children: trailer }));
|
|
243
|
+
}
|
|
183
244
|
/** Complete responsive, branded React Email document. */
|
|
184
245
|
export const EmailDocument = (props) => {
|
|
185
246
|
const theme = resolveEmailBrand(props.brand);
|
|
@@ -189,6 +250,6 @@ export const EmailDocument = (props) => {
|
|
|
189
250
|
margin: 0,
|
|
190
251
|
padding: "28px 12px",
|
|
191
252
|
};
|
|
192
|
-
return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }),
|
|
253
|
+
return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }), _jsxs(Body, { style: pageStyle, children: [_jsx(EmailCard, { ...props }), _jsx(AutofillTrailer, { trailer: props.trailer, theme: theme })] })] }));
|
|
193
254
|
};
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQXFCLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsRUFBRSxFQUNGLElBQUksRUFDSixHQUFHLEVBQ0gsSUFBSSxFQUNKLFFBQVEsRUFDUixPQUFPLEVBQ1AsR0FBRyxFQUNILE9BQU8sRUFDUCxJQUFJLEdBQ0wsTUFBTSx5QkFBeUIsQ0FBQztBQXFDakMsU0FBUyxvQkFBb0IsQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQXFCLEVBQWMsRUFBRTtJQUN6RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ25FLE9BQU87UUFDTCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzlCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDbEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ3JDLEtB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akMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLFdBQVc7S0FDckIsQ0FBQztJQUNGLE9BQU8sQ0FDTCxNQUFDLElBQUksSUFBQyxJQUFJLEVBQUMsSUFBSSxhQUNiLEtBQUMsSUFBSSxLQUFHLEVBQ1IsS0FBQyxPQUFPLGNBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEdBQVcsRUFDL0MsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFFLFNBQVMsWUFDcEIsS0FBQyxTQUFTLE9BQUssS0FBSyxHQUFJLEdBQ25CLElBQ0YsQ0FDUixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbml2ZXJzYWwgUmVhY3QgRW1haWwgcHJlc2VudGF0aW9uIGZvciBkYngtdG9vbHMgZW1haWwgZmxvd3MuXG4gKlxuICogVGhlIGRvY3VtZW50IGNvbXBvbmVudCByZW5kZXJzIG9uIHRoZSBzZXJ2ZXIgdGhyb3VnaCBgQHJlYWN0LWVtYWlsL3JlbmRlcmA7XG4gKiB0aGUgYm9keSBjb21wb25lbnQgaXMgcmV1c2VkIGRpcmVjdGx5IGJ5IGJyb3dzZXIgYXBwcm92YWwgYW5kIGNvbXBvc2Ugdmlld3MuXG4gKiBCb3RoIGRlZmF1bHQgdG8gdGhlIHJlcG9zaXRvcnkgYnJhbmQgd2hpbGUgYWNjZXB0aW5nIGEgY29uc3VtZXIgb3ZlcnJpZGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBicmFuZCwgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQm9keSxcbiAgQ29sdW1uLFxuICBDb250YWluZXIsXG4gIEhlYWQsXG4gIEhlYWRpbmcsXG4gIEhyLFxuICBIdG1sLFxuICBJbWcsXG4gIExpbmssXG4gIE1hcmtkb3duLFxuICBQcmV2aWV3LFxuICBSb3csXG4gIFNlY3Rpb24sXG4gIFRleHQsXG59IGZyb20gXCJAcmVhY3QtZW1haWwvY29tcG9uZW50c1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8qKiBFbWFpbC1zYWZlIGJyYW5kIHZhbHVlcyB1c2VkIGJ5IHRoZSBSZWFjdCBFbWFpbCB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCcmFuZCB7XG4gIGFjY2VudDogc3RyaW5nO1xuICBvbkFjY2VudD86IHN0cmluZztcbiAgZm9udEZhbWlseTogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBsb2dvVXJsPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzdXJmYWNlPzogc3RyaW5nO1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBtdXRlZD86IHN0cmluZztcbiAgYm9yZGVyPzogc3RyaW5nO1xuICB0YWdsaW5lPzogc3RyaW5nO1xuICB3ZWJzaXRlPzogc3RyaW5nO1xufVxuXG4vKiogQ29tcGxldGUgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIHRoZSBkYngtdG9vbHMgZGVmYXVsdCBicmFuZC4gKi9cbmV4cG9ydCB0eXBlIFJlc29sdmVkRW1haWxCcmFuZCA9IFJlcXVpcmVkPFxuICBQaWNrPFxuICAgIEVtYWlsQnJhbmQsXG4gICAgfCBcImFjY2VudFwiXG4gICAgfCBcIm9uQWNjZW50XCJcbiAgICB8IFwiZm9udEZhbWlseVwiXG4gICAgfCBcIm5hbWVcIlxuICAgIHwgXCJiYWNrZ3JvdW5kXCJcbiAgICB8IFwic3VyZmFjZVwiXG4gICAgfCBcImZvcmVncm91bmRcIlxuICAgIHwgXCJtdXRlZFwiXG4gICAgfCBcImJvcmRlclwiXG4gICAgfCBcInRhZ2xpbmVcIlxuICA+XG4+ICZcbiAgUGljazxFbWFpbEJyYW5kLCBcImxvZ29VcmxcIiB8IFwid2Vic2l0ZVwiPjtcblxuZnVuY3Rpb24gaXNSZW5kZXJhYmxlSW1hZ2VVcmwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgL14oPzpodHRwcz86fGRhdGE6fGNpZDopL2kudGVzdCh2YWx1ZSk7XG59XG5cbi8qKiBQcm9qZWN0IGEgcG9ydGFibGUgYnJhbmQgY29udGV4dCBpbnRvIGVtYWlsLXNhZmUgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IGVtYWlsQnJhbmRGcm9tQ29udGV4dCA9IChjb250ZXh0OiBCcmFuZENvbnRleHQpOiBFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbG9nbyA9IGNvbnRleHQuYXNzZXRzLmxvZ28uZGFyayA/PyBjb250ZXh0LmFzc2V0cy5sb2dvLmxpZ2h0O1xuICByZXR1cm4ge1xuICAgIGFjY2VudDogY29udGV4dC5jb2xvcnMucHJpbWFyeSxcbiAgICBvbkFjY2VudDogXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogY29udGV4dC50eXBvZ3JhcGh5LnNhbnMsXG4gICAgbmFtZTogY29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IGNvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogY29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBjb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IGNvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBjb250ZXh0LnRhZ2xpbmUsXG4gICAgd2Vic2l0ZTogY29udGV4dC5saW5rcy53ZWJzaXRlLFxuICAgIC4uLihpc1JlbmRlcmFibGVJbWFnZVVybChsb2dvKSA/IHsgbG9nb1VybDogbG9nbyB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIFRoZSByZXBvc2l0b3J5IGJyYW5kIHVzZWQgYnkgZXZlcnkgZW1haWwgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RW1haWxCcmFuZDogRW1haWxCcmFuZCA9IGVtYWlsQnJhbmRGcm9tQ29udGV4dChicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0KTtcblxuLyoqIE1lcmdlIGEgcGFydGlhbCBjb25zdW1lciBicmFuZCBvdmVyIHRoZSByZXBvc2l0b3J5IGRlZmF1bHQuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVtYWlsQnJhbmQgPSAoaW5wdXQ/OiBFbWFpbEJyYW5kKTogUmVzb2x2ZWRFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbWVyZ2VkID0geyAuLi5kZWZhdWx0RW1haWxCcmFuZCwgLi4uaW5wdXQgfTtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IG1lcmdlZC5hY2NlbnQsXG4gICAgb25BY2NlbnQ6IG1lcmdlZC5vbkFjY2VudCA/PyBcIiNmZmZmZmZcIixcbiAgICBmb250RmFtaWx5OiBtZXJnZWQuZm9udEZhbWlseSxcbiAgICBuYW1lOiBtZXJnZWQubmFtZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0Lm5hbWUsXG4gICAgYmFja2dyb3VuZDogbWVyZ2VkLmJhY2tncm91bmQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuc3VyZmFjZSxcbiAgICBzdXJmYWNlOiBtZXJnZWQuc3VyZmFjZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5iYWNrZ3JvdW5kLFxuICAgIGZvcmVncm91bmQ6IG1lcmdlZC5mb3JlZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmZvcmVncm91bmQsXG4gICAgbXV0ZWQ6IG1lcmdlZC5tdXRlZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IG1lcmdlZC5ib3JkZXIgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYm9yZGVyLFxuICAgIHRhZ2xpbmU6IG1lcmdlZC50YWdsaW5lID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudGFnbGluZSxcbiAgICAuLi4obWVyZ2VkLmxvZ29VcmwgPyB7IGxvZ29Vcmw6IG1lcmdlZC5sb2dvVXJsIH0gOiB7fSksXG4gICAgLi4uKG1lcmdlZC53ZWJzaXRlID8geyB3ZWJzaXRlOiBtZXJnZWQud2Vic2l0ZSB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIE5vcm1hbGl6ZSBpbmRlbnRhdGlvbiBpbiBhdXRob3JlZCBjb250ZW50IHdpdGhvdXQgY29uc3RyYWluaW5nIGl0cyBzdHJ1Y3R1cmUuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRW1haWxNYXJrZG93biA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICB3aGlsZSAobGluZXNbMF0/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMuc2hpZnQoKTtcbiAgd2hpbGUgKGxpbmVzLmF0KC0xKT8udHJpbSgpID09PSBcIlwiKSBsaW5lcy5wb3AoKTtcbiAgY29uc3Qgbm9uQmxhbmsgPSBsaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpLmxlbmd0aCA+IDApO1xuICBjb25zdCBpbmRlbnQgPSBub25CbGFuay5yZWR1Y2UoKG1pbmltdW0sIGxpbmUpID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IGxpbmUubWF0Y2goL15cXHMqLyk/LlswXS5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gTWF0aC5taW4obWluaW11bSwgd2lkdGgpO1xuICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRlbnQpIHx8IGluZGVudCA9PT0gMCkgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoTWF0aC5taW4oaW5kZW50LCBsaW5lLmxlbmd0aCkpKS5qb2luKFwiXFxuXCIpO1xufTtcblxuLyoqIFByb3BzIGZvciB0aGUgcmV1c2FibGUgbWVzc2FnZS1ib2R5IGNvbXBvbmVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCb2R5UHJvcHMge1xuICBib2R5OiBzdHJpbmc7XG4gIGJyYW5kPzogRW1haWxCcmFuZDtcbn1cblxuLyoqIFJlbmRlciByaWNoIG1lc3NhZ2UgY29udGVudCB3aXRoIGVtYWlsLWNsaWVudC1zYWZlIGlubGluZSBzdHlsZXMuICovXG5leHBvcnQgY29uc3QgRW1haWxCb2R5ID0gKHsgYm9keSwgYnJhbmQ6IGJyYW5kSW5wdXQgfTogRW1haWxCb2R5UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8TWFya2Rvd25cbiAgICAgIG1hcmtkb3duQ29udGFpbmVyU3R5bGVzPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBmb250U2l6ZTogXCIxNXB4XCIsXG4gICAgICAgIGxpbmVIZWlnaHQ6IFwiMS42NVwiLFxuICAgICAgfX1cbiAgICAgIG1hcmtkb3duQ3VzdG9tU3R5bGVzPXt7XG4gICAgICAgIGgxOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIzMHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS4yXCIsIG1hcmdpbjogXCIwIDAgMjBweFwiIH0sXG4gICAgICAgIGgyOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIyM3B4XCIsIGxpbmVIZWlnaHQ6IFwiMS4zXCIsIG1hcmdpbjogXCIyOHB4IDAgMTJweFwiIH0sXG4gICAgICAgIGgzOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxOHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS40XCIsIG1hcmdpbjogXCIyNHB4IDAgMTBweFwiIH0sXG4gICAgICAgIHA6IHsgbWFyZ2luOiBcIjAgMCAxNnB4XCIgfSxcbiAgICAgICAgbGluazogeyBjb2xvcjogdGhlbWUuYWNjZW50LCBmb250V2VpZ2h0OiA2MDAsIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgICAgIGJsb2NrUXVvdGU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyTGVmdDogYDRweCBzb2xpZCAke3RoZW1lLmFjY2VudH1gLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIwIDEwcHggMTBweCAwXCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgbWFyZ2luOiBcIjIwcHggMFwiLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMTRweCAxOHB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVJbmxpbmU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjJweCA1cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgY29kZUJsb2NrOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgICAgZm9udEZhbWlseTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC50eXBvZ3JhcGh5Lm1vbm8sXG4gICAgICAgICAgZm9udFNpemU6IFwiMTNweFwiLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE2cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgaHI6IHsgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiBcIjI4cHggMFwiIH0sXG4gICAgICAgIGltYWdlOiB7IGJvcmRlclJhZGl1czogXCIxMHB4XCIsIGhlaWdodDogXCJhdXRvXCIsIG1heFdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICBsaTogeyBtYXJnaW46IFwiNnB4IDBcIiB9LFxuICAgICAgICB0YWJsZTogeyBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLCBtYXJnaW46IFwiMjBweCAwXCIsIHdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICB0aDoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgICAgdGQ6IHtcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge25vcm1hbGl6ZUVtYWlsTWFya2Rvd24oYm9keSl9XG4gICAgPC9NYXJrZG93bj5cbiAgKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIGNvbXBsZXRlIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbERvY3VtZW50UHJvcHMgZXh0ZW5kcyBFbWFpbEJvZHlQcm9wcyB7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+O1xuICBmb290ZXI/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIEJyYW5kTWFyayh7IHRoZW1lIH06IHsgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZCB9KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKHRoZW1lLmxvZ29VcmwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEltZ1xuICAgICAgICBzcmM9e3RoZW1lLmxvZ29Vcmx9XG4gICAgICAgIGFsdD17dGhlbWUubmFtZX1cbiAgICAgICAgaGVpZ2h0PVwiMzRcIlxuICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiBcImJsb2NrXCIsIGhlaWdodDogXCIzNHB4XCIsIHdpZHRoOiBcImF1dG9cIiB9fVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5vbkFjY2VudCxcbiAgICAgICAgZm9udFNpemU6IFwiMjBweFwiLFxuICAgICAgICBmb250V2VpZ2h0OiA4MDAsXG4gICAgICAgIGxldHRlclNwYWNpbmc6IFwiLTAuM3B4XCIsXG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3RoZW1lLm5hbWV9XG4gICAgPC9UZXh0PlxuICApO1xufVxuXG5mdW5jdGlvbiBFbnZlbG9wZUhlYWRlcnMoe1xuICBoZWFkZXJzLFxuICB0aGVtZSxcbn06IHtcbiAgaGVhZGVyczogRW1haWxEb2N1bWVudFByb3BzW1wiaGVhZGVyc1wiXTtcbiAgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZDtcbn0pIHtcbiAgaWYgKCFoZWFkZXJzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFxuICAgIDxTZWN0aW9uXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjE0cHggMTZweFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7aGVhZGVycy5tYXAoKFtsYWJlbCwgdmFsdWVdKSA9PiAoXG4gICAgICAgIDxSb3cga2V5PXtgJHtsYWJlbH06JHt2YWx1ZX1gfT5cbiAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogNzAwLFxuICAgICAgICAgICAgICBwYWRkaW5nOiBcIjNweCAxMnB4IDNweCAwXCIsXG4gICAgICAgICAgICAgIHdpZHRoOiBcIjcwcHhcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgIDxDb2x1bW4gc3R5bGU9e3sgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsIGZvbnRTaXplOiBcIjEzcHhcIiwgcGFkZGluZzogXCIzcHggMFwiIH19PlxuICAgICAgICAgICAge3ZhbHVlfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICA8L1Jvdz5cbiAgICAgICkpfVxuICAgIDwvU2VjdGlvbj5cbiAgKTtcbn1cblxuLyoqIEJyYW5kZWQgbWVzc2FnZSBjYXJkIHNoYXJlZCBieSB0aGUgZnVsbCBkb2N1bWVudCBhbmQgYnJvd3NlciBwcmV2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBFbWFpbENhcmQgPSAoe1xuICBib2R5LFxuICBzdWJqZWN0ID0gXCJNZXNzYWdlXCIsXG4gIGhlYWRlcnMsXG4gIGZvb3RlcixcbiAgYnJhbmQ6IGJyYW5kSW5wdXQsXG59OiBFbWFpbERvY3VtZW50UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgIGJvcmRlcjogYDFweCBzb2xpZCAke3RoZW1lLmJvcmRlcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTZweFwiLFxuICAgICAgICBib3hTaGFkb3c6IFwiMCA4cHggMzBweCByZ2JhKDI3LDQ5LDU3LDAuMDgpXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLmZvbnRGYW1pbHksXG4gICAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogdGhlbWUuYWNjZW50LCBwYWRkaW5nOiBcIjIycHggMzBweFwiIH19PlxuICAgICAgICA8QnJhbmRNYXJrIHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IHBhZGRpbmc6IFwiMzRweCAzNHB4IDI0cHhcIiB9fT5cbiAgICAgICAgPEhlYWRpbmdcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIyOHB4XCIsXG4gICAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjVweFwiLFxuICAgICAgICAgICAgbGluZUhlaWdodDogXCIxLjJcIixcbiAgICAgICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7c3ViamVjdH1cbiAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICA8RW52ZWxvcGVIZWFkZXJzIGhlYWRlcnM9e2hlYWRlcnN9IHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgICAgPEVtYWlsQm9keSBib2R5PXtib2R5fSBicmFuZD17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8SHIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiAwIH19IC8+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjIwcHggMzRweCAyNnB4XCIgfX0+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7Zm9vdGVyID8/IHRoZW1lLnRhZ2xpbmV9e1wiIFwifVxuICAgICAgICAgIHt0aGVtZS53ZWJzaXRlID8gKFxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj17dGhlbWUud2Vic2l0ZX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUuYWNjZW50LFxuICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3RoZW1lLm5hbWV9XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKTtcbn07XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvQm9keT5cbiAgICA8L0h0bWw+XG4gICk7XG59O1xuIl19
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsT0FBTyxFQUFFLEtBQUssRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLEVBQ0osUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsT0FBTyxFQUNQLElBQUksR0FDTCxNQUFNLHlCQUF5QixDQUFDO0FBcUNqQyxTQUFTLG9CQUFvQixDQUFDLEtBQXlCO0lBQ3JELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBcUIsRUFBYyxFQUFFO0lBQ3pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbkUsT0FBTztRQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDOUIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUNuQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNsQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ2xDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFD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TUFBTSxFQUFFLENBQUM7UUFDVCxPQUFPLEVBQUUsV0FBVztLQUNyQixDQUFDO0lBQ0YsT0FBTyxDQUNMLE1BQUMsSUFBSSxJQUFDLElBQUksRUFBQyxJQUFJLGFBQ2IsS0FBQyxJQUFJLEtBQUcsRUFDUixLQUFDLE9BQU8sY0FBRSxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsR0FBVyxFQUMvQyxNQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsU0FBUyxhQUNwQixLQUFDLFNBQVMsT0FBSyxLQUFLLEdBQUksRUFDeEIsS0FBQyxlQUFlLElBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBSSxJQUNwRCxJQUNGLENBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pdmVyc2FsIFJlYWN0IEVtYWlsIHByZXNlbnRhdGlvbiBmb3IgZGJ4LXRvb2xzIGVtYWlsIGZsb3dzLlxuICpcbiAqIFRoZSBkb2N1bWVudCBjb21wb25lbnQgcmVuZGVycyBvbiB0aGUgc2VydmVyIHRocm91Z2ggYEByZWFjdC1lbWFpbC9yZW5kZXJgO1xuICogdGhlIGJvZHkgY29tcG9uZW50IGlzIHJldXNlZCBkaXJlY3RseSBieSBicm93c2VyIGFwcHJvdmFsIGFuZCBjb21wb3NlIHZpZXdzLlxuICogQm90aCBkZWZhdWx0IHRvIHRoZSByZXBvc2l0b3J5IGJyYW5kIHdoaWxlIGFjY2VwdGluZyBhIGNvbnN1bWVyIG92ZXJyaWRlLlxuICpcbiAqIHtAbGluayBhdXRvZmlsbFRyYWlsZXJ9ICsgdGhlIGRvY3VtZW50J3MgYHRyYWlsZXJgIHByb3AgY292ZXIgQXBwbGUnc1xuICogZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdoaWNoIHJlcXVpcmVzIGBAPGRvbWFpbj4gIzxjb2RlPmAgdG8gYmVcbiAqIHRoZSBtZXNzYWdlJ3MgZmluYWwgbGluZSAtIGhlbmNlIGEgZG9jdW1lbnQtbGV2ZWwgcHJvcCByYXRoZXIgdGhhbiBzb21ldGhpbmcgYVxuICogY2FsbGVyIGNhbiBhcHBlbmQgdG8gYGJvZHlgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYnJhbmQsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIEJvZHksXG4gIENvbHVtbixcbiAgQ29udGFpbmVyLFxuICBIZWFkLFxuICBIZWFkaW5nLFxuICBIcixcbiAgSHRtbCxcbiAgSW1nLFxuICBMaW5rLFxuICBNYXJrZG93bixcbiAgUHJldmlldyxcbiAgUm93LFxuICBTZWN0aW9uLFxuICBUZXh0LFxufSBmcm9tIFwiQHJlYWN0LWVtYWlsL2NvbXBvbmVudHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG4vKiogRW1haWwtc2FmZSBicmFuZCB2YWx1ZXMgdXNlZCBieSB0aGUgUmVhY3QgRW1haWwgdGVtcGxhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQnJhbmQge1xuICBhY2NlbnQ6IHN0cmluZztcbiAgb25BY2NlbnQ/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbG9nb1VybD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgc3VyZmFjZT86IHN0cmluZztcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgbXV0ZWQ/OiBzdHJpbmc7XG4gIGJvcmRlcj86IHN0cmluZztcbiAgdGFnbGluZT86IHN0cmluZztcbiAgd2Vic2l0ZT86IHN0cmluZztcbn1cblxuLyoqIENvbXBsZXRlIHZhbHVlcyBhZnRlciBhcHBseWluZyB0aGUgZGJ4LXRvb2xzIGRlZmF1bHQgYnJhbmQuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlZEVtYWlsQnJhbmQgPSBSZXF1aXJlZDxcbiAgUGljazxcbiAgICBFbWFpbEJyYW5kLFxuICAgIHwgXCJhY2NlbnRcIlxuICAgIHwgXCJvbkFjY2VudFwiXG4gICAgfCBcImZvbnRGYW1pbHlcIlxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiYmFja2dyb3VuZFwiXG4gICAgfCBcInN1cmZhY2VcIlxuICAgIHwgXCJmb3JlZ3JvdW5kXCJcbiAgICB8IFwibXV0ZWRcIlxuICAgIHwgXCJib3JkZXJcIlxuICAgIHwgXCJ0YWdsaW5lXCJcbiAgPlxuPiAmXG4gIFBpY2s8RW1haWxCcmFuZCwgXCJsb2dvVXJsXCIgfCBcIndlYnNpdGVcIj47XG5cbmZ1bmN0aW9uIGlzUmVuZGVyYWJsZUltYWdlVXJsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIC9eKD86aHR0cHM/OnxkYXRhOnxjaWQ6KS9pLnRlc3QodmFsdWUpO1xufVxuXG4vKiogUHJvamVjdCBhIHBvcnRhYmxlIGJyYW5kIGNvbnRleHQgaW50byBlbWFpbC1zYWZlIHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCBlbWFpbEJyYW5kRnJvbUNvbnRleHQgPSAoY29udGV4dDogQnJhbmRDb250ZXh0KTogRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IGxvZ28gPSBjb250ZXh0LmFzc2V0cy5sb2dvLmRhcmsgPz8gY29udGV4dC5hc3NldHMubG9nby5saWdodDtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IGNvbnRleHQuY29sb3JzLnByaW1hcnksXG4gICAgb25BY2NlbnQ6IFwiI2ZmZmZmZlwiLFxuICAgIGZvbnRGYW1pbHk6IGNvbnRleHQudHlwb2dyYXBoeS5zYW5zLFxuICAgIG5hbWU6IGNvbnRleHQubmFtZSxcbiAgICBiYWNrZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5zdXJmYWNlLFxuICAgIHN1cmZhY2U6IGNvbnRleHQuY29sb3JzLmJhY2tncm91bmQsXG4gICAgZm9yZWdyb3VuZDogY29udGV4dC5jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBtdXRlZDogY29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBjb250ZXh0LmNvbG9ycy5ib3JkZXIsXG4gICAgdGFnbGluZTogY29udGV4dC50YWdsaW5lLFxuICAgIHdlYnNpdGU6IGNvbnRleHQubGlua3Mud2Vic2l0ZSxcbiAgICAuLi4oaXNSZW5kZXJhYmxlSW1hZ2VVcmwobG9nbykgPyB7IGxvZ29Vcmw6IGxvZ28gfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBUaGUgcmVwb3NpdG9yeSBicmFuZCB1c2VkIGJ5IGV2ZXJ5IGVtYWlsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEVtYWlsQnJhbmQ6IEVtYWlsQnJhbmQgPSBlbWFpbEJyYW5kRnJvbUNvbnRleHQoYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dCk7XG5cbi8qKiBNZXJnZSBhIHBhcnRpYWwgY29uc3VtZXIgYnJhbmQgb3ZlciB0aGUgcmVwb3NpdG9yeSBkZWZhdWx0LiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVFbWFpbEJyYW5kID0gKGlucHV0PzogRW1haWxCcmFuZCk6IFJlc29sdmVkRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4uZGVmYXVsdEVtYWlsQnJhbmQsIC4uLmlucHV0IH07XG4gIHJldHVybiB7XG4gICAgYWNjZW50OiBtZXJnZWQuYWNjZW50LFxuICAgIG9uQWNjZW50OiBtZXJnZWQub25BY2NlbnQgPz8gXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogbWVyZ2VkLmZvbnRGYW1pbHksXG4gICAgbmFtZTogbWVyZ2VkLm5hbWUgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IG1lcmdlZC5iYWNrZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogbWVyZ2VkLnN1cmZhY2UgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBtZXJnZWQuZm9yZWdyb3VuZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBtZXJnZWQubXV0ZWQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBtZXJnZWQuYm9yZGVyID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBtZXJnZWQudGFnbGluZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnRhZ2xpbmUsXG4gICAgLi4uKG1lcmdlZC5sb2dvVXJsID8geyBsb2dvVXJsOiBtZXJnZWQubG9nb1VybCB9IDoge30pLFxuICAgIC4uLihtZXJnZWQud2Vic2l0ZSA/IHsgd2Vic2l0ZTogbWVyZ2VkLndlYnNpdGUgfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBOb3JtYWxpemUgaW5kZW50YXRpb24gaW4gYXV0aG9yZWQgY29udGVudCB3aXRob3V0IGNvbnN0cmFpbmluZyBpdHMgc3RydWN0dXJlLiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24gPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgd2hpbGUgKGxpbmVzWzBdPy50cmltKCkgPT09IFwiXCIpIGxpbmVzLnNoaWZ0KCk7XG4gIHdoaWxlIChsaW5lcy5hdCgtMSk/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMucG9wKCk7XG4gIGNvbnN0IG5vbkJsYW5rID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgY29uc3QgaW5kZW50ID0gbm9uQmxhbmsucmVkdWNlKChtaW5pbXVtLCBsaW5lKSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoID8/IDA7XG4gICAgcmV0dXJuIE1hdGgubWluKG1pbmltdW0sIHdpZHRoKTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZW50KSB8fCBpbmRlbnQgPT09IDApIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKE1hdGgubWluKGluZGVudCwgbGluZS5sZW5ndGgpKSkuam9pbihcIlxcblwiKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIHJldXNhYmxlIG1lc3NhZ2UtYm9keSBjb21wb25lbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQm9keVByb3BzIHtcbiAgYm9keTogc3RyaW5nO1xuICBicmFuZD86IEVtYWlsQnJhbmQ7XG59XG5cbi8qKiBSZW5kZXIgcmljaCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBlbWFpbC1jbGllbnQtc2FmZSBpbmxpbmUgc3R5bGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsQm9keSA9ICh7IGJvZHksIGJyYW5kOiBicmFuZElucHV0IH06IEVtYWlsQm9keVByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPE1hcmtkb3duXG4gICAgICBtYXJrZG93bkNvbnRhaW5lclN0eWxlcz17e1xuICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTVweFwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNjVcIixcbiAgICAgIH19XG4gICAgICBtYXJrZG93bkN1c3RvbVN0eWxlcz17e1xuICAgICAgICBoMTogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMzBweFwiLCBsaW5lSGVpZ2h0OiBcIjEuMlwiLCBtYXJnaW46IFwiMCAwIDIwcHhcIiB9LFxuICAgICAgICBoMjogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMjNweFwiLCBsaW5lSGVpZ2h0OiBcIjEuM1wiLCBtYXJnaW46IFwiMjhweCAwIDEycHhcIiB9LFxuICAgICAgICBoMzogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMThweFwiLCBsaW5lSGVpZ2h0OiBcIjEuNFwiLCBtYXJnaW46IFwiMjRweCAwIDEwcHhcIiB9LFxuICAgICAgICBwOiB7IG1hcmdpbjogXCIwIDAgMTZweFwiIH0sXG4gICAgICAgIGxpbms6IHsgY29sb3I6IHRoZW1lLmFjY2VudCwgZm9udFdlaWdodDogNjAwLCB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIiB9LFxuICAgICAgICBibG9ja1F1b3RlOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlckxlZnQ6IGA0cHggc29saWQgJHt0aGVtZS5hY2NlbnR9YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMCAxMHB4IDEwcHggMFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE0cHggMThweFwiLFxuICAgICAgICB9LFxuICAgICAgICBjb2RlSW5saW5lOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBmb250RmFtaWx5OiBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnR5cG9ncmFwaHkubW9ubyxcbiAgICAgICAgICBmb250U2l6ZTogXCIxM3B4XCIsXG4gICAgICAgICAgcGFkZGluZzogXCIycHggNXB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVCbG9jazoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICBtYXJnaW46IFwiMjBweCAwXCIsXG4gICAgICAgICAgcGFkZGluZzogXCIxNnB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGhyOiB7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogXCIyOHB4IDBcIiB9LFxuICAgICAgICBpbWFnZTogeyBib3JkZXJSYWRpdXM6IFwiMTBweFwiLCBoZWlnaHQ6IFwiYXV0b1wiLCBtYXhXaWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgbGk6IHsgbWFyZ2luOiBcIjZweCAwXCIgfSxcbiAgICAgICAgdGFibGU6IHsgYm9yZGVyQ29sbGFwc2U6IFwiY29sbGFwc2VcIiwgbWFyZ2luOiBcIjIwcHggMFwiLCB3aWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgdGg6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHRkOiB7XG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtub3JtYWxpemVFbWFpbE1hcmtkb3duKGJvZHkpfVxuICAgIDwvTWFya2Rvd24+XG4gICk7XG59O1xuXG4vKiogUHJvcHMgZm9yIHRoZSBjb21wbGV0ZSBSZWFjdCBFbWFpbCBkb2N1bWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxEb2N1bWVudFByb3BzIGV4dGVuZHMgRW1haWxCb2R5UHJvcHMge1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPjtcbiAgZm9vdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBtYWNoaW5lLXJlYWQgbGluZSBlbWl0dGVkIGFzIHRoZSB2ZXJ5IExBU1QgbGluZSBvZiBib3RoIE1JTUUgcGFydHMsIGFmdGVyXG4gICAqIHRoZSBicmFuZGVkIGZvb3RlciBhbmQgb3V0c2lkZSB0aGUgY2FyZC5cbiAgICpcbiAgICogVGhpcyBleGlzdHMgZm9yIEFwcGxlJ3MgZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdob3NlIGZvcm1hdCBpc1xuICAgKiBgQDxkb21haW4+ICM8Y29kZT5gIGFuZCB3aGljaCBpT1Mgb25seSBob25vdXJzIHdoZW4gaXQgaXMgdGhlIGZpbmFsIGxpbmUgb2ZcbiAgICogdGhlIG1lc3NhZ2UgLSBzbyBpdCBjYW5ub3QgYmUgYXBwZW5kZWQgdG8gYGJvZHlgLCB3aGljaCB0aGUgYnJhbmRlZCBmb290ZXJcbiAgICogd291bGQgdGhlbiBmb2xsb3cuIFJlbmRlcmVkIGFzIHZpc2libGUtYnV0LXF1aWV0IHRleHQgcmF0aGVyIHRoYW4gaGlkZGVuXG4gICAqIChgZGlzcGxheTogbm9uZWAgY29udGVudCBpcyBhIHNwYW0gc2lnbmFsLCBhbmQgYSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZVxuICAgKiBjb252ZW50aW9uIHNob3VsZCBzaG93IHNvbWV0aGluZyBpbm5vY3VvdXMgcmF0aGVyIHRoYW4gbm90aGluZykuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgYXV0b2ZpbGxUcmFpbGVyfSwgd2hpY2ggYnVpbGRzIHRoZSBzdHJpbmcuXG4gICAqL1xuICB0cmFpbGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFwcGxlJ3MgZG9tYWluLWJvdW5kIEF1dG9GaWxsIHRyYWlsZXIsIGBAPGRvbWFpbj4gIzxjb2RlPmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGVpdGhlciBwYXJ0IGlzIG1pc3NpbmcuXG4gKlxuICogaU9TIHJlYWRzIHRoaXMgdG8gYmluZCBhIGNvZGUgdG8gYSBzcGVjaWZpYyBXRUJTSVRFOiB3aXRoIGl0LCB0aGUga2V5Ym9hcmRcbiAqIG9mZmVycyB0aGUgY29kZSBvbmx5IGZvciB0aGUgbWF0Y2hpbmcgZG9tYWluLCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgY29kZVxuICogcGhpc2hlZCBmcm9tIG9uZSBzaXRlIGJlaW5nIGF1dG9maWxsZWQgaW50byBhbm90aGVyLiBXaXRob3V0IGl0LCBpT1Mgc3RpbGxcbiAqIGRldGVjdHMgYSBjb2RlIGhldXJpc3RpY2FsbHkgZnJvbSB0aGUgY29udmVudGlvbmFsIGxheW91dCAocHJvbXB0IGxpbmUsIGJhcmVcbiAqIGNvZGUgYWxvbmUgb24gdGhlIG5leHQgbGluZSksIGFzIGRvIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCAtIHNvIHRoaXMgaXMgYVxuICogc3RyaWN0IHVwZ3JhZGUgb24gdG9wIG9mIHRoYXQgYmFzZWxpbmUsIG5ldmVyIGEgcmVwbGFjZW1lbnQgZm9yIGl0LlxuICpcbiAqIFRoZSBkb21haW4gaXMgbm9ybWFsaXplZCB0byBiYXJlIGhvc3QgZm9ybTogYSBzY2hlbWUsIGEgYHd3dy5gIHByZWZpeCwgYW55XG4gKiBwYXRoLCBhbmQgYSB0cmFpbGluZyBkb3QgYXJlIHN0cmlwcGVkLCBzaW5jZSBpT1MgbWF0Y2hlcyB0aGUgaG9zdCB0aGUgc2l0ZSBpc1xuICogc2VydmVkIGZyb20uIEEgZG9tYWluIHdpdGggbm8gZG90IChgbG9jYWxob3N0YCkgaXMgcmVqZWN0ZWQgLSBpdCBjYW5ub3QgYmUgdGhlXG4gKiBwdWJsaWMgaG9zdCBvZiBhIHJlYWwgZGVwbG95bWVudCwgYW5kIGEgdHJhaWxlciBpT1Mgd2lsbCBuZXZlciBtYXRjaCBpcyBqdXN0IGFcbiAqIGNvbmZ1c2luZyBsaW5lIGluIHRoZSBlbWFpbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXV0b2ZpbGxUcmFpbGVyKFwiZGVtby5hcHBzLmRieC50b29sc1wiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZGVtby5hcHBzLmRieC50b29scyAjMTIzNDU2XCJcbiAqIGF1dG9maWxsVHJhaWxlcihcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2FwcFwiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZXhhbXBsZS5jb20gIzEyMzQ1NlwiXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRvZmlsbFRyYWlsZXIgPSAoXG4gIGRvbWFpbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWRvbWFpbiB8fCAhY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaG9zdCA9IGRvbWFpblxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9eW2Etel1bYS16XFxkKy4tXSo6XFwvXFwvLywgXCJcIilcbiAgICAucmVwbGFjZSgvXnd3d1xcLi8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1svPyNdLiokLywgXCJcIilcbiAgICAucmVwbGFjZSgvXFwuJC8sIFwiXCIpXG4gICAgLnJlcGxhY2UoLzpcXGQrJC8sIFwiXCIpO1xuICBpZiAoIWhvc3QuaW5jbHVkZXMoXCIuXCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYEAke2hvc3R9ICMke2NvZGUudHJpbSgpfWA7XG59O1xuXG5mdW5jdGlvbiBCcmFuZE1hcmsoeyB0aGVtZSB9OiB7IHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQgfSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICh0aGVtZS5sb2dvVXJsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxJbWdcbiAgICAgICAgc3JjPXt0aGVtZS5sb2dvVXJsfVxuICAgICAgICBhbHQ9e3RoZW1lLm5hbWV9XG4gICAgICAgIGhlaWdodD1cIjM0XCJcbiAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJibG9ja1wiLCBoZWlnaHQ6IFwiMzRweFwiLCB3aWR0aDogXCJhdXRvXCIgfX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxUZXh0XG4gICAgICBzdHlsZT17e1xuICAgICAgICBjb2xvcjogdGhlbWUub25BY2NlbnQsXG4gICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcbiAgICAgICAgZm9udFdlaWdodDogODAwLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjNweFwiLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHt0aGVtZS5uYW1lfVxuICAgIDwvVGV4dD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRW52ZWxvcGVIZWFkZXJzKHtcbiAgaGVhZGVycyxcbiAgdGhlbWUsXG59OiB7XG4gIGhlYWRlcnM6IEVtYWlsRG9jdW1lbnRQcm9wc1tcImhlYWRlcnNcIl07XG4gIHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQ7XG59KSB7XG4gIGlmICghaGVhZGVycz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8U2VjdGlvblxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgcGFkZGluZzogXCIxNHB4IDE2cHhcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAge2hlYWRlcnMubWFwKChbbGFiZWwsIHZhbHVlXSkgPT4gKFxuICAgICAgICA8Um93IGtleT17YCR7bGFiZWx9OiR7dmFsdWV9YH0+XG4gICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLm11dGVkLFxuICAgICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIzcHggMTJweCAzcHggMFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCI3MHB4XCIsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICA8Q29sdW1uIHN0eWxlPXt7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxM3B4XCIsIHBhZGRpbmc6IFwiM3B4IDBcIiB9fT5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgPC9Sb3c+XG4gICAgICApKX1cbiAgICA8L1NlY3Rpb24+XG4gICk7XG59XG5cbi8qKiBCcmFuZGVkIG1lc3NhZ2UgY2FyZCBzaGFyZWQgYnkgdGhlIGZ1bGwgZG9jdW1lbnQgYW5kIGJyb3dzZXIgcHJldmlld3MuICovXG5leHBvcnQgY29uc3QgRW1haWxDYXJkID0gKHtcbiAgYm9keSxcbiAgc3ViamVjdCA9IFwiTWVzc2FnZVwiLFxuICBoZWFkZXJzLFxuICBmb290ZXIsXG4gIGJyYW5kOiBicmFuZElucHV0LFxufTogRW1haWxEb2N1bWVudFByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lclxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjE2cHhcIixcbiAgICAgICAgYm94U2hhZG93OiBcIjAgOHB4IDMwcHggcmdiYSgyNyw0OSw1NywwLjA4KVwiLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gICAgICAgIG1heFdpZHRoOiBcIjYyMHB4XCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmFjY2VudCwgcGFkZGluZzogXCIyMnB4IDMwcHhcIiB9fT5cbiAgICAgICAgPEJyYW5kTWFyayB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjM0cHggMzRweCAyNHB4XCIgfX0+XG4gICAgICAgIDxIZWFkaW5nXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgICAgZm9udFNpemU6IFwiMjhweFwiLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogXCItMC41cHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS4yXCIsXG4gICAgICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3N1YmplY3R9XG4gICAgICAgIDwvSGVhZGluZz5cbiAgICAgICAgPEVudmVsb3BlSGVhZGVycyBoZWFkZXJzPXtoZWFkZXJzfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICAgIDxFbWFpbEJvZHkgYm9keT17Ym9keX0gYnJhbmQ9e3RoZW1lfSAvPlxuICAgICAgPC9TZWN0aW9uPlxuICAgICAgPEhyIHN0eWxlPXt7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogMCB9fSAvPlxuICAgICAgPFNlY3Rpb24gc3R5bGU9e3sgcGFkZGluZzogXCIyMHB4IDM0cHggMjZweFwiIH19PlxuICAgICAgICA8VGV4dFxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge2Zvb3RlciA/PyB0aGVtZS50YWdsaW5lfXtcIiBcIn1cbiAgICAgICAgICB7dGhlbWUud2Vic2l0ZSA/IChcbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e3RoZW1lLndlYnNpdGV9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLmFjY2VudCxcbiAgICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJub25lXCIsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aGVtZS5uYW1lfVxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgPC9Db250YWluZXI+XG4gICk7XG59O1xuXG4vKipcbiAqIFRoZSBtYWNoaW5lLXJlYWQgdHJhaWxlciBsaW5lLCByZW5kZXJlZCBMQVNUIGFuZCBvdXRzaWRlIHRoZSBjYXJkLlxuICpcbiAqIERlbGliZXJhdGVseSB0aGUgZmluYWwgZWxlbWVudCBvZiBgPEJvZHk+YDogaU9TIG9ubHkgYmluZHMgYSBjb2RlIHRvIGEgZG9tYWluXG4gKiB3aGVuIGBAPGRvbWFpbj4gIzxjb2RlPmAgaXMgdGhlIGxhc3QgbGluZSBvZiB0aGUgbWVzc2FnZSwgc28gbm90aGluZyAtIG5vdCBldmVuXG4gKiB0aGUgYnJhbmRlZCBmb290ZXIgLSBtYXkgZm9sbG93IGl0LiBTdHlsZWQgc21hbGwgYW5kIG11dGVkIHJhdGhlciB0aGFuIGhpZGRlbixcbiAqIGJlY2F1c2UgYGRpc3BsYXk6IG5vbmVgIHRleHQgaXMgYSBzcGFtLWZpbHRlciBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIEF1dG9maWxsVHJhaWxlcih7XG4gIHRyYWlsZXIsXG4gIHRoZW1lLFxufToge1xuICB0cmFpbGVyPzogc3RyaW5nO1xuICB0aGVtZTogUmVzb2x2ZWRFbWFpbEJyYW5kO1xufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghdHJhaWxlcikgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTFweFwiLFxuICAgICAgICBtYXJnaW46IFwiMTZweCBhdXRvIDBcIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7dHJhaWxlcn1cbiAgICA8L1RleHQ+XG4gICk7XG59XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgICAgPEF1dG9maWxsVHJhaWxlciB0cmFpbGVyPXtwcm9wcy50cmFpbGVyfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L0JvZHk+XG4gICAgPC9IdG1sPlxuICApO1xufTtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@dbx-tools/shared-core": "0.6.
|
|
27
|
+
"@dbx-tools/shared-core": "0.6.53",
|
|
28
28
|
"@react-email/components": "^1.0.12",
|
|
29
29
|
"react": "^19.2.4"
|
|
30
30
|
},
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"./package.json": "./package.json"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
-
"version": "0.6.
|
|
45
|
+
"version": "0.6.53",
|
|
46
46
|
"types": "./lib/index.d.ts",
|
|
47
47
|
"type": "module",
|
|
48
48
|
"exports": {
|
package/src/template.tsx
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* the body component is reused directly by browser approval and compose views.
|
|
6
6
|
* Both default to the repository brand while accepting a consumer override.
|
|
7
7
|
*
|
|
8
|
+
* {@link autofillTrailer} + the document's `trailer` prop cover Apple's
|
|
9
|
+
* domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
|
|
10
|
+
* the message's final line - hence a document-level prop rather than something a
|
|
11
|
+
* caller can append to `body`.
|
|
12
|
+
*
|
|
8
13
|
* @module
|
|
9
14
|
*/
|
|
10
15
|
import { brand, type BrandContext } from "@dbx-tools/shared-core";
|
|
@@ -195,8 +200,60 @@ export interface EmailDocumentProps extends EmailBodyProps {
|
|
|
195
200
|
subject?: string;
|
|
196
201
|
headers?: ReadonlyArray<readonly [string, string]>;
|
|
197
202
|
footer?: string;
|
|
203
|
+
/**
|
|
204
|
+
* A machine-read line emitted as the very LAST line of both MIME parts, after
|
|
205
|
+
* the branded footer and outside the card.
|
|
206
|
+
*
|
|
207
|
+
* This exists for Apple's domain-bound one-time-code AutoFill, whose format is
|
|
208
|
+
* `@<domain> #<code>` and which iOS only honours when it is the final line of
|
|
209
|
+
* the message - so it cannot be appended to `body`, which the branded footer
|
|
210
|
+
* would then follow. Rendered as visible-but-quiet text rather than hidden
|
|
211
|
+
* (`display: none` content is a spam signal, and a client that ignores the
|
|
212
|
+
* convention should show something innocuous rather than nothing).
|
|
213
|
+
*
|
|
214
|
+
* See {@link autofillTrailer}, which builds the string.
|
|
215
|
+
*/
|
|
216
|
+
trailer?: string;
|
|
198
217
|
}
|
|
199
218
|
|
|
219
|
+
/**
|
|
220
|
+
* Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
|
|
221
|
+
* when either part is missing.
|
|
222
|
+
*
|
|
223
|
+
* iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
|
|
224
|
+
* offers the code only for the matching domain, which is what stops a code
|
|
225
|
+
* phished from one site being autofilled into another. Without it, iOS still
|
|
226
|
+
* detects a code heuristically from the conventional layout (prompt line, bare
|
|
227
|
+
* code alone on the next line), as do Gmail, Outlook, and Android - so this is a
|
|
228
|
+
* strict upgrade on top of that baseline, never a replacement for it.
|
|
229
|
+
*
|
|
230
|
+
* The domain is normalized to bare host form: a scheme, a `www.` prefix, any
|
|
231
|
+
* path, and a trailing dot are stripped, since iOS matches the host the site is
|
|
232
|
+
* served from. A domain with no dot (`localhost`) is rejected - it cannot be the
|
|
233
|
+
* public host of a real deployment, and a trailer iOS will never match is just a
|
|
234
|
+
* confusing line in the email.
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
|
|
238
|
+
* autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
|
|
239
|
+
*/
|
|
240
|
+
export const autofillTrailer = (
|
|
241
|
+
domain: string | undefined,
|
|
242
|
+
code: string | undefined,
|
|
243
|
+
): string | undefined => {
|
|
244
|
+
if (!domain || !code) return undefined;
|
|
245
|
+
const host = domain
|
|
246
|
+
.trim()
|
|
247
|
+
.toLowerCase()
|
|
248
|
+
.replace(/^[a-z][a-z\d+.-]*:\/\//, "")
|
|
249
|
+
.replace(/^www\./, "")
|
|
250
|
+
.replace(/[/?#].*$/, "")
|
|
251
|
+
.replace(/\.$/, "")
|
|
252
|
+
.replace(/:\d+$/, "");
|
|
253
|
+
if (!host.includes(".")) return undefined;
|
|
254
|
+
return `@${host} #${code.trim()}`;
|
|
255
|
+
};
|
|
256
|
+
|
|
200
257
|
function BrandMark({ theme }: { theme: ResolvedEmailBrand }): React.ReactNode {
|
|
201
258
|
if (theme.logoUrl) {
|
|
202
259
|
return (
|
|
@@ -330,6 +387,38 @@ export const EmailCard = ({
|
|
|
330
387
|
);
|
|
331
388
|
};
|
|
332
389
|
|
|
390
|
+
/**
|
|
391
|
+
* The machine-read trailer line, rendered LAST and outside the card.
|
|
392
|
+
*
|
|
393
|
+
* Deliberately the final element of `<Body>`: iOS only binds a code to a domain
|
|
394
|
+
* when `@<domain> #<code>` is the last line of the message, so nothing - not even
|
|
395
|
+
* the branded footer - may follow it. Styled small and muted rather than hidden,
|
|
396
|
+
* because `display: none` text is a spam-filter signal.
|
|
397
|
+
*/
|
|
398
|
+
function AutofillTrailer({
|
|
399
|
+
trailer,
|
|
400
|
+
theme,
|
|
401
|
+
}: {
|
|
402
|
+
trailer?: string;
|
|
403
|
+
theme: ResolvedEmailBrand;
|
|
404
|
+
}): React.ReactNode {
|
|
405
|
+
if (!trailer) return null;
|
|
406
|
+
return (
|
|
407
|
+
<Text
|
|
408
|
+
style={{
|
|
409
|
+
color: theme.muted,
|
|
410
|
+
fontFamily: theme.fontFamily,
|
|
411
|
+
fontSize: "11px",
|
|
412
|
+
margin: "16px auto 0",
|
|
413
|
+
maxWidth: "620px",
|
|
414
|
+
textAlign: "center",
|
|
415
|
+
}}
|
|
416
|
+
>
|
|
417
|
+
{trailer}
|
|
418
|
+
</Text>
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
|
|
333
422
|
/** Complete responsive, branded React Email document. */
|
|
334
423
|
export const EmailDocument = (props: EmailDocumentProps) => {
|
|
335
424
|
const theme = resolveEmailBrand(props.brand);
|
|
@@ -345,6 +434,7 @@ export const EmailDocument = (props: EmailDocumentProps) => {
|
|
|
345
434
|
<Preview>{props.subject ?? "Message"}</Preview>
|
|
346
435
|
<Body style={pageStyle}>
|
|
347
436
|
<EmailCard {...props} />
|
|
437
|
+
<AutofillTrailer trailer={props.trailer} theme={theme} />
|
|
348
438
|
</Body>
|
|
349
439
|
</Html>
|
|
350
440
|
);
|