@dbx-tools/shared-core 0.9.5 → 0.9.7

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.
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Browser-safe brand contract, defaults, and LLM serialization helpers.
3
+ *
4
+ * Asset values are intentionally strings: they may be relative file paths,
5
+ * package exports, data URLs, or network URLs depending on the consumer.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from "zod";
10
+ const nonBlankString = z.string().trim().min(1);
11
+ const color = z.string().regex(/^#(?:[\da-f]{3}|[\da-f]{6}|[\da-f]{8})$/i, "Expected a hex color.");
12
+ /** Package asset references used when a brand context supplies no custom artwork. */
13
+ export const DEFAULT_BRAND_ASSETS = {
14
+ icon: {
15
+ light: "@dbx-tools/ui-branding/assets/icon-light.svg",
16
+ dark: "@dbx-tools/ui-branding/assets/icon-dark.svg",
17
+ },
18
+ logo: {
19
+ light: "@dbx-tools/ui-branding/assets/logo-light.svg",
20
+ dark: "@dbx-tools/ui-branding/assets/logo-dark.svg",
21
+ },
22
+ favicon: "@dbx-tools/ui-branding/assets/icon-light.svg",
23
+ };
24
+ /** Validates light and optional dark variants for one visual asset. */
25
+ export const BrandAssetSetSchema = z
26
+ .object({
27
+ light: nonBlankString.describe("Asset for light surfaces."),
28
+ dark: nonBlankString.optional().describe("Asset for dark surfaces; light is the fallback."),
29
+ })
30
+ .strict()
31
+ .describe("Theme-aware references to one visual asset.");
32
+ /** Strict brand palette whose omitted colors resolve to the dbx tools defaults. */
33
+ export const BrandColorsSchema = z
34
+ .object({
35
+ primary: color.default("#1B3139").describe("Primary action and identity color."),
36
+ primaryHover: color.default("#0E538B").describe("Primary hover or pressed color."),
37
+ accent: color.default("#00A972").describe("Secondary accent color."),
38
+ foreground: color.default("#1B3139").describe("Default text and mark color."),
39
+ background: color.default("#FFFFFF").describe("Default page background."),
40
+ surface: color.default("#F9F7F4").describe("Secondary surface background."),
41
+ muted: color.default("#618794").describe("Muted text color."),
42
+ border: color.default("#E4E2DD").describe("Default border color."),
43
+ })
44
+ .strict()
45
+ .prefault({});
46
+ /** Strict audience, tone, principle, and avoidance lists with practical defaults. */
47
+ export const BrandVoiceSchema = z
48
+ .object({
49
+ audience: z
50
+ .array(nonBlankString)
51
+ .default(["Databricks developers", "application engineers", "AI agents"]),
52
+ tone: z.array(nonBlankString).default(["direct", "practical", "technical", "approachable"]),
53
+ principles: z
54
+ .array(nonBlankString)
55
+ .default([
56
+ "Lead with the useful outcome.",
57
+ "Prefer concrete examples and accurate technical language.",
58
+ "Keep product claims specific and defensible.",
59
+ ]),
60
+ avoid: z
61
+ .array(nonBlankString)
62
+ .default(["unsupported superlatives", "vague AI claims", "unnecessary jargon"]),
63
+ })
64
+ .strict()
65
+ .prefault({});
66
+ /**
67
+ * Strict portable brand contract that fills identity, assets, colors,
68
+ * typography, voice, links, and extension defaults during parsing.
69
+ */
70
+ export const BrandContextSchema = z
71
+ .object({
72
+ schemaVersion: z.literal("1").default("1"),
73
+ name: nonBlankString.default("dbx tools").describe("Canonical display name."),
74
+ shortName: nonBlankString.default("dbx").describe("Compact name for constrained UI."),
75
+ tagline: nonBlankString
76
+ .default("Practical tools for Databricks builders.")
77
+ .describe("Short product line suitable for a header or metadata."),
78
+ description: nonBlankString
79
+ .default("Companion packages for Databricks developers building apps, agents, data workflows, and reusable UI.")
80
+ .describe("Plain-language product description."),
81
+ assets: z
82
+ .object({
83
+ icon: BrandAssetSetSchema.default(DEFAULT_BRAND_ASSETS.icon),
84
+ logo: BrandAssetSetSchema.default(DEFAULT_BRAND_ASSETS.logo),
85
+ favicon: nonBlankString.default(DEFAULT_BRAND_ASSETS.favicon),
86
+ })
87
+ .strict()
88
+ .default(DEFAULT_BRAND_ASSETS),
89
+ colors: BrandColorsSchema,
90
+ typography: z
91
+ .object({
92
+ sans: nonBlankString.default("'DM Sans', ui-sans-serif, system-ui, sans-serif"),
93
+ mono: nonBlankString.default("'DM Mono', ui-monospace, SFMono-Regular, Menlo, monospace"),
94
+ })
95
+ .strict()
96
+ .prefault({}),
97
+ voice: BrandVoiceSchema,
98
+ links: z
99
+ .object({
100
+ website: z.string().url().optional(),
101
+ repository: z.string().url().optional(),
102
+ documentation: z.string().url().optional(),
103
+ })
104
+ .strict()
105
+ .default({}),
106
+ extensions: z
107
+ .record(nonBlankString, z.unknown())
108
+ .default({})
109
+ .describe("Namespaced consumer-specific values that do not belong in the portable core."),
110
+ })
111
+ .strict()
112
+ .describe("Portable identity, visual, and voice context for UI, libraries, and LLMs.");
113
+ /** Validate input and fill every dbx tools default. */
114
+ export function parseBrandContext(input = {}) {
115
+ return BrandContextSchema.parse(input);
116
+ }
117
+ /** Canonical dbx tools brand context with all schema defaults resolved. */
118
+ export const defaultBrandContext = parseBrandContext();
119
+ /** JSON Schema representation suitable for structured-output and tool definitions. */
120
+ export function brandContextJsonSchema() {
121
+ return z.toJSONSchema(BrandContextSchema);
122
+ }
123
+ /** Stable prompt block for an LLM that needs to write or design in this brand. */
124
+ export function brandContextPrompt(context = defaultBrandContext) {
125
+ return [
126
+ `Use the following ${context.name} brand context for names, visual choices, and writing voice.`,
127
+ "Treat explicit task instructions as higher priority than this context.",
128
+ "",
129
+ JSON.stringify(context, null, 2),
130
+ ].join("\n");
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnJhbmQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7QUFFcEcscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSw4Q0FBOEM7UUFDckQsSUFBSSxFQUFFLDZDQUE2QztLQUNwRDtJQUNELElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSw4Q0FBOEM7UUFDckQsSUFBSSxFQUFFLDZDQUE2QztLQUNwRDtJQUNELE9BQU8sRUFBRSw4Q0FBOEM7Q0FDL0MsQ0FBQztBQUVYLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDO0tBQ2pDLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDO0lBQzNELElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGlEQUFpRCxDQUFDO0NBQzVGLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsNkNBQTZDLENBQUMsQ0FBQztBQUUzRCxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQztLQUMvQixNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMs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QixpQkFBaUIsRUFBRSxDQUFDO0FBRXJFLHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBNEIsQ0FBQztBQUN2RSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxVQUF3QixtQkFBbUI7SUFDNUUsT0FBTztRQUNMLHFCQUFxQixPQUFPLENBQUMsSUFBSSw4REFBOEQ7UUFDL0Ysd0VBQXdFO1FBQ3hFLEVBQUU7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ2pDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIGJyYW5kIGNvbnRyYWN0LCBkZWZhdWx0cywgYW5kIExMTSBzZXJpYWxpemF0aW9uIGhlbHBlcnMuXG4gKlxuICogQXNzZXQgdmFsdWVzIGFyZSBpbnRlbnRpb25hbGx5IHN0cmluZ3M6IHRoZXkgbWF5IGJlIHJlbGF0aXZlIGZpbGUgcGF0aHMsXG4gKiBwYWNrYWdlIGV4cG9ydHMsIGRhdGEgVVJMcywgb3IgbmV0d29yayBVUkxzIGRlcGVuZGluZyBvbiB0aGUgY29uc3VtZXIuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBub25CbGFua1N0cmluZyA9IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKTtcbmNvbnN0IGNvbG9yID0gei5zdHJpbmcoKS5yZWdleCgvXiMoPzpbXFxkYS1mXXszfXxbXFxkYS1mXXs2fXxbXFxkYS1mXXs4fSkkL2ksIFwiRXhwZWN0ZWQgYSBoZXggY29sb3IuXCIpO1xuXG4vKiogUGFja2FnZSBhc3NldCByZWZlcmVuY2VzIHVzZWQgd2hlbiBhIGJyYW5kIGNvbnRleHQgc3VwcGxpZXMgbm8gY3VzdG9tIGFydHdvcmsuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9CUkFORF9BU1NFVFMgPSB7XG4gIGljb246IHtcbiAgICBsaWdodDogXCJAZGJ4LXRvb2xzL3VpLWJyYW5kaW5nL2Fzc2V0cy9pY29uLWxpZ2h0LnN2Z1wiLFxuICAgIGRhcms6IFwiQGRieC10b29scy91aS1icmFuZGluZy9hc3NldHMvaWNvbi1kYXJrLnN2Z1wiLFxuICB9LFxuICBsb2dvOiB7XG4gICAgbGlnaHQ6IFwiQGRieC10b29scy91aS1icmFuZGluZy9hc3NldHMvbG9nby1saWdodC5zdmdcIixcbiAgICBkYXJrOiBcIkBkYngtdG9vbHMvdWktYnJhbmRpbmcvYXNzZXRzL2xvZ28tZGFyay5zdmdcIixcbiAgfSxcbiAgZmF2aWNvbjogXCJAZGJ4LXRvb2xzL3VpLWJyYW5kaW5nL2Fzc2V0cy9pY29uLWxpZ2h0LnN2Z1wiLFxufSBhcyBjb25zdDtcblxuLyoqIFZhbGlkYXRlcyBsaWdodCBhbmQgb3B0aW9uYWwgZGFyayB2YXJpYW50cyBmb3Igb25lIHZpc3VhbCBhc3NldC4gKi9cbmV4cG9ydCBjb25zdCBCcmFuZEFzc2V0U2V0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBsaWdodDogbm9uQmxhbmtTdHJpbmcuZGVzY3JpYmUoXCJBc3NldCBmb3IgbGlnaHQgc3VyZmFjZXMuXCIpLFxuICAgIGRhcms6IG5vbkJsYW5rU3RyaW5nLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJBc3NldCBmb3IgZGFyayBzdXJmYWNlczsgbGlnaHQgaXMgdGhlIGZhbGxiYWNrLlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIlRoZW1lLWF3YXJlIHJlZmVyZW5jZXMgdG8gb25lIHZpc3VhbCBhc3NldC5cIik7XG5cbi8qKiBTdHJpY3QgYnJhbmQgcGFsZXR0ZSB3aG9zZSBvbWl0dGVkIGNvbG9ycyByZXNvbHZlIHRvIHRoZSBkYnggdG9vbHMgZGVmYXVsdHMuICovXG5leHBvcnQgY29uc3QgQnJhbmRDb2xvcnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByaW1hcnk6IGNvbG9yLmRlZmF1bHQoXCIjMUIzMTM5XCIpLmRlc2NyaWJlKFwiUHJpbWFyeSBhY3Rpb24gYW5kIGlkZW50aXR5IGNvbG9yLlwiKSxcbiAgICBwcmltYXJ5SG92ZXI6IGNvbG9yLmRlZmF1bHQoXCIjMEU1MzhCXCIpLmRlc2NyaWJlKFwiUHJpbWFyeSBob3ZlciBvciBwcmVzc2VkIGNvbG9yLlwiKSxcbiAgICBhY2NlbnQ6IGNvbG9yLmRlZmF1bHQoXCIjMDBBOTcyXCIpLmRlc2NyaWJlKFwiU2Vjb25kYXJ5IGFjY2VudCBjb2xvci5cIiksXG4gICAgZm9yZWdyb3VuZDogY29sb3IuZGVmYXVsdChcIiMxQjMxMzlcIikuZGVzY3JpYmUoXCJEZWZhdWx0IHRleHQgYW5kIG1hcmsgY29sb3IuXCIpLFxuICAgIGJhY2tncm91bmQ6IGNvbG9yLmRlZmF1bHQoXCIjRkZGRkZGXCIpLmRlc2NyaWJlKFwiRGVmYXVsdCBwYWdlIGJhY2tncm91bmQuXCIpLFxuICAgIHN1cmZhY2U6IGNvbG9yLmRlZmF1bHQoXCIjRjlGN0Y0XCIpLmRlc2NyaWJlKFwiU2Vjb25kYXJ5IHN1cmZhY2UgYmFja2dyb3VuZC5cIiksXG4gICAgbXV0ZWQ6IGNvbG9yLmRlZmF1bHQoXCIjNjE4Nzk0XCIpLmRlc2NyaWJlKFwiTXV0ZWQgdGV4dCBjb2xvci5cIiksXG4gICAgYm9yZGVyOiBjb2xvci5kZWZhdWx0KFwiI0U0RTJERFwiKS5kZXNjcmliZShcIkRlZmF1bHQgYm9yZGVyIGNvbG9yLlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5wcmVmYXVsdCh7fSk7XG5cbi8qKiBTdHJpY3QgYXVkaWVuY2UsIHRvbmUsIHByaW5jaXBsZSwgYW5kIGF2b2lkYW5jZSBsaXN0cyB3aXRoIHByYWN0aWNhbCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBjb25zdCBCcmFuZFZvaWNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBhdWRpZW5jZTogelxuICAgICAgLmFycmF5KG5vbkJsYW5rU3RyaW5nKVxuICAgICAgLmRlZmF1bHQoW1wiRGF0YWJyaWNrcyBkZXZlbG9wZXJzXCIsIFwiYXBwbGljYXRpb24gZW5naW5lZXJzXCIsIFwiQUkgYWdlbnRzXCJdKSxcbiAgICB0b25lOiB6LmFycmF5KG5vbkJsYW5rU3RyaW5nKS5kZWZhdWx0KFtcImRpcmVjdFwiLCBcInByYWN0aWNhbFwiLCBcInRlY2huaWNhbFwiLCBcImFwcHJvYWNoYWJsZVwiXSksXG4gICAgcHJpbmNpcGxlczogelxuICAgICAgLmFycmF5KG5vbkJsYW5rU3RyaW5nKVxuICAgICAgLmRlZmF1bHQoW1xuICAgICAgICBcIkxlYWQgd2l0aCB0aGUgdXNlZnVsIG91dGNvbWUuXCIsXG4gICAgICAgIFwiUHJlZmVyIGNvbmNyZXRlIGV4YW1wbGVzIGFuZCBhY2N1cmF0ZSB0ZWNobmljYWwgbGFuZ3VhZ2UuXCIsXG4gICAgICAgIFwiS2VlcCBwcm9kdWN0IGNsYWltcyBzcGVjaWZpYyBhbmQgZGVmZW5zaWJsZS5cIixcbiAgICAgIF0pLFxuICAgIGF2b2lkOiB6XG4gICAgICAuYXJyYXkobm9uQmxhbmtTdHJpbmcpXG4gICAgICAuZGVmYXVsdChbXCJ1bnN1cHBvcnRlZCBzdXBlcmxhdGl2ZXNcIiwgXCJ2YWd1ZSBBSSBjbGFpbXNcIiwgXCJ1bm5lY2Vzc2FyeSBqYXJnb25cIl0pLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLnByZWZhdWx0KHt9KTtcblxuLyoqXG4gKiBTdHJpY3QgcG9ydGFibGUgYnJhbmQgY29udHJhY3QgdGhhdCBmaWxscyBpZGVudGl0eSwgYXNzZXRzLCBjb2xvcnMsXG4gKiB0eXBvZ3JhcGh5LCB2b2ljZSwgbGlua3MsIGFuZCBleHRlbnNpb24gZGVmYXVsdHMgZHVyaW5nIHBhcnNpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBCcmFuZENvbnRleHRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubGl0ZXJhbChcIjFcIikuZGVmYXVsdChcIjFcIiksXG4gICAgbmFtZTogbm9uQmxhbmtTdHJpbmcuZGVmYXVsdChcImRieCB0b29sc1wiKS5kZXNjcmliZShcIkNhbm9uaWNhbCBkaXNwbGF5IG5hbWUuXCIpLFxuICAgIHNob3J0TmFtZTogbm9uQmxhbmtTdHJpbmcuZGVmYXVsdChcImRieFwiKS5kZXNjcmliZShcIkNvbXBhY3QgbmFtZSBmb3IgY29uc3RyYWluZWQgVUkuXCIpLFxuICAgIHRhZ2xpbmU6IG5vbkJsYW5rU3RyaW5nXG4gICAgICAuZGVmYXVsdChcIlByYWN0aWNhbCB0b29scyBmb3IgRGF0YWJyaWNrcyBidWlsZGVycy5cIilcbiAgICAgIC5kZXNjcmliZShcIlNob3J0IHByb2R1Y3QgbGluZSBzdWl0YWJsZSBmb3IgYSBoZWFkZXIgb3IgbWV0YWRhdGEuXCIpLFxuICAgIGRlc2NyaXB0aW9uOiBub25CbGFua1N0cmluZ1xuICAgICAgLmRlZmF1bHQoXG4gICAgICAgIFwiQ29tcGFuaW9uIHBhY2thZ2VzIGZvciBEYXRhYnJpY2tzIGRldmVsb3BlcnMgYnVpbGRpbmcgYXBwcywgYWdlbnRzLCBkYXRhIHdvcmtmbG93cywgYW5kIHJldXNhYmxlIFVJLlwiLFxuICAgICAgKVxuICAgICAgLmRlc2NyaWJlKFwiUGxhaW4tbGFuZ3VhZ2UgcHJvZHVjdCBkZXNjcmlwdGlvbi5cIiksXG4gICAgYXNzZXRzOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgaWNvbjogQnJhbmRBc3NldFNldFNjaGVtYS5kZWZhdWx0KERFRkFVTFRfQlJBTkRfQVNTRVRTLmljb24pLFxuICAgICAgICBsb2dvOiBCcmFuZEFzc2V0U2V0U2NoZW1hLmRlZmF1bHQoREVGQVVMVF9CUkFORF9BU1NFVFMubG9nbyksXG4gICAgICAgIGZhdmljb246IG5vbkJsYW5rU3RyaW5nLmRlZmF1bHQoREVGQVVMVF9CUkFORF9BU1NFVFMuZmF2aWNvbiksXG4gICAgICB9KVxuICAgICAgLnN0cmljdCgpXG4gICAgICAuZGVmYXVsdChERUZBVUxUX0JSQU5EX0FTU0VUUyksXG4gICAgY29sb3JzOiBCcmFuZENvbG9yc1NjaGVtYSxcbiAgICB0eXBvZ3JhcGh5OiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgc2Fuczogbm9uQmxhbmtTdHJpbmcuZGVmYXVsdChcIidETSBTYW5zJywgdWktc2Fucy1zZXJpZiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCIpLFxuICAgICAgICBtb25vOiBub25CbGFua1N0cmluZy5kZWZhdWx0KFwiJ0RNIE1vbm8nLCB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgbW9ub3NwYWNlXCIpLFxuICAgICAgfSlcbiAgICAgIC5zdHJpY3QoKVxuICAgICAgLnByZWZhdWx0KHt9KSxcbiAgICB2b2ljZTogQnJhbmRWb2ljZVNjaGVtYSxcbiAgICBsaW5rczogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIHdlYnNpdGU6IHouc3RyaW5nKCkudXJsKCkub3B0aW9uYWwoKSxcbiAgICAgICAgcmVwb3NpdG9yeTogei5zdHJpbmcoKS51cmwoKS5vcHRpb25hbCgpLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiB6LnN0cmluZygpLnVybCgpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLnN0cmljdCgpXG4gICAgICAuZGVmYXVsdCh7fSksXG4gICAgZXh0ZW5zaW9uczogelxuICAgICAgLnJlY29yZChub25CbGFua1N0cmluZywgei51bmtub3duKCkpXG4gICAgICAuZGVmYXVsdCh7fSlcbiAgICAgIC5kZXNjcmliZShcIk5hbWVzcGFjZWQgY29uc3VtZXItc3BlY2lmaWMgdmFsdWVzIHRoYXQgZG8gbm90IGJlbG9uZyBpbiB0aGUgcG9ydGFibGUgY29yZS5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJQb3J0YWJsZSBpZGVudGl0eSwgdmlzdWFsLCBhbmQgdm9pY2UgY29udGV4dCBmb3IgVUksIGxpYnJhcmllcywgYW5kIExMTXMuXCIpO1xuXG4vKiogRnVsbHkgdmFsaWRhdGVkIGJyYW5kIGNvbnRleHQgYWZ0ZXIgZXZlcnkgc2NoZW1hIGRlZmF1bHQgaGFzIGJlZW4gYXBwbGllZC4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kQ29udGV4dCA9IHoub3V0cHV0PHR5cGVvZiBCcmFuZENvbnRleHRTY2hlbWE+O1xuLyoqIElucHV0IGFjY2VwdGVkIGJ5IHtAbGluayBCcmFuZENvbnRleHRTY2hlbWF9LCBiZWZvcmUgZGVmYXVsdHMgYXJlIG1hdGVyaWFsaXplZC4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kQ29udGV4dElucHV0ID0gei5pbnB1dDx0eXBlb2YgQnJhbmRDb250ZXh0U2NoZW1hPjtcbi8qKiBUaGVtZS1hd2FyZSBsaWdodCBhbmQgb3B0aW9uYWwgZGFyayByZWZlcmVuY2VzIGZvciBvbmUgYnJhbmQgYXNzZXQuICovXG5leHBvcnQgdHlwZSBCcmFuZEFzc2V0U2V0ID0gei5vdXRwdXQ8dHlwZW9mIEJyYW5kQXNzZXRTZXRTY2hlbWE+O1xuXG4vKiogVmFsaWRhdGUgaW5wdXQgYW5kIGZpbGwgZXZlcnkgZGJ4IHRvb2xzIGRlZmF1bHQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCcmFuZENvbnRleHQoaW5wdXQ6IHVua25vd24gPSB7fSk6IEJyYW5kQ29udGV4dCB7XG4gIHJldHVybiBCcmFuZENvbnRleHRTY2hlbWEucGFyc2UoaW5wdXQpO1xufVxuXG4vKiogQ2Fub25pY2FsIGRieCB0b29scyBicmFuZCBjb250ZXh0IHdpdGggYWxsIHNjaGVtYSBkZWZhdWx0cyByZXNvbHZlZC4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0QnJhbmRDb250ZXh0OiBCcmFuZENvbnRleHQgPSBwYXJzZUJyYW5kQ29udGV4dCgpO1xuXG4vKiogSlNPTiBTY2hlbWEgcmVwcmVzZW50YXRpb24gc3VpdGFibGUgZm9yIHN0cnVjdHVyZWQtb3V0cHV0IGFuZCB0b29sIGRlZmluaXRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyYW5kQ29udGV4dEpzb25TY2hlbWEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gei50b0pTT05TY2hlbWEoQnJhbmRDb250ZXh0U2NoZW1hKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIFN0YWJsZSBwcm9tcHQgYmxvY2sgZm9yIGFuIExMTSB0aGF0IG5lZWRzIHRvIHdyaXRlIG9yIGRlc2lnbiBpbiB0aGlzIGJyYW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyYW5kQ29udGV4dFByb21wdChjb250ZXh0OiBCcmFuZENvbnRleHQgPSBkZWZhdWx0QnJhbmRDb250ZXh0KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgVXNlIHRoZSBmb2xsb3dpbmcgJHtjb250ZXh0Lm5hbWV9IGJyYW5kIGNvbnRleHQgZm9yIG5hbWVzLCB2aXN1YWwgY2hvaWNlcywgYW5kIHdyaXRpbmcgdm9pY2UuYCxcbiAgICBcIlRyZWF0IGV4cGxpY2l0IHRhc2sgaW5zdHJ1Y3Rpb25zIGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoaXMgY29udGV4dC5cIixcbiAgICBcIlwiLFxuICAgIEpTT04uc3RyaW5naWZ5KGNvbnRleHQsIG51bGwsIDIpLFxuICBdLmpvaW4oXCJcXG5cIik7XG59XG4iXX0=
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Error normalization helpers: collapse the ubiquitous
3
+ * `err instanceof Error ? err.message : String(err)` dance into a single
4
+ * call, walk `cause` / `AggregateError` chains, and coerce any thrown
5
+ * value into a real `Error`. Dependency-free and browser-safe.
6
+ *
7
+ * @module
8
+ */
9
+ import { tokenizeWithOptions } from "./string-utils.js";
10
+ /**
11
+ * Normalize any thrown value into an `Error`. Returns `value` unchanged
12
+ * when it already is an `Error`, otherwise wraps its {@link errorMessage}
13
+ * in a fresh `Error`. Use when a consumer needs a real `Error` object
14
+ * (React error state, `reject`, rethrow) rather than just a printable
15
+ * string.
16
+ */
17
+ export function toError(value) {
18
+ return value instanceof Error ? value : new Error(errorMessage(value));
19
+ }
20
+ /**
21
+ * Extract a human-readable message from any thrown value. Returns
22
+ * `value.message` when `value` is an `Error`, otherwise coerces via
23
+ * `String(value)`. Collapses the ubiquitous
24
+ *
25
+ * ```ts
26
+ * err instanceof Error ? err.message : String(err)
27
+ * ```
28
+ *
29
+ * dance into a single helper, useful for log attributes and any other
30
+ * "give me something printable" context.
31
+ */
32
+ export function errorMessage(value) {
33
+ const message = errorMessages(value).next().value;
34
+ return message ?? String(value);
35
+ }
36
+ /**
37
+ * Yield `message` / `errorCode` strings from every node in the error
38
+ * tree (see {@link errorNodes}). Used by {@link errorMessage} and
39
+ * message predicates elsewhere.
40
+ */
41
+ export function* errorMessages(value) {
42
+ for (const node of errorNodes(value)) {
43
+ if (typeof node === "object") {
44
+ for (const key of ["message", "errorCode"]) {
45
+ if (key in node) {
46
+ const value = node[key];
47
+ if (typeof value === "string" && value) {
48
+ yield value;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ else if (typeof node === "string" && node) {
54
+ yield node;
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Depth-first walk of an error value: the root, then `errors` (e.g.
60
+ * `AggregateError`) and `cause` chains. Cycle-safe via a `seen` set.
61
+ */
62
+ export function* errorNodes(err) {
63
+ const seen = new Set();
64
+ function* visit(node) {
65
+ if (node === undefined || node === null)
66
+ return;
67
+ if (Array.isArray(node)) {
68
+ for (const child of node) {
69
+ yield* visit(child);
70
+ }
71
+ return;
72
+ }
73
+ if (seen.has(node))
74
+ return;
75
+ seen.add(node);
76
+ yield node;
77
+ if (typeof node === "object") {
78
+ for (const key of ["errors", "cause"]) {
79
+ if (key in node) {
80
+ const value = node[key];
81
+ yield* visit(value);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ yield* visit(err);
87
+ }
88
+ class ErrorContextImpl {
89
+ err;
90
+ _statusCode;
91
+ _messages;
92
+ _messageTokens;
93
+ constructor(err) {
94
+ this.err = err;
95
+ }
96
+ /** Last positive `statusCode` / `code` found on the error tree, else `undefined` (0 ignored). */
97
+ get statusCode() {
98
+ if (this._statusCode === undefined) {
99
+ outer: for (const node of errorNodes(this.err)) {
100
+ if (typeof node !== "object" || node === null)
101
+ continue;
102
+ for (const key of ["statusCode", "code"]) {
103
+ if (!(key in node))
104
+ continue;
105
+ const value = node[key];
106
+ if (typeof value === "number" && value > 99 && value < 600) {
107
+ this._statusCode = value;
108
+ break outer;
109
+ }
110
+ }
111
+ }
112
+ if (this._statusCode === undefined) {
113
+ this._statusCode = -1;
114
+ }
115
+ }
116
+ return this._statusCode == -1 ? undefined : this._statusCode;
117
+ }
118
+ /** Every `message` / `errorCode` string in the error tree. */
119
+ get messages() {
120
+ if (this._messages === undefined) {
121
+ this._messages = [...errorMessages(this.err)];
122
+ }
123
+ return this._messages;
124
+ }
125
+ /** Lowercased tokens from {@link messages}. */
126
+ get messageTokens() {
127
+ if (this._messageTokens === undefined) {
128
+ this._messageTokens = [...tokenizeWithOptions({ lowerCase: true }, ...this.messages)];
129
+ }
130
+ return this._messageTokens;
131
+ }
132
+ /** True for any 4xx status or message tokens `not exist` / `not found`. */
133
+ get notAccessible() {
134
+ if (this.hasStatusCode(4))
135
+ return true;
136
+ return this.hasMessage("not", "exist") || this.hasMessage("not", "found");
137
+ }
138
+ /**
139
+ * Match HTTP status. Pass a full code (`404`) or a class (`4` for any 4xx).
140
+ * Extra filters are OR'd. `false` when no status is on the error tree.
141
+ */
142
+ hasStatusCode(statusCodeFilter, ...statusCodeFilters) {
143
+ const code = this.statusCode;
144
+ if (code) {
145
+ for (const filter of [statusCodeFilter, ...statusCodeFilters]) {
146
+ const match = (filter < 100 ? Math.trunc(code / 100) : code) === filter;
147
+ if (match)
148
+ return true;
149
+ }
150
+ }
151
+ return false;
152
+ }
153
+ /**
154
+ * True when every token from the filter phrase(s) appears in
155
+ * {@link messageTokens}. Each argument is tokenized on non-alphanumeric
156
+ * boundaries (e.g. `hasMessage("not", "found")` or `hasMessage("not found")`).
157
+ */
158
+ hasMessage(messageFilter, ...messageFilters) {
159
+ return [messageFilter, ...messageFilters]
160
+ .flatMap((filter) => Array.from(tokenizeWithOptions({ lowerCase: true }, filter)))
161
+ .every((filterToken) => this.messageTokens.includes(filterToken));
162
+ }
163
+ }
164
+ /** Build an {@link ErrorContext} for status + message checks. `null` / `undefined` become `{}`. */
165
+ export function errorContext(err) {
166
+ return new ErrorContextImpl(err ?? {});
167
+ }
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3ItdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYztJQUNwQyxPQUFPLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDbEQsT0FBTyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBYztJQUMzQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxLQUFLLEdBQUksSUFBZ0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDckQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ3ZDLE1BQU0sS0FBSyxDQUFDO29CQUNkLENBQUM7Z0JB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SUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQztnQkFDeEUsSUFBSSxLQUFLO29CQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxhQUFxQixFQUFFLEdBQUcsY0FBd0I7UUFDM0QsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLGNBQWMsQ0FBQzthQUN0QyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUNqRixLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztDQUNGO0FBRUQsbUdBQW1HO0FBQ25HLE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBWTtJQUN2QyxPQUFPLElBQUksZ0JBQWdCLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVycm9yIG5vcm1hbGl6YXRpb24gaGVscGVyczogY29sbGFwc2UgdGhlIHViaXF1aXRvdXNcbiAqIGBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilgIGRhbmNlIGludG8gYSBzaW5nbGVcbiAqIGNhbGwsIHdhbGsgYGNhdXNlYCAvIGBBZ2dyZWdhdGVFcnJvcmAgY2hhaW5zLCBhbmQgY29lcmNlIGFueSB0aHJvd25cbiAqIHZhbHVlIGludG8gYSByZWFsIGBFcnJvcmAuIERlcGVuZGVuY3ktZnJlZSBhbmQgYnJvd3Nlci1zYWZlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB0b2tlbml6ZVdpdGhPcHRpb25zIH0gZnJvbSBcIi4vc3RyaW5nLXV0aWxzLnRzXCI7XG5cbi8qKlxuICogTm9ybWFsaXplIGFueSB0aHJvd24gdmFsdWUgaW50byBhbiBgRXJyb3JgLiBSZXR1cm5zIGB2YWx1ZWAgdW5jaGFuZ2VkXG4gKiB3aGVuIGl0IGFscmVhZHkgaXMgYW4gYEVycm9yYCwgb3RoZXJ3aXNlIHdyYXBzIGl0cyB7QGxpbmsgZXJyb3JNZXNzYWdlfVxuICogaW4gYSBmcmVzaCBgRXJyb3JgLiBVc2Ugd2hlbiBhIGNvbnN1bWVyIG5lZWRzIGEgcmVhbCBgRXJyb3JgIG9iamVjdFxuICogKFJlYWN0IGVycm9yIHN0YXRlLCBgcmVqZWN0YCwgcmV0aHJvdykgcmF0aGVyIHRoYW4ganVzdCBhIHByaW50YWJsZVxuICogc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FcnJvcih2YWx1ZTogdW5rbm93bik6IEVycm9yIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgPyB2YWx1ZSA6IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UodmFsdWUpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBmcm9tIGFueSB0aHJvd24gdmFsdWUuIFJldHVybnNcbiAqIGB2YWx1ZS5tZXNzYWdlYCB3aGVuIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgb3RoZXJ3aXNlIGNvZXJjZXMgdmlhXG4gKiBgU3RyaW5nKHZhbHVlKWAuIENvbGxhcHNlcyB0aGUgdWJpcXVpdG91c1xuICpcbiAqIGBgYHRzXG4gKiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAqIGBgYFxuICpcbiAqIGRhbmNlIGludG8gYSBzaW5nbGUgaGVscGVyLCB1c2VmdWwgZm9yIGxvZyBhdHRyaWJ1dGVzIGFuZCBhbnkgb3RoZXJcbiAqIFwiZ2l2ZSBtZSBzb21ldGhpbmcgcHJpbnRhYmxlXCIgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VzKHZhbHVlKS5uZXh0KCkudmFsdWU7XG4gIHJldHVybiBtZXNzYWdlID8/IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8qKlxuICogWWllbGQgYG1lc3NhZ2VgIC8gYGVycm9yQ29kZWAgc3RyaW5ncyBmcm9tIGV2ZXJ5IG5vZGUgaW4gdGhlIGVycm9yXG4gKiB0cmVlIChzZWUge0BsaW5rIGVycm9yTm9kZXN9KS4gVXNlZCBieSB7QGxpbmsgZXJyb3JNZXNzYWdlfSBhbmRcbiAqIG1lc3NhZ2UgcHJlZGljYXRlcyBlbHNld2hlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZXJyb3JNZXNzYWdlcyh2YWx1ZTogdW5rbm93bik6IEdlbmVyYXRvcjxzdHJpbmcsIHZvaWQsIHVuZGVmaW5lZD4ge1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgZXJyb3JOb2Rlcyh2YWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIFtcIm1lc3NhZ2VcIiwgXCJlcnJvckNvZGVcIl0pIHtcbiAgICAgICAgaWYgKGtleSBpbiBub2RlKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiICYmIG5vZGUpIHtcbiAgICAgIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVwdGgtZmlyc3Qgd2FsayBvZiBhbiBlcnJvciB2YWx1ZTogdGhlIHJvb3QsIHRoZW4gYGVycm9yc2AgKGUuZy5cbiAqIGBBZ2dyZWdhdGVFcnJvcmApIGFuZCBgY2F1c2VgIGNoYWlucy4gQ3ljbGUtc2FmZSB2aWEgYSBgc2VlbmAgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGVycm9yTm9kZXMoZXJyOiB1bmtub3duKTogR2VuZXJhdG9yPE5vbk51bGxhYmxlPHVua25vd24+LCB2b2lkLCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcblxuICBmdW5jdGlvbiogdmlzaXQobm9kZTogdW5rbm93bik6IEdlbmVyYXRvcjxOb25OdWxsYWJsZTx1bmtub3duPiwgdm9pZCwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSBudWxsKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZSkge1xuICAgICAgICB5aWVsZCogdmlzaXQoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpIHJldHVybjtcbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICB5aWVsZCBub2RlO1xuICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgW1wiZXJyb3JzXCIsIFwiY2F1c2VcIl0pIHtcbiAgICAgICAgaWYgKGtleSBpbiBub2RlKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgICB5aWVsZCogdmlzaXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHlpZWxkKiB2aXNpdChlcnIpO1xufVxuXG4vKipcbiAqIExhenkgdmlldyBvdmVyIGEgdGhyb3duIHZhbHVlIGZvciBIVFRQLXN0YXR1cyArIG1lc3NhZ2UgY2xhc3NpZmljYXRpb24uXG4gKiBTdGF0dXMgY29tZXMgZnJvbSB0aGUgbGFzdCBwb3NpdGl2ZSBgc3RhdHVzQ29kZWAgLyBgY29kZWAgb24gdGhlIGVycm9yIHRyZWU7XG4gKiBtZXNzYWdlcy90b2tlbnMgY29tZSBmcm9tIGV2ZXJ5IGBtZXNzYWdlYCAvIGBlcnJvckNvZGVgIGZpZWxkIChpbmNsdWRpbmdcbiAqIGBjYXVzZWAgYW5kIGBBZ2dyZWdhdGVFcnJvci5lcnJvcnNgKS4gQnVpbGQgd2l0aCB7QGxpbmsgZXJyb3JDb250ZXh0fS5cbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JDb250ZXh0ID0gRXJyb3JDb250ZXh0SW1wbDtcblxuY2xhc3MgRXJyb3JDb250ZXh0SW1wbCB7XG4gIHByaXZhdGUgX3N0YXR1c0NvZGU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbWVzc2FnZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9tZXNzYWdlVG9rZW5zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVycjogTm9uTnVsbGFibGU8dW5rbm93bj4pIHt9XG5cbiAgLyoqIExhc3QgcG9zaXRpdmUgYHN0YXR1c0NvZGVgIC8gYGNvZGVgIGZvdW5kIG9uIHRoZSBlcnJvciB0cmVlLCBlbHNlIGB1bmRlZmluZWRgICgwIGlnbm9yZWQpLiAqL1xuICBnZXQgc3RhdHVzQ29kZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9zdGF0dXNDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dGVyOiBmb3IgKGNvbnN0IG5vZGUgb2YgZXJyb3JOb2Rlcyh0aGlzLmVycikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IG5vZGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJzdGF0dXNDb2RlXCIsIFwiY29kZVwiXSBhcyBjb25zdCkge1xuICAgICAgICAgIGlmICghKGtleSBpbiBub2RlKSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID4gOTkgJiYgdmFsdWUgPCA2MDApIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0NvZGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3N0YXR1c0NvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9zdGF0dXNDb2RlID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdGF0dXNDb2RlID09IC0xID8gdW5kZWZpbmVkIDogdGhpcy5fc3RhdHVzQ29kZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBgbWVzc2FnZWAgLyBgZXJyb3JDb2RlYCBzdHJpbmcgaW4gdGhlIGVycm9yIHRyZWUuICovXG4gIGdldCBtZXNzYWdlcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gWy4uLmVycm9yTWVzc2FnZXModGhpcy5lcnIpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9XG5cbiAgLyoqIExvd2VyY2FzZWQgdG9rZW5zIGZyb20ge0BsaW5rIG1lc3NhZ2VzfS4gKi9cbiAgZ2V0IG1lc3NhZ2VUb2tlbnMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLl9tZXNzYWdlVG9rZW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VUb2tlbnMgPSBbLi4udG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSB9LCAuLi50aGlzLm1lc3NhZ2VzKV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlVG9rZW5zO1xuICB9XG5cbiAgLyoqIFRydWUgZm9yIGFueSA0eHggc3RhdHVzIG9yIG1lc3NhZ2UgdG9rZW5zIGBub3QgZXhpc3RgIC8gYG5vdCBmb3VuZGAuICovXG4gIGdldCBub3RBY2Nlc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc1N0YXR1c0NvZGUoNCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmhhc01lc3NhZ2UoXCJub3RcIiwgXCJleGlzdFwiKSB8fCB0aGlzLmhhc01lc3NhZ2UoXCJub3RcIiwgXCJmb3VuZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBIVFRQIHN0YXR1cy4gUGFzcyBhIGZ1bGwgY29kZSAoYDQwNGApIG9yIGEgY2xhc3MgKGA0YCBmb3IgYW55IDR4eCkuXG4gICAqIEV4dHJhIGZpbHRlcnMgYXJlIE9SJ2QuIGBmYWxzZWAgd2hlbiBubyBzdGF0dXMgaXMgb24gdGhlIGVycm9yIHRyZWUuXG4gICAqL1xuICBoYXNTdGF0dXNDb2RlKHN0YXR1c0NvZGVGaWx0ZXI6IG51bWJlciwgLi4uc3RhdHVzQ29kZUZpbHRlcnM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuc3RhdHVzQ29kZTtcbiAgICBpZiAoY29kZSkge1xuICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgW3N0YXR1c0NvZGVGaWx0ZXIsIC4uLnN0YXR1c0NvZGVGaWx0ZXJzXSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IChmaWx0ZXIgPCAxMDAgPyBNYXRoLnRydW5jKGNvZGUgLyAxMDApIDogY29kZSkgPT09IGZpbHRlcjtcbiAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBldmVyeSB0b2tlbiBmcm9tIHRoZSBmaWx0ZXIgcGhyYXNlKHMpIGFwcGVhcnMgaW5cbiAgICoge0BsaW5rIG1lc3NhZ2VUb2tlbnN9LiBFYWNoIGFyZ3VtZW50IGlzIHRva2VuaXplZCBvbiBub24tYWxwaGFudW1lcmljXG4gICAqIGJvdW5kYXJpZXMgKGUuZy4gYGhhc01lc3NhZ2UoXCJub3RcIiwgXCJmb3VuZFwiKWAgb3IgYGhhc01lc3NhZ2UoXCJub3QgZm91bmRcIilgKS5cbiAgICovXG4gIGhhc01lc3NhZ2UobWVzc2FnZUZpbHRlcjogc3RyaW5nLCAuLi5tZXNzYWdlRmlsdGVyczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gW21lc3NhZ2VGaWx0ZXIsIC4uLm1lc3NhZ2VGaWx0ZXJzXVxuICAgICAgLmZsYXRNYXAoKGZpbHRlcikgPT4gQXJyYXkuZnJvbSh0b2tlbml6ZVdpdGhPcHRpb25zKHsgbG93ZXJDYXNlOiB0cnVlIH0sIGZpbHRlcikpKVxuICAgICAgLmV2ZXJ5KChmaWx0ZXJUb2tlbikgPT4gdGhpcy5tZXNzYWdlVG9rZW5zLmluY2x1ZGVzKGZpbHRlclRva2VuKSk7XG4gIH1cbn1cblxuLyoqIEJ1aWxkIGFuIHtAbGluayBFcnJvckNvbnRleHR9IGZvciBzdGF0dXMgKyBtZXNzYWdlIGNoZWNrcy4gYG51bGxgIC8gYHVuZGVmaW5lZGAgYmVjb21lIGB7fWAuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JDb250ZXh0KGVycjogdW5rbm93bik6IEVycm9yQ29udGV4dCB7XG4gIHJldHVybiBuZXcgRXJyb3JDb250ZXh0SW1wbChlcnIgPz8ge30pO1xufVxuIl19
@@ -1,6 +1,6 @@
1
1
  /** Generic helpers for AppKit-style intercepted execution. */
2
- import * as async from "./async.js";
3
- import * as error from "./error.js";
2
+ import * as async from "./async-utils.js";
3
+ import * as error from "./error-utils.js";
4
4
  import * as object from "./object.js";
5
5
  function errorStatus(value) {
6
6
  if (!object.isRecord(value))
@@ -39,4 +39,4 @@ export async function run(options) {
39
39
  message: result.message,
40
40
  });
41
41
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUE4QnRDLFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNoQyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7UUFDbEIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEtBQUs7Z0JBQ1QsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0JBQzFCLE9BQU8sRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQzthQUNuQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLEtBQUssVUFBVSxHQUFHLENBQWMsT0FBZ0M7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUNsQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN2RixPQUFPLENBQUMsUUFBUSxDQUNqQixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUNsQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTztRQUFFLE1BQU0sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RELE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNuQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztLQUN4QixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEdlbmVyaWMgaGVscGVycyBmb3IgQXBwS2l0LXN0eWxlIGludGVyY2VwdGVkIGV4ZWN1dGlvbi4gKi9cbmltcG9ydCAqIGFzIGFzeW5jIGZyb20gXCIuL2FzeW5jLnRzXCI7XG5pbXBvcnQgKiBhcyBlcnJvciBmcm9tIFwiLi9lcnJvci50c1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG4vKiogU3VjY2Vzcy9mYWlsdXJlIHNoYXBlIHJldHVybmVkIGJ5IGFuIGludGVyY2VwdG9yLWJhY2tlZCBleGVjdXRvci4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvblJlc3VsdDxUPiA9XG4gIHsgb2s6IHRydWU7IGRhdGE6IFQgfSB8IHsgb2s6IGZhbHNlOyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH07XG5cbi8qKiBGdW5jdGlvbiBzaWduYXR1cmUgc2hhcmVkIGJ5IEFwcEtpdCBwbHVnaW4gZXhlY3V0b3JzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0b3I8U2V0dGluZ3M+ID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIEZhaWx1cmUgZGV0YWlscyBzdXBwbGllZCB3aGVuIGFuIGludGVyY2VwdGVkIG9wZXJhdGlvbiBjYW5ub3QgY29tcGxldGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkZhaWx1cmUge1xuICBvcGVyYXRpb246IHN0cmluZztcbiAgc3RhdHVzOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHJ1bm5pbmcgYW5kIHVud3JhcHBpbmcgb25lIGludGVyY2VwdGVkIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9uczxULCBTZXR0aW5ncz4ge1xuICBvcGVyYXRpb246IHN0cmluZztcbiAgc2V0dGluZ3M6IFNldHRpbmdzO1xuICBleGVjdXRlOiBFeGVjdXRvcjxTZXR0aW5ncz47XG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD47XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBjYW5jZWxlZDogKCkgPT4gRXJyb3I7XG4gIGZhaWxlZDogKGZhaWx1cmU6IEV4ZWN1dGlvbkZhaWx1cmUpID0+IEVycm9yO1xufVxuXG5mdW5jdGlvbiBlcnJvclN0YXR1cyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIDUwMDtcbiAgY29uc3Qgc3RhdHVzID0gdmFsdWUuc3RhdHVzQ29kZTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHN0YXR1cykgPyBzdGF0dXMgOiA1MDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGV4ZWN1dG9yIHVzZWQgYmVmb3JlIGEgcGx1Z2luIGluc3RhbGxzIGl0cyBpbnRlcmNlcHRvciBjaGFpbi5cbiAqIEVycm9ycyBhcmUgbWFwcGVkIG9udG8gdGhlIHNhbWUgcmVzdWx0IHNoYXBlIGFzIEFwcEtpdCdzIGBQbHVnaW4uZXhlY3V0ZSgpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdEV4ZWN1dG9yPFNldHRpbmdzPigpOiBFeGVjdXRvcjxTZXR0aW5ncz4ge1xuICByZXR1cm4gYXN5bmMgKGZuKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBhd2FpdCBmbigpIH07XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgc3RhdHVzOiBlcnJvclN0YXR1cyhjYXVzZSksXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLmVycm9yTWVzc2FnZShjYXVzZSksXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqIFJ1biBhbiBvcGVyYXRpb24gdGhyb3VnaCBhbiBleGVjdXRvciwgbWVyZ2UgY2FuY2VsbGF0aW9uLCBhbmQgdW53cmFwIGl0cyByZXN1bHQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuPFQsIFNldHRpbmdzPihvcHRpb25zOiBSdW5PcHRpb25zPFQsIFNldHRpbmdzPik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcHRpb25zLmV4ZWN1dGUoXG4gICAgKGV4ZWN1dGVTaWduYWwpID0+IG9wdGlvbnMuZm4oYXN5bmMuY29tYmluZUFib3J0U2lnbmFscyhleGVjdXRlU2lnbmFsLCBvcHRpb25zLnNpZ25hbCkpLFxuICAgIG9wdGlvbnMuc2V0dGluZ3MsXG4gICk7XG4gIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQuZGF0YTtcbiAgaWYgKG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBvcHRpb25zLmNhbmNlbGVkKCk7XG4gIHRocm93IG9wdGlvbnMuZmFpbGVkKHtcbiAgICBvcGVyYXRpb246IG9wdGlvbnMub3BlcmF0aW9uLFxuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcbiAgfSk7XG59XG4iXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsT0FBTyxLQUFLLEtBQUssTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBOEJ0QyxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDaEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzVCLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ2xCLElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLEVBQUUsRUFBRSxLQUFLO2dCQUNULE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7YUFDbkMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsR0FBRyxDQUFjLE9BQWdDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDdkYsT0FBTyxDQUFDLFFBQVEsQ0FDakIsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU87UUFBRSxNQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0RCxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87S0FDeEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBHZW5lcmljIGhlbHBlcnMgZm9yIEFwcEtpdC1zdHlsZSBpbnRlcmNlcHRlZCBleGVjdXRpb24uICovXG5pbXBvcnQgKiBhcyBhc3luYyBmcm9tIFwiLi9hc3luYy11dGlscy50c1wiO1xuaW1wb3J0ICogYXMgZXJyb3IgZnJvbSBcIi4vZXJyb3ItdXRpbHMudHNcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuLyoqIFN1Y2Nlc3MvZmFpbHVyZSBzaGFwZSByZXR1cm5lZCBieSBhbiBpbnRlcmNlcHRvci1iYWNrZWQgZXhlY3V0b3IuICovXG5leHBvcnQgdHlwZSBFeGVjdXRpb25SZXN1bHQ8VD4gPVxuICB7IG9rOiB0cnVlOyBkYXRhOiBUIH0gfCB7IG9rOiBmYWxzZTsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9O1xuXG4vKiogRnVuY3Rpb24gc2lnbmF0dXJlIHNoYXJlZCBieSBBcHBLaXQgcGx1Z2luIGV4ZWN1dG9ycy4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yPFNldHRpbmdzPiA9IDxUPihcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2V0dGluZ3M6IFNldHRpbmdzLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxUPj47XG5cbi8qKiBGYWlsdXJlIGRldGFpbHMgc3VwcGxpZWQgd2hlbiBhbiBpbnRlcmNlcHRlZCBvcGVyYXRpb24gY2Fubm90IGNvbXBsZXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25GYWlsdXJlIHtcbiAgb3BlcmF0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGZvciBydW5uaW5nIGFuZCB1bndyYXBwaW5nIG9uZSBpbnRlcmNlcHRlZCBvcGVyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnM8VCwgU2V0dGluZ3M+IHtcbiAgb3BlcmF0aW9uOiBzdHJpbmc7XG4gIHNldHRpbmdzOiBTZXR0aW5ncztcbiAgZXhlY3V0ZTogRXhlY3V0b3I8U2V0dGluZ3M+O1xuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgY2FuY2VsZWQ6ICgpID0+IEVycm9yO1xuICBmYWlsZWQ6IChmYWlsdXJlOiBFeGVjdXRpb25GYWlsdXJlKSA9PiBFcnJvcjtcbn1cblxuZnVuY3Rpb24gZXJyb3JTdGF0dXModmFsdWU6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiA1MDA7XG4gIGNvbnN0IHN0YXR1cyA9IHZhbHVlLnN0YXR1c0NvZGU7XG4gIHJldHVybiB0eXBlb2Ygc3RhdHVzID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShzdGF0dXMpID8gc3RhdHVzIDogNTAwO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBleGVjdXRvciB1c2VkIGJlZm9yZSBhIHBsdWdpbiBpbnN0YWxscyBpdHMgaW50ZXJjZXB0b3IgY2hhaW4uXG4gKiBFcnJvcnMgYXJlIG1hcHBlZCBvbnRvIHRoZSBzYW1lIHJlc3VsdCBzaGFwZSBhcyBBcHBLaXQncyBgUGx1Z2luLmV4ZWN1dGUoKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RFeGVjdXRvcjxTZXR0aW5ncz4oKTogRXhlY3V0b3I8U2V0dGluZ3M+IHtcbiAgcmV0dXJuIGFzeW5jIChmbikgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogYXdhaXQgZm4oKSB9O1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1czogZXJyb3JTdGF0dXMoY2F1c2UpLFxuICAgICAgICBtZXNzYWdlOiBlcnJvci5lcnJvck1lc3NhZ2UoY2F1c2UpLFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBSdW4gYW4gb3BlcmF0aW9uIHRocm91Z2ggYW4gZXhlY3V0b3IsIG1lcmdlIGNhbmNlbGxhdGlvbiwgYW5kIHVud3JhcCBpdHMgcmVzdWx0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bjxULCBTZXR0aW5ncz4ob3B0aW9uczogUnVuT3B0aW9uczxULCBTZXR0aW5ncz4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3B0aW9ucy5leGVjdXRlKFxuICAgIChleGVjdXRlU2lnbmFsKSA9PiBvcHRpb25zLmZuKGFzeW5jLmNvbWJpbmVBYm9ydFNpZ25hbHMoZXhlY3V0ZVNpZ25hbCwgb3B0aW9ucy5zaWduYWwpKSxcbiAgICBvcHRpb25zLnNldHRpbmdzLFxuICApO1xuICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgb3B0aW9ucy5jYW5jZWxlZCgpO1xuICB0aHJvdyBvcHRpb25zLmZhaWxlZCh7XG4gICAgb3BlcmF0aW9uOiBvcHRpb25zLm9wZXJhdGlvbixcbiAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXG4gIH0pO1xufVxuIl19
@@ -31,7 +31,7 @@ export interface MemoizeOptions {
31
31
  * pending promise until it settles.
32
32
  *
33
33
  * @example
34
- * const ranges = functionModule.memoize(fetchIpRanges, { ttlMs: 24 * 60 * 60 * 1000 });
34
+ * const ranges = functionUtils.memoize(fetchIpRanges, { ttlMs: 24 * 60 * 60 * 1000 });
35
35
  * await ranges(); // fetches
36
36
  * await ranges(); // cached until 24h later
37
37
  */
@@ -0,0 +1,44 @@
1
+ export function memoize(factory, options) {
2
+ const ttlMs = options?.ttlMs ?? 0;
3
+ let cache;
4
+ return () => {
5
+ if (cache === undefined || (ttlMs > 0 && Date.now() >= cache.expiresAt)) {
6
+ const result = factory();
7
+ if (isThenable(result)) {
8
+ const pending = Promise.resolve(result);
9
+ // `Infinity` keeps the entry unexpired while in flight (so a slow
10
+ // request isn't refetched and concurrent callers share it); the
11
+ // TTL window is stamped from resolution below.
12
+ const entry = { value: pending, expiresAt: Infinity };
13
+ cache = entry;
14
+ void pending.then(() => {
15
+ entry.expiresAt = Date.now() + ttlMs;
16
+ },
17
+ // Never cache a rejection: evict so a later call retries.
18
+ () => {
19
+ if (cache === entry)
20
+ cache = undefined;
21
+ });
22
+ }
23
+ else {
24
+ cache = { value: result, expiresAt: Date.now() + ttlMs };
25
+ }
26
+ }
27
+ return cache.value;
28
+ };
29
+ }
30
+ /** Duck-type any value with a callable `.then` as a thenable. */
31
+ function isThenable(value) {
32
+ if (value !== null) {
33
+ if (value instanceof Promise) {
34
+ return true;
35
+ }
36
+ else if (typeof value === "object" &&
37
+ "then" in value &&
38
+ typeof value.then === "function") {
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNENBLE1BQU0sVUFBVSxPQUFPLENBQ3JCLE9BQWlDLEVBQ2pDLE9BQXdCO0lBRXhCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2xDLElBQUksS0FBK0QsQ0FBQztJQUNwRSxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hDLGtFQUFrRTtnQkFDbEUsZ0VBQWdFO2dCQUNoRSwrQ0FBK0M7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3RELEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUNmLEdBQUcsRUFBRTtvQkFDSCxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsMERBQTBEO2dCQUMxRCxHQUFHLEVBQUU7b0JBQ0gsSUFBSSxLQUFLLEtBQUssS0FBSzt3QkFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN6QyxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxTQUFTLFVBQVUsQ0FBSSxLQUF5QjtJQUM5QyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsTUFBTSxJQUFJLEtBQUs7WUFDZixPQUFRLEtBQXdCLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFDcEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ2FjaGUgbGlmZXRpbWUgY29udHJvbHMgZm9yIHtAbGluayBtZW1vaXplfTsgZmFpbHVyZXMgYXJlIGFsd2F5cyBldmljdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgaW4gbWlsbGlzZWNvbmRzLiBUaGUgY2FjaGVkIHZhbHVlIGV4cGlyZXMgYHR0bE1zYCBhZnRlclxuICAgKiBpdCB3YXMgc3RvcmVkLCBzbyB0aGUgbmV4dCBjYWxsIHBhc3QgdGhhdCByZWNvbXB1dGVzOyBhIHJlamVjdGlvbiBpc1xuICAgKiBhbHNvIGV2aWN0ZWQgc28gYSBsYXRlciBjYWxsIHJldHJpZXMgcmF0aGVyIHRoYW4gcmVwbGF5aW5nIHRoZSBlcnJvci5cbiAgICogT21pdHRlZCBvciBgPD0gMGAgbWVhbnMgYSBzdWNjZXNzZnVsIHZhbHVlIGlzIGNhY2hlZCBmb3JldmVyICh0aGUgZGVmYXVsdCkuXG4gICAqIEVycm9ycyBhcmUgbmV2ZXIgY2FjaGVkIC0gc2VlIHtAbGluayBtZW1vaXplfS5cbiAgICpcbiAgICogVXNlIGZvciBwZXJpb2RpY2FsbHktcmVmcmVzaGVkIGRhdGEgKHB1Ymxpc2hlZCBJUCByYW5nZXMsIGZlYXR1cmVcbiAgICogZmxhZ3MsIGFueXRoaW5nIGZldGNoZWQgb25jZSBhbmQgcmV1c2VkIGFjcm9zcyByZXF1ZXN0cykuXG4gICAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSdW4gYSB6ZXJvLWFyZ3VtZW50IGZhY3Rvcnkgb25jZTsgbGF0ZXIgY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC5cbiAqIFRoZSBtZW1vaXplZCBmdW5jdGlvbiBtaXJyb3JzIHRoZSBmYWN0b3J5J3Mgc3luYyAvIGFzeW5jIG5hdHVyZTogYVxuICogc3luYyBmYWN0b3J5IHlpZWxkcyBhIHN5bmMgZ2V0dGVyIChgKCkgPT4gVGApLCBhbiBhc3luYyAvIHRoZW5hYmxlXG4gKiBmYWN0b3J5IHlpZWxkcyBhIHByb21pc2UtcmV0dXJuaW5nIGdldHRlciAoYCgpID0+IFByb21pc2U8VD5gKSB3aG9zZVxuICogY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBvbmUgaW4tZmxpZ2h0IHByb21pc2UgdW50aWwgaXQgc2V0dGxlcy5cbiAqXG4gKiBFcnJvcnMgYXJlIG5ldmVyIGNhY2hlZDogYSBzeW5jIGZhY3RvcnkgdGhhdCB0aHJvd3MgcHJvcGFnYXRlcyB0aGVcbiAqIHRocm93LCBhbmQgYW4gYXN5bmMgZmFjdG9yeSB0aGF0IHJlamVjdHMgZXZpY3RzIHRoZSBjYWNoZWQgcHJvbWlzZSwgc29cbiAqIGluIGJvdGggY2FzZXMgdGhlIG5leHQgY2FsbCByZXRyaWVzLiBQYXNzIGB7IHR0bE1zIH1gIHRvIGFsc28gZXhwaXJlXG4gKiBhbmQgcmVjb21wdXRlIGEgc3VjY2Vzc2Z1bCB2YWx1ZSBhZnRlciBhIHdpbmRvdzsgd2l0aG91dCBhIFRUTCBhXG4gKiBzdWNjZXNzIGlzIGNhY2hlZCBmb3JldmVyLlxuICpcbiAqIEZvciBhbiBhc3luYyBmYWN0b3J5IHRoZSBUVEwgd2luZG93IHN0YXJ0cyB3aGVuIHRoZSBwcm9taXNlXG4gKiAqcmVzb2x2ZXMqLCBub3Qgd2hlbiBpdCB3YXMgY3JlYXRlZCAtIGEgc2xvdyBpbi1mbGlnaHQgcmVxdWVzdCBuZXZlclxuICogY291bnRzIGFzIGFscmVhZHktZXhwaXJlZCwgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBrZWVwIHNoYXJpbmcgdGhlIG9uZVxuICogcGVuZGluZyBwcm9taXNlIHVudGlsIGl0IHNldHRsZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShmZXRjaElwUmFuZ2VzLCB7IHR0bE1zOiAyNCAqIDYwICogNjAgKiAxMDAwIH0pO1xuICogYXdhaXQgcmFuZ2VzKCk7IC8vIGZldGNoZXNcbiAqIGF3YWl0IHJhbmdlcygpOyAvLyBjYWNoZWQgdW50aWwgMjRoIGxhdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KFxuICBmYWN0b3J5OiAoKSA9PiBQcm9taXNlTGlrZTxUPixcbiAgb3B0aW9ucz86IE1lbW9pemVPcHRpb25zLFxuKTogKCkgPT4gUHJvbWlzZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KGZhY3Rvcnk6ICgpID0+IFQsIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyk6ICgpID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KFxuICBmYWN0b3J5OiAoKSA9PiBUIHwgUHJvbWlzZUxpa2U8VD4sXG4gIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyxcbik6ICgpID0+IFQgfCBQcm9taXNlPFQ+IHtcbiAgY29uc3QgdHRsTXMgPSBvcHRpb25zPy50dGxNcyA/PyAwO1xuICBsZXQgY2FjaGU6IHsgdmFsdWU6IFQgfCBQcm9taXNlPFQ+OyBleHBpcmVzQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChjYWNoZSA9PT0gdW5kZWZpbmVkIHx8ICh0dGxNcyA+IDAgJiYgRGF0ZS5ub3coKSA+PSBjYWNoZS5leHBpcmVzQXQpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmYWN0b3J5KCk7XG4gICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgLy8gYEluZmluaXR5YCBrZWVwcyB0aGUgZW50cnkgdW5leHBpcmVkIHdoaWxlIGluIGZsaWdodCAoc28gYSBzbG93XG4gICAgICAgIC8vIHJlcXVlc3QgaXNuJ3QgcmVmZXRjaGVkIGFuZCBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgaXQpOyB0aGVcbiAgICAgICAgLy8gVFRMIHdpbmRvdyBpcyBzdGFtcGVkIGZyb20gcmVzb2x1dGlvbiBiZWxvdy5cbiAgICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlOiBwZW5kaW5nLCBleHBpcmVzQXQ6IEluZmluaXR5IH07XG4gICAgICAgIGNhY2hlID0gZW50cnk7XG4gICAgICAgIHZvaWQgcGVuZGluZy50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0dGxNcztcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIE5ldmVyIGNhY2hlIGEgcmVqZWN0aW9uOiBldmljdCBzbyBhIGxhdGVyIGNhbGwgcmV0cmllcy5cbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FjaGUgPT09IGVudHJ5KSBjYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGUgPSB7IHZhbHVlOiByZXN1bHQsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS52YWx1ZTtcbiAgfTtcbn1cblxuLyoqIER1Y2stdHlwZSBhbnkgdmFsdWUgd2l0aCBhIGNhbGxhYmxlIGAudGhlbmAgYXMgYSB0aGVuYWJsZS4gKi9cbmZ1bmN0aW9uIGlzVGhlbmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJ0aGVuXCIgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUHJvbWlzZUxpa2U8VD4pLnRoZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
package/lib/src/log.js CHANGED
@@ -34,7 +34,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
34
34
  }
35
35
  return path;
36
36
  };
37
- import { memoize } from "./function.js";
37
+ import { memoize } from "./function-utils.js";
38
38
  import { toBoolean } from "./object.js";
39
39
  const globalProcess = globalThis.process;
40
40
  const globalBun = globalThis.Bun;
@@ -328,4 +328,4 @@ export function logger(loggerName) {
328
328
  const name = extractLoggerName(loggerName);
329
329
  return createLogger(name);
330
330
  }
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBY3ZELE1BQU0sYUFBYSxHQUFJLFVBQXdDLENBQUMsT0FBTyxDQUFDO0FBQ3hFLE1BQU0sU0FBUyxHQUFJLFVBQWdDLENBQUMsR0FBRyxDQUFDO0FBRXhEOzs7OztHQUtHO0FBQ0gsOERBQThEO0FBQzlELE1BQU0sbUJBQW1CLEdBQ3ZCLGFBQWEsSUFBSSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxLQUFLLFVBQVU7SUFDaEUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNO0lBQ3RCLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFaEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQVUsQ0FBQztBQUMvRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDckIsQ0FBQztBQUM5QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3pDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN2QixJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO0lBQy9CLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU07WUFDVCxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsT0FBTztZQUMzQixNQUFNO1FBQ1IsS0FBSyxN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YUFBdUI7SUFDdkQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLGFBQWEsSUFBSSxLQUFLLENBQUM7SUFDdkQsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZTtJQUM1QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyx3REFBd0QsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBeUM7SUFDbEUsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQUMsVUFBeUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGFnZ2VkLCBsZXZlbGVkIGxvZ2dpbmcgZm9yIGV2ZXJ5IHJ1bnRpbWUgLSB0aGUgb25lIGxvZ2dlciB0aGUgd2hvbGVcbiAqIG1vbm9yZXBvIHNoYXJlcy5cbiAqXG4gKiB7QGxpbmsgbG9nZ2VyfSByZXNvbHZlcyBhIHRhZ2dlZCB7QGxpbmsgTG9nZ2VyfSB0aHJvdWdoIGEgc3luY2hyb25vdXMgY29uc29sZVxuICogc2luaywgdGhlbiB1cGdyYWRlcyBpdHMgc2VydmVyLXNpZGUgZm9ybWF0dGVyIHdoZW4gYG5vZGU6dXRpbGAgcmVzb2x2ZXMuXG4gKiBLZWVwaW5nIHRoZSBzaW5rIGRlcGVuZGVuY3ktZnJlZSBwcmV2ZW50cyBicm93c2VyIGJ1bmRsZXJzIGZyb20gcmV0YWluaW5nIGFuXG4gKiBvcHRpb25hbCBiYXJlIGltcG9ydCB0aGF0IGRvd25zdHJlYW0gYXBwcyB3b3VsZCBzdGlsbCBoYXZlIHRvIGluc3RhbGwuXG4gKiB7QGxpbmsgTG9nTGV2ZWx9IGZpbHRlcmluZyBydW5zIHRocm91Z2gge0BsaW5rIHNob3VsZEVtaXR9IGluIHBlci1sZXZlbFxuICogd3JhcHBlcnMgYXJvdW5kIHRoZSBwbGF0Zm9ybSBjb25zb2xlIG9yIHN0ZGVyciBzaW5rLlxuICpcbiAqIFRoZSBjb25zb2xlIGZhbGxiYWNrIHdyaXRlcyBmb3JtYXR0ZWQgbGluZXMgdG8gYHByb2Nlc3Muc3RkZXJyYCB3aGVuIGl0IGlzXG4gKiBhdmFpbGFibGUgKEJ1biBgaW5zcGVjdGAgcGVyIGFyZ3VtZW50IHdoZW4gYExPR19CVU5fQ09OU09MRV9ESVNBQkxFRGAgaXNcbiAqIHVuc2V0LCBvdGhlcndpc2UgYG5vZGU6dXRpbGAgYGZvcm1hdFdpdGhPcHRpb25zYCksIG9yIGRlbGVnYXRlcyB0byBnbG9iYWxcbiAqIGBjb25zb2xlLipgIHdoZW4gc3RkZXJyIG9yIGBub2RlOnV0aWxgIGlzIHVuYXZhaWxhYmxlLiBCcm93c2VyIGhvc3RzIG9taXRcbiAqIHRoZSBgTEVWRUxgIHRleHQgcHJlZml4IChkZXZ0b29scyBzaG93IHNldmVyaXR5KSBhbmQga2VlcCBvbmx5IHRoZSBgW25hbWVdYFxuICogdGFnLlxuICpcbiAqIEVudiB0b2dnbGVzOiBgTE9HX0xFVkVMYCAocmVhZCBwZXIgY2FsbCkgYW5kIGBMT0dfQlVOX0NPTlNPTEVfRElTQUJMRURgXG4gKiAocmVhZCBvbmNlIGR1cmluZyBmYWN0b3J5IGluaXQpLlxuICpcbiAqIEJyb3dzZXItc2FmZTogYHByb2Nlc3NgIC8gYEJ1bmAgLyBgd2luZG93YCAvIGBkb2N1bWVudGAgYXJlIGFsbCByZWFjaGVkXG4gKiB0aHJvdWdoIGBnbG9iYWxUaGlzYCBhbmQgZ3VhcmRlZCwgYW5kIGBub2RlOnV0aWxgIGlzIGltcG9ydGVkIE9OTFkgb24gYSBob3N0XG4gKiB0aGF0IGhhcyBgcHJvY2Vzcy5zdGRlcnJgIC0gbmV2ZXIgaW4gYSBicm93c2VyLCB3aGVyZSB0aGUgc3BlY2lmaWVyIGlzXG4gKiB1bnJlc29sdmFibGUgLSBzbyB0aGUgbW9kdWxlIHdvcmtzIGluIGFueSBydW50aW1lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIi4vZnVuY3Rpb24udHNcIjtcbmltcG9ydCB7IHR5cGUgTmFtZUxpa2UsIHRvQm9vbGVhbiB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG4vKiogYHByb2Nlc3NgLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIG5vZGUgdHlwZXMgYXJlIG5lZWRlZC4gKi9cbmludGVyZmFjZSBQcm9jZXNzTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0ZGVycj86IHsgd3JpdGU/OiAoY2h1bms6IHN0cmluZykgPT4gdm9pZDsgaXNUVFk/OiB1bmtub3duIH07XG59XG5cbi8qKiBgQnVuYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBgQHR5cGVzL2J1bmAgaXMgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIEJ1bkxpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBpbnNwZWN0PzogKHZhbHVlOiB1bmtub3duLCBvcHRpb25zPzogeyBjb2xvcnM/OiBib29sZWFuOyBkZXB0aD86IG51bWJlciB9KSA9PiBzdHJpbmc7XG59XG5cbmNvbnN0IGdsb2JhbFByb2Nlc3MgPSAoZ2xvYmFsVGhpcyBhcyB7IHByb2Nlc3M/OiBQcm9jZXNzTGlrZSB9KS5wcm9jZXNzO1xuY29uc3QgZ2xvYmFsQnVuID0gKGdsb2JhbFRoaXMgYXMgeyBCdW4/OiBCdW5MaWtlIH0pLkJ1bjtcblxuLyoqXG4gKiBOb2RlIGBwcm9jZXNzLnN0ZGVycmAgd2hlbiB3cml0YWJsZSwgZWxzZSBgdW5kZWZpbmVkYCAoc3RhYmxlIGZvciB0aGVcbiAqIHByb2Nlc3MpLiBUeXBlZCBsb29zZWx5IChgYW55YCkgYmVjYXVzZSBpdCBpcyBoYW5kZWQgdG8gdGhlIGNvbnNvbGUgc2luaydzXG4gKiBgLndyaXRlYCwgd2hpY2ggb3VyIHN0cnVjdHVyYWwge0BsaW5rIFByb2Nlc3NMaWtlfSBzaGFwZSBkb2VzIG5vdCBzYXRpc2Z5XG4gKiBub21pbmFsbHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkgPVxuICBnbG9iYWxQcm9jZXNzICYmIHR5cGVvZiBnbG9iYWxQcm9jZXNzLnN0ZGVycj8ud3JpdGUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsUHJvY2Vzcy5zdGRlcnJcbiAgICA6IHVuZGVmaW5lZDtcblxuY29uc3QgTE9HX0xFVkVMUyA9IFtcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXSBhcyBjb25zdDtcbmNvbnN0IExPR19MRVZFTF9SQU5LID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBMT0dfTEVWRUxTLm1hcCgobGV2ZWwsIGluZGV4KSA9PiBbbGV2ZWwsIGluZGV4XSksXG4pIGFzIFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPjtcbmNvbnN0IExPR19MRVZFTF9DT0xPUlMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCkgPT4ge1xuICAgIGxldCBjb2xvciA9IFwiXFx4MWJbOTBtXCI7IC8vIGdyYXlcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIFwiaW5mb1wiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzRtXCI7IC8vIGJsdWVcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwid2FyblwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzNtXCI7IC8vIHllbGxvd1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzFtXCI7IC8vIHJlZFxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIFtsZXZlbCwgY29sb3JdO1xuICB9KSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBzdHJpbmc+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SX1JFU0VUID0gXCJcXHgxYlswbVwiO1xuY29uc3QgREVGQVVMVF9MRVZFTDogTG9nTGV2ZWwgPSBcImluZm9cIjtcblxuLyoqXG4gKiBTdXBwb3J0ZWQgc2V2ZXJpdGllcywgbG93ZXN0IHRvIGhpZ2hlc3Q6IGBkZWJ1Z2AsIGBpbmZvYCwgYHdhcm5gLCBgZXJyb3JgLlxuICogQSBjYWxsIGJlbG93IHRoZSBhY3RpdmUgdGhyZXNob2xkIGlzIGRpc2NhcmRlZCBiZWZvcmUgYW55IHN0cmluZyB3b3JrIG9yXG4gKiBzaW5rIEkvTy5cbiAqXG4gKiBUaGUgdGhyZXNob2xkIGNvbWVzIGZyb20gYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgb24gZXZlcnkgY2FsbFxuICogKGNhc2UtaW5zZW5zaXRpdmUsIGRlZmF1bHQgYGluZm9gIHdoZW4gdW5zZXQsIGVtcHR5LCBvciB1bmtub3duKSBzbyB0ZXN0XG4gKiBydW5uZXJzIGFuZCBlbWJlZGRlcnMgY2FuIGNoYW5nZSB2ZXJib3NpdHkgYWZ0ZXIgaW1wb3J0IHdpdGhvdXQgcmVzdGFydGluZ1xuICogdGhlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gKHR5cGVvZiBMT0dfTEVWRUxTKVtudW1iZXJdO1xuXG4vKipcbiAqIERlcGVuZGVuY3ktZnJlZSBsZXZlbGVkIGxvZ2dlci4gU3RhbmRhcmQgbWV0aG9kcyBob25vciBgTE9HX0xFVkVMYDsgYHN0YXJ0YFxuICogYW5kIGBzdWNjZXNzYCBhcmUgaW5mb3JtYXRpb25hbCBhbGlhc2VzIHdpdGggZGlzdGluY3QgcHJlc2VudGF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBMb2dnZXIgPSB7XG4gIFtLIGluIExvZ0xldmVsXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufSAmIHtcbiAgLyoqIFN1Y2Nlc3MgbWVzc2FnZSBlbWl0dGVkIGF0IGBpbmZvYCBsZXZlbC4gKi9cbiAgc3VjY2VzczogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAvKiogU3RhcnQgLyBpbi1wcm9ncmVzcyBtZXNzYWdlIGVtaXR0ZWQgYXQgYGluZm9gIGxldmVsLiAqL1xuICBzdGFydDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufTtcblxuLyoqIGAobmFtZT8pID0+IExvZ2dlcmAgc2luayBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGUgaW5pdC10aW1lIGZhY3RvcnkgY2hhaW4uICovXG50eXBlIExvZ2dlckZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4gTG9nZ2VyO1xuXG4vKipcbiAqIENvbnNvbGUge0BsaW5rIExvZ2dlckZhY3Rvcnl9OyBhbHdheXMgc3VjY2VlZHMuXG4gKlxuICogV2hlbiBgcHJvY2Vzcy5zdGRlcnJgIGlzIGF2YWlsYWJsZSwgZm9ybWF0cyBlYWNoIGxpbmUgYW5kIHdyaXRlcyBvbmx5IHRvXG4gKiBzdGRlcnIuIEJ1biBgaW5zcGVjdGAgZm9ybWF0cyBlYWNoIGFyZ3VtZW50IHdoZW4gZW5hYmxlZDsgb3RoZXJ3aXNlXG4gKiBgdXRpbC5pbnNwZWN0YCB3aGVuIGBub2RlOnV0aWxgIGxvYWRzLCBvciBhIGBKU09OLnN0cmluZ2lmeWAgZmFsbGJhY2sgd2hlblxuICogaXQgZG9lcyBub3QuIFdoZW4gc3RkZXJyIGlzIHVuYXZhaWxhYmxlIChldmVyeSBicm93c2VyKSwgYmluZHNcbiAqIHtAbGluayBjcmVhdGVGb3JtYXR0ZXJ9IHByZWZpeGVzIGludG8gZ2xvYmFsIGBjb25zb2xlLipgIGNhbGxzIGFuZCBza2lwcyB0aGVcbiAqIGBub2RlOnV0aWxgIGltcG9ydCBlbnRpcmVseS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55KTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiB7XG4gIC8vIEluZGlyZWN0IHNwZWNpZmllciBzbyB0aGlzIGJyb3dzZXItc2FmZSBtb2R1bGUgZG9lc24ndCBzdGF0aWNhbGx5IHB1bGwgaW5cbiAgLy8gbm9kZSB0eXBlczogYG5vZGU6dXRpbGAgaXMgb3B0aW9uYWwgKHRoZSBKU09OIGZhbGxiYWNrIGNvdmVycyBpdHMgYWJzZW5jZSkuXG4gIGNvbnN0IG5vZGVVdGlsID0gXCJub2RlOnV0aWxcIjtcbiAgLy8gR2F0ZWQsIG5vdCBqdXN0IGNhdWdodDogdGhlIGluZGlyZWN0IHNwZWNpZmllciBkZWZlYXRzIGJ1bmRsZXIgYW5hbHlzaXMgYnlcbiAgLy8gZGVzaWduLCBzbyBhIGNsaWVudCBidWlsZCBlbWl0cyBhIGxpdGVyYWwgYGltcG9ydChcIm5vZGU6dXRpbFwiKWAgdGhhdCBub1xuICAvLyBicm93c2VyIGNhbiByZXNvbHZlLCBhbmQgdGhlIGNhdWdodCByZWplY3Rpb24gc3RpbGwgc3VyZmFjZWQgYXMgYSBjb25zb2xlXG4gIC8vIGVycm9yLiBgdXRpbHNgIG9ubHkgZmVlZHMgdGhlIHN0ZGVyciBicmFuY2ggb2YgdGhlIGVtaXR0ZXIgYmVsb3csIHNvIG5vXG4gIC8vIHN0ZGVyciBtZWFucyB0aGUgaW1wb3J0IGhhcyBub3RoaW5nIHRvIHNlcnZlIGFuZCBpcyBza2lwcGVkIG91dHJpZ2h0LlxuICBjb25zdCB1dGlsczogeyBpbnNwZWN0PzogYW55IH0gfCB1bmRlZmluZWQgPVxuICAgIGdsb2JhbFByb2Nlc3NTdGRFcnIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBub2RlVXRpbCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRFcnIsIHV0aWxzKTtcbn1cblxuLyoqXG4gKiBUaGUgc3luY2hyb25vdXMgY29yZSBvZiB7QGxpbmsgY3JlYXRlQ29uc29sZUxvZ2dlckZhY3Rvcnl9LCBzcGxpdCBvdXQgc28gdGhlXG4gKiBzYW1lIGVtaXR0ZXIgYWxzbyBzZXJ2ZXMgYXMgdGhlIGJvb3RzdHJhcCBzaW5rIGJlZm9yZSBhbnkgYXN5bmMgZmFjdG9yeSBoYXNcbiAqIHJlc29sdmVkLiBgdXRpbHNgIGlzIGBub2RlOnV0aWxgIHdoZW4gaXQgbG9hZGVkOyB3aXRob3V0IGl0LCBvYmplY3QgYXJndW1lbnRzXG4gKiBmb3JtYXQgdGhyb3VnaCB0aGUgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gY29uc29sZUxvZ2dlckZhY3RvcnkoXG4gIGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSxcbiAgdXRpbHM/OiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCxcbik6IExvZ2dlckZhY3Rvcnkge1xuICBjb25zdCBidW5JbnNwZWN0ID1cbiAgICBnbG9iYWxCdW4gIT09IHVuZGVmaW5lZCAmJiAhdG9Cb29sZWFuKGdsb2JhbEJ1bi5lbnY/LkxPR19CVU5fQ09OU09MRV9ESVNBQkxFRClcbiAgICAgID8gZ2xvYmFsQnVuLmluc3BlY3RcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXNldENvbG9yc1ByZWZpeCA9IGJ1bkluc3BlY3QgIT09IHVuZGVmaW5lZDtcblxuICBjb25zdCBpbnNwZWN0ID0gKGFyZzogYW55LCBjb2xvcnM/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSB8fCAodHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiBhcmcgIT09IG51bGwpKSB7XG4gICAgICBpZiAoYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBidW5JbnNwZWN0KGFyZywge1xuICAgICAgICAgIGNvbG9yczogY29sb3JzLFxuICAgICAgICAgIGRlcHRoOiB1dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnM/LmRlcHRoID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHV0aWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgLi4udXRpbHM/Lmluc3BlY3Q/LmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIGNvbG9yczogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0KCk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcsIChfLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgICAgICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFN0cmluZyhhcmcpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBmYWN0b3J5ID0gKG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcmVmaXhGb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXIobmFtZSwgZ2xvYmFsUHJvY2Vzc1N0ZEVyciwgcmVzZXRDb2xvcnNQcmVmaXgpO1xuICAgIGNvbnN0IGxvZ2dlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIExPR19MRVZFTFMubWFwKChsZXZlbCkgPT4ge1xuICAgICAgICBjb25zdCB7IHByZWZpeCwgY29sb3JzLCByZXNldENvbG9ycyB9ID0gcHJlZml4Rm9ybWF0dGVyKGxldmVsKTtcbiAgICAgICAgY29uc3QgZW1pdHRlciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGlmICghc2hvdWxkRW1pdChsZXZlbCwgdHJ1ZSkpIHJldHVybjtcbiAgICAgICAgICBpZiAoZ2xvYmFsUHJvY2Vzc1N0ZEVyciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFydHMgPSBwcmVmaXggPyBbcHJlZml4XSA6IFtdO1xuICAgICAgICAgICAgbWVzc2FnZVBhcnRzLnB1c2goLi4uYXJncy5tYXAoKGFyZykgPT4gaW5zcGVjdChhcmcsIGNvbG9ycykpKTtcbiAgICAgICAgICAgIGlmIChyZXNldENvbG9ycykgbWVzc2FnZVBhcnRzLnB1c2goTE9HX0xFVkVMX0NPTE9SX1JFU0VUKTtcbiAgICAgICAgICAgIGdsb2JhbFByb2Nlc3NTdGRFcnIud3JpdGUobWVzc2FnZVBhcnRzLmpvaW4oXCIgXCIpICsgXCJcXG5cIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsZXZlbEZuID0gY29uc29sZVtsZXZlbF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxldmVsRm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBsZXZlbEZuID0gY29uc29sZS5sb2c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlZml4KSBsZXZlbEZuID0gbGV2ZWxGbi5iaW5kKGNvbnNvbGUsIHByZWZpeCk7XG4gICAgICAgICAgICBsZXZlbEZuKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFtsZXZlbCwgZW1pdHRlcl07XG4gICAgICB9KSxcbiAgICApIGFzIExvZ2dlcjtcbiAgICAvLyBDb252ZW5pZW5jZSBsZXZlbHMgc2hhcmUgdGhlIGluZm8gc2luay5cbiAgICBsb2dnZXIuc3VjY2VzcyA9IGxvZ2dlci5pbmZvO1xuICAgIGxvZ2dlci5zdGFydCA9IGxvZ2dlci5pbmZvO1xuICAgIHJldHVybiBsb2dnZXI7XG4gIH07XG4gIGNvbnN0IGRlZmF1bHRGYWN0b3J5ID0gbWVtb2l6ZShmYWN0b3J5KTtcbiAgcmV0dXJuIChuYW1lPzogc3RyaW5nKSA9PiAobmFtZSA/IGZhY3RvcnkobmFtZSkgOiBkZWZhdWx0RmFjdG9yeSgpKTtcbn1cblxuLyoqXG4gKiBGdWxsIGNvbnNvbGUgc2luayB3aXRoIG9wdGlvbmFsIGBub2RlOnV0aWxgIGluc3BlY3Rpb24uIE1lbW9pemVkIHNvXG4gKiBjb25jdXJyZW50IGFuZCByZXBlYXQgY2FsbGVycyBzaGFyZSBvbmUgaW4tZmxpZ2h0IHByb21pc2UgYW5kIHNldHRsZWQgcmVzdWx0LlxuICovXG5jb25zdCByZXNvbHZlRmFjdG9yeSA9IG1lbW9pemUoYXN5bmMgKCk6IFByb21pc2U8TG9nZ2VyRmFjdG9yeT4gPT4ge1xuICByZXR1cm4gY3JlYXRlQ29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVycik7XG59KTtcblxuLyoqXG4gKiBBY3RpdmUgZmFjdG9yeSBzdGFydHMgYXMgYSBzeW5jIGNvbnNvbGUgc2luayAobm8gYGF3YWl0YCwgc28gdGhpcyBtb2R1bGVcbiAqIGZpbmlzaGVzIGV2YWx1YXRpbmcgaW1tZWRpYXRlbHkpIGFuZCBzd2FwcyB0byB7QGxpbmsgcmVzb2x2ZUZhY3Rvcnl9J3NcbiAqIHJlc3VsdCB3aGVuIHNlcnZlci1zaWRlIGFyZ3VtZW50IGluc3BlY3Rpb24gaXMgcmVhZHkuXG4gKi9cbmxldCBhY3RpdmVGYWN0b3J5OiBMb2dnZXJGYWN0b3J5ID0gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVycik7XG52b2lkIHJlc29sdmVGYWN0b3J5KCkudGhlbihcbiAgKGZhY3RvcnkpID0+IHtcbiAgICBhY3RpdmVGYWN0b3J5ID0gZmFjdG9yeTtcbiAgfSxcbiAgKCkgPT4ge1xuICAgIC8vIEtlZXAgdGhlIHN5bmMgY29uc29sZSBzaW5rOyBuZXZlciBsZWF2ZSBpbXBvcnRlcnMgd2l0aG91dCBhIGZhY3RvcnkuXG4gIH0sXG4pO1xuXG4vKipcbiAqIEJ1aWxkIGEgbG9nZ2VyIHRoYXQgcmViaW5kcyB3aGVuIHtAbGluayBhY3RpdmVGYWN0b3J5fSB1cGdyYWRlcy4gQ2FsbGVycyB0aGF0XG4gKiBjYXB0dXJlIGBjb25zdCBsb2cgPSBsb2dnZXIoXCJ4XCIpYCBhdCBtb2R1bGUgc2NvcGUgc3RpbGwgZ2V0IHRoZSB1cGdyYWRlZFxuICogZm9ybWF0dGVyIG9uY2UgaXQgYXJyaXZlcywgd2l0aG91dCBldmVyeSBjYWxsIHNpdGUgd2FpdGluZyBvbiBhIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihuYW1lPzogc3RyaW5nKTogTG9nZ2VyIHtcbiAgbGV0IGJvdW5kOiB7IGZhY3Rvcnk6IExvZ2dlckZhY3Rvcnk7IGxvZ2dlcjogTG9nZ2VyIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpbmsgPSAoKTogTG9nZ2VyID0+IHtcbiAgICBpZiAoYm91bmQ/LmZhY3RvcnkgIT09IGFjdGl2ZUZhY3RvcnkpIHtcbiAgICAgIGJvdW5kID0geyBmYWN0b3J5OiBhY3RpdmVGYWN0b3J5LCBsb2dnZXI6IGFjdGl2ZUZhY3RvcnkobmFtZSkgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kLmxvZ2dlcjtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4uTE9HX0xFVkVMUywgXCJzdWNjZXNzXCIsIFwic3RhcnRcIl0ubWFwKChsZXZlbCkgPT4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAoLi4uYXJnczogYW55W10pID0+IHNpbmsoKVtsZXZlbCBhcyBrZXlvZiBMb2dnZXJdKC4uLmFyZ3MpLFxuICAgIF0pLFxuICApIGFzIExvZ2dlcjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGxpbmUgcHJlZml4IG9mIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuIGhvc3RzLCBvciBgW25hbWVdYCBhbG9uZVxuICogaW4gYnJvd3NlcnMgKGVpdGhlciBwYXJ0IG9taXR0ZWQgd2hlbiBhYnNlbnQpLiBBcHBsaWVzIHBlci1sZXZlbCBBTlNJIGNvbG9yXG4gKiB3aGVuIGBzdHJlYW1TdXBwb3J0c0NvbG9yYCBpcyB0cnVlIGZvciB0aGUgZ2l2ZW4gc3RkZXJyIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVyKFxuICBuYW1lOiBhbnksXG4gIHN0cmVhbTogYW55LFxuICByZXNldENvbG9yc1ByZWZpeD86IGJvb2xlYW4sXG4pOiAobGV2ZWw/OiBMb2dMZXZlbCkgPT4geyBwcmVmaXg6IHN0cmluZzsgY29sb3JzOiBib29sZWFuOyByZXNldENvbG9yczogYm9vbGVhbiB9IHtcbiAgY29uc3QgZ2xvYiA9IGdsb2JhbFRoaXMgYXMgeyB3aW5kb3c/OiB1bmtub3duOyBkb2N1bWVudD86IHVua25vd24gfTtcbiAgY29uc3QgaXNCcm93c2VyID0gZ2xvYi53aW5kb3cgIT09IHVuZGVmaW5lZCAmJiBnbG9iLmRvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1cHBvcnRzQ29sb3IgPSAhaXNCcm93c2VyID8gc3RyZWFtU3VwcG9ydHNDb2xvcihzdHJlYW0pIDogZmFsc2U7XG4gIGNvbnN0IG5hbWVQcmVmaXggPSBuYW1lID8gXCJbXCIgKyBuYW1lICsgXCJdXCIgOiB1bmRlZmluZWQ7XG4gIHJldHVybiAobGV2ZWw/OiBMb2dMZXZlbCkgPT4ge1xuICAgIGNvbnN0IGNvbG9yID0gc3VwcG9ydHNDb2xvciAmJiBsZXZlbCAhPT0gdW5kZWZpbmVkID8gTE9HX0xFVkVMX0NPTE9SU1tsZXZlbF0gOiB1bmRlZmluZWQ7XG4gICAgbGV0IHByZWZpeCA9IFshaXNCcm93c2VyICYmIGxldmVsID8gbGV2ZWwudG9VcHBlckNhc2UoKSA6IHVuZGVmaW5lZCwgbmFtZVByZWZpeF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBsZXQgcmVzZXRDb2xvcnMgPSBmYWxzZTtcbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGNvbnN0IGFwcGx5UmVzZXRDb2xvcnNQcmVmaXggPSByZXNldENvbG9yc1ByZWZpeCB8fCBcImluZm9cIiA9PT0gbGV2ZWw7XG4gICAgICBpZiAoIWFwcGx5UmVzZXRDb2xvcnNQcmVmaXgpIHJlc2V0Q29sb3JzID0gdHJ1ZTtcbiAgICAgIHByZWZpeCA9IGFwcGx5UmVzZXRDb2xvcnNQcmVmaXggPyBjb2xvciArIHByZWZpeCArIExPR19MRVZFTF9DT0xPUl9SRVNFVCA6IGNvbG9yICsgcHJlZml4O1xuICAgIH1cbiAgICByZXR1cm4geyBwcmVmaXgsIGNvbG9yczogY29sb3IgPyB0cnVlIDogZmFsc2UsIHJlc2V0Q29sb3JzIH07XG4gIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gYHN0cmVhbWAgaXMgYSBUVFkgYW5kIHRoZSB0ZXJtaW5hbCBpcyBub3QgYGR1bWJgLiAqL1xuZnVuY3Rpb24gc3RyZWFtU3VwcG9ydHNDb2xvcihzdHJlYW0/OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChnbG9iYWxQcm9jZXNzID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHN0cmVhbSAhPT0gXCJvYmplY3RcIiB8fCBzdHJlYW0gPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeyBpc1RUWSB9ID0gc3RyZWFtIGFzIHsgaXNUVFk/OiB1bmtub3duIH07XG4gIGlmIChpc1RUWSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0ZXJtID0gZ2xvYmFsUHJvY2Vzcy5lbnY/LlRFUk0/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChcImR1bWJcIiA9PSB0ZXJtKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUGFyc2UgYSByYXcgdmFsdWUgYXMge0BsaW5rIExvZ0xldmVsfSAodHJpbW1lZCwgY2FzZS1pbnNlbnNpdGl2ZSkuICovXG5mdW5jdGlvbiBwYXJzZUxvZ0xldmVsKHJhdzogdW5rbm93bik6IExvZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHRleHQgPSB0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiID8gcmF3IDogU3RyaW5nKHJhdyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0ZXh0ID09PSBub3JtYWxpemVkKSBicmVhaztcbiAgICAgIHRleHQgPSBub3JtYWxpemVkO1xuICAgIH1cbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAodGV4dCBpbiBMT0dfTEVWRUxfUkFOSykge1xuICAgICAgcmV0dXJuIHRleHQgYXMgTG9nTGV2ZWw7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBY3RpdmUgdGhyZXNob2xkIGZyb20gYHByb2Nlc3MuZW52LkxPR19MRVZFTGAsIGRlZmF1bHQge0BsaW5rIERFRkFVTFRfTEVWRUx9LiAqL1xuZnVuY3Rpb24gYWN0aXZlTGV2ZWwoKTogTG9nTGV2ZWwge1xuICByZXR1cm4gcGFyc2VMb2dMZXZlbChnbG9iYWxQcm9jZXNzPy5lbnY/LkxPR19MRVZFTCkgPz8gREVGQVVMVF9MRVZFTDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGByYXdgIG1lZXRzIHRoZSBjdXJyZW50IGBMT0dfTEVWRUxgIHRocmVzaG9sZC5cbiAqXG4gKiBQYXJzZXMgYHJhd2AgYXMgYSB7QGxpbmsgTG9nTGV2ZWx9OyB3aGVuIHBhcnNpbmcgZmFpbHMsIHJldHVybnNcbiAqIGBkZWZhdWx0UmVzdWx0YCBpZiBzdXBwbGllZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEVtaXQocmF3OiB1bmtub3duLCBkZWZhdWx0UmVzdWx0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBsZXZlbCA9IHBhcnNlTG9nTGV2ZWwocmF3KTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0UmVzdWx0ID8/IGZhbHNlO1xuICByZXR1cm4gTE9HX0xFVkVMX1JBTktbbGV2ZWxdID49IExPR19MRVZFTF9SQU5LW2FjdGl2ZUxldmVsKCldO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjYWxsIGF0IGBsZXZlbGAgd291bGQgYmUgZW1pdHRlZCBhdCB0aGUgY3VycmVudFxuICogYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgdGhyZXNob2xkLiBVc2UgYmVmb3JlIGJ1aWxkaW5nIGV4cGVuc2l2ZSBkZWJ1Z1xuICogcGF5bG9hZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSB7XG4gKiAgIGxvZy5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlclwiLCB7IGNvbnRyaWJ1dGlvbjogYXdhaXQgaGVhdnlTbmFwc2hvdCgpIH0pO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMZXZlbEVuYWJsZWQobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaG91bGRFbWl0KGxldmVsKTtcbn1cblxuY29uc3QgTE9HR0VSX05BTUVfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLyk/LipcXC8oW14vLl0rKSg/OlxcLlteL10rKT8kL2k7XG5cbi8qKlxuICogRGVyaXZlIHRoZSB0YWcgc3RyaW5nIGZyb20gYSBsb2dnZXIgbmFtZSwgcGx1Z2luLCBvciBwYXRoLiBTbGFzaC0gYW5kXG4gKiBVUkwtc2hhcGVkIHN0cmluZ3MgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudCAoZXh0ZW5zaW9uIHN0cmlwcGVkKTsgcGxhaW5cbiAqIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC4gRW1wdHkgb3IgbWlzc2luZyBuYW1lcyAtPiBgdW5kZWZpbmVkYFxuICogKHVudGFnZ2VkIHNpbmspLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lOiBOYW1lTGlrZSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghbG9nZ2VyTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBsb2dnZXJOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsb2dnZXJOYW1lLm1hdGNoKExPR0dFUl9OQU1FX1JFR0VYKTtcbiAgICByZXR1cm4gbWF0Y2g/LlsxXSA/PyBsb2dnZXJOYW1lO1xuICB9XG4gIHJldHVybiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lLm5hbWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgdGFnZ2VkIGxvZ2dlciBmb3IgYSBwbHVnaW4gb3IgbW9kdWxlLlxuICpcbiAqIFRoZSB0YWcgaXMgYFtuYW1lXWAgd2hlbiBgbG9nZ2VyTmFtZWAgaXMgYSBub24tZW1wdHkgc3RyaW5nLCBhXG4gKiB7QGxpbmsgTmFtZUxpa2V9IHdpdGggYG5hbWVgLCBvciBhIGZpbGUgLyBVUkwgcGF0aCAodGhlIGJhc2VuYW1lIHdpdGhvdXRcbiAqIGV4dGVuc2lvbiBpcyB1c2VkKS4gVGhlIGNvbnNvbGUgc2luayBwcmVwZW5kcyBgTEVWRUwgW25hbWVdYCBvbiBOb2RlL0J1blxuICogaG9zdHMgb3IgYFtuYW1lXWAgYWxvbmUgaW4gYnJvd3NlcnMgdmlhIHtAbGluayBjcmVhdGVGb3JtYXR0ZXJ9LlxuICpcbiAqIENhbGxzIGJlbG93IGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgIGFyZSBkcm9wcGVkIGJ5IHtAbGluayBzaG91bGRFbWl0fSBiZWZvcmVcbiAqIHRoZSBzaW5rIGZvcm1hdHMgb3Igd3JpdGVzIHRoZSBsaW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuICpcbiAqIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJnZW5pZS9jaGF0XCIpO1xuICogbG9nZ2VyLmluZm8oXCJzdGFydGluZ1wiKTtcbiAqIGxvZ2dlci53YXJuKFwibWlzc2luZyBvcHRpb25hbCBjb25maWdcIiwgeyByZWFzb246IFwibm8gZW52IHZhclwiIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogTG9nZ2VyIHtcbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUpO1xuICByZXR1cm4gY3JlYXRlTG9nZ2VyKG5hbWUpO1xufVxuIl19
331
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFjdkQsTUFBTSxhQUFhLEdBQUksVUFBd0MsQ0FBQyxPQUFPLENBQUM7QUFDeEUsTUFBTSxTQUFTLEdBQUksVUFBZ0MsQ0FBQyxHQUFHLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNyQixDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3ZCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87SUFDL0IsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssTUFBTTtZQUNULEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO1lBQzNCLE1BQU07UUFDUixLQUFL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RSxhQUF1QjtJQUN2RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sYUFBYSxJQUFJLEtBQUssQ0FBQztJQUN2RCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFlO0lBQzVDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLHdEQUF3RCxDQUFDO0FBRW5GOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxVQUF5QztJQUNsRSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUF5QztJQUM5RCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUYWdnZWQsIGxldmVsZWQgbG9nZ2luZyBmb3IgZXZlcnkgcnVudGltZSAtIHRoZSBvbmUgbG9nZ2VyIHRoZSB3aG9sZVxuICogbW9ub3JlcG8gc2hhcmVzLlxuICpcbiAqIHtAbGluayBsb2dnZXJ9IHJlc29sdmVzIGEgdGFnZ2VkIHtAbGluayBMb2dnZXJ9IHRocm91Z2ggYSBzeW5jaHJvbm91cyBjb25zb2xlXG4gKiBzaW5rLCB0aGVuIHVwZ3JhZGVzIGl0cyBzZXJ2ZXItc2lkZSBmb3JtYXR0ZXIgd2hlbiBgbm9kZTp1dGlsYCByZXNvbHZlcy5cbiAqIEtlZXBpbmcgdGhlIHNpbmsgZGVwZW5kZW5jeS1mcmVlIHByZXZlbnRzIGJyb3dzZXIgYnVuZGxlcnMgZnJvbSByZXRhaW5pbmcgYW5cbiAqIG9wdGlvbmFsIGJhcmUgaW1wb3J0IHRoYXQgZG93bnN0cmVhbSBhcHBzIHdvdWxkIHN0aWxsIGhhdmUgdG8gaW5zdGFsbC5cbiAqIHtAbGluayBMb2dMZXZlbH0gZmlsdGVyaW5nIHJ1bnMgdGhyb3VnaCB7QGxpbmsgc2hvdWxkRW1pdH0gaW4gcGVyLWxldmVsXG4gKiB3cmFwcGVycyBhcm91bmQgdGhlIHBsYXRmb3JtIGNvbnNvbGUgb3Igc3RkZXJyIHNpbmsuXG4gKlxuICogVGhlIGNvbnNvbGUgZmFsbGJhY2sgd3JpdGVzIGZvcm1hdHRlZCBsaW5lcyB0byBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gaXQgaXNcbiAqIGF2YWlsYWJsZSAoQnVuIGBpbnNwZWN0YCBwZXIgYXJndW1lbnQgd2hlbiBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYCBpc1xuICogdW5zZXQsIG90aGVyd2lzZSBgbm9kZTp1dGlsYCBgZm9ybWF0V2l0aE9wdGlvbnNgKSwgb3IgZGVsZWdhdGVzIHRvIGdsb2JhbFxuICogYGNvbnNvbGUuKmAgd2hlbiBzdGRlcnIgb3IgYG5vZGU6dXRpbGAgaXMgdW5hdmFpbGFibGUuIEJyb3dzZXIgaG9zdHMgb21pdFxuICogdGhlIGBMRVZFTGAgdGV4dCBwcmVmaXggKGRldnRvb2xzIHNob3cgc2V2ZXJpdHkpIGFuZCBrZWVwIG9ubHkgdGhlIGBbbmFtZV1gXG4gKiB0YWcuXG4gKlxuICogRW52IHRvZ2dsZXM6IGBMT0dfTEVWRUxgIChyZWFkIHBlciBjYWxsKSBhbmQgYExPR19CVU5fQ09OU09MRV9ESVNBQkxFRGBcbiAqIChyZWFkIG9uY2UgZHVyaW5nIGZhY3RvcnkgaW5pdCkuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgLyBgQnVuYCAvIGB3aW5kb3dgIC8gYGRvY3VtZW50YCBhcmUgYWxsIHJlYWNoZWRcbiAqIHRocm91Z2ggYGdsb2JhbFRoaXNgIGFuZCBndWFyZGVkLCBhbmQgYG5vZGU6dXRpbGAgaXMgaW1wb3J0ZWQgT05MWSBvbiBhIGhvc3RcbiAqIHRoYXQgaGFzIGBwcm9jZXNzLnN0ZGVycmAgLSBuZXZlciBpbiBhIGJyb3dzZXIsIHdoZXJlIHRoZSBzcGVjaWZpZXIgaXNcbiAqIHVucmVzb2x2YWJsZSAtIHNvIHRoZSBtb2R1bGUgd29ya3MgaW4gYW55IHJ1bnRpbWUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi9mdW5jdGlvbi11dGlscy50c1wiO1xuaW1wb3J0IHsgdHlwZSBOYW1lTGlrZSwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5cbi8qKiBgcHJvY2Vzc2Atc2hhcGVkIHZpZXcgb2ZmIGBnbG9iYWxUaGlzYCwgc28gbm8gbm9kZSB0eXBlcyBhcmUgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NMaWtlIHtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RkZXJyPzogeyB3cml0ZT86IChjaHVuazogc3RyaW5nKSA9PiB2b2lkOyBpc1RUWT86IHVua25vd24gfTtcbn1cblxuLyoqIGBCdW5gLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIGBAdHlwZXMvYnVuYCBpcyBuZWVkZWQuICovXG5pbnRlcmZhY2UgQnVuTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGluc3BlY3Q/OiAodmFsdWU6IHVua25vd24sIG9wdGlvbnM/OiB7IGNvbG9ycz86IGJvb2xlYW47IGRlcHRoPzogbnVtYmVyIH0pID0+IHN0cmluZztcbn1cblxuY29uc3QgZ2xvYmFsUHJvY2VzcyA9IChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IFByb2Nlc3NMaWtlIH0pLnByb2Nlc3M7XG5jb25zdCBnbG9iYWxCdW4gPSAoZ2xvYmFsVGhpcyBhcyB7IEJ1bj86IEJ1bkxpa2UgfSkuQnVuO1xuXG4vKipcbiAqIE5vZGUgYHByb2Nlc3Muc3RkZXJyYCB3aGVuIHdyaXRhYmxlLCBlbHNlIGB1bmRlZmluZWRgIChzdGFibGUgZm9yIHRoZVxuICogcHJvY2VzcykuIFR5cGVkIGxvb3NlbHkgKGBhbnlgKSBiZWNhdXNlIGl0IGlzIGhhbmRlZCB0byB0aGUgY29uc29sZSBzaW5rJ3NcbiAqIGAud3JpdGVgLCB3aGljaCBvdXIgc3RydWN0dXJhbCB7QGxpbmsgUHJvY2Vzc0xpa2V9IHNoYXBlIGRvZXMgbm90IHNhdGlzZnlcbiAqIG5vbWluYWxseS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSA9XG4gIGdsb2JhbFByb2Nlc3MgJiYgdHlwZW9mIGdsb2JhbFByb2Nlc3Muc3RkZXJyPy53cml0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBnbG9iYWxQcm9jZXNzLnN0ZGVyclxuICAgIDogdW5kZWZpbmVkO1xuXG5jb25zdCBMT0dfTEVWRUxTID0gW1wiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdIGFzIGNvbnN0O1xuY29uc3QgTE9HX0xFVkVMX1JBTksgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCwgaW5kZXgpID0+IFtsZXZlbCwgaW5kZXhdKSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SUyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgbGV0IGNvbG9yID0gXCJcXHgxYls5MG1cIjsgLy8gZ3JheVxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszNG1cIjsgLy8gYmx1ZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszM21cIjsgLy8geWVsbG93XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszMW1cIjsgLy8gcmVkXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gW2xldmVsLCBjb2xvcl07XG4gIH0pLFxuKSBhcyBSZWNvcmQ8TG9nTGV2ZWwsIHN0cmluZz47XG5jb25zdCBMT0dfTEVWRUxfQ09MT1JfUkVTRVQgPSBcIlxceDFiWzBtXCI7XG5jb25zdCBERUZBVUxUX0xFVkVMOiBMb2dMZXZlbCA9IFwiaW5mb1wiO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBzZXZlcml0aWVzLCBsb3dlc3QgdG8gaGlnaGVzdDogYGRlYnVnYCwgYGluZm9gLCBgd2FybmAsIGBlcnJvcmAuXG4gKiBBIGNhbGwgYmVsb3cgdGhlIGFjdGl2ZSB0aHJlc2hvbGQgaXMgZGlzY2FyZGVkIGJlZm9yZSBhbnkgc3RyaW5nIHdvcmsgb3JcbiAqIHNpbmsgSS9PLlxuICpcbiAqIFRoZSB0aHJlc2hvbGQgY29tZXMgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCBvbiBldmVyeSBjYWxsXG4gKiAoY2FzZS1pbnNlbnNpdGl2ZSwgZGVmYXVsdCBgaW5mb2Agd2hlbiB1bnNldCwgZW1wdHksIG9yIHVua25vd24pIHNvIHRlc3RcbiAqIHJ1bm5lcnMgYW5kIGVtYmVkZGVycyBjYW4gY2hhbmdlIHZlcmJvc2l0eSBhZnRlciBpbXBvcnQgd2l0aG91dCByZXN0YXJ0aW5nXG4gKiB0aGUgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAodHlwZW9mIExPR19MRVZFTFMpW251bWJlcl07XG5cbi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIGxldmVsZWQgbG9nZ2VyLiBTdGFuZGFyZCBtZXRob2RzIGhvbm9yIGBMT0dfTEVWRUxgOyBgc3RhcnRgXG4gKiBhbmQgYHN1Y2Nlc3NgIGFyZSBpbmZvcm1hdGlvbmFsIGFsaWFzZXMgd2l0aCBkaXN0aW5jdCBwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIExvZ2dlciA9IHtcbiAgW0sgaW4gTG9nTGV2ZWxdOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59ICYge1xuICAvKiogU3VjY2VzcyBtZXNzYWdlIGVtaXR0ZWQgYXQgYGluZm9gIGxldmVsLiAqL1xuICBzdWNjZXNzOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gIC8qKiBTdGFydCAvIGluLXByb2dyZXNzIG1lc3NhZ2UgZW1pdHRlZCBhdCBgaW5mb2AgbGV2ZWwuICovXG4gIHN0YXJ0OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG4vKiogYChuYW1lPykgPT4gTG9nZ2VyYCBzaW5rIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoZSBpbml0LXRpbWUgZmFjdG9yeSBjaGFpbi4gKi9cbnR5cGUgTG9nZ2VyRmFjdG9yeSA9IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI7XG5cbi8qKlxuICogQ29uc29sZSB7QGxpbmsgTG9nZ2VyRmFjdG9yeX07IGFsd2F5cyBzdWNjZWVkcy5cbiAqXG4gKiBXaGVuIGBwcm9jZXNzLnN0ZGVycmAgaXMgYXZhaWxhYmxlLCBmb3JtYXRzIGVhY2ggbGluZSBhbmQgd3JpdGVzIG9ubHkgdG9cbiAqIHN0ZGVyci4gQnVuIGBpbnNwZWN0YCBmb3JtYXRzIGVhY2ggYXJndW1lbnQgd2hlbiBlbmFibGVkOyBvdGhlcndpc2VcbiAqIGB1dGlsLmluc3BlY3RgIHdoZW4gYG5vZGU6dXRpbGAgbG9hZHMsIG9yIGEgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjayB3aGVuXG4gKiBpdCBkb2VzIG5vdC4gV2hlbiBzdGRlcnIgaXMgdW5hdmFpbGFibGUgKGV2ZXJ5IGJyb3dzZXIpLCBiaW5kc1xuICoge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0gcHJlZml4ZXMgaW50byBnbG9iYWwgYGNvbnNvbGUuKmAgY2FsbHMgYW5kIHNraXBzIHRoZVxuICogYG5vZGU6dXRpbGAgaW1wb3J0IGVudGlyZWx5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkpOiBQcm9taXNlPExvZ2dlckZhY3Rvcnk+IHtcbiAgLy8gSW5kaXJlY3Qgc3BlY2lmaWVyIHNvIHRoaXMgYnJvd3Nlci1zYWZlIG1vZHVsZSBkb2Vzbid0IHN0YXRpY2FsbHkgcHVsbCBpblxuICAvLyBub2RlIHR5cGVzOiBgbm9kZTp1dGlsYCBpcyBvcHRpb25hbCAodGhlIEpTT04gZmFsbGJhY2sgY292ZXJzIGl0cyBhYnNlbmNlKS5cbiAgY29uc3Qgbm9kZVV0aWwgPSBcIm5vZGU6dXRpbFwiO1xuICAvLyBHYXRlZCwgbm90IGp1c3QgY2F1Z2h0OiB0aGUgaW5kaXJlY3Qgc3BlY2lmaWVyIGRlZmVhdHMgYnVuZGxlciBhbmFseXNpcyBieVxuICAvLyBkZXNpZ24sIHNvIGEgY2xpZW50IGJ1aWxkIGVtaXRzIGEgbGl0ZXJhbCBgaW1wb3J0KFwibm9kZTp1dGlsXCIpYCB0aGF0IG5vXG4gIC8vIGJyb3dzZXIgY2FuIHJlc29sdmUsIGFuZCB0aGUgY2F1Z2h0IHJlamVjdGlvbiBzdGlsbCBzdXJmYWNlZCBhcyBhIGNvbnNvbGVcbiAgLy8gZXJyb3IuIGB1dGlsc2Agb25seSBmZWVkcyB0aGUgc3RkZXJyIGJyYW5jaCBvZiB0aGUgZW1pdHRlciBiZWxvdywgc28gbm9cbiAgLy8gc3RkZXJyIG1lYW5zIHRoZSBpbXBvcnQgaGFzIG5vdGhpbmcgdG8gc2VydmUgYW5kIGlzIHNraXBwZWQgb3V0cmlnaHQuXG4gIGNvbnN0IHV0aWxzOiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVVdGlsKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVyciwgdXRpbHMpO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeX0sIHNwbGl0IG91dCBzbyB0aGVcbiAqIHNhbWUgZW1pdHRlciBhbHNvIHNlcnZlcyBhcyB0aGUgYm9vdHN0cmFwIHNpbmsgYmVmb3JlIGFueSBhc3luYyBmYWN0b3J5IGhhc1xuICogcmVzb2x2ZWQuIGB1dGlsc2AgaXMgYG5vZGU6dXRpbGAgd2hlbiBpdCBsb2FkZWQ7IHdpdGhvdXQgaXQsIG9iamVjdCBhcmd1bWVudHNcbiAqIGZvcm1hdCB0aHJvdWdoIHRoZSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBjb25zb2xlTG9nZ2VyRmFjdG9yeShcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuICB1dGlscz86IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkLFxuKTogTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBnbG9iYWxQcm9jZXNzU3RkRXJyLCByZXNldENvbG9yc1ByZWZpeCk7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb2xvcnMsIHJlc2V0Q29sb3JzIH0gPSBwcmVmaXhGb3JtYXR0ZXIobGV2ZWwpO1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaG91bGRFbWl0KGxldmVsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHByZWZpeCA/IFtwcmVmaXhdIDogW107XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaCguLi5hcmdzLm1hcCgoYXJnKSA9PiBpbnNwZWN0KGFyZywgY29sb3JzKSkpO1xuICAgICAgICAgICAgaWYgKHJlc2V0Q29sb3JzKSBtZXNzYWdlUGFydHMucHVzaChMT0dfTEVWRUxfQ09MT1JfUkVTRVQpO1xuICAgICAgICAgICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyci53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIENvbnZlbmllbmNlIGxldmVscyBzaGFyZSB0aGUgaW5mbyBzaW5rLlxuICAgIGxvZ2dlci5zdWNjZXNzID0gbG9nZ2VyLmluZm87XG4gICAgbG9nZ2VyLnN0YXJ0ID0gbG9nZ2VyLmluZm87XG4gICAgcmV0dXJuIGxvZ2dlcjtcbiAgfTtcbiAgY29uc3QgZGVmYXVsdEZhY3RvcnkgPSBtZW1vaXplKGZhY3RvcnkpO1xuICByZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IChuYW1lID8gZmFjdG9yeShuYW1lKSA6IGRlZmF1bHRGYWN0b3J5KCkpO1xufVxuXG4vKipcbiAqIEZ1bGwgY29uc29sZSBzaW5rIHdpdGggb3B0aW9uYWwgYG5vZGU6dXRpbGAgaW5zcGVjdGlvbi4gTWVtb2l6ZWQgc29cbiAqIGNvbmN1cnJlbnQgYW5kIHJlcGVhdCBjYWxsZXJzIHNoYXJlIG9uZSBpbi1mbGlnaHQgcHJvbWlzZSBhbmQgc2V0dGxlZCByZXN1bHQuXG4gKi9cbmNvbnN0IHJlc29sdmVGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiA9PiB7XG4gIHJldHVybiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbn0pO1xuXG4vKipcbiAqIEFjdGl2ZSBmYWN0b3J5IHN0YXJ0cyBhcyBhIHN5bmMgY29uc29sZSBzaW5rIChubyBgYXdhaXRgLCBzbyB0aGlzIG1vZHVsZVxuICogZmluaXNoZXMgZXZhbHVhdGluZyBpbW1lZGlhdGVseSkgYW5kIHN3YXBzIHRvIHtAbGluayByZXNvbHZlRmFjdG9yeX0nc1xuICogcmVzdWx0IHdoZW4gc2VydmVyLXNpZGUgYXJndW1lbnQgaW5zcGVjdGlvbiBpcyByZWFkeS5cbiAqL1xubGV0IGFjdGl2ZUZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSBjb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbnZvaWQgcmVzb2x2ZUZhY3RvcnkoKS50aGVuKFxuICAoZmFjdG9yeSkgPT4ge1xuICAgIGFjdGl2ZUZhY3RvcnkgPSBmYWN0b3J5O1xuICB9LFxuICAoKSA9PiB7XG4gICAgLy8gS2VlcCB0aGUgc3luYyBjb25zb2xlIHNpbms7IG5ldmVyIGxlYXZlIGltcG9ydGVycyB3aXRob3V0IGEgZmFjdG9yeS5cbiAgfSxcbik7XG5cbi8qKlxuICogQnVpbGQgYSBsb2dnZXIgdGhhdCByZWJpbmRzIHdoZW4ge0BsaW5rIGFjdGl2ZUZhY3Rvcnl9IHVwZ3JhZGVzLiBDYWxsZXJzIHRoYXRcbiAqIGNhcHR1cmUgYGNvbnN0IGxvZyA9IGxvZ2dlcihcInhcIilgIGF0IG1vZHVsZSBzY29wZSBzdGlsbCBnZXQgdGhlIHVwZ3JhZGVkXG4gKiBmb3JtYXR0ZXIgb25jZSBpdCBhcnJpdmVzLCB3aXRob3V0IGV2ZXJ5IGNhbGwgc2l0ZSB3YWl0aW5nIG9uIGEgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKG5hbWU/OiBzdHJpbmcpOiBMb2dnZXIge1xuICBsZXQgYm91bmQ6IHsgZmFjdG9yeTogTG9nZ2VyRmFjdG9yeTsgbG9nZ2VyOiBMb2dnZXIgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2luayA9ICgpOiBMb2dnZXIgPT4ge1xuICAgIGlmIChib3VuZD8uZmFjdG9yeSAhPT0gYWN0aXZlRmFjdG9yeSkge1xuICAgICAgYm91bmQgPSB7IGZhY3Rvcnk6IGFjdGl2ZUZhY3RvcnksIGxvZ2dlcjogYWN0aXZlRmFjdG9yeShuYW1lKSB9O1xuICAgIH1cbiAgICByZXR1cm4gYm91bmQubG9nZ2VyO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5MT0dfTEVWRUxTLCBcInN1Y2Nlc3NcIiwgXCJzdGFydFwiXS5tYXAoKGxldmVsKSA9PiBbXG4gICAgICBsZXZlbCxcbiAgICAgICguLi5hcmdzOiBhbnlbXSkgPT4gc2luaygpW2xldmVsIGFzIGtleW9mIExvZ2dlcl0oLi4uYXJncyksXG4gICAgXSksXG4gICkgYXMgTG9nZ2VyO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbGluZSBwcmVmaXggb2YgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMsIG9yIGBbbmFtZV1gIGFsb25lXG4gKiBpbiBicm93c2VycyAoZWl0aGVyIHBhcnQgb21pdHRlZCB3aGVuIGFic2VudCkuIEFwcGxpZXMgcGVyLWxldmVsIEFOU0kgY29sb3JcbiAqIHdoZW4gYHN0cmVhbVN1cHBvcnRzQ29sb3JgIGlzIHRydWUgZm9yIHRoZSBnaXZlbiBzdGRlcnIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoXG4gIG5hbWU6IGFueSxcbiAgc3RyZWFtOiBhbnksXG4gIHJlc2V0Q29sb3JzUHJlZml4PzogYm9vbGVhbixcbik6IChsZXZlbD86IExvZ0xldmVsKSA9PiB7IHByZWZpeDogc3RyaW5nOyBjb2xvcnM6IGJvb2xlYW47IHJlc2V0Q29sb3JzOiBib29sZWFuIH0ge1xuICBjb25zdCBnbG9iID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHVua25vd247IGRvY3VtZW50PzogdW5rbm93biB9O1xuICBjb25zdCBpc0Jyb3dzZXIgPSBnbG9iLndpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGdsb2IuZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VwcG9ydHNDb2xvciA9ICFpc0Jyb3dzZXIgPyBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbSkgOiBmYWxzZTtcbiAgY29uc3QgbmFtZVByZWZpeCA9IG5hbWUgPyBcIltcIiArIG5hbWUgKyBcIl1cIiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChsZXZlbD86IExvZ0xldmVsKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSBzdXBwb3J0c0NvbG9yICYmIGxldmVsICE9PSB1bmRlZmluZWQgPyBMT0dfTEVWRUxfQ09MT1JTW2xldmVsXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlZml4ID0gWyFpc0Jyb3dzZXIgJiYgbGV2ZWwgPyBsZXZlbC50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLCBuYW1lUHJlZml4XVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGxldCByZXNldENvbG9ycyA9IGZhbHNlO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYXBwbHlSZXNldENvbG9yc1ByZWZpeCA9IHJlc2V0Q29sb3JzUHJlZml4IHx8IFwiaW5mb1wiID09PSBsZXZlbDtcbiAgICAgIGlmICghYXBwbHlSZXNldENvbG9yc1ByZWZpeCkgcmVzZXRDb2xvcnMgPSB0cnVlO1xuICAgICAgcHJlZml4ID0gYXBwbHlSZXNldENvbG9yc1ByZWZpeCA/IGNvbG9yICsgcHJlZml4ICsgTE9HX0xFVkVMX0NPTE9SX1JFU0VUIDogY29sb3IgKyBwcmVmaXg7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWZpeCwgY29sb3JzOiBjb2xvciA/IHRydWUgOiBmYWxzZSwgcmVzZXRDb2xvcnMgfTtcbiAgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3RyZWFtYCBpcyBhIFRUWSBhbmQgdGhlIHRlcm1pbmFsIGlzIG5vdCBgZHVtYmAuICovXG5mdW5jdGlvbiBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbT86IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGdsb2JhbFByb2Nlc3MgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RyZWFtICE9PSBcIm9iamVjdFwiIHx8IHN0cmVhbSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IGlzVFRZIH0gPSBzdHJlYW0gYXMgeyBpc1RUWT86IHVua25vd24gfTtcbiAgaWYgKGlzVFRZICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRlcm0gPSBnbG9iYWxQcm9jZXNzLmVudj8uVEVSTT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKFwiZHVtYlwiID09IHRlcm0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBQYXJzZSBhIHJhdyB2YWx1ZSBhcyB7QGxpbmsgTG9nTGV2ZWx9ICh0cmltbWVkLCBjYXNlLWluc2Vuc2l0aXZlKS4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9nTGV2ZWwocmF3OiB1bmtub3duKTogTG9nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgdGV4dCA9IHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcgOiBTdHJpbmcocmF3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRleHQgPT09IG5vcm1hbGl6ZWQpIGJyZWFrO1xuICAgICAgdGV4dCA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0ZXh0IGluIExPR19MRVZFTF9SQU5LKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBMb2dMZXZlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEFjdGl2ZSB0aHJlc2hvbGQgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCwgZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRVZFTH0uICovXG5mdW5jdGlvbiBhY3RpdmVMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBwYXJzZUxvZ0xldmVsKGdsb2JhbFByb2Nlc3M/LmVudj8uTE9HX0xFVkVMKSA/PyBERUZBVUxUX0xFVkVMO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYHJhd2AgbWVldHMgdGhlIGN1cnJlbnQgYExPR19MRVZFTGAgdGhyZXNob2xkLlxuICpcbiAqIFBhcnNlcyBgcmF3YCBhcyBhIHtAbGluayBMb2dMZXZlbH07IHdoZW4gcGFyc2luZyBmYWlscywgcmV0dXJuc1xuICogYGRlZmF1bHRSZXN1bHRgIGlmIHN1cHBsaWVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkRW1pdChyYXc6IHVua25vd24sIGRlZmF1bHRSZXN1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxldmVsID0gcGFyc2VMb2dMZXZlbChyYXcpO1xuICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRSZXN1bHQgPz8gZmFsc2U7XG4gIHJldHVybiBMT0dfTEVWRUxfUkFOS1tsZXZlbF0gPj0gTE9HX0xFVkVMX1JBTktbYWN0aXZlTGV2ZWwoKV07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhbGwgYXQgYGxldmVsYCB3b3VsZCBiZSBlbWl0dGVkIGF0IHRoZSBjdXJyZW50XG4gKiBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCB0aHJlc2hvbGQuIFVzZSBiZWZvcmUgYnVpbGRpbmcgZXhwZW5zaXZlIGRlYnVnXG4gKiBwYXlsb2Fkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIHtcbiAqICAgbG9nLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHsgY29udHJpYnV0aW9uOiBhd2FpdCBoZWF2eVNuYXBzaG90KCkgfSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xldmVsRW5hYmxlZChsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNob3VsZEVtaXQobGV2ZWwpO1xufVxuXG5jb25zdCBMT0dHRVJfTkFNRV9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6XFwvXFwvKT8uKlxcLyhbXi8uXSspKD86XFwuW14vXSspPyQvaTtcblxuLyoqXG4gKiBEZXJpdmUgdGhlIHRhZyBzdHJpbmcgZnJvbSBhIGxvZ2dlciBuYW1lLCBwbHVnaW4sIG9yIHBhdGguIFNsYXNoLSBhbmRcbiAqIFVSTC1zaGFwZWQgc3RyaW5ncyB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50IChleHRlbnNpb24gc3RyaXBwZWQpOyBwbGFpblxuICogc3RyaW5ncyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBFbXB0eSBvciBtaXNzaW5nIG5hbWVzIC0+IGB1bmRlZmluZWRgXG4gKiAodW50YWdnZWQgc2luaykuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFsb2dnZXJOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGxvZ2dlck5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxvZ2dlck5hbWUubWF0Y2goTE9HR0VSX05BTUVfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IGxvZ2dlck5hbWU7XG4gIH1cbiAgcmV0dXJuIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUubmFtZSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSB0YWdnZWQgbG9nZ2VyIGZvciBhIHBsdWdpbiBvciBtb2R1bGUuXG4gKlxuICogVGhlIHRhZyBpcyBgW25hbWVdYCB3aGVuIGBsb2dnZXJOYW1lYCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIGFcbiAqIHtAbGluayBOYW1lTGlrZX0gd2l0aCBgbmFtZWAsIG9yIGEgZmlsZSAvIFVSTCBwYXRoICh0aGUgYmFzZW5hbWUgd2l0aG91dFxuICogZXh0ZW5zaW9uIGlzIHVzZWQpLiBUaGUgY29uc29sZSBzaW5rIHByZXBlbmRzIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuXG4gKiBob3N0cyBvciBgW25hbWVdYCBhbG9uZSBpbiBicm93c2VycyB2aWEge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0uXG4gKlxuICogQ2FsbHMgYmVsb3cgYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgYXJlIGRyb3BwZWQgYnkge0BsaW5rIHNob3VsZEVtaXR9IGJlZm9yZVxuICogdGhlIHNpbmsgZm9ybWF0cyBvciB3cml0ZXMgdGhlIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG4gKlxuICogY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImdlbmllL2NoYXRcIik7XG4gKiBsb2dnZXIuaW5mbyhcInN0YXJ0aW5nXCIpO1xuICogbG9nZ2VyLndhcm4oXCJtaXNzaW5nIG9wdGlvbmFsIGNvbmZpZ1wiLCB7IHJlYXNvbjogXCJubyBlbnYgdmFyXCIgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIobG9nZ2VyTmFtZTogTmFtZUxpa2UgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBMb2dnZXIge1xuICBjb25zdCBuYW1lID0gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZSk7XG4gIHJldHVybiBjcmVhdGVMb2dnZXIobmFtZSk7XG59XG4iXX0=