@dbx-tools/tunnel 0.6.105 → 0.6.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -18
- package/index.ts +3 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +2 -1
- package/lib/src/frp.d.ts +44 -0
- package/lib/src/frp.js +118 -0
- package/lib/src/gate.d.ts +5 -5
- package/lib/src/gate.js +6 -5
- package/lib/src/interceptor.d.ts +22 -5
- package/lib/src/interceptor.js +58 -20
- package/lib/src/plugin.d.ts +5 -1
- package/lib/src/plugin.js +13 -4
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/frp.ts +183 -0
- package/src/gate.ts +10 -6
- package/src/interceptor.ts +71 -22
- package/src/plugin.ts +19 -4
package/lib/src/interceptor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `tunnelInterceptor()` - the {@link Interceptor} that fronts an app with a public
|
|
3
|
-
* portr tunnel, consuming the {@link InterceptorContext} `@dbx-tools/appkit`'s
|
|
3
|
+
* portr and/or frp tunnel, consuming the {@link InterceptorContext} `@dbx-tools/appkit`'s
|
|
4
4
|
* `createApp` hands it.
|
|
5
5
|
*
|
|
6
6
|
* The tunnel runs IN-PROCESS: the APP is the main process and hands this interceptor
|
|
@@ -17,8 +17,19 @@
|
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
19
|
import { log, object } from "@dbx-tools/shared-core";
|
|
20
|
+
import { installFrp, resolveFrpConfig, startFrp, writeFrpConfig } from "./frp.js";
|
|
20
21
|
import { installPortr, resolvePortrConfig, startPortr, writePortrConfig } from "./portr.js";
|
|
21
22
|
const logger = log.logger("tunnel:interceptor");
|
|
23
|
+
/** Resolve and validate the tunnel transport selector. */
|
|
24
|
+
export function resolveTunnelTransport(transport) {
|
|
25
|
+
const resolved = transport ??
|
|
26
|
+
process.env.DBX_TOOLS_TUNNEL_TRANSPORT ??
|
|
27
|
+
process.env.TUNNEL_TRANSPORT ??
|
|
28
|
+
"portr";
|
|
29
|
+
if (resolved === "portr" || resolved === "frp" || resolved === "both")
|
|
30
|
+
return resolved;
|
|
31
|
+
throw new TypeError(`invalid tunnel transport: ${resolved} (expected portr, frp, or both)`);
|
|
32
|
+
}
|
|
22
33
|
/** Resolve the public port portr should target: explicit, else the Apps contract. */
|
|
23
34
|
function resolvePublicPort(port) {
|
|
24
35
|
return port ?? object.toNumber(process.env.DATABRICKS_APP_PORT) ?? 8000;
|
|
@@ -26,9 +37,8 @@ function resolvePublicPort(port) {
|
|
|
26
37
|
/**
|
|
27
38
|
* Build the tunnel {@link Interceptor}. Pass it to `createApp({ interceptor })`.
|
|
28
39
|
*
|
|
29
|
-
* A no-op (logs and returns) when
|
|
30
|
-
*
|
|
31
|
-
* unconditionally and only actually tunnels where the deployment wired portr.
|
|
40
|
+
* A no-op (logs and returns) when none of the selected tunnel clients resolve
|
|
41
|
+
* usable configuration, so an app can register it unconditionally.
|
|
32
42
|
*
|
|
33
43
|
* @example
|
|
34
44
|
* import { appkit } from "@dbx-tools/appkit";
|
|
@@ -45,24 +55,52 @@ export function tunnelInterceptor(options = {}) {
|
|
|
45
55
|
process.env.DATABRICKS_HOST ??= ctx.env.databricksHost;
|
|
46
56
|
}
|
|
47
57
|
const port = resolvePublicPort(options.port);
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
const transport = resolveTunnelTransport(options.transport);
|
|
59
|
+
const children = [];
|
|
60
|
+
if (transport === "portr" || transport === "both") {
|
|
61
|
+
const portrConfig = resolvePortrConfig({
|
|
62
|
+
publicDomain: options.publicDomain,
|
|
63
|
+
subdomain: options.subdomain,
|
|
64
|
+
port,
|
|
65
|
+
});
|
|
66
|
+
if (portrConfig) {
|
|
67
|
+
const portrEnv = await installPortr();
|
|
68
|
+
await writePortrConfig(portrConfig, portrEnv);
|
|
69
|
+
children.push(await startPortr(portrConfig, portrEnv));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
logger.info("portr not configured (requires PORTR_TOKEN and TUNNEL_PUBLIC_DOMAIN)");
|
|
73
|
+
}
|
|
56
74
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
if (transport === "frp" || transport === "both") {
|
|
76
|
+
const frpConfig = resolveFrpConfig({
|
|
77
|
+
publicDomain: options.frpPublicDomain,
|
|
78
|
+
server: options.frpServer,
|
|
79
|
+
serverPort: options.frpServerPort,
|
|
80
|
+
protocol: options.frpProtocol,
|
|
81
|
+
token: options.frpToken,
|
|
82
|
+
proxyName: options.frpProxyName,
|
|
83
|
+
port,
|
|
84
|
+
});
|
|
85
|
+
if (frpConfig) {
|
|
86
|
+
const frpEnv = await installFrp();
|
|
87
|
+
const configPath = await writeFrpConfig(frpConfig, frpEnv);
|
|
88
|
+
children.push(startFrp(frpConfig, frpEnv, configPath));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
logger.info("frp not configured (requires TUNNEL_PUBLIC_DOMAIN)");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!children.length)
|
|
95
|
+
return;
|
|
96
|
+
for (const child of children)
|
|
97
|
+
ctx.bindProcess(child);
|
|
61
98
|
ctx.onLifecycle("shutdown", () => {
|
|
62
|
-
|
|
63
|
-
|
|
99
|
+
for (const child of children)
|
|
100
|
+
if (!child.killed)
|
|
101
|
+
child.kill("SIGTERM");
|
|
64
102
|
});
|
|
65
|
-
logger.info(`tunnel bound:
|
|
103
|
+
logger.info(`tunnel bound: ${transport} -> :${port}`);
|
|
66
104
|
};
|
|
67
105
|
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBR0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFnQmhELHFGQUFxRjtBQUNyRixTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBb0MsRUFBRTtJQUN0RSxPQUFPLEtBQUssRUFBRSxHQUF1QixFQUFpQixFQUFFO1FBQ3RELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO1lBQ3JDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsSUFBSTtTQUNMLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDMUYsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0RCxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZCLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLElBQUksS0FBSyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xHLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGB0dW5uZWxJbnRlcmNlcHRvcigpYCAtIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3J9IHRoYXQgZnJvbnRzIGFuIGFwcCB3aXRoIGEgcHVibGljXG4gKiBwb3J0ciB0dW5uZWwsIGNvbnN1bWluZyB0aGUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gYEBkYngtdG9vbHMvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCBoYW5kcyBpdC5cbiAqXG4gKiBUaGUgdHVubmVsIHJ1bnMgSU4tUFJPQ0VTUzogdGhlIEFQUCBpcyB0aGUgbWFpbiBwcm9jZXNzIGFuZCBoYW5kcyB0aGlzIGludGVyY2VwdG9yXG4gKiBpdHMgY29udGV4dCwgcmF0aGVyIHRoYW4gYSB3cmFwcGVyIHByb2Nlc3Mgc3Bhd25pbmcgdGhlIGFwcCBhcyBhIGNoaWxkLiBUaGVcbiAqIGludGVyY2VwdG9yIGFwcGxpZXMgdGhlIGNvbXB1dGVkIHdvcmtzcGFjZSBob3N0LCBpbnN0YWxscyBhbmQgbGF1bmNoZXMgcG9ydHIgb24gdGhlXG4gKiBhcHAncyBwdWJsaWMgcG9ydCwgYmluZHMgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGhlIGFwcCwgYW5kIHN0b3BzIHBvcnRyIGR1cmluZyBhblxuICogb3JkZXJseSBBcHBLaXQgc2h1dGRvd24uXG4gKlxuICogVGhlIHBhc3N3b3JkbGVzcyBHQVRFIGlzIGEgc2VwYXJhdGUgY29uY2VybjogaXQgaXMgdGhlIGBhdXRoR2F0ZWAgQXBwS2l0IHBsdWdpbixcbiAqIHdoaWNoIHJlZ2lzdGVycyB0aGUgbG9naW4gcm91dGVzICsgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3Mgb3duIHNlcnZlci5cbiAqIFJlZ2lzdGVyIGl0IGluIHRoZSBhcHAncyBgcGx1Z2luc2AgZm9yIGdhdGVkIHRyYWZmaWMuIFRoaXMgaW50ZXJjZXB0b3IgaXMgb25seVxuICogdGhlIHBvcnRyIGhhbGYgLSBcInVwZGF0ZSB0aGUgaG9zdCwgYmluZCBwb3J0clwiIC0gdGhlIHNtYWxsZXN0IHVzZWZ1bCB1bml0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdG9yLCBJbnRlcmNlcHRvckNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdGFydFBvcnRyLCB3cml0ZVBvcnRyQ29uZmlnIH0gZnJvbSBcIi4vcG9ydHIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDppbnRlcmNlcHRvclwiKTtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB0dW5uZWxJbnRlcmNlcHRvcn0gKGVhY2ggYWxzbyByZXNvbHZhYmxlIGZyb20gZW52KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqIHBvcnRyIGA8c3ViZG9tYWluPi48c2VydmVyPmAgdG8gc2VydmUgb24uIEVudiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBwb3J0ciBzdWJkb21haW4gKGVsc2UgZGVyaXZlZCBmcm9tIHtAbGluayBwdWJsaWNEb21haW59KS4gKi9cbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFBVQkxJQyBwb3J0IHBvcnRyIGZvcndhcmRzIHRvIC0gdGhlIHBvcnQgdGhlIGFwcCBpdHNlbGYgbGlzdGVucyBvbi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0IGBEQVRBQlJJQ0tTX0FQUF9QT1JUYFxuICAgKiAodGhlbiBgODAwMGApLCB3aGljaCBpcyB0aGUgcG9ydCB0aGUgcGxhdGZvcm0gcm91dGVzIHRvLlxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHB1YmxpYyBwb3J0IHBvcnRyIHNob3VsZCB0YXJnZXQ6IGV4cGxpY2l0LCBlbHNlIHRoZSBBcHBzIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVB1YmxpY1BvcnQocG9ydD86IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBwb3J0ID8/IG9iamVjdC50b051bWJlcihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9QT1JUKSA/PyA4MDAwO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB0dW5uZWwge0BsaW5rIEludGVyY2VwdG9yfS4gUGFzcyBpdCB0byBgY3JlYXRlQXBwKHsgaW50ZXJjZXB0b3IgfSlgLlxuICpcbiAqIEEgbm8tb3AgKGxvZ3MgYW5kIHJldHVybnMpIHdoZW4gbm8gcG9ydHIgdHVubmVsIGlzIGNvbmZpZ3VyZWQgLSBubyBgUE9SVFJfVE9LRU5gXG4gKiBvciBubyByZXNvbHZhYmxlIGA8c3ViZG9tYWluPi48c2VydmVyPmAgLSBzbyBhbiBhcHAgY2FuIHJlZ2lzdGVyIGl0XG4gKiB1bmNvbmRpdGlvbmFsbHkgYW5kIG9ubHkgYWN0dWFsbHkgdHVubmVscyB3aGVyZSB0aGUgZGVwbG95bWVudCB3aXJlZCBwb3J0ci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyB0dW5uZWxJbnRlcmNlcHRvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuICpcbiAqIGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbc2VydmVyKHsgaG9zdCwgc3RhdGljUGF0aCB9KV0sXG4gKiAgIGludGVyY2VwdG9yOiB0dW5uZWxJbnRlcmNlcHRvcigpLFxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dW5uZWxJbnRlcmNlcHRvcihvcHRpb25zOiBUdW5uZWxJbnRlcmNlcHRvck9wdGlvbnMgPSB7fSk6IEludGVyY2VwdG9yIHtcbiAgcmV0dXJuIGFzeW5jIChjdHg6IEludGVyY2VwdG9yQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChjdHguZW52LmRhdGFicmlja3NIb3N0KSB7XG4gICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QgPz89IGN0eC5lbnYuZGF0YWJyaWNrc0hvc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHJlc29sdmVQdWJsaWNQb3J0KG9wdGlvbnMucG9ydCk7XG4gICAgY29uc3QgcG9ydHJDb25maWcgPSByZXNvbHZlUG9ydHJDb25maWcoe1xuICAgICAgcHVibGljRG9tYWluOiBvcHRpb25zLnB1YmxpY0RvbWFpbixcbiAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICBwb3J0LFxuICAgIH0pO1xuICAgIGlmICghcG9ydHJDb25maWcpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwibm8gUE9SVFJfVE9LRU4vVFVOTkVMX1BVQkxJQ19ET01BSU4gLSB0aGUgYXBwIHJ1bnMgd2l0aG91dCBhIHB1YmxpYyB0dW5uZWxcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydHJFbnYgPSBhd2FpdCBpbnN0YWxsUG9ydHIoKTtcbiAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgY29uc3QgcG9ydHIgPSBhd2FpdCBzdGFydFBvcnRyKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgY3R4LmJpbmRQcm9jZXNzKHBvcnRyKTtcblxuICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHtcbiAgICAgIGlmICghcG9ydHIua2lsbGVkKSBwb3J0ci5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGB0dW5uZWwgYm91bmQ6IHBvcnRyIC0+IDoke3BvcnR9ICgke3BvcnRyQ29uZmlnLnN1YmRvbWFpbn0uJHtwb3J0ckNvbmZpZy5zZXJ2ZXJ9KWApO1xuICB9O1xufVxuIl19
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBaUNoRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFNBQWtCO0lBQ3ZELE1BQU0sUUFBUSxHQUNaLFNBQVM7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQjtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQjtRQUM1QixPQUFPLENBQUM7SUFDVixJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxRQUFRLEtBQUssTUFBTTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3ZGLE1BQU0sSUFBSSxTQUFTLENBQUMsNkJBQTZCLFFBQVEsaUNBQWlDLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLFNBQVMsaUJBQWlCLENBQUMsSUFBYTtJQUN0QyxPQUFPLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDMUUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFVBQW9D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dGVyY2VwdG9yfSB0aGF0IGZyb250cyBhbiBhcHAgd2l0aCBhIHB1YmxpY1xuICogcG9ydHIgYW5kL29yIGZycCB0dW5uZWwsIGNvbnN1bWluZyB0aGUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gYEBkYngtdG9vbHMvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCBoYW5kcyBpdC5cbiAqXG4gKiBUaGUgdHVubmVsIHJ1bnMgSU4tUFJPQ0VTUzogdGhlIEFQUCBpcyB0aGUgbWFpbiBwcm9jZXNzIGFuZCBoYW5kcyB0aGlzIGludGVyY2VwdG9yXG4gKiBpdHMgY29udGV4dCwgcmF0aGVyIHRoYW4gYSB3cmFwcGVyIHByb2Nlc3Mgc3Bhd25pbmcgdGhlIGFwcCBhcyBhIGNoaWxkLiBUaGVcbiAqIGludGVyY2VwdG9yIGFwcGxpZXMgdGhlIGNvbXB1dGVkIHdvcmtzcGFjZSBob3N0LCBpbnN0YWxscyBhbmQgbGF1bmNoZXMgcG9ydHIgb24gdGhlXG4gKiBhcHAncyBwdWJsaWMgcG9ydCwgYmluZHMgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGhlIGFwcCwgYW5kIHN0b3BzIHBvcnRyIGR1cmluZyBhblxuICogb3JkZXJseSBBcHBLaXQgc2h1dGRvd24uXG4gKlxuICogVGhlIHBhc3N3b3JkbGVzcyBHQVRFIGlzIGEgc2VwYXJhdGUgY29uY2VybjogaXQgaXMgdGhlIGBhdXRoR2F0ZWAgQXBwS2l0IHBsdWdpbixcbiAqIHdoaWNoIHJlZ2lzdGVycyB0aGUgbG9naW4gcm91dGVzICsgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3Mgb3duIHNlcnZlci5cbiAqIFJlZ2lzdGVyIGl0IGluIHRoZSBhcHAncyBgcGx1Z2luc2AgZm9yIGdhdGVkIHRyYWZmaWMuIFRoaXMgaW50ZXJjZXB0b3IgaXMgb25seVxuICogdGhlIHBvcnRyIGhhbGYgLSBcInVwZGF0ZSB0aGUgaG9zdCwgYmluZCBwb3J0clwiIC0gdGhlIHNtYWxsZXN0IHVzZWZ1bCB1bml0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaW5zdGFsbEZycCwgcmVzb2x2ZUZycENvbmZpZywgc3RhcnRGcnAsIHdyaXRlRnJwQ29uZmlnIH0gZnJvbSBcIi4vZnJwLnRzXCI7XG5pbXBvcnQgeyBpbnN0YWxsUG9ydHIsIHJlc29sdmVQb3J0ckNvbmZpZywgc3RhcnRQb3J0ciwgd3JpdGVQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3BvcnRyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6aW50ZXJjZXB0b3JcIik7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgdHVubmVsSW50ZXJjZXB0b3J9IChlYWNoIGFsc28gcmVzb2x2YWJsZSBmcm9tIGVudikuICovXG5leHBvcnQgaW50ZXJmYWNlIFR1bm5lbEludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKiBUdW5uZWwgY2xpZW50cyB0byBydW4uIEVudiBgREJYX1RPT0xTX1RVTk5FTF9UUkFOU1BPUlRgOyBkZWZhdWx0cyB0byBgcG9ydHJgLiAqL1xuICB0cmFuc3BvcnQ/OiBUdW5uZWxUcmFuc3BvcnQ7XG4gIC8qKiBQdWJsaWMgaG9zdCB0byBzZXJ2ZSBvbi4gRW52IGBUVU5ORUxfUFVCTElDX0RPTUFJTmAuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIHBvcnRyIHN1YmRvbWFpbiAoZWxzZSBkZXJpdmVkIGZyb20ge0BsaW5rIHB1YmxpY0RvbWFpbn0pLiAqL1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgUFVCTElDIHBvcnQgcG9ydHIgZm9yd2FyZHMgdG8gLSB0aGUgcG9ydCB0aGUgYXBwIGl0c2VsZiBsaXN0ZW5zIG9uLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgRGF0YWJyaWNrcyBBcHBzIHJ1bnRpbWUgY29udHJhY3QgYERBVEFCUklDS1NfQVBQX1BPUlRgXG4gICAqICh0aGVuIGA4MDAwYCksIHdoaWNoIGlzIHRoZSBwb3J0IHRoZSBwbGF0Zm9ybSByb3V0ZXMgdG8uXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogZnJwcyBjb250cm9sIGhvc3Q7IGRlZmF1bHRzIHRvIHRoZSBGUlAgcHVibGljIGRvbWFpbi4gRW52IGBGUlBfU0VSVkVSYC4gKi9cbiAgZnJwU2VydmVyPzogc3RyaW5nO1xuICAvKiogRlJQIHB1YmxpYyBIVFRQIGhvc3QuIEVudiBgVFVOTkVMX0ZSUF9QVUJMSUNfRE9NQUlOYC4gKi9cbiAgZnJwUHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogZnJwcyBjb250cm9sIHBvcnQuIEVudiBgRlJQX1NFUlZFUl9QT1JUYDsgZGVmYXVsdHMgdG8gYDQ0M2AuICovXG4gIGZycFNlcnZlclBvcnQ/OiBudW1iZXI7XG4gIC8qKiBmcnBjIHRyYW5zcG9ydCBwcm90b2NvbC4gRW52IGBGUlBfUFJPVE9DT0xgOyBkZWZhdWx0cyB0byBgd3NzYC4gKi9cbiAgZnJwUHJvdG9jb2w/OiBzdHJpbmc7XG4gIC8qKiBmcnBzIGF1dGggdG9rZW4uIEVudiBgRlJQX1RPS0VOYCAob3IgYFRVTk5FTF9UT0tFTmApLiAqL1xuICBmcnBUb2tlbj86IHN0cmluZztcbiAgLyoqIGZycCBwcm94eSByZWdpc3RyYXRpb24gbmFtZS4gRW52IGBGUlBfUFJPWFlfTkFNRWAuICovXG4gIGZycFByb3h5TmFtZT86IHN0cmluZztcbn1cblxuLyoqIFB1YmxpYyB0dW5uZWwgY2xpZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludGVyY2VwdG9yIGFuZCBDTEkuICovXG5leHBvcnQgdHlwZSBUdW5uZWxUcmFuc3BvcnQgPSBcInBvcnRyXCIgfCBcImZycFwiIHwgXCJib3RoXCI7XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSB0aGUgdHVubmVsIHRyYW5zcG9ydCBzZWxlY3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsVHJhbnNwb3J0KHRyYW5zcG9ydD86IHN0cmluZyk6IFR1bm5lbFRyYW5zcG9ydCB7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0cmFuc3BvcnQgPz9cbiAgICBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/P1xuICAgIHByb2Nlc3MuZW52LlRVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBcInBvcnRyXCI7XG4gIGlmIChyZXNvbHZlZCA9PT0gXCJwb3J0clwiIHx8IHJlc29sdmVkID09PSBcImZycFwiIHx8IHJlc29sdmVkID09PSBcImJvdGhcIikgcmV0dXJuIHJlc29sdmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIHR1bm5lbCB0cmFuc3BvcnQ6ICR7cmVzb2x2ZWR9IChleHBlY3RlZCBwb3J0ciwgZnJwLCBvciBib3RoKWApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcHVibGljIHBvcnQgcG9ydHIgc2hvdWxkIHRhcmdldDogZXhwbGljaXQsIGVsc2UgdGhlIEFwcHMgY29udHJhY3QuICovXG5mdW5jdGlvbiByZXNvbHZlUHVibGljUG9ydChwb3J0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBvcnQgPz8gb2JqZWN0LnRvTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQpID8/IDgwMDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHR1bm5lbCB7QGxpbmsgSW50ZXJjZXB0b3J9LiBQYXNzIGl0IHRvIGBjcmVhdGVBcHAoeyBpbnRlcmNlcHRvciB9KWAuXG4gKlxuICogQSBuby1vcCAobG9ncyBhbmQgcmV0dXJucykgd2hlbiBub25lIG9mIHRoZSBzZWxlY3RlZCB0dW5uZWwgY2xpZW50cyByZXNvbHZlXG4gKiB1c2FibGUgY29uZmlndXJhdGlvbiwgc28gYW4gYXBwIGNhbiByZWdpc3RlciBpdCB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgdHVubmVsSW50ZXJjZXB0b3IgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcih7IGhvc3QsIHN0YXRpY1BhdGggfSldLFxuICogICBpbnRlcmNlcHRvcjogdHVubmVsSW50ZXJjZXB0b3IoKSxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVubmVsSW50ZXJjZXB0b3Iob3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30pOiBJbnRlcmNlcHRvciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCkge1xuICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8/PSBjdHguZW52LmRhdGFicmlja3NIb3N0O1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSByZXNvbHZlUHVibGljUG9ydChvcHRpb25zLnBvcnQpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHJlc29sdmVUdW5uZWxUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpO1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFtdO1xuICAgIGlmICh0cmFuc3BvcnQgPT09IFwicG9ydHJcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gICAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwb3J0ckNvbmZpZykge1xuICAgICAgICBjb25zdCBwb3J0ckVudiA9IGF3YWl0IGluc3RhbGxQb3J0cigpO1xuICAgICAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgc3RhcnRQb3J0cihwb3J0ckNvbmZpZywgcG9ydHJFbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicG9ydHIgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFBPUlRSX1RPS0VOIGFuZCBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc3BvcnQgPT09IFwiZnJwXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgZnJwQ29uZmlnID0gcmVzb2x2ZUZycENvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5mcnBQdWJsaWNEb21haW4sXG4gICAgICAgIHNlcnZlcjogb3B0aW9ucy5mcnBTZXJ2ZXIsXG4gICAgICAgIHNlcnZlclBvcnQ6IG9wdGlvbnMuZnJwU2VydmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IG9wdGlvbnMuZnJwUHJvdG9jb2wsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLmZycFRva2VuLFxuICAgICAgICBwcm94eU5hbWU6IG9wdGlvbnMuZnJwUHJveHlOYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGZycEVudiA9IGF3YWl0IGluc3RhbGxGcnAoKTtcbiAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGF3YWl0IHdyaXRlRnJwQ29uZmlnKGZycENvbmZpZywgZnJwRW52KTtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChzdGFydEZycChmcnBDb25maWcsIGZycEVudiwgY29uZmlnUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJmcnAgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSBjdHguYmluZFByb2Nlc3MoY2hpbGQpO1xuICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgdHVubmVsIGJvdW5kOiAke3RyYW5zcG9ydH0gLT4gOiR7cG9ydH1gKTtcbiAgfTtcbn1cbiJdfQ==
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -105,6 +105,8 @@ export interface AuthGateConfig extends BasePluginConfig, AuthStorageConfig {
|
|
|
105
105
|
* traffic).
|
|
106
106
|
*/
|
|
107
107
|
publicDomain?: string;
|
|
108
|
+
/** Additional public tunnel domains accepted by the gate. */
|
|
109
|
+
publicDomains?: string | string[];
|
|
108
110
|
/**
|
|
109
111
|
* Extra `x-` request headers tunnel traffic may forward (literal / glob /
|
|
110
112
|
* `/regex/`), unioned with the built-in allow-list. Env `TUNNEL_FORWARD_HEADERS`.
|
|
@@ -150,8 +152,10 @@ export interface ResolvedAuthGateConfig {
|
|
|
150
152
|
sessionCutoffMs: number;
|
|
151
153
|
/** Same-origin path returned after logout. */
|
|
152
154
|
logoutRedirectPath: string;
|
|
153
|
-
/**
|
|
155
|
+
/** Primary public domain; `undefined` when Portr is not configured. */
|
|
154
156
|
publicDomain?: string;
|
|
157
|
+
/** All public tunnel domains accepted by the gate. */
|
|
158
|
+
publicDomains: string[];
|
|
155
159
|
/** Extra `x-` headers tunnel traffic may forward (unioned with the defaults). */
|
|
156
160
|
forwardHeaders: string[];
|
|
157
161
|
/** Path prefixes to gate beyond `/api/` (e.g. `/ws`). */
|
package/lib/src/plugin.js
CHANGED
|
@@ -65,6 +65,8 @@ export function resolveAuthGateConfig(config) {
|
|
|
65
65
|
coreConfig.text("AUTH_STORAGE", TUNNEL_CONFIG),
|
|
66
66
|
sqlitePath: config.sqlitePath ?? coreConfig.text("AUTH_SQLITE_PATH", TUNNEL_CONFIG),
|
|
67
67
|
});
|
|
68
|
+
const publicDomain = coreConfig.string(config.publicDomain, "PUBLIC_DOMAIN", TUNNEL_CONFIG);
|
|
69
|
+
const frpPublicDomain = coreConfig.text("FRP_PUBLIC_DOMAIN", TUNNEL_CONFIG);
|
|
68
70
|
return {
|
|
69
71
|
// Both sources are unioned rather than one overriding: a deployment-wide
|
|
70
72
|
// TUNNEL_AUTH_ALLOW and a per-invocation `--allow` should both grant access.
|
|
@@ -83,7 +85,14 @@ export function resolveAuthGateConfig(config) {
|
|
|
83
85
|
sessionCutoffMs: resolveSessionCutoff(config.sessionCutoff),
|
|
84
86
|
logoutRedirectPath: passwordlessAuth.normalizeLogoutRedirectPath(coreConfig.string(config.logoutRedirectPath, "AUTH_LOGOUT_REDIRECT", TUNNEL_CONFIG) ??
|
|
85
87
|
DEFAULTS.logoutRedirectPath),
|
|
86
|
-
publicDomain
|
|
88
|
+
publicDomain,
|
|
89
|
+
publicDomains: [
|
|
90
|
+
...new Set([
|
|
91
|
+
publicDomain,
|
|
92
|
+
frpPublicDomain,
|
|
93
|
+
...string.parseList(config.publicDomains),
|
|
94
|
+
].filter((value) => !!value)),
|
|
95
|
+
],
|
|
87
96
|
forwardHeaders: [
|
|
88
97
|
...string.parseList(config.forwardHeaders),
|
|
89
98
|
...string.parseList(coreConfig.text("FORWARD_HEADERS", TUNNEL_CONFIG)),
|
|
@@ -187,7 +196,7 @@ export class AuthGatePlugin extends Plugin {
|
|
|
187
196
|
logger.info("ready", {
|
|
188
197
|
patterns: this.resolved.allow.length,
|
|
189
198
|
sessionTtlSeconds: this.resolved.sessionTtlSeconds,
|
|
190
|
-
|
|
199
|
+
publicDomains: this.resolved.publicDomains,
|
|
191
200
|
insecure: this.resolved.insecure,
|
|
192
201
|
storage: this.resolved.storage,
|
|
193
202
|
logoutRedirectPath: this.resolved.logoutRedirectPath,
|
|
@@ -214,7 +223,7 @@ export class AuthGatePlugin extends Plugin {
|
|
|
214
223
|
}
|
|
215
224
|
mountGateOnContext(context, {
|
|
216
225
|
gate: this.exports(),
|
|
217
|
-
publicDomain: this.resolved.
|
|
226
|
+
publicDomain: this.resolved.publicDomains,
|
|
218
227
|
forwardHeaders: this.resolved.forwardHeaders,
|
|
219
228
|
gatePaths: this.resolved.gatePaths,
|
|
220
229
|
});
|
|
@@ -252,4 +261,4 @@ function authOrigin(publicDomain) {
|
|
|
252
261
|
}
|
|
253
262
|
/** Factory: `authGate({ allow, subject, ... })` for an AppKit `plugins` array. */
|
|
254
263
|
export const authGate = toPlugin(AuthGatePlugin);
|
|
255
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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LEtBQUs7UUFBRSxPQUFPLGtCQUFrQixDQUFDO0lBQ3RDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBhdXRoR2F0ZSgpYCAtIHRoZSBBcHBLaXQgYWRhcHRlciBhcm91bmQgYEBkYngtdG9vbHMvYXV0aGAuXG4gKlxuICogSXQgaGFzIE5PIHJvdXRlcyBvZiBpdHMgb3duOiB0aGUgdHVubmVsIFBST1hZIChub3QgYW4gSFRUUCBzZXJ2ZXIpIGNhbGxzIHRoZVxuICogaGFuZGxlcnMgdGhpcyBwbHVnaW4gZXhwb3NlcyB2aWEge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9LiBUaGUgcGx1Z2luXG4gKiBvd25zIHR1bm5lbCBhdXRob3JpemF0aW9uLCBBcHBLaXQgTGFrZWJhc2UgZGlzY292ZXJ5LCBlbWFpbCBkZWxpdmVyeSwgYW5kXG4gKiB0cmFuc3BvcnQgbW91bnRpbmcuIEJldHRlciBBdXRoIG93bnMgdXNlcnMsIE9UUHMsIHNlc3Npb25zLCByYXRlIGxpbWl0cywgYW5kXG4gKiBwYXNza2V5cy4gYGNyZWF0ZUFwcGAgY2FuIHJ1biB0aGlzIHBsdWdpbiB3aXRoIG9yIHdpdGhvdXQgYHNlcnZlcigpYC5cbiAqXG4gKiBPcHRpb25zIGNvbWUgZnJvbSBDTEkgZmxhZ3MgT1IgZW52LCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzIC0gc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZUF1dGhHYXRlQ29uZmlnfS4gVGhlIG9uZSBydW50aW1lIGRlcGVuZGVuY3kgdGhlIHBsdWdpbiBjYW4ndFxuICogcmVzb2x2ZSBpdHNlbGYgaXMgSE9XIHRvIGVtYWlsIHRoZSBjb2RlLCBzbyBpdCB0YWtlcyBhIGBzZW5kQ29kZWAgY2FsbGJhY2sgdGhlXG4gKiBhcHAgd2lyZXMgdG8gdGhlIGVtYWlsIHBsdWdpbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxuICBSZXNvdXJjZVR5cGUsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBsdWdpbiBhcyBhcHBraXRQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGF1dGggYXMgcGFzc3dvcmRsZXNzQXV0aCxcbiAgc3RvcmFnZSBhcyBhdXRoU3RvcmFnZSxcbiAgdHlwZSBBdXRob3JpemVJZGVudGl0eSxcbiAgdHlwZSBBdXRoU3RvcmFnZUNvbmZpZyxcbiAgdHlwZSBBdXRoU3RvcmFnZU1vZGUsXG4gIHR5cGUgUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmltcG9ydCB7IGNvbmZpZyBhcyBjb3JlQ29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBdXRoU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGhcIjtcbmltcG9ydCB7IGJyYW5kLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBsb29rc0xpa2VFbWFpbCwgbWF0Y2hlc0FsbG93bGlzdCB9IGZyb20gXCIuL2FsbG93bGlzdC50c1wiO1xuaW1wb3J0IHsgbW91bnRHYXRlLCB0eXBlIEdhdGVPcHRpb25zIH0gZnJvbSBcIi4vZ2F0ZS50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRW1haWxBdmFpbGFibGUsIHNlbmRDb2RlIGFzIGRlZmF1bHRTZW5kQ29kZSB9IGZyb20gXCIuL3NlbmQtY29kZS50c1wiO1xuaW1wb3J0IHsgS0VZX1RUTF9TRUNPTkRTLCByZXNvbHZlU2Vzc2lvbkN1dG9mZiwgc2lnbmluZ0tleSB9IGZyb20gXCIuL3NpZ25pbmcta2V5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6YXV0aFwiKTtcblxuaW50ZXJmYWNlIEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbiB7XG4gIGdldChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbiAgcG9zdChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbiAgdXNlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgR2F0ZU1vdW50Q29udGV4dCB7XG4gIGFkZFJvdXRlKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdm9pZDtcbiAgYWRkTWlkZGxld2FyZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdm9pZDtcbiAgZ2V0UGx1Z2lucygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5mdW5jdGlvbiBzZXJ2ZXJBcHBsaWNhdGlvbihjb250ZXh0OiBHYXRlTW91bnRDb250ZXh0KTogR2F0ZVNlcnZlckFwcGxpY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VydmVyID0gY29udGV4dC5nZXRQbHVnaW5zKCkuZ2V0KFwic2VydmVyXCIpIGFzXG4gICAgeyBzZXJ2ZXJBcHBsaWNhdGlvbj86IFBhcnRpYWw8R2F0ZVNlcnZlckFwcGxpY2F0aW9uPiB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBhcHBsaWNhdGlvbiA9IHNlcnZlcj8uc2VydmVyQXBwbGljYXRpb247XG4gIHJldHVybiBhcHBsaWNhdGlvbiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi5wb3N0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24udXNlID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IChhcHBsaWNhdGlvbiBhcyBHYXRlU2VydmVyQXBwbGljYXRpb24pXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudEdhdGVPbkNvbnRleHQoY29udGV4dDogR2F0ZU1vdW50Q29udGV4dCwgb3B0aW9uczogR2F0ZU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgYXBwbGljYXRpb24gPSBzZXJ2ZXJBcHBsaWNhdGlvbihjb250ZXh0KTtcbiAgaWYgKGFwcGxpY2F0aW9uKSB7XG4gICAgbW91bnRHYXRlKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIChtZXRob2QsIHBhdGgsIGhhbmRsZXIpID0+IGFwcGxpY2F0aW9uW21ldGhvZF0ocGF0aCwgaGFuZGxlciksXG4gICAgICAocGF0aCwgaGFuZGxlcikgPT4gYXBwbGljYXRpb24udXNlKHBhdGgsIGhhbmRsZXIpLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vdW50R2F0ZShcbiAgICBvcHRpb25zLFxuICAgIChtZXRob2QsIHBhdGgsIGhhbmRsZXIpID0+IGNvbnRleHQuYWRkUm91dGUobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSxcbiAgICAocGF0aCwgaGFuZGxlcikgPT4gY29udGV4dC5hZGRNaWRkbGV3YXJlKHBhdGgsIGhhbmRsZXIpLFxuICApO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBhdXRoR2F0ZX0gcGx1Z2luIChhbGwgcmVzb2x2YWJsZSBmcm9tIGVudiAtIHNlZSBiZWxvdykuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHYXRlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZywgQXV0aFN0b3JhZ2VDb25maWcge1xuICAvKiogQWxsb3ctbGlzdCBwYXR0ZXJucyAoZG9tYWluIC8gZ2xvYiAvIGAvcmVnZXgvYCkuIEVtcHR5ID0gYWxsb3cgbm9ib2R5LiBFbnYgVFVOTkVMX0FVVEhfQUxMT1cuICovXG4gIGFsbG93Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBTdWJqZWN0IGxpbmUgZm9yIHRoZSBjb2RlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfU1VCSkVDVC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIuIFRoZSB3b3JkaW5nIG9mIHRoZSBzdWJqZWN0IGFuZFxuICAgKiB7QGxpbmsgbWVzc2FnZX0gaXMgZGVsaWJlcmF0ZWx5IHRoZSBjb252ZW50aW9uYWwgcGhyYXNpbmcgcmF0aGVyIHRoYW5cbiAgICogYW55dGhpbmcgYnJhbmRlZDogaU9TLCBHbWFpbCwgT3V0bG9vaywgYW5kIEFuZHJvaWQgYWxsIGRldGVjdCBhIG9uZS10aW1lXG4gICAqIGNvZGUgZnJvbSB0aGlzIHNoYXBlIGFuZCBvZmZlciB0byBhdXRvZmlsbCBpdCwgYW5kIGEgbm92ZWwgcGhyYXNpbmcgaXMgd2hhdFxuICAgKiBicmVha3MgdGhhdCBkZXRlY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHN1YmplY3QgVEVNUExBVEUsIG5vdCB0aGUgbGl0ZXJhbCBsaW5lIHNlbnQ6IHRoZSBjb2RlIGlzIHNwbGljZWRcbiAgICogaW50byBpdCAoYFwiMTIzNDU2IGlzIHlvdXIgdmVyaWZpY2F0aW9uIGNvZGVcImApIGJlY2F1c2UgYSBwdXNoIG5vdGlmaWNhdGlvblxuICAgKiBzaG93cyBvbmx5IHRoZSBzdWJqZWN0IGFuZCBwcmVoZWFkZXIsIGFuZCB0aGF0IG5vdGlmaWNhdGlvbiBpcyB3aGF0IG1vYmlsZVxuICAgKiBhdXRvZmlsbCByZWFkcy4gU2VlIGBjb2RlRW1haWxTdWJqZWN0YCBpbiBgLi9jb2RlLWVtYWlsLnRzYC5cbiAgICovXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgdXNlZCBpbiB0aGUgY29kZSBlbWFpbCBjb3B5LiBFbnYgVFVOTkVMX0FVVEhfQlJBTkRfTkFNRS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGJyYW5kIGNvbnRleHQncyBgbmFtZWAgLSB0aGUgYXBwJ3Mgb3duIGBicmFuZGluZy9icmFuZC55YW1sYFxuICAgKiB3aGVuIGl0IGhhcyBvbmUsIGVsc2UgdGhlIGRieC10b29scyBkZWZhdWx0LiBTZXQgdGhpcyBvbmx5IHRvIG92ZXJyaWRlIHRoZVxuICAgKiBicmFuZCBmb3IgdGhpcyBnYXRlLlxuICAgKi9cbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogTGluZSBzaG93biBpbW1lZGlhdGVseSBhYm92ZSB0aGUgY29kZSBpbiB0aGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9NRVNTQUdFLlxuICAgKlxuICAgKiBLZWVwIHRoZSBjb2RlIG9uIGl0cyBPV04gbGluZSBkaXJlY3RseSBhZnRlciB0aGlzIHRleHQgLSB0aGF0IGFkamFjZW5jeSBpc1xuICAgKiB3aGF0IHRoZSBwbGF0Zm9ybSBjb2RlLWRldGVjdGlvbiBoZXVyaXN0aWNzIGtleSBvbi5cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXNzaW9uIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fVFRMLiBEZWZhdWx0IDI1OTIwMDAgKDMwZCkuXG4gICAqXG4gICAqIE1hdGNoZWQgdG8gdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSdzIG93biAzMC1kYXkgVFRMIChzZWVcbiAgICogYC4vc2lnbmluZy1rZXkudHNgKTogdGhlIGNvb2tpZSBhbmQgdGhlIGtleSB0aGF0IHZhbGlkYXRlcyBpdCBzaG91bGQgZXhwaXJlXG4gICAqIHRvZ2V0aGVyLCBvciBvbmUgc2lsZW50bHkgb3V0bGl2ZXMgdGhlIG90aGVyLlxuICAgKi9cbiAgc2Vzc2lvblR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBPbmUtdGltZS1jb2RlIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX0NPREVfVFRMLiBEZWZhdWx0IDYwMCAoMTBtKS4gKi9cbiAgY29kZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBNYXggdmVyaWZ5IGF0dGVtcHRzIHBlciBpc3N1ZWQgY29kZS4gRGVmYXVsdCA1LiAqL1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvcmNlLWNsZWFyIGN1dG9mZjogZXZlcnkgc2Vzc2lvbiBpc3N1ZWQgQkVGT1JFIGl0IHN0b3BzIHZlcmlmeWluZywgc28gbW92aW5nXG4gICAqIGl0IGZvcndhcmQgc2lnbnMgZXZlcnlvbmUgb3V0LiBFbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9DVVRPRkYuXG4gICAqXG4gICAqIEFueXRoaW5nIGBvYmplY3QudG9EYXRlYCBhY2NlcHRzOiBhIGBEYXRlYCwgYDIwMjYtMDgtMDJgLCBhbiBJU08gaW5zdGFudCxcbiAgICogZXBvY2ggc2Vjb25kcy9taWxsaXMsIG9yIGEgcmVsYXRpdmUgZHVyYXRpb24gKGAtMzBkYCwgYDcgZGF5cyBhZ29gKS4gVW5zZXRcbiAgICogbWVhbnMgbm8gY3V0b2ZmLlxuICAgKi9cbiAgc2Vzc2lvbkN1dG9mZj86IHN0cmluZyB8IG51bWJlciB8IERhdGU7XG4gIC8qKlxuICAgKiBTYW1lLW9yaWdpbiBwYXRoIHJldHVybmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsb2dvdXQuIEVudlxuICAgKiBgVFVOTkVMX0FVVEhfTE9HT1VUX1JFRElSRUNUYC4gRGVmYXVsdHMgdG8gYC9gLCB3aGVyZSB0aGUgQXV0aEdhdGUgcHJlc2VudHNcbiAgICogbG9naW4gYWdhaW4uXG4gICAqL1xuICBsb2dvdXRSZWRpcmVjdFBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWxpdmVyIGEgY29kZSB0byBhbiBhZGRyZXNzLiBEZWZhdWx0cyB0byBzZW5kaW5nIHRocm91Z2ggdGhlIGhvc3QgYXBwJ3NcbiAgICogc2hhcmVkIGBAZGJ4LXRvb2xzL2VtYWlsYCB0cmFuc3BvcnQgKHNlZSBgLi9zZW5kLWNvZGVgKTsgb3ZlcnJpZGUgdG8gd2lyZSBhXG4gICAqIGRpZmZlcmVudCBkZWxpdmVyeSBwYXRoLlxuICAgKi9cbiAgc2VuZENvZGU/OiAoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBvcHRzOiBTZW5kQ29kZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBJZGVudGl0eSBhdXRob3JpemF0aW9uIGluZGVwZW5kZW50IG9mIGF1dGhlbnRpY2F0aW9uLiBEZWZhdWx0cyB0byB0aGVcbiAgICogY29uZmlndXJlZCBhbGxvdy1saXN0IGFuZCBpcyByZS1ldmFsdWF0ZWQgZm9yIGV2ZXJ5IGFjY2VwdGVkIHNlc3Npb24uXG4gICAqL1xuICBhdXRob3JpemVJZGVudGl0eT86IEF1dGhvcml6ZUlkZW50aXR5O1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBgPHN1YmRvbWFpbj4uPHNlcnZlcj5gIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGl0cyBgSG9zdGBcbiAgICogaGVhZGVyLiBPbmx5IHJlcXVlc3RzIHdob3NlIGBIb3N0YCBtYXRjaGVzIHRoaXMgYXJlIGdhdGVkOyBldmVyeXRoaW5nIGVsc2VcbiAgICogKHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yLCBvdGhlciBsb2NhbCBjYWxsZXJzKSBwYXNzZXMgdGhyb3VnaC4gRW52XG4gICAqIGBUVU5ORUxfUFVCTElDX0RPTUFJTmAuIFdoZW4gYWJzZW50LCB0aGUgZ2F0ZSBpcyBpbmVydCAobm90aGluZyBpcyB0dW5uZWxcbiAgICogdHJhZmZpYykuXG4gICAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHRyYSBgeC1gIHJlcXVlc3QgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAobGl0ZXJhbCAvIGdsb2IgL1xuICAgKiBgL3JlZ2V4L2ApLCB1bmlvbmVkIHdpdGggdGhlIGJ1aWx0LWluIGFsbG93LWxpc3QuIEVudiBgVFVOTkVMX0ZPUldBUkRfSEVBREVSU2AuXG4gICAqL1xuICBmb3J3YXJkSGVhZGVycz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCB0aGUgYnVpbHQtaW4gYC9hcGkvYCAobGl0ZXJhbCBwcmVmaXhlcywgY29tbWEtXG4gICAqIG9yIHNwYWNlLXNlcGFyYXRlZCBhcyBhIHN0cmluZykuIEZvciBhbiBhcHAgd2hvc2UgcHJpdmlsZWdlZCBzdXJmYWNlIGlzIG5vdFxuICAgKiB1bmRlciBgL2FwaS9gIOKAlCBlLmcuIGEgV2ViU29ja2V0IGF0IGAvd3NgIOKAlCBsaXN0IHRob3NlIHByZWZpeGVzIHNvIHRoZXlcbiAgICogcmVxdWlyZSBhIHNlc3Npb24gdG9vLiBFbnYgYFRVTk5FTF9HQVRFX1BBVEhTYC5cbiAgICovXG4gIGdhdGVQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUnVuIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgYFRVTk5FTF9JTlNFQ1VSRT10cnVlYCkuIFRoZSBsb2dpbiByb3V0ZXMgYW5kIGdhdGVcbiAgICogbWlkZGxld2FyZSBhcmUgbm90IG1vdW50ZWQsIGFuZCB0aGUgU01UUCBmYWlsLWZhc3QgaXMgc2tpcHBlZC4gVXNlIG9ubHkgd2hlblxuICAgKiB0aGUgdHVubmVsIGlzIGRlbGliZXJhdGVseSBwdWJsaWMuXG4gICAqL1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG59XG5cbi8qKiBCcmFuZGluZy9tZXNzYWdpbmcgcGFzc2VkIHRvIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5zZW5kQ29kZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRDb2RlT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIExpZmV0aW1lIG9mIHRoZSBjb2RlIGJlaW5nIHNlbnQsIGluIHNlY29uZHMgLSB0aGUgUkVTT0xWRURcbiAgICoge0BsaW5rIEF1dGhHYXRlQ29uZmlnLmNvZGVUdGxTZWNvbmRzfSwgc28gdGhlIGVtYWlsIGNhbiBzdGF0ZSB0aGUgcmVhbFxuICAgKiBleHBpcnkgKFwiVGhpcyBjb2RlIGV4cGlyZXMgaW4gMTAgbWludXRlc1wiKSBpbnN0ZWFkIG9mIGEgdmFndWUgXCJzaG9ydGx5XCJcbiAgICogdGhhdCBkcmlmdHMgZnJvbSB0aGUgY29uZmlndXJlZCBUVEwuXG4gICAqL1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKiogUmVzb2x2ZWQgZ2F0ZSBjb25maWcgd2l0aCBlbnYgZmFsbGJhY2tzICsgZGVmYXVsdHMgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGFsbG93OiBzdHJpbmdbXTtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICAvKiogRm9yY2UtY2xlYXIgY3V0b2ZmIGluIGVwb2NoIG1zOyBgMGAgd2hlbiB1bnNldC4gKi9cbiAgc2Vzc2lvbkN1dG9mZk1zOiBudW1iZXI7XG4gIC8qKiBTYW1lLW9yaWdpbiBwYXRoIHJldHVybmVkIGFmdGVyIGxvZ291dC4gKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBQdWJsaWMgZG9tYWluIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGBIb3N0YDsgYHVuZGVmaW5lZGAgPSBpbmVydC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogRXh0cmEgYHgtYCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkICh1bmlvbmVkIHdpdGggdGhlIGRlZmF1bHRzKS4gKi9cbiAgZm9yd2FyZEhlYWRlcnM6IHN0cmluZ1tdO1xuICAvKiogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCBgL2FwaS9gIChlLmcuIGAvd3NgKS4gKi9cbiAgZ2F0ZVBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZS4gKi9cbiAgaW5zZWN1cmU6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBcIi9cIixcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBjb25zdCBzdG9yYWdlID0gYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKHtcbiAgICBzdG9yYWdlOlxuICAgICAgY29uZmlnLnN0b3JhZ2UgPz9cbiAgICAgIChjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NUT1JBR0VcIiwgVFVOTkVMX0NPTkZJRykgYXMgQXV0aFN0b3JhZ2VNb2RlIHwgdW5kZWZpbmVkKSxcbiAgICBzcWxpdGVQYXRoOiBjb25maWcuc3FsaXRlUGF0aCA/PyBjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NRTElURV9QQVRIXCIsIFRVTk5FTF9DT05GSUcpLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICAvLyBCb3RoIHNvdXJjZXMgYXJlIHVuaW9uZWQgcmF0aGVyIHRoYW4gb25lIG92ZXJyaWRpbmc6IGEgZGVwbG95bWVudC13aWRlXG4gICAgLy8gVFVOTkVMX0FVVEhfQUxMT1cgYW5kIGEgcGVyLWludm9jYXRpb24gYC0tYWxsb3dgIHNob3VsZCBib3RoIGdyYW50IGFjY2Vzcy5cbiAgICAvLyBIZW5jZSBgcGFyc2VMaXN0YCBvbiBlYWNoIHJhdGhlciB0aGFuIGBjb25maWcubGlzdGAsIHdoaWNoIHN0b3BzIGF0IHRoZVxuICAgIC8vIGZpcnN0IHNvdXJjZSB0aGF0IHlpZWxkcyBhbnl0aGluZy5cbiAgICBhbGxvdzogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuYWxsb3cpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoW1wiQVVUSF9BTExPV1wiLCBcIkVNQUlMX0FVVEhfQUxMT1dcIl0sIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIHN1YmplY3Q6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5zdWJqZWN0LCBcIkFVVEhfU1VCSkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTpcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5icmFuZE5hbWUsIFwiQVVUSF9CUkFORF9OQU1FXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLmJyYW5kTmFtZSxcbiAgICBtZXNzYWdlOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcubWVzc2FnZSwgXCJBVVRIX01FU1NBR0VcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMubWVzc2FnZSxcbiAgICBzZXNzaW9uVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9TRVNTSU9OX1RUTFwiLFxuICAgICAgREVGQVVMVFMuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgY29kZVR0bFNlY29uZHM6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gICAgICBcIkFVVEhfQ09ERV9UVExcIixcbiAgICAgIERFRkFVTFRTLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICAgIG1heEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMgPz8gREVGQVVMVFMubWF4QXR0ZW1wdHMsXG4gICAgc2Vzc2lvbkN1dG9mZk1zOiByZXNvbHZlU2Vzc2lvbkN1dG9mZihjb25maWcuc2Vzc2lvbkN1dG9mZiksXG4gICAgbG9nb3V0UmVkaXJlY3RQYXRoOiBwYXNzd29yZGxlc3NBdXRoLm5vcm1hbGl6ZUxvZ291dFJlZGlyZWN0UGF0aChcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgsIFwiQVVUSF9MT0dPVVRfUkVESVJFQ1RcIiwgVFVOTkVMX0NPTkZJRykgPz9cbiAgICAgICAgREVGQVVMVFMubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICksXG4gICAgcHVibGljRG9tYWluOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcucHVibGljRG9tYWluLCBcIlBVQkxJQ19ET01BSU5cIiwgVFVOTkVMX0NPTkZJRyksXG4gICAgZm9yd2FyZEhlYWRlcnM6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmZvcndhcmRIZWFkZXJzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiRk9SV0FSRF9IRUFERVJTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGdhdGVQYXRoczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZ2F0ZVBhdGhzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiR0FURV9QQVRIU1wiLCBUVU5ORUxfQ09ORklHKSksXG4gICAgXSxcbiAgICBpbnNlY3VyZTogY29yZUNvbmZpZy5ib29sZWFuKGNvbmZpZy5pbnNlY3VyZSwgXCJJTlNFQ1VSRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBmYWxzZSxcbiAgICBzdG9yYWdlOiBzdG9yYWdlLm1vZGUsXG4gICAgc3FsaXRlUGF0aDogc3RvcmFnZS5zcWxpdGVQYXRoLFxuICB9O1xufVxuXG4vKiogVGhlIGhhbmRsZXJzIHRoZSBnYXRlIG1pZGRsZXdhcmUgY2FsbHMgaW4tcHJvY2VzcyAocmV0dXJuZWQgYnkge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVBcGkge1xuICAvKiogQmV0dGVyIEF1dGggYW5kIGNvbXBhdGliaWxpdHkgcm91dGVzIHVuZGVyIGAvYXBpL2VtYWlsL2F1dGgvKmAuICovXG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICAvKiogUmVzb2x2ZSB0aGUgYXV0aG9yaXplZCBlbWFpbCBmb3IgcmVxdWVzdCBoZWFkZXJzLCBvciB1bmRlZmluZWQuICovXG4gIHNlc3Npb24oaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkLiAqL1xuICBzdGF0dXMoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8QXV0aFN0YXR1cz47XG4gIC8qKiBXaGV0aGVyIHRoZSBydW50aW1lIGV4cG9zZXMgcGFzc2tleSBlbnJvbGxtZW50IGFuZCBhdXRoZW50aWNhdGlvbi4gKi9cbiAgcmVhZG9ubHkgcGFzc2tleXNFbmFibGVkOiBib29sZWFuO1xuICAvKiogQ2xvc2UgYXV0aCBzdG9yYWdlIG93bmVkIGJ5IHRoaXMgcnVudGltZS4gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIGFkYXB0aW5nIGBAZGJ4LXRvb2xzL2F1dGhgIHRvIHR1bm5lbCB0cmFmZmljLiBPbiBgc2V0dXAoKWAgaXQgcmVnaXN0ZXJzIHRoZSBsb2dpblxuICogcm91dGVzIChgL2FwaS9lbWFpbC9hdXRoLypgKSBhbmQgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3NcbiAqIHNlcnZlciB2aWEgYHRoaXMuY29udGV4dGAsIHNvIGEgcHVibGljIHBvcnRyIGNhbGxlciBtdXN0IHByb3ZlIGFuIGVtYWlsIGJlZm9yZVxuICogcmVhY2hpbmcgdGhlIGFwcCdzIGAvYXBpLypgIC0gc2VlIGAuL2dhdGVgLiBGcm9udC1kb29yIChwbGF0Zm9ybSkgdHJhZmZpYyBhbmRcbiAqIG90aGVyIGxvY2FsIGNhbGxlcnMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCAodGhlIGdhdGUga2V5cyBvbiB0aGUgYEhvc3RgIGhlYWRlcikuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoR2F0ZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxBdXRoR2F0ZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJhdXRoR2F0ZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkF1dGggR2F0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJldHRlciBBdXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleSBhY2Nlc3MgZ2F0ZSBmb3IgYSBwdWJsaWMgdHVubmVsLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgICByZXNvdXJjZUtleTogXCJhdXRoLWRhdGFiYXNlXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiYXV0aEdhdGVcIj47XG5cbiAgcHJpdmF0ZSByZXNvbHZlZCE6IFJlc29sdmVkQXV0aEdhdGVDb25maWc7XG4gIHByaXZhdGUgcnVudGltZT86IFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lO1xuXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBpZiAoYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZykubW9kZSAhPT0gXCJsYWtlYmFzZVwiKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICBhbGlhczogXCJhdXRoXCIsXG4gICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgIHBlcm1pc3Npb246IFwiQ0FOX0NPTk5FQ1RfQU5EX0NSRUFURVwiLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICBkYXRhYmFzZV9uYW1lOiB7IGVudjogXCJQR0RBVEFCQVNFXCIgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVkLmluc2VjdXJlKSB7XG4gICAgICBsb2dnZXIud2FybihcImluc2VjdXJlIG1vZGUgLSB0aGUgdHVubmVsIHJ1bnMgT1BFTiB3aXRoIG5vIGF1dGggZ2F0ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFrZWJhc2VQbHVnaW4gPSBhcHBraXRQbHVnaW4uaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSk7XG4gICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgYXV0aFN0b3JhZ2UuY3JlYXRlQXV0aFN0b3JhZ2UoXG4gICAgICAgIHRoaXMucmVzb2x2ZWQsXG4gICAgICAgIGxha2ViYXNlUGx1Z2luPy5leHBvcnRzKCkucG9vbCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGtleSB9ID0gYXdhaXQgc2lnbmluZ0tleSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyk7XG4gICAgICB0aGlzLnJ1bnRpbWUgPSBhd2FpdCBwYXNzd29yZGxlc3NBdXRoLmNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoe1xuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBiYXNlVVJMOiBhdXRoT3JpZ2luKHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWluKSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2FwaS9lbWFpbC9hdXRoXCIsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMucmVzb2x2ZWQuYnJhbmROYW1lLFxuICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gICAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgICBzZXNzaW9uQ3V0b2ZmTXM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zLFxuICAgICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgICBjb2RlVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5jb2RlVHRsU2Vjb25kcyxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IHRoaXMucmVzb2x2ZWQubWF4QXR0ZW1wdHMsXG4gICAgICAgIGF1dGhvcml6ZUlkZW50aXR5OiAoZW1haWwpID0+IHRoaXMuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpLFxuICAgICAgICBzZW5kQ29kZTogKGVtYWlsLCBjb2RlLCBvcHRpb25zKSA9PiB0aGlzLnNlbmRDb2RlKGVtYWlsLCBjb2RlLCBvcHRpb25zKSxcbiAgICAgICAgc3ViamVjdDogdGhpcy5yZXNvbHZlZC5zdWJqZWN0LFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnJlc29sdmVkLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIGBzZXJ2ZXIoKWAgaXMgZGVmZXJyZWQsIHNvIGl0IGRvZXMgbm90IGV4aXN0IGR1cmluZyB0aGlzIHBsdWdpbidzIHNldHVwLlxuICAgICAgLy8gQXQgYHNldHVwOmNvbXBsZXRlYCB0aGUgRXhwcmVzcyBhcHAgZXhpc3RzIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpblxuICAgICAgLy8gcm91dGVzIG9yIHN0YXRpYyBoYW5kbGluZyB5ZXQsIHdoaWNoIGlzIHRoZSBvbmUgcG9pbnQgdGhlIGdhdGUgY2FuIG1vdW50XG4gICAgICAvLyBhaGVhZCBvZiBldmVyeSBwcm90ZWN0ZWQgcm91dGUuXG4gICAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLm1vdW50R2F0ZVJvdXRlcygpO1xuICAgICAgICAvLyBGYWlsIGZhc3Qgb25jZSB0aGUgc2libGluZyBlbWFpbCBwbHVnaW4gaGFzIHByaW1lZCBpdHMgdHJhbnNwb3J0OiBhXG4gICAgICAgIC8vIGdhdGUgdGhhdCBjYW5ub3QgZW1haWwgYSBjb2RlIGxldHMgbm9ib2R5IGluLlxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNlbmRDb2RlKSBhd2FpdCBlbnN1cmVFbWFpbEF2YWlsYWJsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBwYXR0ZXJuczogdGhpcy5yZXNvbHZlZC5hbGxvdy5sZW5ndGgsXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHB1YmxpY0RvbWFpbjogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW4gPz8gbnVsbCxcbiAgICAgIGluc2VjdXJlOiB0aGlzLnJlc29sdmVkLmluc2VjdXJlLFxuICAgICAgc3RvcmFnZTogdGhpcy5yZXNvbHZlZC5zdG9yYWdlLFxuICAgICAgbG9nb3V0UmVkaXJlY3RQYXRoOiB0aGlzLnJlc29sdmVkLmxvZ291dFJlZGlyZWN0UGF0aCxcbiAgICAgIHNlc3Npb25DdXRvZmY6XG4gICAgICAgIHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zID4gMFxuICAgICAgICAgID8gbmV3IERhdGUodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bnRpbWU/LmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIHRoZSBnYXRpbmcgbWlkZGxld2FyZSBvblxuICAgKiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3Mgc2VydmVyLiBBdCBgc2V0dXA6Y29tcGxldGVgLCB0aGUgZGVmZXJyZWQgc2VydmVyIHBsdWdpblxuICAgKiBoYXMgY29uc3RydWN0ZWQgaXRzIEV4cHJlc3MgYXBwIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpbiByb3V0ZXMgb3Igc3RhdGljXG4gICAqIGhhbmRsaW5nLCBzbyBkaXJlY3QgcmVnaXN0cmF0aW9uIHB1dHMgdGhlIGdhdGUgZmlyc3QuIFRoZSBjb250ZXh0J3MgYnVmZmVyZWRcbiAgICogcm91dGUgQVBJIHJlbWFpbnMgYSBmYWxsYmFjayBmb3IgY29tcGF0aWJsZSBub24tc3RhbmRhcmQgc2VydmVyIHBsdWdpbnMuXG4gICAqL1xuICBwcml2YXRlIG1vdW50R2F0ZVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJubyBwbHVnaW4gY29udGV4dCAtIHRoZSBhdXRoIGdhdGUgY2Fubm90IG1vdW50IGl0cyByb3V0ZXNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0LCB7XG4gICAgICBnYXRlOiB0aGlzLmV4cG9ydHMoKSxcbiAgICAgIHB1YmxpY0RvbWFpbjogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW4sXG4gICAgICBmb3J3YXJkSGVhZGVyczogdGhpcy5yZXNvbHZlZC5mb3J3YXJkSGVhZGVycyxcbiAgICAgIGdhdGVQYXRoczogdGhpcy5yZXNvbHZlZC5nYXRlUGF0aHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIGNvZGUgc2VuZGVyOiB0aGUgY29uZmlndXJlZCBgc2VuZENvZGVgLCBlbHNlIHRoZSBzaGFyZWQtdHJhbnNwb3J0IGRlZmF1bHQuICovXG4gIHByaXZhdGUgZ2V0IHNlbmRDb2RlKCk6IE5vbk51bGxhYmxlPEF1dGhHYXRlQ29uZmlnW1wic2VuZENvZGVcIl0+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2VuZENvZGUgPz8gZGVmYXVsdFNlbmRDb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRob3JpemVJZGVudGl0eShlbWFpbDogc3RyaW5nKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eSkgcmV0dXJuIHRoaXMuY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGVtYWlsKTtcbiAgICByZXR1cm4gbG9va3NMaWtlRW1haWwoZW1haWwpICYmIG1hdGNoZXNBbGxvd2xpc3QoZW1haWwsIHRoaXMucmVzb2x2ZWQuYWxsb3cpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpOiBBdXRoR2F0ZUFwaSB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFzc2tleXNFbmFibGVkOiBydW50aW1lPy5wYXNza2V5c0VuYWJsZWQgPz8gZmFsc2UsXG4gICAgICBoYW5kbGVyOiAocmVxdWVzdCkgPT5cbiAgICAgICAgcnVudGltZT8uaGFuZGxlcihyZXF1ZXN0KSA/PyBQcm9taXNlLnJlc29sdmUobmV3IFJlc3BvbnNlKFwiTm90IEZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSkpLFxuICAgICAgc2Vzc2lvbjogKGhlYWRlcnMpID0+IHJ1bnRpbWU/LnNlc3Npb24oaGVhZGVycykgPz8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG4gICAgICBzdGF0dXM6IChoZWFkZXJzKSA9PlxuICAgICAgICBydW50aW1lPy5zdGF0dXMoaGVhZGVycykgPz9cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlLCBwYXNza2V5c0VuYWJsZWQ6IGZhbHNlIH0pLFxuICAgICAgY2xvc2U6ICgpID0+IHJ1bnRpbWU/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdXRoT3JpZ2luKHB1YmxpY0RvbWFpbj86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nLnRyaW1Ub051bGwocHVibGljRG9tYWluKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiaHR0cDovL2xvY2FsaG9zdFwiO1xuICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdCh2YWx1ZSkpIHJldHVybiBuZXcgVVJMKHZhbHVlKS5vcmlnaW47XG4gIGNvbnN0IGhvc3QgPSB2YWx1ZS5zcGxpdChcIi9cIilbMF0hO1xuICBjb25zdCBsb2NhbCA9IGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdC5zdGFydHNXaXRoKFwibG9jYWxob3N0OlwiKTtcbiAgcmV0dXJuIGAke2xvY2FsID8gXCJodHRwXCIgOiBcImh0dHBzXCJ9Oi8vJHtob3N0fWA7XG59XG5cbi8qKiBGYWN0b3J5OiBgYXV0aEdhdGUoeyBhbGxvdywgc3ViamVjdCwgLi4uIH0pYCBmb3IgYW4gQXBwS2l0IGBwbHVnaW5zYCBhcnJheS4gKi9cbmV4cG9ydCBjb25zdCBhdXRoR2F0ZSA9IHRvUGx1Z2luKEF1dGhHYXRlUGx1Z2luKTtcbiJdfQ==
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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QUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNuRixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7U0FDbkQsQ0FBQztJQUNKLENBQUM7O0FBR0gsU0FBUyxVQUFVLENBQUMsWUFBcUI7SUFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sa0JBQWtCLENBQUM7SUFDdEMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGF1dGhHYXRlKClgIC0gdGhlIEFwcEtpdCBhZGFwdGVyIGFyb3VuZCBgQGRieC10b29scy9hdXRoYC5cbiAqXG4gKiBJdCBoYXMgTk8gcm91dGVzIG9mIGl0cyBvd246IHRoZSB0dW5uZWwgUFJPWFkgKG5vdCBhbiBIVFRQIHNlcnZlcikgY2FsbHMgdGhlXG4gKiBoYW5kbGVycyB0aGlzIHBsdWdpbiBleHBvc2VzIHZpYSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30uIFRoZSBwbHVnaW5cbiAqIG93bnMgdHVubmVsIGF1dGhvcml6YXRpb24sIEFwcEtpdCBMYWtlYmFzZSBkaXNjb3ZlcnksIGVtYWlsIGRlbGl2ZXJ5LCBhbmRcbiAqIHRyYW5zcG9ydCBtb3VudGluZy4gQmV0dGVyIEF1dGggb3ducyB1c2VycywgT1RQcywgc2Vzc2lvbnMsIHJhdGUgbGltaXRzLCBhbmRcbiAqIHBhc3NrZXlzLiBgY3JlYXRlQXBwYCBjYW4gcnVuIHRoaXMgcGx1Z2luIHdpdGggb3Igd2l0aG91dCBgc2VydmVyKClgLlxuICpcbiAqIE9wdGlvbnMgY29tZSBmcm9tIENMSSBmbGFncyBPUiBlbnYsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMgLSBzZWVcbiAqIHtAbGluayByZXNvbHZlQXV0aEdhdGVDb25maWd9LiBUaGUgb25lIHJ1bnRpbWUgZGVwZW5kZW5jeSB0aGUgcGx1Z2luIGNhbid0XG4gKiByZXNvbHZlIGl0c2VsZiBpcyBIT1cgdG8gZW1haWwgdGhlIGNvZGUsIHNvIGl0IHRha2VzIGEgYHNlbmRDb2RlYCBjYWxsYmFjayB0aGVcbiAqIGFwcCB3aXJlcyB0byB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG4gIFJlc291cmNlVHlwZSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIGFzIGFwcGtpdFBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgYXV0aCBhcyBwYXNzd29yZGxlc3NBdXRoLFxuICBzdG9yYWdlIGFzIGF1dGhTdG9yYWdlLFxuICB0eXBlIEF1dGhvcml6ZUlkZW50aXR5LFxuICB0eXBlIEF1dGhTdG9yYWdlQ29uZmlnLFxuICB0eXBlIEF1dGhTdG9yYWdlTW9kZSxcbiAgdHlwZSBQYXNzd29yZGxlc3NBdXRoUnVudGltZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhTdGF0dXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0IHsgYnJhbmQsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgVFVOTkVMX0NPTkZJRyB9IGZyb20gXCIuL19jb25maWcudHNcIjtcbmltcG9ydCB7IGxvb2tzTGlrZUVtYWlsLCBtYXRjaGVzQWxsb3dsaXN0IH0gZnJvbSBcIi4vYWxsb3dsaXN0LnRzXCI7XG5pbXBvcnQgeyBtb3VudEdhdGUsIHR5cGUgR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9nYXRlLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFbWFpbEF2YWlsYWJsZSwgc2VuZENvZGUgYXMgZGVmYXVsdFNlbmRDb2RlIH0gZnJvbSBcIi4vc2VuZC1jb2RlLnRzXCI7XG5pbXBvcnQgeyBLRVlfVFRMX1NFQ09ORFMsIHJlc29sdmVTZXNzaW9uQ3V0b2ZmLCBzaWduaW5nS2V5IH0gZnJvbSBcIi4vc2lnbmluZy1rZXkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDphdXRoXCIpO1xuXG5pbnRlcmZhY2UgR2F0ZVNlcnZlckFwcGxpY2F0aW9uIHtcbiAgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICBwb3N0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICB1c2UocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG59XG5cbmludGVyZmFjZSBHYXRlTW91bnRDb250ZXh0IHtcbiAgYWRkUm91dGUobWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBhZGRNaWRkbGV3YXJlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBnZXRQbHVnaW5zKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgdW5rbm93bj47XG59XG5cbmZ1bmN0aW9uIHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQpOiBHYXRlU2VydmVyQXBwbGljYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJ2ZXIgPSBjb250ZXh0LmdldFBsdWdpbnMoKS5nZXQoXCJzZXJ2ZXJcIikgYXNcbiAgICB7IHNlcnZlckFwcGxpY2F0aW9uPzogUGFydGlhbDxHYXRlU2VydmVyQXBwbGljYXRpb24+IH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyPy5zZXJ2ZXJBcHBsaWNhdGlvbjtcbiAgcmV0dXJuIGFwcGxpY2F0aW9uICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLmdldCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnBvc3QgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi51c2UgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGFwcGxpY2F0aW9uIGFzIEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0OiBHYXRlTW91bnRDb250ZXh0LCBvcHRpb25zOiBHYXRlT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBhcHBsaWNhdGlvbiA9IHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQpO1xuICBpZiAoYXBwbGljYXRpb24pIHtcbiAgICBtb3VudEdhdGUoXG4gICAgICBvcHRpb25zLFxuICAgICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gYXBwbGljYXRpb25bbWV0aG9kXShwYXRoLCBoYW5kbGVyKSxcbiAgICAgIChwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvbi51c2UocGF0aCwgaGFuZGxlciksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbW91bnRHYXRlKFxuICAgIG9wdGlvbnMsXG4gICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gY29udGV4dC5hZGRSb3V0ZShtZXRob2QsIHBhdGgsIGhhbmRsZXIpLFxuICAgIChwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZE1pZGRsZXdhcmUocGF0aCwgaGFuZGxlciksXG4gICk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIGF1dGhHYXRlfSBwbHVnaW4gKGFsbCByZXNvbHZhYmxlIGZyb20gZW52IC0gc2VlIGJlbG93KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVDb25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnLCBBdXRoU3RvcmFnZUNvbmZpZyB7XG4gIC8qKiBBbGxvdy1saXN0IHBhdHRlcm5zIChkb21haW4gLyBnbG9iIC8gYC9yZWdleC9gKS4gRW1wdHkgPSBhbGxvdyBub2JvZHkuIEVudiBUVU5ORUxfQVVUSF9BTExPVy4gKi9cbiAgYWxsb3c/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFN1YmplY3QgbGluZSBmb3IgdGhlIGNvZGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9TVUJKRUNULlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGVcIi4gVGhlIHdvcmRpbmcgb2YgdGhlIHN1YmplY3QgYW5kXG4gICAqIHtAbGluayBtZXNzYWdlfSBpcyBkZWxpYmVyYXRlbHkgdGhlIGNvbnZlbnRpb25hbCBwaHJhc2luZyByYXRoZXIgdGhhblxuICAgKiBhbnl0aGluZyBicmFuZGVkOiBpT1MsIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCBhbGwgZGV0ZWN0IGEgb25lLXRpbWVcbiAgICogY29kZSBmcm9tIHRoaXMgc2hhcGUgYW5kIG9mZmVyIHRvIGF1dG9maWxsIGl0LCBhbmQgYSBub3ZlbCBwaHJhc2luZyBpcyB3aGF0XG4gICAqIGJyZWFrcyB0aGF0IGRldGVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgc3ViamVjdCBURU1QTEFURSwgbm90IHRoZSBsaXRlcmFsIGxpbmUgc2VudDogdGhlIGNvZGUgaXMgc3BsaWNlZFxuICAgKiBpbnRvIGl0IChgXCIxMjM0NTYgaXMgeW91ciB2ZXJpZmljYXRpb24gY29kZVwiYCkgYmVjYXVzZSBhIHB1c2ggbm90aWZpY2F0aW9uXG4gICAqIHNob3dzIG9ubHkgdGhlIHN1YmplY3QgYW5kIHByZWhlYWRlciwgYW5kIHRoYXQgbm90aWZpY2F0aW9uIGlzIHdoYXQgbW9iaWxlXG4gICAqIGF1dG9maWxsIHJlYWRzLiBTZWUgYGNvZGVFbWFpbFN1YmplY3RgIGluIGAuL2NvZGUtZW1haWwudHNgLlxuICAgKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpc3BsYXkgbmFtZSB1c2VkIGluIHRoZSBjb2RlIGVtYWlsIGNvcHkuIEVudiBUVU5ORUxfQVVUSF9CUkFORF9OQU1FLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0aGUgYnJhbmQgY29udGV4dCdzIGBuYW1lYCAtIHRoZSBhcHAncyBvd24gYGJyYW5kaW5nL2JyYW5kLnlhbWxgXG4gICAqIHdoZW4gaXQgaGFzIG9uZSwgZWxzZSB0aGUgZGJ4LXRvb2xzIGRlZmF1bHQuIFNldCB0aGlzIG9ubHkgdG8gb3ZlcnJpZGUgdGhlXG4gICAqIGJyYW5kIGZvciB0aGlzIGdhdGUuXG4gICAqL1xuICBicmFuZE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaW5lIHNob3duIGltbWVkaWF0ZWx5IGFib3ZlIHRoZSBjb2RlIGluIHRoZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX01FU1NBR0UuXG4gICAqXG4gICAqIEtlZXAgdGhlIGNvZGUgb24gaXRzIE9XTiBsaW5lIGRpcmVjdGx5IGFmdGVyIHRoaXMgdGV4dCAtIHRoYXQgYWRqYWNlbmN5IGlzXG4gICAqIHdoYXQgdGhlIHBsYXRmb3JtIGNvZGUtZGV0ZWN0aW9uIGhldXJpc3RpY3Mga2V5IG9uLlxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFNlc3Npb24gbGlmZXRpbWUgKHNlY29uZHMpLiBFbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9UVEwuIERlZmF1bHQgMjU5MjAwMCAoMzBkKS5cbiAgICpcbiAgICogTWF0Y2hlZCB0byB0aGUgY2FjaGUtYmFja2VkIHNpZ25pbmcga2V5J3Mgb3duIDMwLWRheSBUVEwgKHNlZVxuICAgKiBgLi9zaWduaW5nLWtleS50c2ApOiB0aGUgY29va2llIGFuZCB0aGUga2V5IHRoYXQgdmFsaWRhdGVzIGl0IHNob3VsZCBleHBpcmVcbiAgICogdG9nZXRoZXIsIG9yIG9uZSBzaWxlbnRseSBvdXRsaXZlcyB0aGUgb3RoZXIuXG4gICAqL1xuICBzZXNzaW9uVHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIE9uZS10aW1lLWNvZGUgbGlmZXRpbWUgKHNlY29uZHMpLiBFbnYgVFVOTkVMX0FVVEhfQ09ERV9UVEwuIERlZmF1bHQgNjAwICgxMG0pLiAqL1xuICBjb2RlVHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIE1heCB2ZXJpZnkgYXR0ZW1wdHMgcGVyIGlzc3VlZCBjb2RlLiBEZWZhdWx0IDUuICovXG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogRm9yY2UtY2xlYXIgY3V0b2ZmOiBldmVyeSBzZXNzaW9uIGlzc3VlZCBCRUZPUkUgaXQgc3RvcHMgdmVyaWZ5aW5nLCBzbyBtb3ZpbmdcbiAgICogaXQgZm9yd2FyZCBzaWducyBldmVyeW9uZSBvdXQuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX0NVVE9GRi5cbiAgICpcbiAgICogQW55dGhpbmcgYG9iamVjdC50b0RhdGVgIGFjY2VwdHM6IGEgYERhdGVgLCBgMjAyNi0wOC0wMmAsIGFuIElTTyBpbnN0YW50LFxuICAgKiBlcG9jaCBzZWNvbmRzL21pbGxpcywgb3IgYSByZWxhdGl2ZSBkdXJhdGlvbiAoYC0zMGRgLCBgNyBkYXlzIGFnb2ApLiBVbnNldFxuICAgKiBtZWFucyBubyBjdXRvZmYuXG4gICAqL1xuICBzZXNzaW9uQ3V0b2ZmPzogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbiAgLyoqXG4gICAqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGxvZ291dC4gRW52XG4gICAqIGBUVU5ORUxfQVVUSF9MT0dPVVRfUkVESVJFQ1RgLiBEZWZhdWx0cyB0byBgL2AsIHdoZXJlIHRoZSBBdXRoR2F0ZSBwcmVzZW50c1xuICAgKiBsb2dpbiBhZ2Fpbi5cbiAgICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIERlbGl2ZXIgYSBjb2RlIHRvIGFuIGFkZHJlc3MuIERlZmF1bHRzIHRvIHNlbmRpbmcgdGhyb3VnaCB0aGUgaG9zdCBhcHAnc1xuICAgKiBzaGFyZWQgYEBkYngtdG9vbHMvZW1haWxgIHRyYW5zcG9ydCAoc2VlIGAuL3NlbmQtY29kZWApOyBvdmVycmlkZSB0byB3aXJlIGFcbiAgICogZGlmZmVyZW50IGRlbGl2ZXJ5IHBhdGguXG4gICAqL1xuICBzZW5kQ29kZT86IChlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG9wdHM6IFNlbmRDb2RlT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIElkZW50aXR5IGF1dGhvcml6YXRpb24gaW5kZXBlbmRlbnQgb2YgYXV0aGVudGljYXRpb24uIERlZmF1bHRzIHRvIHRoZVxuICAgKiBjb25maWd1cmVkIGFsbG93LWxpc3QgYW5kIGlzIHJlLWV2YWx1YXRlZCBmb3IgZXZlcnkgYWNjZXB0ZWQgc2Vzc2lvbi5cbiAgICovXG4gIGF1dGhvcml6ZUlkZW50aXR5PzogQXV0aG9yaXplSWRlbnRpdHk7XG4gIC8qKlxuICAgKiBUaGUgcHVibGljIGA8c3ViZG9tYWluPi48c2VydmVyPmAgdGhhdCBpZGVudGlmaWVzIHBvcnRyIHRyYWZmaWMgYnkgaXRzIGBIb3N0YFxuICAgKiBoZWFkZXIuIE9ubHkgcmVxdWVzdHMgd2hvc2UgYEhvc3RgIG1hdGNoZXMgdGhpcyBhcmUgZ2F0ZWQ7IGV2ZXJ5dGhpbmcgZWxzZVxuICAgKiAodGhlIHBsYXRmb3JtIGZyb250IGRvb3IsIG90aGVyIGxvY2FsIGNhbGxlcnMpIHBhc3NlcyB0aHJvdWdoLiBFbnZcbiAgICogYFRVTk5FTF9QVUJMSUNfRE9NQUlOYC4gV2hlbiBhYnNlbnQsIHRoZSBnYXRlIGlzIGluZXJ0IChub3RoaW5nIGlzIHR1bm5lbFxuICAgKiB0cmFmZmljKS5cbiAgICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgcHVibGljIHR1bm5lbCBkb21haW5zIGFjY2VwdGVkIGJ5IHRoZSBnYXRlLiAqL1xuICBwdWJsaWNEb21haW5zPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBFeHRyYSBgeC1gIHJlcXVlc3QgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAobGl0ZXJhbCAvIGdsb2IgL1xuICAgKiBgL3JlZ2V4L2ApLCB1bmlvbmVkIHdpdGggdGhlIGJ1aWx0LWluIGFsbG93LWxpc3QuIEVudiBgVFVOTkVMX0ZPUldBUkRfSEVBREVSU2AuXG4gICAqL1xuICBmb3J3YXJkSGVhZGVycz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCB0aGUgYnVpbHQtaW4gYC9hcGkvYCAobGl0ZXJhbCBwcmVmaXhlcywgY29tbWEtXG4gICAqIG9yIHNwYWNlLXNlcGFyYXRlZCBhcyBhIHN0cmluZykuIEZvciBhbiBhcHAgd2hvc2UgcHJpdmlsZWdlZCBzdXJmYWNlIGlzIG5vdFxuICAgKiB1bmRlciBgL2FwaS9gIOKAlCBlLmcuIGEgV2ViU29ja2V0IGF0IGAvd3NgIOKAlCBsaXN0IHRob3NlIHByZWZpeGVzIHNvIHRoZXlcbiAgICogcmVxdWlyZSBhIHNlc3Npb24gdG9vLiBFbnYgYFRVTk5FTF9HQVRFX1BBVEhTYC5cbiAgICovXG4gIGdhdGVQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUnVuIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgYFRVTk5FTF9JTlNFQ1VSRT10cnVlYCkuIFRoZSBsb2dpbiByb3V0ZXMgYW5kIGdhdGVcbiAgICogbWlkZGxld2FyZSBhcmUgbm90IG1vdW50ZWQsIGFuZCB0aGUgU01UUCBmYWlsLWZhc3QgaXMgc2tpcHBlZC4gVXNlIG9ubHkgd2hlblxuICAgKiB0aGUgdHVubmVsIGlzIGRlbGliZXJhdGVseSBwdWJsaWMuXG4gICAqL1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG59XG5cbi8qKiBCcmFuZGluZy9tZXNzYWdpbmcgcGFzc2VkIHRvIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5zZW5kQ29kZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRDb2RlT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIExpZmV0aW1lIG9mIHRoZSBjb2RlIGJlaW5nIHNlbnQsIGluIHNlY29uZHMgLSB0aGUgUkVTT0xWRURcbiAgICoge0BsaW5rIEF1dGhHYXRlQ29uZmlnLmNvZGVUdGxTZWNvbmRzfSwgc28gdGhlIGVtYWlsIGNhbiBzdGF0ZSB0aGUgcmVhbFxuICAgKiBleHBpcnkgKFwiVGhpcyBjb2RlIGV4cGlyZXMgaW4gMTAgbWludXRlc1wiKSBpbnN0ZWFkIG9mIGEgdmFndWUgXCJzaG9ydGx5XCJcbiAgICogdGhhdCBkcmlmdHMgZnJvbSB0aGUgY29uZmlndXJlZCBUVEwuXG4gICAqL1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKiogUmVzb2x2ZWQgZ2F0ZSBjb25maWcgd2l0aCBlbnYgZmFsbGJhY2tzICsgZGVmYXVsdHMgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGFsbG93OiBzdHJpbmdbXTtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICAvKiogRm9yY2UtY2xlYXIgY3V0b2ZmIGluIGVwb2NoIG1zOyBgMGAgd2hlbiB1bnNldC4gKi9cbiAgc2Vzc2lvbkN1dG9mZk1zOiBudW1iZXI7XG4gIC8qKiBTYW1lLW9yaWdpbiBwYXRoIHJldHVybmVkIGFmdGVyIGxvZ291dC4gKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5IHB1YmxpYyBkb21haW47IGB1bmRlZmluZWRgIHdoZW4gUG9ydHIgaXMgbm90IGNvbmZpZ3VyZWQuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIEFsbCBwdWJsaWMgdHVubmVsIGRvbWFpbnMgYWNjZXB0ZWQgYnkgdGhlIGdhdGUuICovXG4gIHB1YmxpY0RvbWFpbnM6IHN0cmluZ1tdO1xuICAvKiogRXh0cmEgYHgtYCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkICh1bmlvbmVkIHdpdGggdGhlIGRlZmF1bHRzKS4gKi9cbiAgZm9yd2FyZEhlYWRlcnM6IHN0cmluZ1tdO1xuICAvKiogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCBgL2FwaS9gIChlLmcuIGAvd3NgKS4gKi9cbiAgZ2F0ZVBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZS4gKi9cbiAgaW5zZWN1cmU6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBcIi9cIixcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBjb25zdCBzdG9yYWdlID0gYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKHtcbiAgICBzdG9yYWdlOlxuICAgICAgY29uZmlnLnN0b3JhZ2UgPz9cbiAgICAgIChjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NUT1JBR0VcIiwgVFVOTkVMX0NPTkZJRykgYXMgQXV0aFN0b3JhZ2VNb2RlIHwgdW5kZWZpbmVkKSxcbiAgICBzcWxpdGVQYXRoOiBjb25maWcuc3FsaXRlUGF0aCA/PyBjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NRTElURV9QQVRIXCIsIFRVTk5FTF9DT05GSUcpLFxuICB9KTtcbiAgY29uc3QgcHVibGljRG9tYWluID0gY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLnB1YmxpY0RvbWFpbiwgXCJQVUJMSUNfRE9NQUlOXCIsIFRVTk5FTF9DT05GSUcpO1xuICBjb25zdCBmcnBQdWJsaWNEb21haW4gPSBjb3JlQ29uZmlnLnRleHQoXCJGUlBfUFVCTElDX0RPTUFJTlwiLCBUVU5ORUxfQ09ORklHKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBCb3RoIHNvdXJjZXMgYXJlIHVuaW9uZWQgcmF0aGVyIHRoYW4gb25lIG92ZXJyaWRpbmc6IGEgZGVwbG95bWVudC13aWRlXG4gICAgLy8gVFVOTkVMX0FVVEhfQUxMT1cgYW5kIGEgcGVyLWludm9jYXRpb24gYC0tYWxsb3dgIHNob3VsZCBib3RoIGdyYW50IGFjY2Vzcy5cbiAgICAvLyBIZW5jZSBgcGFyc2VMaXN0YCBvbiBlYWNoIHJhdGhlciB0aGFuIGBjb25maWcubGlzdGAsIHdoaWNoIHN0b3BzIGF0IHRoZVxuICAgIC8vIGZpcnN0IHNvdXJjZSB0aGF0IHlpZWxkcyBhbnl0aGluZy5cbiAgICBhbGxvdzogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuYWxsb3cpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoW1wiQVVUSF9BTExPV1wiLCBcIkVNQUlMX0FVVEhfQUxMT1dcIl0sIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIHN1YmplY3Q6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5zdWJqZWN0LCBcIkFVVEhfU1VCSkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTpcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5icmFuZE5hbWUsIFwiQVVUSF9CUkFORF9OQU1FXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLmJyYW5kTmFtZSxcbiAgICBtZXNzYWdlOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcubWVzc2FnZSwgXCJBVVRIX01FU1NBR0VcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMubWVzc2FnZSxcbiAgICBzZXNzaW9uVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9TRVNTSU9OX1RUTFwiLFxuICAgICAgREVGQVVMVFMuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgY29kZVR0bFNlY29uZHM6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gICAgICBcIkFVVEhfQ09ERV9UVExcIixcbiAgICAgIERFRkFVTFRTLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICAgIG1heEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMgPz8gREVGQVVMVFMubWF4QXR0ZW1wdHMsXG4gICAgc2Vzc2lvbkN1dG9mZk1zOiByZXNvbHZlU2Vzc2lvbkN1dG9mZihjb25maWcuc2Vzc2lvbkN1dG9mZiksXG4gICAgbG9nb3V0UmVkaXJlY3RQYXRoOiBwYXNzd29yZGxlc3NBdXRoLm5vcm1hbGl6ZUxvZ291dFJlZGlyZWN0UGF0aChcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgsIFwiQVVUSF9MT0dPVVRfUkVESVJFQ1RcIiwgVFVOTkVMX0NPTkZJRykgPz9cbiAgICAgICAgREVGQVVMVFMubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICksXG4gICAgcHVibGljRG9tYWluLFxuICAgIHB1YmxpY0RvbWFpbnM6IFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIFtcbiAgICAgICAgICBwdWJsaWNEb21haW4sXG4gICAgICAgICAgZnJwUHVibGljRG9tYWluLFxuICAgICAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLnB1YmxpY0RvbWFpbnMpLFxuICAgICAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gISF2YWx1ZSksXG4gICAgICApLFxuICAgIF0sXG4gICAgZm9yd2FyZEhlYWRlcnM6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmZvcndhcmRIZWFkZXJzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiRk9SV0FSRF9IRUFERVJTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGdhdGVQYXRoczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZ2F0ZVBhdGhzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiR0FURV9QQVRIU1wiLCBUVU5ORUxfQ09ORklHKSksXG4gICAgXSxcbiAgICBpbnNlY3VyZTogY29yZUNvbmZpZy5ib29sZWFuKGNvbmZpZy5pbnNlY3VyZSwgXCJJTlNFQ1VSRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBmYWxzZSxcbiAgICBzdG9yYWdlOiBzdG9yYWdlLm1vZGUsXG4gICAgc3FsaXRlUGF0aDogc3RvcmFnZS5zcWxpdGVQYXRoLFxuICB9O1xufVxuXG4vKiogVGhlIGhhbmRsZXJzIHRoZSBnYXRlIG1pZGRsZXdhcmUgY2FsbHMgaW4tcHJvY2VzcyAocmV0dXJuZWQgYnkge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVBcGkge1xuICAvKiogQmV0dGVyIEF1dGggYW5kIGNvbXBhdGliaWxpdHkgcm91dGVzIHVuZGVyIGAvYXBpL2VtYWlsL2F1dGgvKmAuICovXG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICAvKiogUmVzb2x2ZSB0aGUgYXV0aG9yaXplZCBlbWFpbCBmb3IgcmVxdWVzdCBoZWFkZXJzLCBvciB1bmRlZmluZWQuICovXG4gIHNlc3Npb24oaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkLiAqL1xuICBzdGF0dXMoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8QXV0aFN0YXR1cz47XG4gIC8qKiBXaGV0aGVyIHRoZSBydW50aW1lIGV4cG9zZXMgcGFzc2tleSBlbnJvbGxtZW50IGFuZCBhdXRoZW50aWNhdGlvbi4gKi9cbiAgcmVhZG9ubHkgcGFzc2tleXNFbmFibGVkOiBib29sZWFuO1xuICAvKiogQ2xvc2UgYXV0aCBzdG9yYWdlIG93bmVkIGJ5IHRoaXMgcnVudGltZS4gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIGFkYXB0aW5nIGBAZGJ4LXRvb2xzL2F1dGhgIHRvIHR1bm5lbCB0cmFmZmljLiBPbiBgc2V0dXAoKWAgaXQgcmVnaXN0ZXJzIHRoZSBsb2dpblxuICogcm91dGVzIChgL2FwaS9lbWFpbC9hdXRoLypgKSBhbmQgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3NcbiAqIHNlcnZlciB2aWEgYHRoaXMuY29udGV4dGAsIHNvIGEgcHVibGljIHBvcnRyIGNhbGxlciBtdXN0IHByb3ZlIGFuIGVtYWlsIGJlZm9yZVxuICogcmVhY2hpbmcgdGhlIGFwcCdzIGAvYXBpLypgIC0gc2VlIGAuL2dhdGVgLiBGcm9udC1kb29yIChwbGF0Zm9ybSkgdHJhZmZpYyBhbmRcbiAqIG90aGVyIGxvY2FsIGNhbGxlcnMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCAodGhlIGdhdGUga2V5cyBvbiB0aGUgYEhvc3RgIGhlYWRlcikuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoR2F0ZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxBdXRoR2F0ZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJhdXRoR2F0ZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkF1dGggR2F0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJldHRlciBBdXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleSBhY2Nlc3MgZ2F0ZSBmb3IgYSBwdWJsaWMgdHVubmVsLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgICByZXNvdXJjZUtleTogXCJhdXRoLWRhdGFiYXNlXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiYXV0aEdhdGVcIj47XG5cbiAgcHJpdmF0ZSByZXNvbHZlZCE6IFJlc29sdmVkQXV0aEdhdGVDb25maWc7XG4gIHByaXZhdGUgcnVudGltZT86IFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lO1xuXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBpZiAoYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZykubW9kZSAhPT0gXCJsYWtlYmFzZVwiKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICBhbGlhczogXCJhdXRoXCIsXG4gICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgIHBlcm1pc3Npb246IFwiQ0FOX0NPTk5FQ1RfQU5EX0NSRUFURVwiLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICBkYXRhYmFzZV9uYW1lOiB7IGVudjogXCJQR0RBVEFCQVNFXCIgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVkLmluc2VjdXJlKSB7XG4gICAgICBsb2dnZXIud2FybihcImluc2VjdXJlIG1vZGUgLSB0aGUgdHVubmVsIHJ1bnMgT1BFTiB3aXRoIG5vIGF1dGggZ2F0ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFrZWJhc2VQbHVnaW4gPSBhcHBraXRQbHVnaW4uaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSk7XG4gICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgYXV0aFN0b3JhZ2UuY3JlYXRlQXV0aFN0b3JhZ2UoXG4gICAgICAgIHRoaXMucmVzb2x2ZWQsXG4gICAgICAgIGxha2ViYXNlUGx1Z2luPy5leHBvcnRzKCkucG9vbCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGtleSB9ID0gYXdhaXQgc2lnbmluZ0tleSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyk7XG4gICAgICB0aGlzLnJ1bnRpbWUgPSBhd2FpdCBwYXNzd29yZGxlc3NBdXRoLmNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoe1xuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBiYXNlVVJMOiBhdXRoT3JpZ2luKHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWluKSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2FwaS9lbWFpbC9hdXRoXCIsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMucmVzb2x2ZWQuYnJhbmROYW1lLFxuICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gICAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgICBzZXNzaW9uQ3V0b2ZmTXM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zLFxuICAgICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgICBjb2RlVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5jb2RlVHRsU2Vjb25kcyxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IHRoaXMucmVzb2x2ZWQubWF4QXR0ZW1wdHMsXG4gICAgICAgIGF1dGhvcml6ZUlkZW50aXR5OiAoZW1haWwpID0+IHRoaXMuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpLFxuICAgICAgICBzZW5kQ29kZTogKGVtYWlsLCBjb2RlLCBvcHRpb25zKSA9PiB0aGlzLnNlbmRDb2RlKGVtYWlsLCBjb2RlLCBvcHRpb25zKSxcbiAgICAgICAgc3ViamVjdDogdGhpcy5yZXNvbHZlZC5zdWJqZWN0LFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnJlc29sdmVkLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIGBzZXJ2ZXIoKWAgaXMgZGVmZXJyZWQsIHNvIGl0IGRvZXMgbm90IGV4aXN0IGR1cmluZyB0aGlzIHBsdWdpbidzIHNldHVwLlxuICAgICAgLy8gQXQgYHNldHVwOmNvbXBsZXRlYCB0aGUgRXhwcmVzcyBhcHAgZXhpc3RzIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpblxuICAgICAgLy8gcm91dGVzIG9yIHN0YXRpYyBoYW5kbGluZyB5ZXQsIHdoaWNoIGlzIHRoZSBvbmUgcG9pbnQgdGhlIGdhdGUgY2FuIG1vdW50XG4gICAgICAvLyBhaGVhZCBvZiBldmVyeSBwcm90ZWN0ZWQgcm91dGUuXG4gICAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLm1vdW50R2F0ZVJvdXRlcygpO1xuICAgICAgICAvLyBGYWlsIGZhc3Qgb25jZSB0aGUgc2libGluZyBlbWFpbCBwbHVnaW4gaGFzIHByaW1lZCBpdHMgdHJhbnNwb3J0OiBhXG4gICAgICAgIC8vIGdhdGUgdGhhdCBjYW5ub3QgZW1haWwgYSBjb2RlIGxldHMgbm9ib2R5IGluLlxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNlbmRDb2RlKSBhd2FpdCBlbnN1cmVFbWFpbEF2YWlsYWJsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBwYXR0ZXJuczogdGhpcy5yZXNvbHZlZC5hbGxvdy5sZW5ndGgsXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHB1YmxpY0RvbWFpbnM6IHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWlucyxcbiAgICAgIGluc2VjdXJlOiB0aGlzLnJlc29sdmVkLmluc2VjdXJlLFxuICAgICAgc3RvcmFnZTogdGhpcy5yZXNvbHZlZC5zdG9yYWdlLFxuICAgICAgbG9nb3V0UmVkaXJlY3RQYXRoOiB0aGlzLnJlc29sdmVkLmxvZ291dFJlZGlyZWN0UGF0aCxcbiAgICAgIHNlc3Npb25DdXRvZmY6XG4gICAgICAgIHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zID4gMFxuICAgICAgICAgID8gbmV3IERhdGUodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bnRpbWU/LmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIHRoZSBnYXRpbmcgbWlkZGxld2FyZSBvblxuICAgKiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3Mgc2VydmVyLiBBdCBgc2V0dXA6Y29tcGxldGVgLCB0aGUgZGVmZXJyZWQgc2VydmVyIHBsdWdpblxuICAgKiBoYXMgY29uc3RydWN0ZWQgaXRzIEV4cHJlc3MgYXBwIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpbiByb3V0ZXMgb3Igc3RhdGljXG4gICAqIGhhbmRsaW5nLCBzbyBkaXJlY3QgcmVnaXN0cmF0aW9uIHB1dHMgdGhlIGdhdGUgZmlyc3QuIFRoZSBjb250ZXh0J3MgYnVmZmVyZWRcbiAgICogcm91dGUgQVBJIHJlbWFpbnMgYSBmYWxsYmFjayBmb3IgY29tcGF0aWJsZSBub24tc3RhbmRhcmQgc2VydmVyIHBsdWdpbnMuXG4gICAqL1xuICBwcml2YXRlIG1vdW50R2F0ZVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJubyBwbHVnaW4gY29udGV4dCAtIHRoZSBhdXRoIGdhdGUgY2Fubm90IG1vdW50IGl0cyByb3V0ZXNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0LCB7XG4gICAgICBnYXRlOiB0aGlzLmV4cG9ydHMoKSxcbiAgICAgIHB1YmxpY0RvbWFpbjogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLFxuICAgICAgZm9yd2FyZEhlYWRlcnM6IHRoaXMucmVzb2x2ZWQuZm9yd2FyZEhlYWRlcnMsXG4gICAgICBnYXRlUGF0aHM6IHRoaXMucmVzb2x2ZWQuZ2F0ZVBhdGhzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjb2RlIHNlbmRlcjogdGhlIGNvbmZpZ3VyZWQgYHNlbmRDb2RlYCwgZWxzZSB0aGUgc2hhcmVkLXRyYW5zcG9ydCBkZWZhdWx0LiAqL1xuICBwcml2YXRlIGdldCBzZW5kQ29kZSgpOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlbmRDb2RlID8/IGRlZmF1bHRTZW5kQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aG9yaXplSWRlbnRpdHkoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0aG9yaXplSWRlbnRpdHkpIHJldHVybiB0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eShlbWFpbCk7XG4gICAgcmV0dXJuIGxvb2tzTGlrZUVtYWlsKGVtYWlsKSAmJiBtYXRjaGVzQWxsb3dsaXN0KGVtYWlsLCB0aGlzLnJlc29sdmVkLmFsbG93KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKTogQXV0aEdhdGVBcGkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhc3NrZXlzRW5hYmxlZDogcnVudGltZT8ucGFzc2tleXNFbmFibGVkID8/IGZhbHNlLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QpID0+XG4gICAgICAgIHJ1bnRpbWU/LmhhbmRsZXIocmVxdWVzdCkgPz8gUHJvbWlzZS5yZXNvbHZlKG5ldyBSZXNwb25zZShcIk5vdCBGb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pKSxcbiAgICAgIHNlc3Npb246IChoZWFkZXJzKSA9PiBydW50aW1lPy5zZXNzaW9uKGhlYWRlcnMpID8/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgc3RhdHVzOiAoaGVhZGVycykgPT5cbiAgICAgICAgcnVudGltZT8uc3RhdHVzKGhlYWRlcnMpID8/XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSwgcGFzc2tleXNFbmFibGVkOiBmYWxzZSB9KSxcbiAgICAgIGNsb3NlOiAoKSA9PiBydW50aW1lPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0aE9yaWdpbihwdWJsaWNEb21haW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZy50cmltVG9OdWxsKHB1YmxpY0RvbWFpbik7XG4gIGlmICghdmFsdWUpIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3RcIjtcbiAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodmFsdWUpKSByZXR1cm4gbmV3IFVSTCh2YWx1ZSkub3JpZ2luO1xuICBjb25zdCBob3N0ID0gdmFsdWUuc3BsaXQoXCIvXCIpWzBdITtcbiAgY29uc3QgbG9jYWwgPSBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3Quc3RhcnRzV2l0aChcImxvY2FsaG9zdDpcIik7XG4gIHJldHVybiBgJHtsb2NhbCA/IFwiaHR0cFwiIDogXCJodHRwc1wifTovLyR7aG9zdH1gO1xufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/login-page.ts","../src/plugin.ts","../src/portr.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/frp.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/login-page.ts","../src/plugin.ts","../src/portr.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -18,21 +18,21 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@dbx-tools/email": "0.6.
|
|
21
|
+
"@dbx-tools/email": "0.6.106",
|
|
22
22
|
"@types/bun": "^1.3.14",
|
|
23
23
|
"@types/node": "^24.6.0",
|
|
24
24
|
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@dbx-tools/email": "0.6.
|
|
27
|
+
"@dbx-tools/email": "0.6.106"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@databricks/appkit": "^0.43.0",
|
|
31
|
-
"@dbx-tools/appkit": "0.6.
|
|
32
|
-
"@dbx-tools/auth": "0.6.
|
|
33
|
-
"@dbx-tools/core": "0.6.
|
|
34
|
-
"@dbx-tools/shared-auth": "0.6.
|
|
35
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
+
"@dbx-tools/appkit": "0.6.106",
|
|
32
|
+
"@dbx-tools/auth": "0.6.106",
|
|
33
|
+
"@dbx-tools/core": "0.6.106",
|
|
34
|
+
"@dbx-tools/shared-auth": "0.6.106",
|
|
35
|
+
"@dbx-tools/shared-core": "0.6.106"
|
|
36
36
|
},
|
|
37
37
|
"main": "./lib/index.js",
|
|
38
38
|
"license": "UNLICENSED",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"./package.json": "./package.json"
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
|
-
"version": "0.6.
|
|
51
|
+
"version": "0.6.106",
|
|
52
52
|
"types": "./lib/index.d.ts",
|
|
53
53
|
"type": "module",
|
|
54
54
|
"exports": {
|
package/src/frp.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install and run an frp client (`frpc`) for a public HTTP tunnel.
|
|
3
|
+
*
|
|
4
|
+
* The defaults match the deployment shape used by inspire-mediamix: a single
|
|
5
|
+
* TLS-terminating host is both the WSS control endpoint and the HTTP custom
|
|
6
|
+
* domain. Callers may point `server` somewhere else when frps is exposed on a
|
|
7
|
+
* separate control host.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { delimiter, join } from "node:path";
|
|
16
|
+
|
|
17
|
+
import { bin, config } from "@dbx-tools/core";
|
|
18
|
+
import { log } from "@dbx-tools/shared-core";
|
|
19
|
+
import { TUNNEL_CONFIG } from "./_config.ts";
|
|
20
|
+
|
|
21
|
+
const logger = log.logger("tunnel:frp");
|
|
22
|
+
const FRP_VERSION = "0.68.1";
|
|
23
|
+
const FRP_RELEASE_URL = `https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}`;
|
|
24
|
+
|
|
25
|
+
/** Options for installing the frpc executable. */
|
|
26
|
+
export interface FrpInstallOptions {
|
|
27
|
+
/** Home directory containing `.frpc`; defaults to the OS home directory. */
|
|
28
|
+
homeDir?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Resolved frpc wiring, or `undefined` when no FRP tunnel is configured. */
|
|
32
|
+
export interface FrpConfig {
|
|
33
|
+
publicDomain: string;
|
|
34
|
+
server: string;
|
|
35
|
+
serverPort: number;
|
|
36
|
+
protocol: string;
|
|
37
|
+
token?: string;
|
|
38
|
+
proxyName: string;
|
|
39
|
+
port: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function bareHost(value: string | undefined): string | undefined {
|
|
43
|
+
if (!value) return undefined;
|
|
44
|
+
const normalized = value.replace(/^https?:\/\//, "").split("/")[0]?.trim();
|
|
45
|
+
return normalized || undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Resolve frpc config from the public domain and FRP-specific environment. */
|
|
49
|
+
export function resolveFrpConfig(opts: {
|
|
50
|
+
publicDomain?: string;
|
|
51
|
+
server?: string;
|
|
52
|
+
serverPort?: string | number;
|
|
53
|
+
protocol?: string;
|
|
54
|
+
token?: string;
|
|
55
|
+
proxyName?: string;
|
|
56
|
+
port: number;
|
|
57
|
+
}): FrpConfig | undefined {
|
|
58
|
+
const publicDomain = bareHost(
|
|
59
|
+
config.string(
|
|
60
|
+
opts.publicDomain,
|
|
61
|
+
["FRP_PUBLIC_DOMAIN", "PUBLIC_DOMAIN"],
|
|
62
|
+
TUNNEL_CONFIG,
|
|
63
|
+
),
|
|
64
|
+
);
|
|
65
|
+
if (!publicDomain) return undefined;
|
|
66
|
+
const server = bareHost(config.string(opts.server, "FRP_SERVER")) ?? publicDomain;
|
|
67
|
+
const serverPort = config.port(opts.serverPort, "FRP_SERVER_PORT", 443);
|
|
68
|
+
const protocol = config.string(opts.protocol, "FRP_PROTOCOL") ?? "wss";
|
|
69
|
+
const token = config.string(opts.token, ["FRP_TOKEN", "TUNNEL_TOKEN"]);
|
|
70
|
+
const proxyName =
|
|
71
|
+
config.string(opts.proxyName, "FRP_PROXY_NAME") ?? publicDomain.split(".")[0] ?? "app";
|
|
72
|
+
return {
|
|
73
|
+
publicDomain,
|
|
74
|
+
server,
|
|
75
|
+
serverPort,
|
|
76
|
+
protocol,
|
|
77
|
+
...(token ? { token } : {}),
|
|
78
|
+
proxyName,
|
|
79
|
+
port: opts.port,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** GitHub release asset name for the current or supplied OS/architecture. */
|
|
84
|
+
export function frpAssetName(
|
|
85
|
+
version: string,
|
|
86
|
+
platform: NodeJS.Platform = process.platform,
|
|
87
|
+
arch: string = process.arch,
|
|
88
|
+
): string {
|
|
89
|
+
const osName = platform === "darwin" ? "darwin" : platform === "linux" ? "linux" : undefined;
|
|
90
|
+
const archName = arch === "arm64" ? "arm64" : arch === "x64" ? "amd64" : undefined;
|
|
91
|
+
if (!osName || !archName) {
|
|
92
|
+
throw new Error(`frp has no supported release asset for ${platform}/${arch}`);
|
|
93
|
+
}
|
|
94
|
+
return `frp_${version}_${osName}_${archName}.tar.gz`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function frpDownloadUrl(): string {
|
|
98
|
+
const assetName = frpAssetName(FRP_VERSION);
|
|
99
|
+
logger.info("installing frpc", { version: FRP_VERSION, asset: assetName });
|
|
100
|
+
return `${FRP_RELEASE_URL}/${assetName}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function selectFrpc(source: string): Promise<string> {
|
|
104
|
+
const path = join(source, frpArchiveDirectory(), "frpc");
|
|
105
|
+
if (process.platform === "darwin") {
|
|
106
|
+
await new Promise<void>((resolve, reject) => {
|
|
107
|
+
const signer = spawn("codesign", ["--force", "--sign", "-", path], { stdio: "ignore" });
|
|
108
|
+
signer.once("error", reject);
|
|
109
|
+
signer.once("exit", (code) =>
|
|
110
|
+
code === 0 ? resolve() : reject(new Error(`codesign exited with code ${code}`)),
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return path;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Install frpc when absent and return the environment used by its process. */
|
|
118
|
+
export async function installFrp(options: FrpInstallOptions = {}): Promise<NodeJS.ProcessEnv> {
|
|
119
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
120
|
+
const context = await bin.ensure("frpc", frpDownloadUrl, {
|
|
121
|
+
autoUnpackage: true,
|
|
122
|
+
homeDir,
|
|
123
|
+
minVersion: FRP_VERSION,
|
|
124
|
+
selector: ({ source }) => selectFrpc(source),
|
|
125
|
+
versionParser: ({ stdout, stderr }) => {
|
|
126
|
+
const version = bin.parseVersion({ stdout, stderr });
|
|
127
|
+
return version === FRP_VERSION ? version : undefined;
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
...process.env,
|
|
132
|
+
HOME: homeDir,
|
|
133
|
+
PATH: [context.binDir, process.env.PATH ?? ""].join(delimiter),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function frpArchiveDirectory(
|
|
138
|
+
platform: NodeJS.Platform = process.platform,
|
|
139
|
+
arch: string = process.arch,
|
|
140
|
+
): string {
|
|
141
|
+
return frpAssetName(FRP_VERSION, platform, arch).replace(/\.tar\.gz$/, "");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function tomlString(value: string): string {
|
|
145
|
+
return JSON.stringify(value);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Render `~/.frpc/frpc.toml` for the resolved tunnel. */
|
|
149
|
+
export async function writeFrpConfig(
|
|
150
|
+
resolved: FrpConfig,
|
|
151
|
+
childEnv: NodeJS.ProcessEnv,
|
|
152
|
+
): Promise<string> {
|
|
153
|
+
const directory = join(childEnv.HOME ?? os.homedir(), ".frpc");
|
|
154
|
+
const path = join(directory, "frpc.toml");
|
|
155
|
+
await mkdir(directory, { recursive: true });
|
|
156
|
+
const lines = [
|
|
157
|
+
`serverAddr = ${tomlString(resolved.server)}`,
|
|
158
|
+
`serverPort = ${resolved.serverPort}`,
|
|
159
|
+
`transport.protocol = ${tomlString(resolved.protocol)}`,
|
|
160
|
+
];
|
|
161
|
+
if (resolved.token) lines.push(`auth.token = ${tomlString(resolved.token)}`);
|
|
162
|
+
lines.push(
|
|
163
|
+
"",
|
|
164
|
+
"[[proxies]]",
|
|
165
|
+
`name = ${tomlString(resolved.proxyName)}`,
|
|
166
|
+
'type = "http"',
|
|
167
|
+
`localPort = ${resolved.port}`,
|
|
168
|
+
`customDomains = [${tomlString(resolved.publicDomain)}]`,
|
|
169
|
+
"",
|
|
170
|
+
);
|
|
171
|
+
await writeFile(path, lines.join("\n"));
|
|
172
|
+
return path;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Launch frpc as a child process (caller supervises and terminates it). */
|
|
176
|
+
export function startFrp(
|
|
177
|
+
resolved: FrpConfig,
|
|
178
|
+
childEnv: NodeJS.ProcessEnv,
|
|
179
|
+
configPath: string,
|
|
180
|
+
): ReturnType<typeof spawn> {
|
|
181
|
+
logger.info(`frpc tunneling https://${resolved.publicDomain} -> :${resolved.port}`);
|
|
182
|
+
return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
|
|
183
|
+
}
|