@dbx-tools/email 0.6.42 → 0.6.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/src/auth/gate.d.ts +13 -5
- package/lib/src/auth/gate.js +16 -7
- package/lib/src/plugin.js +26 -17
- package/package.json +3 -3
- package/src/auth/gate.ts +15 -6
- package/src/plugin.ts +30 -20
package/lib/src/auth/gate.d.ts
CHANGED
|
@@ -73,11 +73,19 @@ export declare class AuthGate {
|
|
|
73
73
|
/** The `GET /auth/status` payload for a request. */
|
|
74
74
|
status(req: Request): Promise<AuthStatus>;
|
|
75
75
|
/**
|
|
76
|
-
* Express middleware gating
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
76
|
+
* Express middleware gating the app's DATA APIs behind a session.
|
|
77
|
+
*
|
|
78
|
+
* It gates `/api/*` and returns 401 for an unauthenticated caller - EXCEPT the
|
|
79
|
+
* login flow itself (`<emailBase>/auth/*`), which must stay open so a caller
|
|
80
|
+
* can obtain a session. Static assets (the SPA shell, JS/CSS, favicons) are
|
|
81
|
+
* NOT gated: the browser has to load the client so the `<AuthGate>` React
|
|
82
|
+
* component can render the login screen and call these endpoints. A gated
|
|
83
|
+
* `/api` request from the un-logged-in SPA simply 401s, which the client
|
|
84
|
+
* treats as "show the login". This is the standard SPA gate shape - protect
|
|
85
|
+
* the data, serve the shell.
|
|
86
|
+
*
|
|
87
|
+
* `emailBase` is the email plugin's mount path (e.g. `/api/email`), so both the
|
|
88
|
+
* open login prefix and the gated API prefix are matched on the full path.
|
|
81
89
|
*/
|
|
82
90
|
middleware(emailBase: string): (req: Request, res: Response, next: NextFunction) => void;
|
|
83
91
|
}
|
package/lib/src/auth/gate.js
CHANGED
|
@@ -107,16 +107,25 @@ export class AuthGate {
|
|
|
107
107
|
return { authenticated: Boolean(email), email, enabled: true };
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
110
|
-
* Express middleware gating
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
110
|
+
* Express middleware gating the app's DATA APIs behind a session.
|
|
111
|
+
*
|
|
112
|
+
* It gates `/api/*` and returns 401 for an unauthenticated caller - EXCEPT the
|
|
113
|
+
* login flow itself (`<emailBase>/auth/*`), which must stay open so a caller
|
|
114
|
+
* can obtain a session. Static assets (the SPA shell, JS/CSS, favicons) are
|
|
115
|
+
* NOT gated: the browser has to load the client so the `<AuthGate>` React
|
|
116
|
+
* component can render the login screen and call these endpoints. A gated
|
|
117
|
+
* `/api` request from the un-logged-in SPA simply 401s, which the client
|
|
118
|
+
* treats as "show the login". This is the standard SPA gate shape - protect
|
|
119
|
+
* the data, serve the shell.
|
|
120
|
+
*
|
|
121
|
+
* `emailBase` is the email plugin's mount path (e.g. `/api/email`), so both the
|
|
122
|
+
* open login prefix and the gated API prefix are matched on the full path.
|
|
115
123
|
*/
|
|
116
124
|
middleware(emailBase) {
|
|
117
125
|
const openPrefix = `${emailBase}${AUTH_PATH_PREFIX}`;
|
|
118
126
|
return (req, res, next) => {
|
|
119
|
-
|
|
127
|
+
// Only API traffic is gated; static assets load freely so the login UI can.
|
|
128
|
+
if (!req.path.startsWith("/api/") || req.path.startsWith(openPrefix)) {
|
|
120
129
|
next();
|
|
121
130
|
return;
|
|
122
131
|
}
|
|
@@ -131,4 +140,4 @@ export class AuthGate {
|
|
|
131
140
|
};
|
|
132
141
|
}
|
|
133
142
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL2dhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFHSCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEMsdUNBQXVDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUFFekMsOEVBQThFO0FBQzlFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0FBa0JqQyxzQ0FBc0M7QUFDdEMsTUFBTSxPQUFPLFFBQVE7SUFPVTtJQU5aLEtBQUssQ0FBWTtJQUNsQyxpRkFBaUY7SUFDakYsb0ZBQW9GO0lBQ25FLGNBQWMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwRCxhQUFhLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFFckUsWUFBNkIsT0FBd0I7UUFBeEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7OztP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QUUsQ0FBQztvQkFDVixJQUFJLEVBQUUsQ0FBQztnQkFDVCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGVtYWlsLU9UUCBhY2Nlc3MgZ2F0ZTogcnVudGltZSArIEV4cHJlc3MgbWlkZGxld2FyZSArIHJlcXVlc3QgaGFuZGxlcnMuXG4gKlxuICoge0BsaW5rIEF1dGhHYXRlfSBvd25zIHRoZSBhbGxvdy1saXN0LCByYXRlIGxpbWl0ZXJzLCBjb2RlIHN0b3JlLCBhbmQgc2Vzc2lvblxuICogc2lnbmluZy4gVGhlIHBsdWdpbiB3aXJlcyBmb3VyIHJvdXRlcyB0byBpdCAoYHJlcXVlc3RgL2B2ZXJpZnlgL2Bsb2dvdXRgL1xuICogYHN0YXR1c2ApIGFuZCBtb3VudHMge0BsaW5rIEF1dGhHYXRlLm1pZGRsZXdhcmV9IHNvIGV2ZXJ5IE9USEVSIHJlcXVlc3QgbmVlZHMgYVxuICogdmFsaWQgc2Vzc2lvbiBjb29raWUuXG4gKlxuICogRGVzaWduIHBvaW50czpcbiAqICAgLSBgcmVxdWVzdGAgQUxXQVlTIHJlc29sdmVzIGB7IG9rOiB0cnVlIH1gIChhbnRpLWVudW1lcmF0aW9uKTogYSBjb2RlIGlzIG9ubHlcbiAqICAgICBnZW5lcmF0ZWQgKyBlbWFpbGVkIHdoZW4gdGhlIGFkZHJlc3MgaXMgYWxsb3ctbGlzdGVkIEFORCB1bmRlciB0aGUgcmF0ZVxuICogICAgIGxpbWl0LCBidXQgdGhlIGNhbGxlciBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlLlxuICogICAtIHRoZSBzZXNzaW9uIGxpdmVzIGluIGFuIEh0dHBPbmx5ICsgU2FtZVNpdGU9TGF4IGNvb2tpZSAoU2VjdXJlIGluIHByb2QpLCBzb1xuICogICAgIGl0IHN1cnZpdmVzIHJlbG9hZHMgYW5kIGlzIG5vdCByZWFkYWJsZSBieSBwYWdlIHNjcmlwdHMuXG4gKiAgIC0gZmFpbC1vcGVuIG9uIGEgbWlzc2luZyBzaWduaW5nIHNlY3JldCAoc2VlIGBvdHAudHNgKTogYSBEYXRhYnJpY2tzIEFwcCBpc1xuICogICAgIGFscmVhZHkgYWNjZXNzLWxpbWl0ZWQ7IGFuIHVuc2V0IGBBVVRIX0pXVF9TRUNSRVRgIGRlZ3JhZGVzIHRvXG4gKiAgICAgbm9uLWR1cmFibGUgc2Vzc2lvbnMsIG5vdCBhIGxvY2tvdXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29va2llT3B0aW9ucywgTmV4dEZ1bmN0aW9uLCBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBodHRwLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBdXRoU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgeyBsb29rc0xpa2VFbWFpbCwgbWF0Y2hlc0FsbG93bGlzdCB9IGZyb20gXCIuL2FsbG93bGlzdC50c1wiO1xuaW1wb3J0IHsgQ29kZVN0b3JlLCBzaWduU2Vzc2lvbiwgdmVyaWZ5U2Vzc2lvbiB9IGZyb20gXCIuL290cC50c1wiO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tIFwiLi9yYXRlLWxpbWl0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbDphdXRoXCIpO1xuXG4vKiogQ29va2llIHRoZSBzZXNzaW9uIEpXVCByaWRlcyBpbi4gKi9cbmV4cG9ydCBjb25zdCBTRVNTSU9OX0NPT0tJRSA9IFwiZGJ4X2F1dGhcIjtcblxuLyoqIFJvdXRlIHByZWZpeCAodW5kZXIgdGhlIHBsdWdpbiBiYXNlIGAvYXBpL2VtYWlsYCkgdGhlIGdhdGUgbGVhdmVzIG9wZW4uICovXG5jb25zdCBBVVRIX1BBVEhfUFJFRklYID0gXCIvYXV0aFwiO1xuXG4vKiogUmVzb2x2ZWQgZ2F0ZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZU9wdGlvbnMge1xuICAvKiogQWxsb3ctbGlzdCBwYXR0ZXJucyAoZG9tYWluIC8gZ2xvYiAvIGAvcmVnZXgvYCkuIEVtcHR5ID0gYWxsb3cgbm9ib2R5LiAqL1xuICByZWFkb25seSBhbGxvdzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTZXNzaW9uIGxpZmV0aW1lIGluIHNlY29uZHMuICovXG4gIHJlYWRvbmx5IHNlc3Npb25UdGxTZWNvbmRzOiBudW1iZXI7XG4gIC8qKiBPbmUtdGltZSBjb2RlIGxpZmV0aW1lIGluIHNlY29uZHMuICovXG4gIHJlYWRvbmx5IGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG4gIC8qKiBNYXggdmVyaWZ5IGF0dGVtcHRzIHBlciBpc3N1ZWQgY29kZS4gKi9cbiAgcmVhZG9ubHkgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIFNlbmQgdGhlIGNvZGUgZW1haWwuIFJldHVybnMgbm90aGluZzsgZmFpbHVyZXMgYXJlIGxvZ2dlZCwgbm90IHN1cmZhY2VkLiAqL1xuICByZWFkb25seSBzZW5kQ29kZTogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRydWUgaW4gcHJvZHVjdGlvbiAoc2V0cyB0aGUgYFNlY3VyZWAgY29va2llIGZsYWcpLiAqL1xuICByZWFkb25seSBzZWN1cmVDb29raWVzOiBib29sZWFuO1xufVxuXG4vKiogVGhlIGVtYWlsLU9UUCBnYXRlIGZvciBvbmUgYXBwLiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlczogQ29kZVN0b3JlO1xuICAvLyBTZXBhcmF0ZSBsaW1pdGVyczogcmVxdWVzdGluZyBhIGNvZGUgaXMgY2hlYXAtdG8tYWJ1c2UgKGVtYWlsIHNwYW0pLCB2ZXJpZnlpbmdcbiAgLy8gaXMgYSBicnV0ZS1mb3JjZSBzdXJmYWNlLiBQZXItZW1haWwgQU5EIHBlci1JUCBzbyBuZWl0aGVyIGF4aXMgYWxvbmUgaXMgYSBieXBhc3MuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdExpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoNSwgMTUgKiA2MCAqIDEwMDApO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmeUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoMTAsIDE1ICogNjAgKiAxMDAwKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEF1dGhHYXRlT3B0aW9ucykge1xuICAgIHRoaXMuY29kZXMgPSBuZXcgQ29kZVN0b3JlKG9wdGlvbnMuY29kZVR0bFNlY29uZHMgKiAxMDAwLCBvcHRpb25zLm1heEF0dGVtcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYFBPU1QgL2F1dGgvcmVxdWVzdGAuIEFsd2F5cyByZXNvbHZlcyBgeyBvazogdHJ1ZSB9YCAocGx1cyBhXG4gICAqIGByZXRyeUFmdGVyYCB3aGVuIHJhdGUtbGltaXRlZCk7IGEgY29kZSBpcyBpc3N1ZWQgKyBlbWFpbGVkIG9ubHkgZm9yIGFuXG4gICAqIGFsbG93LWxpc3RlZCBhZGRyZXNzIHVuZGVyIHRoZSBsaW1pdC4gRXJyb3JzIGluIHNlbmRpbmcgYXJlIHN3YWxsb3dlZCBzbyB0aGVcbiAgICogcmVzcG9uc2UgbmV2ZXIgcmV2ZWFscyB3aGV0aGVyIGFuIGFkZHJlc3MgZXhpc3RzIC8gaXMgYWxsb3dlZC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVJlcXVlc3QoZW1haWw6IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8eyBvazogdHJ1ZTsgcmV0cnlBZnRlcj86IG51bWJlciB9PiB7XG4gICAgY29uc3QgYWRkcmVzcyA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ5SXAgPSB0aGlzLnJlcXVlc3RMaW1pdGVyLmhpdChgaXA6JHtpcH1gKTtcbiAgICBjb25zdCBieUVtYWlsID0gdGhpcy5yZXF1ZXN0TGltaXRlci5oaXQoYGVtYWlsOiR7YWRkcmVzc31gKTtcbiAgICBpZiAoIWJ5SXAuYWxsb3dlZCB8fCAhYnlFbWFpbC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgcmV0cnlBZnRlcjogYnlJcC5yZXRyeUFmdGVyID8/IGJ5RW1haWwucmV0cnlBZnRlciB9O1xuICAgIH1cbiAgICBpZiAobG9va3NMaWtlRW1haWwoYWRkcmVzcykgJiYgbWF0Y2hlc0FsbG93bGlzdChhZGRyZXNzLCB0aGlzLm9wdGlvbnMuYWxsb3cpKSB7XG4gICAgICBjb25zdCBjb2RlID0gdGhpcy5jb2Rlcy5pc3N1ZShhZGRyZXNzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5zZW5kQ29kZShhZGRyZXNzLCBjb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHNlbmQgT1RQIGVtYWlsXCIsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGBQT1NUIC9hdXRoL3ZlcmlmeWAuIE9uIGEgY29ycmVjdCBjb2RlLCByZXR1cm5zIHRoZSBzZXNzaW9uIGB0b2tlbmBcbiAgICogcGx1cyB0aGUgYGNvb2tpZU9wdGlvbnNgIGZvciBpdCBzbyB0aGUgcm91dGUgc2V0cyBpdCB3aXRoIEV4cHJlc3MncyBvd25cbiAgICogYHJlcy5jb29raWUoU0VTU0lPTl9DT09LSUUsIHRva2VuLCBvcHRpb25zKWAgKG5vIGhhbmQtcm9sbGVkIFNldC1Db29raWUpLlxuICAgKiBGYWlsdXJlcyByZXR1cm4gYHsgb2s6IGZhbHNlIH1gIHdpdGggYSBnZW5lcmljIHJlYXNvbi5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVZlcmlmeShcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBpcDogc3RyaW5nLFxuICAgIHNlY3VyZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx7IG9rOiBib29sZWFuOyB0b2tlbj86IHN0cmluZzsgY29va2llT3B0aW9ucz86IENvb2tpZU9wdGlvbnM7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBieUlwID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgaXA6JHtpcH1gKTtcbiAgICBjb25zdCBieUVtYWlsID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIGlmICghYnlJcC5hbGxvd2VkIHx8ICFieUVtYWlsLmFsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmV0cnlBZnRlcjogYnlJcC5yZXRyeUFmdGVyID8/IGJ5RW1haWwucmV0cnlBZnRlciB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2Rlcy52ZXJpZnkoYWRkcmVzcywgY29kZS50cmltKCkpICE9PSBcIm9rXCIpIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICAgIC8vIENvcnJlY3QgY29kZTogY2xlYXIgdGhlIGNhbGxlcidzIHJlcXVlc3QvdmVyaWZ5IGJ1ZGdldCBhbmQgbWludCBhIHNlc3Npb24uXG4gICAgdGhpcy5yZXF1ZXN0TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIHRoaXMudmVyaWZ5TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgc2lnblNlc3Npb24oYWRkcmVzcywgdGhpcy5vcHRpb25zLnNlc3Npb25UdGxTZWNvbmRzKTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdG9rZW4sIGNvb2tpZU9wdGlvbnM6IHRoaXMuY29va2llT3B0aW9ucyhzZWN1cmUpIH07XG4gIH1cblxuICAvKiogRXhwcmVzcyBjb29raWUgb3B0aW9ucyBmb3IgdGhlIHNlc3Npb24gKHVzZWQgd2l0aCBgcmVzLmNvb2tpZWAvYHJlcy5jbGVhckNvb2tpZWApLiAqL1xuICBjb29raWVPcHRpb25zKHNlY3VyZTogYm9vbGVhbik6IENvb2tpZU9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgc2VjdXJlOiBzZWN1cmUgfHwgdGhpcy5vcHRpb25zLnNlY3VyZUNvb2tpZXMsXG4gICAgICBwYXRoOiBcIi9cIixcbiAgICAgIG1heEFnZTogdGhpcy5vcHRpb25zLnNlc3Npb25UdGxTZWNvbmRzICogMTAwMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIGF1dGhlbnRpY2F0ZWQgZW1haWwgZm9yIGEgcmVxdWVzdCwgb3IgYHVuZGVmaW5lZGAuICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShyZXE6IFJlcXVlc3QpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFJldXNlIHNoYXJlZC1jb3JlJ3MgY29va2llIHBhcnNlciAoYWNjZXB0cyBhbiBFeHByZXNzIHJlcSBkaXJlY3RseSkgcmF0aGVyXG4gICAgLy8gdGhhbiByZS1pbXBsZW1lbnRpbmcgaGVhZGVyIHNwbGl0dGluZyBoZXJlLlxuICAgIGNvbnN0IHRva2VuID0gaHR0cC5wYXJzZUNvb2tpZXMocmVxKVtTRVNTSU9OX0NPT0tJRV07XG4gICAgcmV0dXJuIHZlcmlmeVNlc3Npb24odG9rZW4pO1xuICB9XG5cbiAgLyoqIFRoZSBgR0VUIC9hdXRoL3N0YXR1c2AgcGF5bG9hZCBmb3IgYSByZXF1ZXN0LiAqL1xuICBhc3luYyBzdGF0dXMocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgY29uc3QgZW1haWwgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShyZXEpO1xuICAgIHJldHVybiB7IGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLCBlbWFpbCwgZW5hYmxlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cHJlc3MgbWlkZGxld2FyZSBnYXRpbmcgcmVxdWVzdHMgb24gdGhlIEFQUCByb3V0ZXIgKG1vdW50ZWQgYXQgdGhlIGFwcFxuICAgKiByb290KS4gUmVxdWVzdHMgdG8gdGhlIGxvZ2luIGZsb3cgKGA8ZW1haWxCYXNlPi9hdXRoLypgKSBwYXNzIHRocm91Z2ggc28gYVxuICAgKiBjYWxsZXIgY2FuIGF1dGhlbnRpY2F0ZTsgdGhlIGFwcCdzIG93biBBUEkvYXNzZXQgcmVxdWVzdHMgbmVlZCBhIHZhbGlkXG4gICAqIHNlc3Npb24gb3IgZ2V0IGEgNDAxLiBgZW1haWxCYXNlYCBpcyB0aGUgcGx1Z2luJ3MgbW91bnQgcGF0aCAoZS5nLlxuICAgKiBgL2FwaS9lbWFpbGApIHNvIHRoZSBvcGVuIHByZWZpeCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGZ1bGwgcmVxdWVzdCBwYXRoLlxuICAgKi9cbiAgbWlkZGxld2FyZShlbWFpbEJhc2U6IHN0cmluZyk6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCB7XG4gICAgY29uc3Qgb3BlblByZWZpeCA9IGAke2VtYWlsQmFzZX0ke0FVVEhfUEFUSF9QUkVGSVh9YDtcbiAgICByZXR1cm4gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChvcGVuUHJlZml4KSkge1xuICAgICAgICBuZXh0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZvaWQgdGhpcy5hdXRoZW50aWNhdGUocmVxKS50aGVuKChlbWFpbCkgPT4ge1xuICAgICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oeyBlcnJvcjogXCJhdXRoZW50aWNhdGlvbiByZXF1aXJlZFwiLCBsb2dpblBhdGg6IG9wZW5QcmVmaXggfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL2dhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFHSCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEMsdUNBQXVDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUFFekMsOEVBQThFO0FBQzlFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0FBa0JqQyxzQ0FBc0M7QUFDdEMsTUFBTSxPQUFPLFFBQVE7SUFPVTtJQU5aLEtBQUssQ0FBWTtJQUNsQyxpRkFBaUY7SUFDakYsb0ZBQW9GO0lBQ25FLGNBQWMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwRCxhQUFhLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFFckUsWUFBNkIsT0FBd0I7UUFBeEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7OztP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WSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLElBQUksRUFBRSxDQUFDO2dCQUNULENBQUM7cUJBQU0sQ0FBQztvQkFDTixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDcEYsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgZW1haWwtT1RQIGFjY2VzcyBnYXRlOiBydW50aW1lICsgRXhwcmVzcyBtaWRkbGV3YXJlICsgcmVxdWVzdCBoYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgQXV0aEdhdGV9IG93bnMgdGhlIGFsbG93LWxpc3QsIHJhdGUgbGltaXRlcnMsIGNvZGUgc3RvcmUsIGFuZCBzZXNzaW9uXG4gKiBzaWduaW5nLiBUaGUgcGx1Z2luIHdpcmVzIGZvdXIgcm91dGVzIHRvIGl0IChgcmVxdWVzdGAvYHZlcmlmeWAvYGxvZ291dGAvXG4gKiBgc3RhdHVzYCkgYW5kIG1vdW50cyB7QGxpbmsgQXV0aEdhdGUubWlkZGxld2FyZX0gc28gZXZlcnkgT1RIRVIgcmVxdWVzdCBuZWVkcyBhXG4gKiB2YWxpZCBzZXNzaW9uIGNvb2tpZS5cbiAqXG4gKiBEZXNpZ24gcG9pbnRzOlxuICogICAtIGByZXF1ZXN0YCBBTFdBWVMgcmVzb2x2ZXMgYHsgb2s6IHRydWUgfWAgKGFudGktZW51bWVyYXRpb24pOiBhIGNvZGUgaXMgb25seVxuICogICAgIGdlbmVyYXRlZCArIGVtYWlsZWQgd2hlbiB0aGUgYWRkcmVzcyBpcyBhbGxvdy1saXN0ZWQgQU5EIHVuZGVyIHRoZSByYXRlXG4gKiAgICAgbGltaXQsIGJ1dCB0aGUgY2FsbGVyIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuXG4gKiAgIC0gdGhlIHNlc3Npb24gbGl2ZXMgaW4gYW4gSHR0cE9ubHkgKyBTYW1lU2l0ZT1MYXggY29va2llIChTZWN1cmUgaW4gcHJvZCksIHNvXG4gKiAgICAgaXQgc3Vydml2ZXMgcmVsb2FkcyBhbmQgaXMgbm90IHJlYWRhYmxlIGJ5IHBhZ2Ugc2NyaXB0cy5cbiAqICAgLSBmYWlsLW9wZW4gb24gYSBtaXNzaW5nIHNpZ25pbmcgc2VjcmV0IChzZWUgYG90cC50c2ApOiBhIERhdGFicmlja3MgQXBwIGlzXG4gKiAgICAgYWxyZWFkeSBhY2Nlc3MtbGltaXRlZDsgYW4gdW5zZXQgYEFVVEhfSldUX1NFQ1JFVGAgZGVncmFkZXMgdG9cbiAqICAgICBub24tZHVyYWJsZSBzZXNzaW9ucywgbm90IGEgbG9ja291dC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb29raWVPcHRpb25zLCBOZXh0RnVuY3Rpb24sIFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IGh0dHAsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhTdGF0dXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWxcIjtcbmltcG9ydCB7IGxvb2tzTGlrZUVtYWlsLCBtYXRjaGVzQWxsb3dsaXN0IH0gZnJvbSBcIi4vYWxsb3dsaXN0LnRzXCI7XG5pbXBvcnQgeyBDb2RlU3RvcmUsIHNpZ25TZXNzaW9uLCB2ZXJpZnlTZXNzaW9uIH0gZnJvbSBcIi4vb3RwLnRzXCI7XG5pbXBvcnQgeyBSYXRlTGltaXRlciB9IGZyb20gXCIuL3JhdGUtbGltaXQudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImVtYWlsOmF1dGhcIik7XG5cbi8qKiBDb29raWUgdGhlIHNlc3Npb24gSldUIHJpZGVzIGluLiAqL1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fQ09PS0lFID0gXCJkYnhfYXV0aFwiO1xuXG4vKiogUm91dGUgcHJlZml4ICh1bmRlciB0aGUgcGx1Z2luIGJhc2UgYC9hcGkvZW1haWxgKSB0aGUgZ2F0ZSBsZWF2ZXMgb3Blbi4gKi9cbmNvbnN0IEFVVEhfUEFUSF9QUkVGSVggPSBcIi9hdXRoXCI7XG5cbi8qKiBSZXNvbHZlZCBnYXRlIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHYXRlT3B0aW9ucyB7XG4gIC8qKiBBbGxvdy1saXN0IHBhdHRlcm5zIChkb21haW4gLyBnbG9iIC8gYC9yZWdleC9gKS4gRW1wdHkgPSBhbGxvdyBub2JvZHkuICovXG4gIHJlYWRvbmx5IGFsbG93OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFNlc3Npb24gbGlmZXRpbWUgaW4gc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIE9uZS10aW1lIGNvZGUgbGlmZXRpbWUgaW4gc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIE1heCB2ZXJpZnkgYXR0ZW1wdHMgcGVyIGlzc3VlZCBjb2RlLiAqL1xuICByZWFkb25seSBtYXhBdHRlbXB0czogbnVtYmVyO1xuICAvKiogU2VuZCB0aGUgY29kZSBlbWFpbC4gUmV0dXJucyBub3RoaW5nOyBmYWlsdXJlcyBhcmUgbG9nZ2VkLCBub3Qgc3VyZmFjZWQuICovXG4gIHJlYWRvbmx5IHNlbmRDb2RlOiAoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVHJ1ZSBpbiBwcm9kdWN0aW9uIChzZXRzIHRoZSBgU2VjdXJlYCBjb29raWUgZmxhZykuICovXG4gIHJlYWRvbmx5IHNlY3VyZUNvb2tpZXM6IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgZW1haWwtT1RQIGdhdGUgZm9yIG9uZSBhcHAuICovXG5leHBvcnQgY2xhc3MgQXV0aEdhdGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvZGVzOiBDb2RlU3RvcmU7XG4gIC8vIFNlcGFyYXRlIGxpbWl0ZXJzOiByZXF1ZXN0aW5nIGEgY29kZSBpcyBjaGVhcC10by1hYnVzZSAoZW1haWwgc3BhbSksIHZlcmlmeWluZ1xuICAvLyBpcyBhIGJydXRlLWZvcmNlIHN1cmZhY2UuIFBlci1lbWFpbCBBTkQgcGVyLUlQIHNvIG5laXRoZXIgYXhpcyBhbG9uZSBpcyBhIGJ5cGFzcy5cbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0TGltaXRlciA9IG5ldyBSYXRlTGltaXRlcig1LCAxNSAqIDYwICogMTAwMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZ5TGltaXRlciA9IG5ldyBSYXRlTGltaXRlcigxMCwgMTUgKiA2MCAqIDEwMDApO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXV0aEdhdGVPcHRpb25zKSB7XG4gICAgdGhpcy5jb2RlcyA9IG5ldyBDb2RlU3RvcmUob3B0aW9ucy5jb2RlVHRsU2Vjb25kcyAqIDEwMDAsIG9wdGlvbnMubWF4QXR0ZW1wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgUE9TVCAvYXV0aC9yZXF1ZXN0YC4gQWx3YXlzIHJlc29sdmVzIGB7IG9rOiB0cnVlIH1gIChwbHVzIGFcbiAgICogYHJldHJ5QWZ0ZXJgIHdoZW4gcmF0ZS1saW1pdGVkKTsgYSBjb2RlIGlzIGlzc3VlZCArIGVtYWlsZWQgb25seSBmb3IgYW5cbiAgICogYWxsb3ctbGlzdGVkIGFkZHJlc3MgdW5kZXIgdGhlIGxpbWl0LiBFcnJvcnMgaW4gc2VuZGluZyBhcmUgc3dhbGxvd2VkIHNvIHRoZVxuICAgKiByZXNwb25zZSBuZXZlciByZXZlYWxzIHdoZXRoZXIgYW4gYWRkcmVzcyBleGlzdHMgLyBpcyBhbGxvd2VkLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlUmVxdWVzdChlbWFpbDogc3RyaW5nLCBpcDogc3RyaW5nKTogUHJvbWlzZTx7IG9rOiB0cnVlOyByZXRyeUFmdGVyPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYnlJcCA9IHRoaXMucmVxdWVzdExpbWl0ZXIuaGl0KGBpcDoke2lwfWApO1xuICAgIGNvbnN0IGJ5RW1haWwgPSB0aGlzLnJlcXVlc3RMaW1pdGVyLmhpdChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIGlmICghYnlJcC5hbGxvd2VkIHx8ICFieUVtYWlsLmFsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCByZXRyeUFmdGVyOiBieUlwLnJldHJ5QWZ0ZXIgPz8gYnlFbWFpbC5yZXRyeUFmdGVyIH07XG4gICAgfVxuICAgIGlmIChsb29rc0xpa2VFbWFpbChhZGRyZXNzKSAmJiBtYXRjaGVzQWxsb3dsaXN0KGFkZHJlc3MsIHRoaXMub3B0aW9ucy5hbGxvdykpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmNvZGVzLmlzc3VlKGFkZHJlc3MpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnNlbmRDb2RlKGFkZHJlc3MsIGNvZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gc2VuZCBPVFAgZW1haWxcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYFBPU1QgL2F1dGgvdmVyaWZ5YC4gT24gYSBjb3JyZWN0IGNvZGUsIHJldHVybnMgdGhlIHNlc3Npb24gYHRva2VuYFxuICAgKiBwbHVzIHRoZSBgY29va2llT3B0aW9uc2AgZm9yIGl0IHNvIHRoZSByb3V0ZSBzZXRzIGl0IHdpdGggRXhwcmVzcydzIG93blxuICAgKiBgcmVzLmNvb2tpZShTRVNTSU9OX0NPT0tJRSwgdG9rZW4sIG9wdGlvbnMpYCAobm8gaGFuZC1yb2xsZWQgU2V0LUNvb2tpZSkuXG4gICAqIEZhaWx1cmVzIHJldHVybiBgeyBvazogZmFsc2UgfWAgd2l0aCBhIGdlbmVyaWMgcmVhc29uLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlVmVyaWZ5KFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIGlwOiBzdHJpbmcsXG4gICAgc2VjdXJlOiBib29sZWFuLFxuICApOiBQcm9taXNlPHsgb2s6IGJvb2xlYW47IHRva2VuPzogc3RyaW5nOyBjb29raWVPcHRpb25zPzogQ29va2llT3B0aW9uczsgcmV0cnlBZnRlcj86IG51bWJlciB9PiB7XG4gICAgY29uc3QgYWRkcmVzcyA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ5SXAgPSB0aGlzLnZlcmlmeUxpbWl0ZXIuaGl0KGBpcDoke2lwfWApO1xuICAgIGNvbnN0IGJ5RW1haWwgPSB0aGlzLnZlcmlmeUxpbWl0ZXIuaGl0KGBlbWFpbDoke2FkZHJlc3N9YCk7XG4gICAgaWYgKCFieUlwLmFsbG93ZWQgfHwgIWJ5RW1haWwuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCByZXRyeUFmdGVyOiBieUlwLnJldHJ5QWZ0ZXIgPz8gYnlFbWFpbC5yZXRyeUFmdGVyIH07XG4gICAgfVxuICAgIGlmICh0aGlzLmNvZGVzLnZlcmlmeShhZGRyZXNzLCBjb2RlLnRyaW0oKSkgIT09IFwib2tcIikgcmV0dXJuIHsgb2s6IGZhbHNlIH07XG4gICAgLy8gQ29ycmVjdCBjb2RlOiBjbGVhciB0aGUgY2FsbGVyJ3MgcmVxdWVzdC92ZXJpZnkgYnVkZ2V0IGFuZCBtaW50IGEgc2Vzc2lvbi5cbiAgICB0aGlzLnJlcXVlc3RMaW1pdGVyLnJlc2V0KGBlbWFpbDoke2FkZHJlc3N9YCk7XG4gICAgdGhpcy52ZXJpZnlMaW1pdGVyLnJlc2V0KGBlbWFpbDoke2FkZHJlc3N9YCk7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBzaWduU2Vzc2lvbihhZGRyZXNzLCB0aGlzLm9wdGlvbnMuc2Vzc2lvblR0bFNlY29uZHMpO1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCB0b2tlbiwgY29va2llT3B0aW9uczogdGhpcy5jb29raWVPcHRpb25zKHNlY3VyZSkgfTtcbiAgfVxuXG4gIC8qKiBFeHByZXNzIGNvb2tpZSBvcHRpb25zIGZvciB0aGUgc2Vzc2lvbiAodXNlZCB3aXRoIGByZXMuY29va2llYC9gcmVzLmNsZWFyQ29va2llYCkuICovXG4gIGNvb2tpZU9wdGlvbnMoc2VjdXJlOiBib29sZWFuKTogQ29va2llT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICBzZWN1cmU6IHNlY3VyZSB8fCB0aGlzLm9wdGlvbnMuc2VjdXJlQ29va2llcyxcbiAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgbWF4QWdlOiB0aGlzLm9wdGlvbnMuc2Vzc2lvblR0bFNlY29uZHMgKiAxMDAwLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgYXV0aGVudGljYXRlZCBlbWFpbCBmb3IgYSByZXF1ZXN0LCBvciBgdW5kZWZpbmVkYC4gKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlKHJlcTogUmVxdWVzdCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gUmV1c2Ugc2hhcmVkLWNvcmUncyBjb29raWUgcGFyc2VyIChhY2NlcHRzIGFuIEV4cHJlc3MgcmVxIGRpcmVjdGx5KSByYXRoZXJcbiAgICAvLyB0aGFuIHJlLWltcGxlbWVudGluZyBoZWFkZXIgc3BsaXR0aW5nIGhlcmUuXG4gICAgY29uc3QgdG9rZW4gPSBodHRwLnBhcnNlQ29va2llcyhyZXEpW1NFU1NJT05fQ09PS0lFXTtcbiAgICByZXR1cm4gdmVyaWZ5U2Vzc2lvbih0b2tlbik7XG4gIH1cblxuICAvKiogVGhlIGBHRVQgL2F1dGgvc3RhdHVzYCBwYXlsb2FkIGZvciBhIHJlcXVlc3QuICovXG4gIGFzeW5jIHN0YXR1cyhyZXE6IFJlcXVlc3QpOiBQcm9taXNlPEF1dGhTdGF0dXM+IHtcbiAgICBjb25zdCBlbWFpbCA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKHJlcSk7XG4gICAgcmV0dXJuIHsgYXV0aGVudGljYXRlZDogQm9vbGVhbihlbWFpbCksIGVtYWlsLCBlbmFibGVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogRXhwcmVzcyBtaWRkbGV3YXJlIGdhdGluZyB0aGUgYXBwJ3MgREFUQSBBUElzIGJlaGluZCBhIHNlc3Npb24uXG4gICAqXG4gICAqIEl0IGdhdGVzIGAvYXBpLypgIGFuZCByZXR1cm5zIDQwMSBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIGNhbGxlciAtIEVYQ0VQVCB0aGVcbiAgICogbG9naW4gZmxvdyBpdHNlbGYgKGA8ZW1haWxCYXNlPi9hdXRoLypgKSwgd2hpY2ggbXVzdCBzdGF5IG9wZW4gc28gYSBjYWxsZXJcbiAgICogY2FuIG9idGFpbiBhIHNlc3Npb24uIFN0YXRpYyBhc3NldHMgKHRoZSBTUEEgc2hlbGwsIEpTL0NTUywgZmF2aWNvbnMpIGFyZVxuICAgKiBOT1QgZ2F0ZWQ6IHRoZSBicm93c2VyIGhhcyB0byBsb2FkIHRoZSBjbGllbnQgc28gdGhlIGA8QXV0aEdhdGU+YCBSZWFjdFxuICAgKiBjb21wb25lbnQgY2FuIHJlbmRlciB0aGUgbG9naW4gc2NyZWVuIGFuZCBjYWxsIHRoZXNlIGVuZHBvaW50cy4gQSBnYXRlZFxuICAgKiBgL2FwaWAgcmVxdWVzdCBmcm9tIHRoZSB1bi1sb2dnZWQtaW4gU1BBIHNpbXBseSA0MDFzLCB3aGljaCB0aGUgY2xpZW50XG4gICAqIHRyZWF0cyBhcyBcInNob3cgdGhlIGxvZ2luXCIuIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFNQQSBnYXRlIHNoYXBlIC0gcHJvdGVjdFxuICAgKiB0aGUgZGF0YSwgc2VydmUgdGhlIHNoZWxsLlxuICAgKlxuICAgKiBgZW1haWxCYXNlYCBpcyB0aGUgZW1haWwgcGx1Z2luJ3MgbW91bnQgcGF0aCAoZS5nLiBgL2FwaS9lbWFpbGApLCBzbyBib3RoIHRoZVxuICAgKiBvcGVuIGxvZ2luIHByZWZpeCBhbmQgdGhlIGdhdGVkIEFQSSBwcmVmaXggYXJlIG1hdGNoZWQgb24gdGhlIGZ1bGwgcGF0aC5cbiAgICovXG4gIG1pZGRsZXdhcmUoZW1haWxCYXNlOiBzdHJpbmcpOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQge1xuICAgIGNvbnN0IG9wZW5QcmVmaXggPSBgJHtlbWFpbEJhc2V9JHtBVVRIX1BBVEhfUFJFRklYfWA7XG4gICAgcmV0dXJuIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgLy8gT25seSBBUEkgdHJhZmZpYyBpcyBnYXRlZDsgc3RhdGljIGFzc2V0cyBsb2FkIGZyZWVseSBzbyB0aGUgbG9naW4gVUkgY2FuLlxuICAgICAgaWYgKCFyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS9cIikgfHwgcmVxLnBhdGguc3RhcnRzV2l0aChvcGVuUHJlZml4KSkge1xuICAgICAgICBuZXh0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZvaWQgdGhpcy5hdXRoZW50aWNhdGUocmVxKS50aGVuKChlbWFpbCkgPT4ge1xuICAgICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oeyBlcnJvcjogXCJhdXRoZW50aWNhdGlvbiByZXF1aXJlZFwiLCBsb2dpblBhdGg6IG9wZW5QcmVmaXggfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
package/lib/src/plugin.js
CHANGED
|
@@ -300,24 +300,33 @@ export class EmailPlugin extends Plugin {
|
|
|
300
300
|
this.authGate = gate;
|
|
301
301
|
// The gate must protect the WHOLE app, but a plugin's own `injectRoutes`
|
|
302
302
|
// router only covers `/api/email/*`. AppKit's `server` plugin exposes
|
|
303
|
-
// `addExtension(fn)` for exactly this: an app-level middleware
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
server
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
303
|
+
// `addExtension(fn)` for exactly this: an app-level middleware applied before
|
|
304
|
+
// the server listens. The lookup is deferred to the `setup:complete`
|
|
305
|
+
// lifecycle event because sibling plugins (including `server`) are not all
|
|
306
|
+
// registered during this plugin's own `setup()` - the same coordination
|
|
307
|
+
// `appkit-mastra` uses to wait for `lakebase`. The login routes are exempted
|
|
308
|
+
// by the middleware's open-prefix (`/api/email/auth`).
|
|
309
|
+
const registerGate = () => {
|
|
310
|
+
const server = this.context?.getPlugins().get("server");
|
|
311
|
+
if (server?.addExtension) {
|
|
312
|
+
server.addExtension((app) => app.use(gate.middleware(`/api/${EmailPlugin.manifest.name}`)));
|
|
313
|
+
logger.info("auth:enabled", {
|
|
314
|
+
patterns: auth.allow.length,
|
|
315
|
+
sessionTtlSeconds: auth.sessionTtlSeconds,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
// No server plugin to gate through - the login routes still work, but the
|
|
320
|
+
// rest of the app would be ungated, so disable rather than half-enable.
|
|
321
|
+
this.authGate = undefined;
|
|
322
|
+
logger.warn("auth:disabled - the `server` plugin is required to gate the app; add server() to your plugins");
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
if (this.context?.onLifecycle) {
|
|
326
|
+
this.context.onLifecycle("setup:complete", registerGate);
|
|
315
327
|
}
|
|
316
328
|
else {
|
|
317
|
-
|
|
318
|
-
// rest of the app would be ungated, so refuse to half-enable silently.
|
|
319
|
-
this.authGate = undefined;
|
|
320
|
-
logger.warn("auth:disabled - the `server` plugin is required to gate the app; add server() to your plugins");
|
|
329
|
+
registerGate();
|
|
321
330
|
}
|
|
322
331
|
}
|
|
323
332
|
/**
|
|
@@ -423,4 +432,4 @@ function unwrap(result) {
|
|
|
423
432
|
* ```
|
|
424
433
|
*/
|
|
425
434
|
export const email = toPlugin(EmailPlugin);
|
|
426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FLaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLEtBQUssSUFBSSxTQUFTLEdBSW5CLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUEwQixNQUFNLGFBQWEsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsNEVB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Ii8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgZW1haWxgKSB0aGF0IG93bnMgdGhlIFNNVFAgcnVudGltZVxuICogZm9yIG91dGJvdW5kIG1haWwuIFJlZ2lzdGVyaW5nIGl0IHZhbGlkYXRlcyB0aGUgU01UUCBjb25maWd1cmF0aW9uXG4gKiBhbmQgdmVyaWZpZXMgY29ubmVjdGl2aXR5IGF0IHN0YXJ0dXAsIHNvIGEgYmFkIGhvc3QgLyBjcmVkZW50aWFsXG4gKiBzdXJmYWNlcyBpbiB0aGUgYm9vdCBsb2dzIGluc3RlYWQgb2Ygb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQsIGFuZFxuICogaW5zdGFsbHMgdGhpcyBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBhcyB0aGUgcnVudGltZSdzIGV4ZWN1dG9yIHNvIGV2ZXJ5XG4gKiBzZW5kIHBpY2tzIHVwIEFwcEtpdCdzIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi5cbiAqXG4gKiBUaGUgcGx1Z2luIGlzIGFsc28gYSBgVG9vbFByb3ZpZGVyYCwgc28gYW4gQXBwS2l0IGFnZW50IGNhbiByZWFjaCBhblxuICogYGVtYWlsLnNlbmRgIHRvb2wgZGlyZWN0bHk7IHRoZSB7QGxpbmsgZW1haWxUb29sfSBleHBvcnQgaXMgdGhlIHNhbWVcbiAqIGNhcGFiaWxpdHkgZm9yIGEgTWFzdHJhIGFnZW50LiBCb3RoIHNoYXJlIHRoZSB0cmFuc3BvcnQgcHJpbWVkIGhlcmUsXG4gKiBhbmQge0BsaW5rIHNlbmRFbWFpbH0gaXMgYXZhaWxhYmxlIHRvIG5vbi1hZ2VudCBjYWxsZXJzLlxuICpcbiAqIENvbmZpZ3VyYXRpb24gaXMgdGhlIG1hbmlmZXN0LXB1Ymxpc2hlZCB7QGxpbmsgRW1haWxQbHVnaW5Db25maWd9XG4gKiAoU01UUCBob3N0L3BvcnQvY3JlZGVudGlhbHMsIHNlbmRlciBkb21haW4gb3IgZXhwbGljaXQgYGZyb21gLCB0aGVcbiAqIHNlbmRlciBwb2xpY3ksIGFuZCBhbiBvcHRpb25hbCBgYWxsb3dlZFNlbmRlcnNgIHJlc3RyaWN0aW9uKSwgd2l0aFxuICogdW5wcmVmaXhlZCBgU01UUF8qYCAvIGBFTUFJTF8qYCBlbnZpcm9ubWVudCBmYWxsYmFja3MuXG4gKlxuICogVGhlIHBsdWdpbiBtb3VudHMgb25lIHJvdXRlIHVuZGVyIGl0cyBiYXNlIHBhdGggKGAvYXBpL2VtYWlsYCk6XG4gKiBgR0VUIC9zZW5kZXJzYCByZXR1cm5zIHRoZSBwZXJtaXR0ZWQgYEZyb21gIG9wdGlvbnMgZm9yIHRoZSBjYWxsaW5nXG4gKiB1c2VyLCBzbyBhIGNvbXBvc2UgVUkgY2FuIG9mZmVyIHRoZW0gaW4gYSBkcm9wZG93bi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQXBwS2l0RXJyb3IsXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZW1haWwgYXMgZW1haWxXaXJlLFxuICB0eXBlIEVtYWlsTWVzc2FnZSxcbiAgdHlwZSBFbWFpbFJlc3VsdCxcbiAgdHlwZSBFbWFpbFNlbmRlcnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgYXV0aFJlcXVlc3RTY2hlbWEsIGF1dGhWZXJpZnlTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWxcIjtcbmltcG9ydCB7IEVNQUlMX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVBdXRoQ29uZmlnLCB0eXBlIEVtYWlsUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBBdXRoR2F0ZSwgU0VTU0lPTl9DT09LSUUgfSBmcm9tIFwiLi9hdXRoL2dhdGUudHNcIjtcbmltcG9ydCB7IEVNQUlMX1NFTkRFUlNfU0VUVElOR1MsIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyBpc1NlbmRlckFsbG93ZWQsIGxpc3RTZW5kZXJPcHRpb25zLCByZXNvbHZlU2VuZGVyQWRkcmVzcyB9IGZyb20gXCIuL3NlbmRlci50c1wiO1xuaW1wb3J0IHsgU0VORF9FTUFJTF9ERVNDUklQVElPTiB9IGZyb20gXCIuL3Rvb2wudHNcIjtcbmltcG9ydCB7XG4gIGdldEVtYWlsUnVudGltZSxcbiAgcmVzZXRFbWFpbFJ1bnRpbWUsXG4gIHNlbmRFbWFpbCxcbiAgc2V0RW1haWxFeGVjdXRvcixcbiAgdmVyaWZ5RW1haWxUcmFuc3BvcnQsXG59IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgKHVuZGVyIGAvYXBpL2VtYWlsYCkgZm9yIHRoZSBzZW5kZXItb3B0aW9ucyBsb29rdXAuICovXG5jb25zdCBTRU5ERVJTX1JPVVRFID0gXCIvc2VuZGVyc1wiO1xuXG4vKiogUmVnaXN0cnkga2V5IG9mIHRoZSBhZ2VudCB0b29sLCB3aGljaCBhZ2VudHMgYWRkcmVzcyBhcyBgZW1haWwuc2VuZGAuICovXG5jb25zdCBTRU5EX1RPT0wgPSBcInNlbmRcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImVtYWlsXCIpO1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCBjb25maWd1cmVzIGFuZCB2ZXJpZmllcyB0aGUgU01UUCB0cmFuc3BvcnQgdXNlZCBieVxuICogdGhlIGBzZW5kX2VtYWlsYCB0b29sLCBhbmQgZXhwb3NlcyBzZW5kaW5nIGFzIGFuIEFwcEtpdCBhZ2VudCB0b29sLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgZW1haWxQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9lbWFpbFwiO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBlbWFpbFBsdWdpbi5lbWFpbCh7XG4gKiAgICAgICBzbXRwOiB7IGhvc3Q6IFwic210cC5leGFtcGxlLmNvbVwiLCB1c2VyOiBcImFwaWtleVwiLCBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU01UUF9LRVkgfSxcbiAqICAgICAgIGRvbWFpbjogXCJtYWlsLmV4YW1wbGUuY29tXCIsXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1haWxQbHVnaW4gZXh0ZW5kcyBQbHVnaW48RW1haWxQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgLyoqIFRoZSBlbWFpbC1PVFAgYWNjZXNzIGdhdGUsIGNvbnN0cnVjdGVkIGluIHtAbGluayBzZXR1cH0gd2hlbiBgYXV0aC5lbmFibGVkYC4gKi9cbiAgcHJpdmF0ZSBhdXRoR2F0ZT86IEF1dGhHYXRlO1xuXG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRW1haWxcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VuZHMgYXBwcm92YWwtZ2F0ZWQgZW1haWwgb3ZlciBTTVRQLCB3aXRoIHRoZSBzZW5kZXIgZGVyaXZlZCBmcm9tIFwiICtcbiAgICAgIFwidGhlIG9uLWJlaGFsZi1vZiB1c2VyJ3MgYWRkcmVzcyBvbiBhIGNvbmZpZ3VyZWQgZG9tYWluLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBFTUFJTF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZW1haWxcIj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuXG4gICAqXG4gICAqIE5vdCBgYXV0b0luaGVyaXRhYmxlYDogYSBzZW5kIGlzIGlycmV2ZXJzaWJsZSBhbmQgbGVhdmVzIHRoZSB3b3Jrc3BhY2UsXG4gICAqIHNvIGl0IG11c3Qgb25seSBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZVxuICAgKiBzZW5kZXIgcG9saWN5IHRoYXQgY29tZXMgd2l0aCBpdC5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xzOiBUb29sUmVnaXN0cnkgPSB7XG4gICAgW1NFTkRfVE9PTF06IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFNFTkRfRU1BSUxfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IGVtYWlsV2lyZS5lbWFpbE1lc3NhZ2VTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+XG4gICAgICAgIHRoaXMuc2VuZChlbWFpbFdpcmUuZW1haWxNZXNzYWdlU2NoZW1hLnBhcnNlKGFyZ3MpLCB1bmRlZmluZWQsIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqXG4gICAqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIHRoaXMgcGx1Z2luJ3MgY29uZmlnIChvdmVyIGVudiksIHJvdXRlIHRoZVxuICAgKiB0b29scycgc2VuZHMgdGhyb3VnaCB0aGlzIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLCBhbmQgbG9nIHRoZVxuICAgKiBlZmZlY3RpdmUgc2VuZGVyIHBvbGljeSBzbyBhbiBhY3RpdmUgcmVzdHJpY3Rpb24gaXMgb2J2aW91cyBhdCBib290LiBJblxuICAgKiBTTVRQIG1vZGUsIGZhaWwgc2V0dXAgd2hlbiB0aGUgdHJhbnNwb3J0IGNhbm5vdCBiZSB2ZXJpZmllZDogYSBiYWQgaG9zdFxuICAgKiBvciBjcmVkZW50aWFsIGlzIGEgZGVwbG95LXRpbWUgbWlzdGFrZSBhbmQgc2hvdWxkIHN0b3AgdGhlIGFwcCByYXRoZXJcbiAgICogdGhhbiB3YWl0IGZvciBhIHVzZXIgdG8gYXBwcm92ZSBhIHNlbmQgdGhhdCBjYW5ub3Qgd29yay4gV2l0aCBubyBTTVRQXG4gICAqIGNyZWRlbnRpYWxzIHRoZSBydW50aW1lIGlzIGluIGZpbGUvb3V0Ym94IG1vZGUgKG9ubHkgd2hlblxuICAgKiBgRU1BSUxfT1VUQk9YX01PREVgIGlzIHNldCksIGxvZ2dlZCBsb3VkbHkgaGVyZSBzbyBpdCBpcyBvYnZpb3VzIG1haWxcbiAgICogaXMgYmVpbmcgd3JpdHRlbiB0byBkaXNrIHJhdGhlciB0aGFuIHNlbnQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRyYW5zcG9ydGVyLCBjb25maWcgfSA9IGdldEVtYWlsUnVudGltZSh0aGlzLmNvbmZpZyk7XG4gICAgc2V0RW1haWxFeGVjdXRvcigoZm4sIHNldHRpbmdzKSA9PiB0aGlzLmV4ZWN1dGUoZm4sIHNldHRpbmdzKSk7XG4gICAgdGhpcy5zZXR1cEF1dGhHYXRlKCk7XG4gICAgY29uc3QgcG9saWN5ID0ge1xuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBzZW5kZXJQb2xpY3k6IGNvbmZpZy5zZW5kZXJQb2xpY3ksXG4gICAgICByZXN0cmljdGVkOiBjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCxcbiAgICAgIC4uLihjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCA/IHsgYWxsb3dlZFNlbmRlcnM6IGNvbmZpZy5hbGxvd2VkU2VuZGVycyB9IDoge30pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvdXRib3g6ZW5hYmxlZFwiLCB7XG4gICAgICAgIGRpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgcmVhc29uOiBcIm5vIFNNVFAgY3JlZGVudGlhbHMgY29uZmlndXJlZDsgZW1haWxzIGFyZSB3cml0dGVuIHRvIGRpc2sgaW5zdGVhZCBvZiBzZW50XCIsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgcG9saWN5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoc2lnbmFsKSA9PiB2ZXJpZnlFbWFpbFRyYW5zcG9ydCh0cmFuc3BvcnRlciwgc2lnbmFsKSxcbiAgICAgIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyxcbiAgICApO1xuICAgIGlmICghdmVyaWZpZWQub2spIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInNtdHA6dW52ZXJpZmllZFwiLCB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgc3RhdHVzOiB2ZXJpZmllZC5zdGF0dXMsXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZC5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICAgIFwiU01UUFwiLFxuICAgICAgICBgQ291bGQgbm90IHZlcmlmeSAke2NvbmZpZy5ob3N0fToke2NvbmZpZy5wb3J0fS4gQ2hlY2sgU01UUF9IT1NULCBTTVRQX1BPUlQsIFNNVFBfU0VDVVJFLCBhbmQgdGhlIGNyZWRlbnRpYWxzLCBvciBzZXQgRU1BSUxfT1VUQk9YX01PREU9MSBmb3IgbG9jYWwgb3V0Ym94IHRlc3RpbmcuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgLi4ucG9saWN5LFxuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wuIElkZW1wb3RlbnQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0RW1haWxSdW50aW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIG9ubHkgaW52b2tlcyB0aGlzIGhvb2sgLVxuICAgKiBpdCBuZXZlciBjYWxscyB7QGxpbmsgc2h1dGRvd259IC0gc28gdGhlIFNNVFAgcG9vbCBpcyBjbG9zZWQgZnJvbSBoZXJlIG9yXG4gICAqIGl0IGxlYWtzIGF0IFNJR1RFUk0uIFRoZSB0ZWFyZG93biBpcyBzeW5jaHJvbm91cyBhbmQgaWRlbXBvdGVudCwgc28gdGhlXG4gICAqIHVuLWF3YWl0ZWQgY2FsbCBjb3N0cyBub3RoaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwIHNvIFVJIGNvbXBvc2Ugdmlld3MgY2FuIHBvcHVsYXRlIGFcbiAgICogYEZyb21gIGRyb3Bkb3duIGZyb20gdGhlIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdC4gTW91bnRlZCB1bmRlciB0aGVcbiAgICogcGx1Z2luIGJhc2UgcGF0aCwgaS5lLiBgR0VUIC9hcGkvZW1haWwvc2VuZGVyc2AuIFJ1bnMgaW4gdGhlIE9CT1xuICAgKiB1c2VyIHNjb3BlIHNvIGRvbWFpbiB3aWxkY2FyZHMgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWxsZXIncyBvd25cbiAgICogbG9jYWwgcGFydC5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJsaXN0U2VuZGVyc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogU0VOREVSU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmV4ZWN1dGVMaXN0U2VuZGVycygpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmluamVjdEF1dGhSb3V0ZXMocm91dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgZW1haWwtT1RQIGxvZ2luIGZsb3cgdW5kZXIgYC9hcGkvZW1haWwvYXV0aC8qYCB3aGVuIHRoZSBnYXRlIGlzXG4gICAqIGVuYWJsZWQuIFRoZXNlIHJvdXRlcyBhcmUgdGhlIE9OTFkgb25lcyB0aGUgZ2F0ZSBtaWRkbGV3YXJlIGxlYXZlcyBvcGVuIChzZWVcbiAgICoge0BsaW5rIEF1dGhHYXRlLm1pZGRsZXdhcmV9KTsgZXZlcnl0aGluZyBlbHNlIHJlcXVpcmVzIHRoZSBzZXNzaW9uIGNvb2tpZVxuICAgKiB0aGV5IGVzdGFibGlzaC4gTm8tb3Agd2hlbiBhdXRoIGlzIG9mZi5cbiAgICovXG4gIHByaXZhdGUgaW5qZWN0QXV0aFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlID0gdGhpcy5hdXRoR2F0ZTtcbiAgICBpZiAoIWdhdGUpIHJldHVybjtcblxuICAgIC8vIGByZXF1ZXN0YCBhbmQgYHZlcmlmeWAgdGFrZSBhIHJhdyBlbWFpbC9jb2RlLCBub3QgYW4gT0JPIHVzZXIsIHNvIHRoZXkgYXJlXG4gICAgLy8gTk9UIHdyYXBwZWQgaW4gYGFzVXNlcmAgLSB0aGUgY2FsbGVyIGlzIGFub255bW91cyB1bnRpbCB2ZXJpZmllZC5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJhdXRoUmVxdWVzdFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvcmVxdWVzdFwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGF1dGhSZXF1ZXN0U2NoZW1hLnNhZmVQYXJzZShyZXEuYm9keSk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAvLyBFdmVuIGEgbWFsZm9ybWVkIGJvZHkgcmVwb3J0cyBzdWNjZXNzIChhbnRpLWVudW1lcmF0aW9uKS5cbiAgICAgICAgICByZXMuanNvbih7IG9rOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRlLmhhbmRsZVJlcXVlc3QocGFyc2VkLmRhdGEuZW1haWwsIHRoaXMuY2xpZW50SXAocmVxKSk7XG4gICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiYXV0aFZlcmlmeVwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvdmVyaWZ5XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gYXV0aFZlcmlmeVNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGUuaGFuZGxlVmVyaWZ5KFxuICAgICAgICAgIHBhcnNlZC5kYXRhLmVtYWlsLFxuICAgICAgICAgIHBhcnNlZC5kYXRhLmNvZGUsXG4gICAgICAgICAgdGhpcy5jbGllbnRJcChyZXEpLFxuICAgICAgICAgIHJlcS5zZWN1cmUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQub2sgJiYgcmVzdWx0LnRva2VuICYmIHJlc3VsdC5jb29raWVPcHRpb25zKSB7XG4gICAgICAgICAgcmVzLmNvb2tpZShTRVNTSU9OX0NPT0tJRSwgcmVzdWx0LnRva2VuLCByZXN1bHQuY29va2llT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBvazogcmVzdWx0Lm9rLCAuLi4ocmVzdWx0LnJldHJ5QWZ0ZXIgPyB7IHJldHJ5QWZ0ZXI6IHJlc3VsdC5yZXRyeUFmdGVyIH0gOiB7fSkgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiYXV0aExvZ291dFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvbG9nb3V0XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5jbGVhckNvb2tpZShTRVNTSU9OX0NPT0tJRSwgeyBwYXRoOiBcIi9cIiB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBvazogdHJ1ZSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJhdXRoU3RhdHVzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi9hdXRoL3N0YXR1c1wiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKGF3YWl0IGdhdGUuc3RhdHVzKHJlcSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbGllbnQgSVAgZm9yIHJhdGUtbGltaXRpbmcsIGhvbm9yaW5nIHRoZSBBcHBzIGluZ3Jlc3MgYHgtZm9yd2FyZGVkLWZvcmAuICovXG4gIHByaXZhdGUgY2xpZW50SXAocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ3ZCA9IHJlcS5oZWFkZXJzW1wieC1mb3J3YXJkZWQtZm9yXCJdO1xuICAgIGNvbnN0IGZpcnN0ID0gQXJyYXkuaXNBcnJheShmd2QpID8gZndkWzBdIDogZndkPy5zcGxpdChcIixcIilbMF07XG4gICAgcmV0dXJuIChmaXJzdCA/PyByZXEuaXAgPz8gXCJ1bmtub3duXCIpLnRyaW0oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogU2VuZCBhIG1lc3NhZ2UgaW1tZWRpYXRlbHkgZnJvbSBgZnJvbWAgdGhyb3VnaCB0aGUgc2hhcmVkXG4gICAgICAgKiB0cmFuc3BvcnQsIGJ5cGFzc2luZyB0aGUgYXBwcm92YWwgZmxvdy4gRm9yIGFnZW50LWRyaXZlbiBzZW5kc1xuICAgICAgICogdXNlIHtAbGluayBlbWFpbFRvb2x9IGluc3RlYWQuXG4gICAgICAgKi9cbiAgICAgIHNlbmRFbWFpbDogKFxuICAgICAgICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gICAgICAgIGZyb206IHN0cmluZyxcbiAgICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgICApOiBQcm9taXNlPEVtYWlsUmVzdWx0PiA9PiB0aGlzLnNlbmQobWVzc2FnZSwgZnJvbSwgc2lnbmFsKSxcbiAgICAgIC8qKlxuICAgICAgICogU2VuZGVyIG9wdGlvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgKHRoZSBgR0VUIC9zZW5kZXJzYCBwYXlsb2FkKS5cbiAgICAgICAqIEFwcEtpdCB3cmFwcyB0aGlzIHdpdGggYGFzVXNlcihyZXEpYCBmb3IgT0JPIHNjb3BpbmcuXG4gICAgICAgKi9cbiAgICAgIGxpc3RTZW5kZXJzOiBhc3luYyAoKTogUHJvbWlzZTxFbWFpbFNlbmRlcnM+ID0+IHVud3JhcChhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0U2VuZGVycygpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogdGhlIHRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBhZ2VudC4gKi9cbiAgZ2V0QWdlbnRUb29scygpOiBBZ2VudFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0b29sc0Zyb21SZWdpc3RyeSh0aGlzLnRvb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHJ1biBvbmUgdG9vbCBjYWxsLiBBcmd1bWVudHMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0XG4gICAqIHRoZSB0b29sJ3Mgc2NoZW1hIGZpcnN0LCBhbmQgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhblxuICAgKiBMTE0tZnJpZW5kbHkgc3RyaW5nIHNvIHRoZSBtb2RlbCBjYW4gY29ycmVjdCBpdHNlbGYgb24gdGhlIG5leHQgdHVybi5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBvbmUgbWVzc2FnZSwgcmVzb2x2aW5nIHRoZSBzZW5kZXIgZm9yIHRoZSBjYWxsZXIgaW4gc2NvcGUgd2hlblxuICAgKiBgZnJvbWAgaXMgbm90IHBpbm5lZC4gVGhlIGludGVyY2VwdG9yIGNoYWluIGlzIGFwcGxpZWQgaW5zaWRlXG4gICAqIHtAbGluayBzZW5kRW1haWx9IHRocm91Z2ggdGhlIGV4ZWN1dG9yIGluc3RhbGxlZCBhdCBzZXR1cCwgc28gdGhpcyBtdXN0XG4gICAqIG5vdCB3cmFwIGl0IGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kKFxuICAgIG1lc3NhZ2U6IEVtYWlsTWVzc2FnZSxcbiAgICBmcm9tOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8RW1haWxSZXN1bHQ+IHtcbiAgICByZXR1cm4gc2VuZEVtYWlsKG1lc3NhZ2UsIGZyb20gPz8gdGhpcy5yZXNvbHZlU2VuZGVyKCksIHNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGVtYWlsLU9UUCBhY2Nlc3MgZ2F0ZSB3aGVuIGBhdXRoLmVuYWJsZWRgLCB3aXJpbmcgaXRzIGNvZGVcbiAgICogZGVsaXZlcnkgdGhyb3VnaCB0aGlzIHBsdWdpbidzIG93biB0cmFuc3BvcnQuIENhbGxlZCBmcm9tIHtAbGluayBzZXR1cH07IGFcbiAgICogbm8tb3AgKGxlYXZlcyB7QGxpbmsgYXV0aEdhdGV9IHVuZGVmaW5lZCkgd2hlbiB0aGUgZ2F0ZSBpcyBvZmYuXG4gICAqL1xuICBwcml2YXRlIHNldHVwQXV0aEdhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgYXV0aCA9IHJlc29sdmVBdXRoQ29uZmlnKHRoaXMuY29uZmlnLmF1dGgpO1xuICAgIGlmICghYXV0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGdhdGUgPSBuZXcgQXV0aEdhdGUoe1xuICAgICAgYWxsb3c6IGF1dGguYWxsb3csXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogYXV0aC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIGNvZGVUdGxTZWNvbmRzOiBhdXRoLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgbWF4QXR0ZW1wdHM6IGF1dGgubWF4QXR0ZW1wdHMsXG4gICAgICBzZWN1cmVDb29raWVzOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIsXG4gICAgICBzZW5kQ29kZTogKGVtYWlsLCBjb2RlKSA9PiB0aGlzLnNlbmRPdHBFbWFpbChlbWFpbCwgY29kZSksXG4gICAgfSk7XG4gICAgdGhpcy5hdXRoR2F0ZSA9IGdhdGU7XG5cbiAgICAvLyBUaGUgZ2F0ZSBtdXN0IHByb3RlY3QgdGhlIFdIT0xFIGFwcCwgYnV0IGEgcGx1Z2luJ3Mgb3duIGBpbmplY3RSb3V0ZXNgXG4gICAgLy8gcm91dGVyIG9ubHkgY292ZXJzIGAvYXBpL2VtYWlsLypgLiBBcHBLaXQncyBgc2VydmVyYCBwbHVnaW4gZXhwb3Nlc1xuICAgIC8vIGBhZGRFeHRlbnNpb24oZm4pYCBmb3IgZXhhY3RseSB0aGlzOiBhbiBhcHAtbGV2ZWwgbWlkZGxld2FyZSByZWdpc3RlcmVkXG4gICAgLy8gYmVmb3JlIHRoZSBzZXJ2ZXIgbGlzdGVucy4gTG9vayBpdCB1cCBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lIChub1xuICAgIC8vIGRlcGVuZGVuY3kgb24gYSBzcGVjaWZpYyBzZXJ2ZXItcGx1Z2luIHBhY2thZ2UpIGFuZCBtb3VudCB0aGUgZ2F0ZSB0aGVyZS5cbiAgICAvLyBUaGUgbG9naW4gcm91dGVzIHRoZW1zZWx2ZXMgYXJlIGV4ZW1wdGVkIGJ5IHRoZSBtaWRkbGV3YXJlJ3MgYGVtYWlsQmFzZWBcbiAgICAvLyBvcGVuLXByZWZpeCAoYC9hcGkvZW1haWwvYXV0aGApLlxuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhc1xuICAgICAgfCB7IGFkZEV4dGVuc2lvbj86IChmbjogKGFwcDogZXhwcmVzcy5BcHBsaWNhdGlvbikgPT4gdm9pZCkgPT4gdm9pZCB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VydmVyPy5hZGRFeHRlbnNpb24pIHtcbiAgICAgIHNlcnZlci5hZGRFeHRlbnNpb24oKGFwcCkgPT4gYXBwLnVzZShnYXRlLm1pZGRsZXdhcmUoYC9hcGkvJHtFbWFpbFBsdWdpbi5tYW5pZmVzdC5uYW1lfWApKSk7XG4gICAgICBsb2dnZXIuaW5mbyhcImF1dGg6ZW5hYmxlZFwiLCB7XG4gICAgICAgIHBhdHRlcm5zOiBhdXRoLmFsbG93Lmxlbmd0aCxcbiAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IGF1dGguc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gc2VydmVyIHBsdWdpbiB0byBnYXRlIHRocm91Z2ggLSB0aGUgbG9naW4gcm91dGVzIHN0aWxsIHdvcmssIGJ1dCB0aGVcbiAgICAgIC8vIHJlc3Qgb2YgdGhlIGFwcCB3b3VsZCBiZSB1bmdhdGVkLCBzbyByZWZ1c2UgdG8gaGFsZi1lbmFibGUgc2lsZW50bHkuXG4gICAgICB0aGlzLmF1dGhHYXRlID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIFwiYXV0aDpkaXNhYmxlZCAtIHRoZSBgc2VydmVyYCBwbHVnaW4gaXMgcmVxdWlyZWQgdG8gZ2F0ZSB0aGUgYXBwOyBhZGQgc2VydmVyKCkgdG8geW91ciBwbHVnaW5zXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxpdmVyIGEgb25lLXRpbWUgY29kZSB0byBgZW1haWxgIHRocm91Z2ggdGhpcyBwbHVnaW4ncyB0cmFuc3BvcnQuIFRocm93c1xuICAgKiBvbiBmYWlsdXJlICh0aGUgZ2F0ZSBzd2FsbG93cyBpdCwgc28gYSBkZWxpdmVyeSBlcnJvciBuZXZlciBsZWFrcyB3aGV0aGVyXG4gICAqIHRoZSBhZGRyZXNzIHdhcyBhbGxvdy1saXN0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kT3RwRW1haWwoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICB0bzogW2VtYWlsXSxcbiAgICAgICAgc3ViamVjdDogYFlvdXIgc2lnbi1pbiBjb2RlOiAke2NvZGV9YCxcbiAgICAgICAgYm9keTogW1xuICAgICAgICAgIGBZb3VyIG9uZS10aW1lIHNpZ24taW4gY29kZSBpczpgLFxuICAgICAgICAgIGBgLFxuICAgICAgICAgIGAjIyAke2NvZGV9YCxcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgSXQgZXhwaXJlcyBzaG9ydGx5LiBJZiB5b3UgZGlkbid0IHJlcXVlc3QgdGhpcywgeW91IGNhbiBpZ25vcmUgdGhpcyBlbWFpbC5gLFxuICAgICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgICB9LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICk7XG4gIH1cblxuICAvKiogUnVuIHRoZSBzZW5kZXItb3B0aW9ucyBsb29rdXAgdGhyb3VnaCB0aGUgcGx1Z2luJ3MgaW50ZXJjZXB0b3IgY2hhaW4uICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RTZW5kZXJzKCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PEVtYWlsU2VuZGVycz4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKGFzeW5jICgpID0+IHRoaXMubGlzdFNlbmRlcnMoKSwgRU1BSUxfU0VOREVSU19TRVRUSU5HUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgYEZyb21gIG9wdGlvbnMgb2ZmZXJlZCB0byB0aGUgY3VycmVudCB1c2VyOiB0aGUgY29uY3JldGVcbiAgICogYWRkcmVzc2VzIHRoZSBlZmZlY3RpdmUgYWxsb3ctbGlzdCBwZXJtaXRzIChkb21haW4gd2lsZGNhcmRzIGV4cGFuZGVkXG4gICAqIGFnYWluc3QgdGhlIE9CTyB1c2VyJ3MgbG9jYWwgcGFydCksIHRoZSBkZWZhdWx0IGFtb25nIHRoZW0sIGFuZFxuICAgKiB3aGV0aGVyIHRoZSBsaXN0IGlzIGFuIGVuZm9yY2VkIHJlc3RyaWN0aW9uLiBTZWVcbiAgICoge0BsaW5rIGxpc3RTZW5kZXJPcHRpb25zfS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdFNlbmRlcnMoKTogUHJvbWlzZTxFbWFpbFNlbmRlcnM+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0RW1haWxSdW50aW1lKCk7XG4gICAgY29uc3Qgc2VuZGVycyA9IGxpc3RTZW5kZXJPcHRpb25zKGNvbmZpZywgY3VycmVudFVzZXJFbWFpbCgpKTtcbiAgICAvLyBQcmVmZXIgdGhlIGFkZHJlc3MgYSBzZW5kIHdvdWxkIGFjdHVhbGx5IGRlZmF1bHQgdG87IGZhbGwgYmFjayB0b1xuICAgIC8vIHRoZSBmaXJzdCBvZmZlcmVkIG9wdGlvbiB3aGVuIHRoYXQgY2FuJ3QgYmUgcmVzb2x2ZWQgLyBwZXJtaXR0ZWQuXG4gICAgbGV0IGRlZmF1bHRTZW5kZXIgPSBzZW5kZXJzWzBdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVNlbmRlcigpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaXNTZW5kZXJBbGxvd2VkKHJlc29sdmVkLCBjb25maWcuYWxsb3dlZFNlbmRlcnMpKSBkZWZhdWx0U2VuZGVyID0gcmVzb2x2ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZWVwIHRoZSBmaXJzdCBvZmZlcmVkIG9wdGlvbiAob3Igbm9uZSkgYXMgdGhlIGRlZmF1bHQuXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXJzLFxuICAgICAgLi4uKGRlZmF1bHRTZW5kZXIgPyB7IGRlZmF1bHRTZW5kZXIgfSA6IHt9KSxcbiAgICAgIHJlc3RyaWN0ZWQ6IGNvbmZpZy5hbGxvd2VkU2VuZGVycy5sZW5ndGggPiAwLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIGBGcm9tYCBhIHNlbmQgZGVmYXVsdHMgdG8gZm9yIHRoZSBjYWxsZXIgaW4gc2NvcGUuICovXG4gIHByaXZhdGUgcmVzb2x2ZVNlbmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlU2VuZGVyQWRkcmVzcyhnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcsIGN1cnJlbnRVc2VyRW1haWwoKSk7XG4gIH1cbn1cblxuLyoqIFRoZSBPQk8gdXNlcidzIGFkZHJlc3MsIG9yIHVuZGVmaW5lZCBvdXRzaWRlIGEgdXNlciBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY3VycmVudFVzZXJFbWFpbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIHJldHVybiBcImlzVXNlckNvbnRleHRcIiBpbiBjdHggPyBjdHgudXNlckVtYWlsIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlLXJhaXNlIGEgZmFpbGVkIGV4ZWN1dGlvbiBhcyB0aGUgQXBwS2l0IGVycm9yIGNsYXNzIHRoYXQgYWxyZWFkeSBjYXJyaWVzXG4gKiB0aGUgc3RhdHVzIEFwcEtpdCByZXNvbHZlZCwgc28gYSBwcm9ncmFtbWF0aWMgY2FsbGVyIHNlZXMgdGhlIHNhbWUgNDAwIC9cbiAqIDQwMSAvIDUwMyBhbiBIVFRQIGNhbGxlciB3b3VsZC5cbiAqL1xuZnVuY3Rpb24gdG9BcHBLaXRFcnJvcihzdGF0dXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKTogQXBwS2l0RXJyb3Ige1xuICBpZiAoc3RhdHVzID09PSA0MDApIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICBpZiAoc3RhdHVzID09PSA0MDEpIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgaWYgKHN0YXR1cyA9PT0gNTAzKSByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBTdXJmYWNlIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHRvIGEgcHJvZ3JhbW1hdGljIGNhbGxlciBhcyBhXG4gKiB0aHJvdy4gSFRUUCBoYW5kbGVycyBtYXAgYHN0YXR1c2Agb250byB0aGUgcmVzcG9uc2UgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwPFQ+KHJlc3VsdDogRXhlY3V0aW9uUmVzdWx0PFQ+KTogVCB7XG4gIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQuZGF0YTtcbiAgdGhyb3cgdG9BcHBLaXRFcnJvcihyZXN1bHQuc3RhdHVzLCByZXN1bHQubWVzc2FnZSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGVtYWlsIHBsdWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYnJhbmQsIHBsdWdpbiBhcyBlbWFpbFBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2VtYWlsXCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIGVtYWlsUGx1Z2luLmVtYWlsKHtcbiAqICAgICAgIGRvbWFpbjogXCJtYWlsLmV4YW1wbGUuY29tXCIsXG4gKiAgICAgICBhbGxvd2VkU2VuZGVyczogW1wiKkBtYWlsLmV4YW1wbGUuY29tXCJdLFxuICogICAgICAgYnJhbmQ6IGJyYW5kLmRlZmF1bHRFbWFpbEJyYW5kLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGVtYWlsID0gdG9QbHVnaW4oRW1haWxQbHVnaW4pO1xuIl19
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FLaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLEtBQUssSUFBSSxTQUFTLEdBSW5CLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUEwQixNQUFNLGFBQWEsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsNEVB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QUksTUFBTSxDQUFDLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDbEMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgZW1haWxgKSB0aGF0IG93bnMgdGhlIFNNVFAgcnVudGltZVxuICogZm9yIG91dGJvdW5kIG1haWwuIFJlZ2lzdGVyaW5nIGl0IHZhbGlkYXRlcyB0aGUgU01UUCBjb25maWd1cmF0aW9uXG4gKiBhbmQgdmVyaWZpZXMgY29ubmVjdGl2aXR5IGF0IHN0YXJ0dXAsIHNvIGEgYmFkIGhvc3QgLyBjcmVkZW50aWFsXG4gKiBzdXJmYWNlcyBpbiB0aGUgYm9vdCBsb2dzIGluc3RlYWQgb2Ygb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQsIGFuZFxuICogaW5zdGFsbHMgdGhpcyBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBhcyB0aGUgcnVudGltZSdzIGV4ZWN1dG9yIHNvIGV2ZXJ5XG4gKiBzZW5kIHBpY2tzIHVwIEFwcEtpdCdzIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi5cbiAqXG4gKiBUaGUgcGx1Z2luIGlzIGFsc28gYSBgVG9vbFByb3ZpZGVyYCwgc28gYW4gQXBwS2l0IGFnZW50IGNhbiByZWFjaCBhblxuICogYGVtYWlsLnNlbmRgIHRvb2wgZGlyZWN0bHk7IHRoZSB7QGxpbmsgZW1haWxUb29sfSBleHBvcnQgaXMgdGhlIHNhbWVcbiAqIGNhcGFiaWxpdHkgZm9yIGEgTWFzdHJhIGFnZW50LiBCb3RoIHNoYXJlIHRoZSB0cmFuc3BvcnQgcHJpbWVkIGhlcmUsXG4gKiBhbmQge0BsaW5rIHNlbmRFbWFpbH0gaXMgYXZhaWxhYmxlIHRvIG5vbi1hZ2VudCBjYWxsZXJzLlxuICpcbiAqIENvbmZpZ3VyYXRpb24gaXMgdGhlIG1hbmlmZXN0LXB1Ymxpc2hlZCB7QGxpbmsgRW1haWxQbHVnaW5Db25maWd9XG4gKiAoU01UUCBob3N0L3BvcnQvY3JlZGVudGlhbHMsIHNlbmRlciBkb21haW4gb3IgZXhwbGljaXQgYGZyb21gLCB0aGVcbiAqIHNlbmRlciBwb2xpY3ksIGFuZCBhbiBvcHRpb25hbCBgYWxsb3dlZFNlbmRlcnNgIHJlc3RyaWN0aW9uKSwgd2l0aFxuICogdW5wcmVmaXhlZCBgU01UUF8qYCAvIGBFTUFJTF8qYCBlbnZpcm9ubWVudCBmYWxsYmFja3MuXG4gKlxuICogVGhlIHBsdWdpbiBtb3VudHMgb25lIHJvdXRlIHVuZGVyIGl0cyBiYXNlIHBhdGggKGAvYXBpL2VtYWlsYCk6XG4gKiBgR0VUIC9zZW5kZXJzYCByZXR1cm5zIHRoZSBwZXJtaXR0ZWQgYEZyb21gIG9wdGlvbnMgZm9yIHRoZSBjYWxsaW5nXG4gKiB1c2VyLCBzbyBhIGNvbXBvc2UgVUkgY2FuIG9mZmVyIHRoZW0gaW4gYSBkcm9wZG93bi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQXBwS2l0RXJyb3IsXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZW1haWwgYXMgZW1haWxXaXJlLFxuICB0eXBlIEVtYWlsTWVzc2FnZSxcbiAgdHlwZSBFbWFpbFJlc3VsdCxcbiAgdHlwZSBFbWFpbFNlbmRlcnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgYXV0aFJlcXVlc3RTY2hlbWEsIGF1dGhWZXJpZnlTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWxcIjtcbmltcG9ydCB7IEVNQUlMX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVBdXRoQ29uZmlnLCB0eXBlIEVtYWlsUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBBdXRoR2F0ZSwgU0VTU0lPTl9DT09LSUUgfSBmcm9tIFwiLi9hdXRoL2dhdGUudHNcIjtcbmltcG9ydCB7IEVNQUlMX1NFTkRFUlNfU0VUVElOR1MsIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyBpc1NlbmRlckFsbG93ZWQsIGxpc3RTZW5kZXJPcHRpb25zLCByZXNvbHZlU2VuZGVyQWRkcmVzcyB9IGZyb20gXCIuL3NlbmRlci50c1wiO1xuaW1wb3J0IHsgU0VORF9FTUFJTF9ERVNDUklQVElPTiB9IGZyb20gXCIuL3Rvb2wudHNcIjtcbmltcG9ydCB7XG4gIGdldEVtYWlsUnVudGltZSxcbiAgcmVzZXRFbWFpbFJ1bnRpbWUsXG4gIHNlbmRFbWFpbCxcbiAgc2V0RW1haWxFeGVjdXRvcixcbiAgdmVyaWZ5RW1haWxUcmFuc3BvcnQsXG59IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgKHVuZGVyIGAvYXBpL2VtYWlsYCkgZm9yIHRoZSBzZW5kZXItb3B0aW9ucyBsb29rdXAuICovXG5jb25zdCBTRU5ERVJTX1JPVVRFID0gXCIvc2VuZGVyc1wiO1xuXG4vKiogUmVnaXN0cnkga2V5IG9mIHRoZSBhZ2VudCB0b29sLCB3aGljaCBhZ2VudHMgYWRkcmVzcyBhcyBgZW1haWwuc2VuZGAuICovXG5jb25zdCBTRU5EX1RPT0wgPSBcInNlbmRcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImVtYWlsXCIpO1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCBjb25maWd1cmVzIGFuZCB2ZXJpZmllcyB0aGUgU01UUCB0cmFuc3BvcnQgdXNlZCBieVxuICogdGhlIGBzZW5kX2VtYWlsYCB0b29sLCBhbmQgZXhwb3NlcyBzZW5kaW5nIGFzIGFuIEFwcEtpdCBhZ2VudCB0b29sLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgZW1haWxQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9lbWFpbFwiO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBlbWFpbFBsdWdpbi5lbWFpbCh7XG4gKiAgICAgICBzbXRwOiB7IGhvc3Q6IFwic210cC5leGFtcGxlLmNvbVwiLCB1c2VyOiBcImFwaWtleVwiLCBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU01UUF9LRVkgfSxcbiAqICAgICAgIGRvbWFpbjogXCJtYWlsLmV4YW1wbGUuY29tXCIsXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1haWxQbHVnaW4gZXh0ZW5kcyBQbHVnaW48RW1haWxQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgLyoqIFRoZSBlbWFpbC1PVFAgYWNjZXNzIGdhdGUsIGNvbnN0cnVjdGVkIGluIHtAbGluayBzZXR1cH0gd2hlbiBgYXV0aC5lbmFibGVkYC4gKi9cbiAgcHJpdmF0ZSBhdXRoR2F0ZT86IEF1dGhHYXRlO1xuXG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRW1haWxcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VuZHMgYXBwcm92YWwtZ2F0ZWQgZW1haWwgb3ZlciBTTVRQLCB3aXRoIHRoZSBzZW5kZXIgZGVyaXZlZCBmcm9tIFwiICtcbiAgICAgIFwidGhlIG9uLWJlaGFsZi1vZiB1c2VyJ3MgYWRkcmVzcyBvbiBhIGNvbmZpZ3VyZWQgZG9tYWluLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBFTUFJTF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZW1haWxcIj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuXG4gICAqXG4gICAqIE5vdCBgYXV0b0luaGVyaXRhYmxlYDogYSBzZW5kIGlzIGlycmV2ZXJzaWJsZSBhbmQgbGVhdmVzIHRoZSB3b3Jrc3BhY2UsXG4gICAqIHNvIGl0IG11c3Qgb25seSBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZVxuICAgKiBzZW5kZXIgcG9saWN5IHRoYXQgY29tZXMgd2l0aCBpdC5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xzOiBUb29sUmVnaXN0cnkgPSB7XG4gICAgW1NFTkRfVE9PTF06IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFNFTkRfRU1BSUxfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IGVtYWlsV2lyZS5lbWFpbE1lc3NhZ2VTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+XG4gICAgICAgIHRoaXMuc2VuZChlbWFpbFdpcmUuZW1haWxNZXNzYWdlU2NoZW1hLnBhcnNlKGFyZ3MpLCB1bmRlZmluZWQsIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqXG4gICAqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIHRoaXMgcGx1Z2luJ3MgY29uZmlnIChvdmVyIGVudiksIHJvdXRlIHRoZVxuICAgKiB0b29scycgc2VuZHMgdGhyb3VnaCB0aGlzIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLCBhbmQgbG9nIHRoZVxuICAgKiBlZmZlY3RpdmUgc2VuZGVyIHBvbGljeSBzbyBhbiBhY3RpdmUgcmVzdHJpY3Rpb24gaXMgb2J2aW91cyBhdCBib290LiBJblxuICAgKiBTTVRQIG1vZGUsIGZhaWwgc2V0dXAgd2hlbiB0aGUgdHJhbnNwb3J0IGNhbm5vdCBiZSB2ZXJpZmllZDogYSBiYWQgaG9zdFxuICAgKiBvciBjcmVkZW50aWFsIGlzIGEgZGVwbG95LXRpbWUgbWlzdGFrZSBhbmQgc2hvdWxkIHN0b3AgdGhlIGFwcCByYXRoZXJcbiAgICogdGhhbiB3YWl0IGZvciBhIHVzZXIgdG8gYXBwcm92ZSBhIHNlbmQgdGhhdCBjYW5ub3Qgd29yay4gV2l0aCBubyBTTVRQXG4gICAqIGNyZWRlbnRpYWxzIHRoZSBydW50aW1lIGlzIGluIGZpbGUvb3V0Ym94IG1vZGUgKG9ubHkgd2hlblxuICAgKiBgRU1BSUxfT1VUQk9YX01PREVgIGlzIHNldCksIGxvZ2dlZCBsb3VkbHkgaGVyZSBzbyBpdCBpcyBvYnZpb3VzIG1haWxcbiAgICogaXMgYmVpbmcgd3JpdHRlbiB0byBkaXNrIHJhdGhlciB0aGFuIHNlbnQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRyYW5zcG9ydGVyLCBjb25maWcgfSA9IGdldEVtYWlsUnVudGltZSh0aGlzLmNvbmZpZyk7XG4gICAgc2V0RW1haWxFeGVjdXRvcigoZm4sIHNldHRpbmdzKSA9PiB0aGlzLmV4ZWN1dGUoZm4sIHNldHRpbmdzKSk7XG4gICAgdGhpcy5zZXR1cEF1dGhHYXRlKCk7XG4gICAgY29uc3QgcG9saWN5ID0ge1xuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBzZW5kZXJQb2xpY3k6IGNvbmZpZy5zZW5kZXJQb2xpY3ksXG4gICAgICByZXN0cmljdGVkOiBjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCxcbiAgICAgIC4uLihjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCA/IHsgYWxsb3dlZFNlbmRlcnM6IGNvbmZpZy5hbGxvd2VkU2VuZGVycyB9IDoge30pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvdXRib3g6ZW5hYmxlZFwiLCB7XG4gICAgICAgIGRpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgcmVhc29uOiBcIm5vIFNNVFAgY3JlZGVudGlhbHMgY29uZmlndXJlZDsgZW1haWxzIGFyZSB3cml0dGVuIHRvIGRpc2sgaW5zdGVhZCBvZiBzZW50XCIsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgcG9saWN5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoc2lnbmFsKSA9PiB2ZXJpZnlFbWFpbFRyYW5zcG9ydCh0cmFuc3BvcnRlciwgc2lnbmFsKSxcbiAgICAgIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyxcbiAgICApO1xuICAgIGlmICghdmVyaWZpZWQub2spIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInNtdHA6dW52ZXJpZmllZFwiLCB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgc3RhdHVzOiB2ZXJpZmllZC5zdGF0dXMsXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZC5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICAgIFwiU01UUFwiLFxuICAgICAgICBgQ291bGQgbm90IHZlcmlmeSAke2NvbmZpZy5ob3N0fToke2NvbmZpZy5wb3J0fS4gQ2hlY2sgU01UUF9IT1NULCBTTVRQX1BPUlQsIFNNVFBfU0VDVVJFLCBhbmQgdGhlIGNyZWRlbnRpYWxzLCBvciBzZXQgRU1BSUxfT1VUQk9YX01PREU9MSBmb3IgbG9jYWwgb3V0Ym94IHRlc3RpbmcuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgLi4ucG9saWN5LFxuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wuIElkZW1wb3RlbnQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0RW1haWxSdW50aW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIG9ubHkgaW52b2tlcyB0aGlzIGhvb2sgLVxuICAgKiBpdCBuZXZlciBjYWxscyB7QGxpbmsgc2h1dGRvd259IC0gc28gdGhlIFNNVFAgcG9vbCBpcyBjbG9zZWQgZnJvbSBoZXJlIG9yXG4gICAqIGl0IGxlYWtzIGF0IFNJR1RFUk0uIFRoZSB0ZWFyZG93biBpcyBzeW5jaHJvbm91cyBhbmQgaWRlbXBvdGVudCwgc28gdGhlXG4gICAqIHVuLWF3YWl0ZWQgY2FsbCBjb3N0cyBub3RoaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwIHNvIFVJIGNvbXBvc2Ugdmlld3MgY2FuIHBvcHVsYXRlIGFcbiAgICogYEZyb21gIGRyb3Bkb3duIGZyb20gdGhlIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdC4gTW91bnRlZCB1bmRlciB0aGVcbiAgICogcGx1Z2luIGJhc2UgcGF0aCwgaS5lLiBgR0VUIC9hcGkvZW1haWwvc2VuZGVyc2AuIFJ1bnMgaW4gdGhlIE9CT1xuICAgKiB1c2VyIHNjb3BlIHNvIGRvbWFpbiB3aWxkY2FyZHMgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWxsZXIncyBvd25cbiAgICogbG9jYWwgcGFydC5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJsaXN0U2VuZGVyc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogU0VOREVSU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmV4ZWN1dGVMaXN0U2VuZGVycygpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmluamVjdEF1dGhSb3V0ZXMocm91dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgZW1haWwtT1RQIGxvZ2luIGZsb3cgdW5kZXIgYC9hcGkvZW1haWwvYXV0aC8qYCB3aGVuIHRoZSBnYXRlIGlzXG4gICAqIGVuYWJsZWQuIFRoZXNlIHJvdXRlcyBhcmUgdGhlIE9OTFkgb25lcyB0aGUgZ2F0ZSBtaWRkbGV3YXJlIGxlYXZlcyBvcGVuIChzZWVcbiAgICoge0BsaW5rIEF1dGhHYXRlLm1pZGRsZXdhcmV9KTsgZXZlcnl0aGluZyBlbHNlIHJlcXVpcmVzIHRoZSBzZXNzaW9uIGNvb2tpZVxuICAgKiB0aGV5IGVzdGFibGlzaC4gTm8tb3Agd2hlbiBhdXRoIGlzIG9mZi5cbiAgICovXG4gIHByaXZhdGUgaW5qZWN0QXV0aFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlID0gdGhpcy5hdXRoR2F0ZTtcbiAgICBpZiAoIWdhdGUpIHJldHVybjtcblxuICAgIC8vIGByZXF1ZXN0YCBhbmQgYHZlcmlmeWAgdGFrZSBhIHJhdyBlbWFpbC9jb2RlLCBub3QgYW4gT0JPIHVzZXIsIHNvIHRoZXkgYXJlXG4gICAgLy8gTk9UIHdyYXBwZWQgaW4gYGFzVXNlcmAgLSB0aGUgY2FsbGVyIGlzIGFub255bW91cyB1bnRpbCB2ZXJpZmllZC5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJhdXRoUmVxdWVzdFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvcmVxdWVzdFwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGF1dGhSZXF1ZXN0U2NoZW1hLnNhZmVQYXJzZShyZXEuYm9keSk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAvLyBFdmVuIGEgbWFsZm9ybWVkIGJvZHkgcmVwb3J0cyBzdWNjZXNzIChhbnRpLWVudW1lcmF0aW9uKS5cbiAgICAgICAgICByZXMuanNvbih7IG9rOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRlLmhhbmRsZVJlcXVlc3QocGFyc2VkLmRhdGEuZW1haWwsIHRoaXMuY2xpZW50SXAocmVxKSk7XG4gICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiYXV0aFZlcmlmeVwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvdmVyaWZ5XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gYXV0aFZlcmlmeVNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGUuaGFuZGxlVmVyaWZ5KFxuICAgICAgICAgIHBhcnNlZC5kYXRhLmVtYWlsLFxuICAgICAgICAgIHBhcnNlZC5kYXRhLmNvZGUsXG4gICAgICAgICAgdGhpcy5jbGllbnRJcChyZXEpLFxuICAgICAgICAgIHJlcS5zZWN1cmUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQub2sgJiYgcmVzdWx0LnRva2VuICYmIHJlc3VsdC5jb29raWVPcHRpb25zKSB7XG4gICAgICAgICAgcmVzLmNvb2tpZShTRVNTSU9OX0NPT0tJRSwgcmVzdWx0LnRva2VuLCByZXN1bHQuY29va2llT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBvazogcmVzdWx0Lm9rLCAuLi4ocmVzdWx0LnJldHJ5QWZ0ZXIgPyB7IHJldHJ5QWZ0ZXI6IHJlc3VsdC5yZXRyeUFmdGVyIH0gOiB7fSkgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiYXV0aExvZ291dFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiL2F1dGgvbG9nb3V0XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5jbGVhckNvb2tpZShTRVNTSU9OX0NPT0tJRSwgeyBwYXRoOiBcIi9cIiB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBvazogdHJ1ZSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJhdXRoU3RhdHVzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi9hdXRoL3N0YXR1c1wiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKGF3YWl0IGdhdGUuc3RhdHVzKHJlcSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbGllbnQgSVAgZm9yIHJhdGUtbGltaXRpbmcsIGhvbm9yaW5nIHRoZSBBcHBzIGluZ3Jlc3MgYHgtZm9yd2FyZGVkLWZvcmAuICovXG4gIHByaXZhdGUgY2xpZW50SXAocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ3ZCA9IHJlcS5oZWFkZXJzW1wieC1mb3J3YXJkZWQtZm9yXCJdO1xuICAgIGNvbnN0IGZpcnN0ID0gQXJyYXkuaXNBcnJheShmd2QpID8gZndkWzBdIDogZndkPy5zcGxpdChcIixcIilbMF07XG4gICAgcmV0dXJuIChmaXJzdCA/PyByZXEuaXAgPz8gXCJ1bmtub3duXCIpLnRyaW0oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogU2VuZCBhIG1lc3NhZ2UgaW1tZWRpYXRlbHkgZnJvbSBgZnJvbWAgdGhyb3VnaCB0aGUgc2hhcmVkXG4gICAgICAgKiB0cmFuc3BvcnQsIGJ5cGFzc2luZyB0aGUgYXBwcm92YWwgZmxvdy4gRm9yIGFnZW50LWRyaXZlbiBzZW5kc1xuICAgICAgICogdXNlIHtAbGluayBlbWFpbFRvb2x9IGluc3RlYWQuXG4gICAgICAgKi9cbiAgICAgIHNlbmRFbWFpbDogKFxuICAgICAgICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gICAgICAgIGZyb206IHN0cmluZyxcbiAgICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgICApOiBQcm9taXNlPEVtYWlsUmVzdWx0PiA9PiB0aGlzLnNlbmQobWVzc2FnZSwgZnJvbSwgc2lnbmFsKSxcbiAgICAgIC8qKlxuICAgICAgICogU2VuZGVyIG9wdGlvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgKHRoZSBgR0VUIC9zZW5kZXJzYCBwYXlsb2FkKS5cbiAgICAgICAqIEFwcEtpdCB3cmFwcyB0aGlzIHdpdGggYGFzVXNlcihyZXEpYCBmb3IgT0JPIHNjb3BpbmcuXG4gICAgICAgKi9cbiAgICAgIGxpc3RTZW5kZXJzOiBhc3luYyAoKTogUHJvbWlzZTxFbWFpbFNlbmRlcnM+ID0+IHVud3JhcChhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0U2VuZGVycygpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogdGhlIHRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBhZ2VudC4gKi9cbiAgZ2V0QWdlbnRUb29scygpOiBBZ2VudFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0b29sc0Zyb21SZWdpc3RyeSh0aGlzLnRvb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHJ1biBvbmUgdG9vbCBjYWxsLiBBcmd1bWVudHMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0XG4gICAqIHRoZSB0b29sJ3Mgc2NoZW1hIGZpcnN0LCBhbmQgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhblxuICAgKiBMTE0tZnJpZW5kbHkgc3RyaW5nIHNvIHRoZSBtb2RlbCBjYW4gY29ycmVjdCBpdHNlbGYgb24gdGhlIG5leHQgdHVybi5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBvbmUgbWVzc2FnZSwgcmVzb2x2aW5nIHRoZSBzZW5kZXIgZm9yIHRoZSBjYWxsZXIgaW4gc2NvcGUgd2hlblxuICAgKiBgZnJvbWAgaXMgbm90IHBpbm5lZC4gVGhlIGludGVyY2VwdG9yIGNoYWluIGlzIGFwcGxpZWQgaW5zaWRlXG4gICAqIHtAbGluayBzZW5kRW1haWx9IHRocm91Z2ggdGhlIGV4ZWN1dG9yIGluc3RhbGxlZCBhdCBzZXR1cCwgc28gdGhpcyBtdXN0XG4gICAqIG5vdCB3cmFwIGl0IGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kKFxuICAgIG1lc3NhZ2U6IEVtYWlsTWVzc2FnZSxcbiAgICBmcm9tOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8RW1haWxSZXN1bHQ+IHtcbiAgICByZXR1cm4gc2VuZEVtYWlsKG1lc3NhZ2UsIGZyb20gPz8gdGhpcy5yZXNvbHZlU2VuZGVyKCksIHNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGVtYWlsLU9UUCBhY2Nlc3MgZ2F0ZSB3aGVuIGBhdXRoLmVuYWJsZWRgLCB3aXJpbmcgaXRzIGNvZGVcbiAgICogZGVsaXZlcnkgdGhyb3VnaCB0aGlzIHBsdWdpbidzIG93biB0cmFuc3BvcnQuIENhbGxlZCBmcm9tIHtAbGluayBzZXR1cH07IGFcbiAgICogbm8tb3AgKGxlYXZlcyB7QGxpbmsgYXV0aEdhdGV9IHVuZGVmaW5lZCkgd2hlbiB0aGUgZ2F0ZSBpcyBvZmYuXG4gICAqL1xuICBwcml2YXRlIHNldHVwQXV0aEdhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgYXV0aCA9IHJlc29sdmVBdXRoQ29uZmlnKHRoaXMuY29uZmlnLmF1dGgpO1xuICAgIGlmICghYXV0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGdhdGUgPSBuZXcgQXV0aEdhdGUoe1xuICAgICAgYWxsb3c6IGF1dGguYWxsb3csXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogYXV0aC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIGNvZGVUdGxTZWNvbmRzOiBhdXRoLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgbWF4QXR0ZW1wdHM6IGF1dGgubWF4QXR0ZW1wdHMsXG4gICAgICBzZWN1cmVDb29raWVzOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIsXG4gICAgICBzZW5kQ29kZTogKGVtYWlsLCBjb2RlKSA9PiB0aGlzLnNlbmRPdHBFbWFpbChlbWFpbCwgY29kZSksXG4gICAgfSk7XG4gICAgdGhpcy5hdXRoR2F0ZSA9IGdhdGU7XG5cbiAgICAvLyBUaGUgZ2F0ZSBtdXN0IHByb3RlY3QgdGhlIFdIT0xFIGFwcCwgYnV0IGEgcGx1Z2luJ3Mgb3duIGBpbmplY3RSb3V0ZXNgXG4gICAgLy8gcm91dGVyIG9ubHkgY292ZXJzIGAvYXBpL2VtYWlsLypgLiBBcHBLaXQncyBgc2VydmVyYCBwbHVnaW4gZXhwb3Nlc1xuICAgIC8vIGBhZGRFeHRlbnNpb24oZm4pYCBmb3IgZXhhY3RseSB0aGlzOiBhbiBhcHAtbGV2ZWwgbWlkZGxld2FyZSBhcHBsaWVkIGJlZm9yZVxuICAgIC8vIHRoZSBzZXJ2ZXIgbGlzdGVucy4gVGhlIGxvb2t1cCBpcyBkZWZlcnJlZCB0byB0aGUgYHNldHVwOmNvbXBsZXRlYFxuICAgIC8vIGxpZmVjeWNsZSBldmVudCBiZWNhdXNlIHNpYmxpbmcgcGx1Z2lucyAoaW5jbHVkaW5nIGBzZXJ2ZXJgKSBhcmUgbm90IGFsbFxuICAgIC8vIHJlZ2lzdGVyZWQgZHVyaW5nIHRoaXMgcGx1Z2luJ3Mgb3duIGBzZXR1cCgpYCAtIHRoZSBzYW1lIGNvb3JkaW5hdGlvblxuICAgIC8vIGBhcHBraXQtbWFzdHJhYCB1c2VzIHRvIHdhaXQgZm9yIGBsYWtlYmFzZWAuIFRoZSBsb2dpbiByb3V0ZXMgYXJlIGV4ZW1wdGVkXG4gICAgLy8gYnkgdGhlIG1pZGRsZXdhcmUncyBvcGVuLXByZWZpeCAoYC9hcGkvZW1haWwvYXV0aGApLlxuICAgIGNvbnN0IHJlZ2lzdGVyR2F0ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhc1xuICAgICAgICB8IHsgYWRkRXh0ZW5zaW9uPzogKGZuOiAoYXBwOiBleHByZXNzLkFwcGxpY2F0aW9uKSA9PiB2b2lkKSA9PiB2b2lkIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoc2VydmVyPy5hZGRFeHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyLmFkZEV4dGVuc2lvbigoYXBwKSA9PlxuICAgICAgICAgIGFwcC51c2UoZ2F0ZS5taWRkbGV3YXJlKGAvYXBpLyR7RW1haWxQbHVnaW4ubWFuaWZlc3QubmFtZX1gKSksXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiYXV0aDplbmFibGVkXCIsIHtcbiAgICAgICAgICBwYXR0ZXJuczogYXV0aC5hbGxvdy5sZW5ndGgsXG4gICAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IGF1dGguc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gc2VydmVyIHBsdWdpbiB0byBnYXRlIHRocm91Z2ggLSB0aGUgbG9naW4gcm91dGVzIHN0aWxsIHdvcmssIGJ1dCB0aGVcbiAgICAgICAgLy8gcmVzdCBvZiB0aGUgYXBwIHdvdWxkIGJlIHVuZ2F0ZWQsIHNvIGRpc2FibGUgcmF0aGVyIHRoYW4gaGFsZi1lbmFibGUuXG4gICAgICAgIHRoaXMuYXV0aEdhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIFwiYXV0aDpkaXNhYmxlZCAtIHRoZSBgc2VydmVyYCBwbHVnaW4gaXMgcmVxdWlyZWQgdG8gZ2F0ZSB0aGUgYXBwOyBhZGQgc2VydmVyKCkgdG8geW91ciBwbHVnaW5zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZSkge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgcmVnaXN0ZXJHYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJHYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGl2ZXIgYSBvbmUtdGltZSBjb2RlIHRvIGBlbWFpbGAgdGhyb3VnaCB0aGlzIHBsdWdpbidzIHRyYW5zcG9ydC4gVGhyb3dzXG4gICAqIG9uIGZhaWx1cmUgKHRoZSBnYXRlIHN3YWxsb3dzIGl0LCBzbyBhIGRlbGl2ZXJ5IGVycm9yIG5ldmVyIGxlYWtzIHdoZXRoZXJcbiAgICogdGhlIGFkZHJlc3Mgd2FzIGFsbG93LWxpc3RlZCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRPdHBFbWFpbChlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIHRvOiBbZW1haWxdLFxuICAgICAgICBzdWJqZWN0OiBgWW91ciBzaWduLWluIGNvZGU6ICR7Y29kZX1gLFxuICAgICAgICBib2R5OiBbXG4gICAgICAgICAgYFlvdXIgb25lLXRpbWUgc2lnbi1pbiBjb2RlIGlzOmAsXG4gICAgICAgICAgYGAsXG4gICAgICAgICAgYCMjICR7Y29kZX1gLFxuICAgICAgICAgIGBgLFxuICAgICAgICAgIGBJdCBleHBpcmVzIHNob3J0bHkuIElmIHlvdSBkaWRuJ3QgcmVxdWVzdCB0aGlzLCB5b3UgY2FuIGlnbm9yZSB0aGlzIGVtYWlsLmAsXG4gICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBSdW4gdGhlIHNlbmRlci1vcHRpb25zIGxvb2t1cCB0aHJvdWdoIHRoZSBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi4gKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGlzdFNlbmRlcnMoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8RW1haWxTZW5kZXJzPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4gdGhpcy5saXN0U2VuZGVycygpLCBFTUFJTF9TRU5ERVJTX1NFVFRJTkdTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBgRnJvbWAgb3B0aW9ucyBvZmZlcmVkIHRvIHRoZSBjdXJyZW50IHVzZXI6IHRoZSBjb25jcmV0ZVxuICAgKiBhZGRyZXNzZXMgdGhlIGVmZmVjdGl2ZSBhbGxvdy1saXN0IHBlcm1pdHMgKGRvbWFpbiB3aWxkY2FyZHMgZXhwYW5kZWRcbiAgICogYWdhaW5zdCB0aGUgT0JPIHVzZXIncyBsb2NhbCBwYXJ0KSwgdGhlIGRlZmF1bHQgYW1vbmcgdGhlbSwgYW5kXG4gICAqIHdoZXRoZXIgdGhlIGxpc3QgaXMgYW4gZW5mb3JjZWQgcmVzdHJpY3Rpb24uIFNlZVxuICAgKiB7QGxpbmsgbGlzdFNlbmRlck9wdGlvbnN9LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0U2VuZGVycygpOiBQcm9taXNlPEVtYWlsU2VuZGVycz4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRFbWFpbFJ1bnRpbWUoKTtcbiAgICBjb25zdCBzZW5kZXJzID0gbGlzdFNlbmRlck9wdGlvbnMoY29uZmlnLCBjdXJyZW50VXNlckVtYWlsKCkpO1xuICAgIC8vIFByZWZlciB0aGUgYWRkcmVzcyBhIHNlbmQgd291bGQgYWN0dWFsbHkgZGVmYXVsdCB0bzsgZmFsbCBiYWNrIHRvXG4gICAgLy8gdGhlIGZpcnN0IG9mZmVyZWQgb3B0aW9uIHdoZW4gdGhhdCBjYW4ndCBiZSByZXNvbHZlZCAvIHBlcm1pdHRlZC5cbiAgICBsZXQgZGVmYXVsdFNlbmRlciA9IHNlbmRlcnNbMF07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlU2VuZGVyKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChpc1NlbmRlckFsbG93ZWQocmVzb2x2ZWQsIGNvbmZpZy5hbGxvd2VkU2VuZGVycykpIGRlZmF1bHRTZW5kZXIgPSByZXNvbHZlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IG9mZmVyZWQgb3B0aW9uIChvciBub25lKSBhcyB0aGUgZGVmYXVsdC5cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRlcnMsXG4gICAgICAuLi4oZGVmYXVsdFNlbmRlciA/IHsgZGVmYXVsdFNlbmRlciB9IDoge30pLFxuICAgICAgcmVzdHJpY3RlZDogY29uZmlnLmFsbG93ZWRTZW5kZXJzLmxlbmd0aCA+IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYEZyb21gIGEgc2VuZCBkZWZhdWx0cyB0byBmb3IgdGhlIGNhbGxlciBpbiBzY29wZS4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2VuZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVTZW5kZXJBZGRyZXNzKGdldEVtYWlsUnVudGltZSgpLmNvbmZpZywgY3VycmVudFVzZXJFbWFpbCgpKTtcbiAgfVxufVxuXG4vKiogVGhlIE9CTyB1c2VyJ3MgYWRkcmVzcywgb3IgdW5kZWZpbmVkIG91dHNpZGUgYSB1c2VyIGNvbnRleHQuICovXG5mdW5jdGlvbiBjdXJyZW50VXNlckVtYWlsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgcmV0dXJuIFwiaXNVc2VyQ29udGV4dFwiIGluIGN0eCA/IGN0eC51c2VyRW1haWwgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmUtcmFpc2UgYSBmYWlsZWQgZXhlY3V0aW9uIGFzIHRoZSBBcHBLaXQgZXJyb3IgY2xhc3MgdGhhdCBhbHJlYWR5IGNhcnJpZXNcbiAqIHRoZSBzdGF0dXMgQXBwS2l0IHJlc29sdmVkLCBzbyBhIHByb2dyYW1tYXRpYyBjYWxsZXIgc2VlcyB0aGUgc2FtZSA0MDAgL1xuICogNDAxIC8gNTAzIGFuIEhUVFAgY2FsbGVyIHdvdWxkLlxuICovXG5mdW5jdGlvbiB0b0FwcEtpdEVycm9yKHN0YXR1czogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBBcHBLaXRFcnJvciB7XG4gIGlmIChzdGF0dXMgPT09IDQwMCkgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSk7XG4gIGlmIChzdGF0dXMgPT09IDQwMSkgcmV0dXJuIG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICBpZiAoc3RhdHVzID09PSA1MDMpIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFN1cmZhY2UgYSBmYWlsZWQge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gdG8gYSBwcm9ncmFtbWF0aWMgY2FsbGVyIGFzIGFcbiAqIHRocm93LiBIVFRQIGhhbmRsZXJzIG1hcCBgc3RhdHVzYCBvbnRvIHRoZSByZXNwb25zZSBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiB1bndyYXA8VD4ocmVzdWx0OiBFeGVjdXRpb25SZXN1bHQ8VD4pOiBUIHtcbiAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB0aHJvdyB0b0FwcEtpdEVycm9yKHJlc3VsdC5zdGF0dXMsIHJlc3VsdC5tZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBicmFuZCwgcGx1Z2luIGFzIGVtYWlsUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgZW1haWxQbHVnaW4uZW1haWwoe1xuICogICAgICAgZG9tYWluOiBcIm1haWwuZXhhbXBsZS5jb21cIixcbiAqICAgICAgIGFsbG93ZWRTZW5kZXJzOiBbXCIqQG1haWwuZXhhbXBsZS5jb21cIl0sXG4gKiAgICAgICBicmFuZDogYnJhbmQuZGVmYXVsdEVtYWlsQnJhbmQsXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZW1haWwgPSB0b1BsdWdpbihFbWFpbFBsdWdpbik7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "^0.43.0",
|
|
30
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
-
"@dbx-tools/shared-email": "0.6.
|
|
30
|
+
"@dbx-tools/shared-core": "0.6.44",
|
|
31
|
+
"@dbx-tools/shared-email": "0.6.44",
|
|
32
32
|
"@mastra/core": "^1.47.0",
|
|
33
33
|
"jose": "^6.2.3",
|
|
34
34
|
"juice": "^12.1.1",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"./package.json": "./package.json"
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
|
-
"version": "0.6.
|
|
52
|
+
"version": "0.6.44",
|
|
53
53
|
"types": "index.ts",
|
|
54
54
|
"type": "module",
|
|
55
55
|
"exports": {
|
package/src/auth/gate.ts
CHANGED
|
@@ -138,16 +138,25 @@ export class AuthGate {
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
/**
|
|
141
|
-
* Express middleware gating
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
141
|
+
* Express middleware gating the app's DATA APIs behind a session.
|
|
142
|
+
*
|
|
143
|
+
* It gates `/api/*` and returns 401 for an unauthenticated caller - EXCEPT the
|
|
144
|
+
* login flow itself (`<emailBase>/auth/*`), which must stay open so a caller
|
|
145
|
+
* can obtain a session. Static assets (the SPA shell, JS/CSS, favicons) are
|
|
146
|
+
* NOT gated: the browser has to load the client so the `<AuthGate>` React
|
|
147
|
+
* component can render the login screen and call these endpoints. A gated
|
|
148
|
+
* `/api` request from the un-logged-in SPA simply 401s, which the client
|
|
149
|
+
* treats as "show the login". This is the standard SPA gate shape - protect
|
|
150
|
+
* the data, serve the shell.
|
|
151
|
+
*
|
|
152
|
+
* `emailBase` is the email plugin's mount path (e.g. `/api/email`), so both the
|
|
153
|
+
* open login prefix and the gated API prefix are matched on the full path.
|
|
146
154
|
*/
|
|
147
155
|
middleware(emailBase: string): (req: Request, res: Response, next: NextFunction) => void {
|
|
148
156
|
const openPrefix = `${emailBase}${AUTH_PATH_PREFIX}`;
|
|
149
157
|
return (req, res, next) => {
|
|
150
|
-
|
|
158
|
+
// Only API traffic is gated; static assets load freely so the login UI can.
|
|
159
|
+
if (!req.path.startsWith("/api/") || req.path.startsWith(openPrefix)) {
|
|
151
160
|
next();
|
|
152
161
|
return;
|
|
153
162
|
}
|
package/src/plugin.ts
CHANGED
|
@@ -374,27 +374,37 @@ export class EmailPlugin extends Plugin<EmailPluginConfig> implements ToolProvid
|
|
|
374
374
|
|
|
375
375
|
// The gate must protect the WHOLE app, but a plugin's own `injectRoutes`
|
|
376
376
|
// router only covers `/api/email/*`. AppKit's `server` plugin exposes
|
|
377
|
-
// `addExtension(fn)` for exactly this: an app-level middleware
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
377
|
+
// `addExtension(fn)` for exactly this: an app-level middleware applied before
|
|
378
|
+
// the server listens. The lookup is deferred to the `setup:complete`
|
|
379
|
+
// lifecycle event because sibling plugins (including `server`) are not all
|
|
380
|
+
// registered during this plugin's own `setup()` - the same coordination
|
|
381
|
+
// `appkit-mastra` uses to wait for `lakebase`. The login routes are exempted
|
|
382
|
+
// by the middleware's open-prefix (`/api/email/auth`).
|
|
383
|
+
const registerGate = () => {
|
|
384
|
+
const server = this.context?.getPlugins().get("server") as
|
|
385
|
+
| { addExtension?: (fn: (app: express.Application) => void) => void }
|
|
386
|
+
| undefined;
|
|
387
|
+
if (server?.addExtension) {
|
|
388
|
+
server.addExtension((app) =>
|
|
389
|
+
app.use(gate.middleware(`/api/${EmailPlugin.manifest.name}`)),
|
|
390
|
+
);
|
|
391
|
+
logger.info("auth:enabled", {
|
|
392
|
+
patterns: auth.allow.length,
|
|
393
|
+
sessionTtlSeconds: auth.sessionTtlSeconds,
|
|
394
|
+
});
|
|
395
|
+
} else {
|
|
396
|
+
// No server plugin to gate through - the login routes still work, but the
|
|
397
|
+
// rest of the app would be ungated, so disable rather than half-enable.
|
|
398
|
+
this.authGate = undefined;
|
|
399
|
+
logger.warn(
|
|
400
|
+
"auth:disabled - the `server` plugin is required to gate the app; add server() to your plugins",
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
if (this.context?.onLifecycle) {
|
|
405
|
+
this.context.onLifecycle("setup:complete", registerGate);
|
|
391
406
|
} else {
|
|
392
|
-
|
|
393
|
-
// rest of the app would be ungated, so refuse to half-enable silently.
|
|
394
|
-
this.authGate = undefined;
|
|
395
|
-
logger.warn(
|
|
396
|
-
"auth:disabled - the `server` plugin is required to gate the app; add server() to your plugins",
|
|
397
|
-
);
|
|
407
|
+
registerGate();
|
|
398
408
|
}
|
|
399
409
|
}
|
|
400
410
|
|