vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
122 lines (119 loc) • 20.4 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { readFileSync } from 'node:fs';
import { configureReactServer } from './configureReactServer.client.js';
import { resolveOptions } from '../config/resolveOptions.js';
import { CSS_EXT } from './collectRunnerCss.js';
import { detectClientModule } from 'react-server-loader/directives';
const vitePluginReactDevServer = function _vitePluginReactServerDevClient(options) {
if (options == null) {
throw new Error("options is required");
}
if (options.verbose) ;
const resolvedOptions = resolveOptions(options);
if (resolvedOptions.type === "error") {
if (resolvedOptions.error != null) {
throw resolvedOptions.error;
}
throw new Error("Failed to resolve options");
}
const userOptions = resolvedOptions.userOptions;
let configEnv;
let hmrHandler = null;
let isProcessingHmr = false;
return {
name: "vite-plugin-react-server:dev-server-client",
apply: "serve",
// Only apply in dev server mode
// No applyToEnvironment — hotUpdate needs to run for all environments
// that should work regardless of environment filtering
config(_config, viteConfigEnv) {
configEnv = viteConfigEnv;
},
configureServer(server) {
server.config.logger.info(`[vite-plugin-react-server] Dev server plugin configured for client environment`);
hmrHandler = configureReactServer({
server,
autoDiscoveredFiles: {
propsMap: /* @__PURE__ */ new Map(),
pageMap: /* @__PURE__ */ new Map(),
rootMap: /* @__PURE__ */ new Map(),
htmlMap: /* @__PURE__ */ new Map(),
routeMap: /* @__PURE__ */ new Map(),
urlMap: /* @__PURE__ */ new Map(),
errors: [],
workerPaths: {},
serverEntry: null,
clientEntry: {},
clientInputs: {},
staticInputs: {},
serverInputs: {},
// staticManifest removed from AutoDiscoveredFiles
serverActions: {}
},
userOptions,
configEnv,
serverManifest: {},
resolvedConfig: server.config
});
},
hotUpdate(ctx) {
const { file, server } = ctx;
const envName = ctx.environment?.name ?? "unknown";
if (envName !== "client") return;
if (isProcessingHmr) {
return void 0;
}
const moduleBase = userOptions.moduleBase || "src";
const projectRoot = userOptions.projectRoot || server.config.root;
const normalizedFile = file.replace(projectRoot, "").replace(/^\/+/, "");
const isInModuleBase = normalizedFile.startsWith(moduleBase + "/");
const isSourceFile = isInModuleBase && (file.endsWith(".tsx") || file.endsWith(".ts") || file.endsWith(".jsx") || file.endsWith(".js"));
const isCssFile = isInModuleBase && CSS_EXT.test(file);
const isClientFile = isSourceFile && (() => {
try {
const source = readFileSync(file, "utf-8");
return detectClientModule({ source, moduleId: file });
} catch {
return false;
}
})();
const isClientGraphCss = isCssFile && (ctx.modules?.length ?? 0) > 0;
if (isClientGraphCss) {
return;
}
const isServerFile = isSourceFile && !isClientFile;
const shouldInvalidateWorker = isServerFile || isCssFile;
if (shouldInvalidateWorker && hmrHandler) {
isProcessingHmr = true;
try {
if (userOptions.verbose) {
server.config.logger.info(`[vite-plugin-react-server] File changed: ${file}, sending HMR update...`);
}
hmrHandler.sendHmrUpdate(file);
server.ws.send({
type: "custom",
event: "vite-plugin-react-server:server-component-update",
data: { file: normalizedFile, path: file, kind: isCssFile ? "css" : "component" }
});
setTimeout(() => {
isProcessingHmr = false;
}, 100);
} catch (error) {
server.config.logger.error(`[vite-plugin-react-server] Error handling HMR update: ${error}`);
isProcessingHmr = false;
}
if (isCssFile) return [];
} else if (shouldInvalidateWorker && !hmrHandler) {
if (userOptions.verbose) {
server.config.logger.warn(`[vite-plugin-react-server] Source file changed but HMR handler not available yet: ${file}`);
}
}
}
};
};
export { vitePluginReactDevServer };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvcGx1Z2luLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHR5cGUgeyBWaXRlUGx1Z2luRm4gfSBmcm9tIFwiLi4vLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNvbmZpZ3VyZVJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlndXJlUmVhY3RTZXJ2ZXIuY2xpZW50LmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZU9wdGlvbnMuanNcIjtcbmltcG9ydCB7IENTU19FWFQgfSBmcm9tIFwiLi9jb2xsZWN0UnVubmVyQ3NzLmpzXCI7XG5pbXBvcnQgeyBkZXRlY3RDbGllbnRNb2R1bGUgfSBmcm9tIFwicmVhY3Qtc2VydmVyLWxvYWRlci9kaXJlY3RpdmVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ0VudiB9IGZyb20gXCJ2aXRlXCI7XG5cblxuLyoqXG4gKiBEZXYgc2VydmVyIHBsdWdpbiBmb3IgY2xpZW50IGVudmlyb25tZW50LlxuICogVXNlcyBjb25maWd1cmVTZXJ2ZXIgaG9vayBmb3IgcHJvcGVyIGRldiBzZXJ2ZXIgc2V0dXAuXG4gKi9cbmV4cG9ydCBjb25zdCB2aXRlUGx1Z2luUmVhY3REZXZTZXJ2ZXI6IFZpdGVQbHVnaW5GbiA9IGZ1bmN0aW9uIF92aXRlUGx1Z2luUmVhY3RTZXJ2ZXJEZXZDbGllbnQob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgfVxuICBcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZE9wdGlvbnMudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgaWYgKHJlc29sdmVkT3B0aW9ucy5lcnJvciAhPSBudWxsKSB7XG4gICAgICB0aHJvdyByZXNvbHZlZE9wdGlvbnMuZXJyb3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXNvbHZlIG9wdGlvbnNcIik7XG4gIH1cbiAgY29uc3QgdXNlck9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnMudXNlck9wdGlvbnM7XG4gIFxuXG4gIGxldCBjb25maWdFbnY6IENvbmZpZ0VudiB8IHVuZGVmaW5lZDtcbiAgbGV0IGhtckhhbmRsZXI6IHsgc2VuZEhtclVwZGF0ZTogKGZpbGU6IHN0cmluZywgcm91dGVzPzogc3RyaW5nW10pID0+IHZvaWQgfSB8IG51bGwgPSBudWxsO1xuICBsZXQgaXNQcm9jZXNzaW5nSG1yID0gZmFsc2U7IC8vIFByZXZlbnQgcmVjdXJzaXZlIEhNUiB1cGRhdGVzXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcInZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcjpkZXYtc2VydmVyLWNsaWVudFwiLFxuICAgIGFwcGx5OiBcInNlcnZlXCIsIC8vIE9ubHkgYXBwbHkgaW4gZGV2IHNlcnZlciBtb2RlXG4gICAgLy8gTm8gYXBwbHlUb0Vudmlyb25tZW50IOKAlCBob3RVcGRhdGUgbmVlZHMgdG8gcnVuIGZvciBhbGwgZW52aXJvbm1lbnRzXG4gICAgLy8gdGhhdCBzaG91bGQgd29yayByZWdhcmRsZXNzIG9mIGVudmlyb25tZW50IGZpbHRlcmluZ1xuICAgIGNvbmZpZyhfY29uZmlnLCB2aXRlQ29uZmlnRW52KSB7XG4gICAgICBjb25maWdFbnYgPSB2aXRlQ29uZmlnRW52O1xuICBcbiAgICB9LFxuICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXIpIHsgICAgICBcbiAgICAgIC8vIExvZyB0aGF0IHBsdWdpbiBpcyBiZWluZyBjb25maWd1cmVkXG4gICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBEZXYgc2VydmVyIHBsdWdpbiBjb25maWd1cmVkIGZvciBjbGllbnQgZW52aXJvbm1lbnRgKTtcbiAgICAgIFxuICAgICAgLy8gQ29uZmlndXJlIHRoZSBSZWFjdCBzZXJ2ZXIgZm9yIGNsaWVudCBlbnZpcm9ubWVudCAod29ya2VyLWJhc2VkKVxuICAgICAgLy8gVGhpcyB1c2VzIHRoZSBleGlzdGluZyBjb25maWd1cmVSZWFjdFNlcnZlci5jbGllbnQuanMgaW1wbGVtZW50YXRpb25cbiAgICAgIGhtckhhbmRsZXIgPSBjb25maWd1cmVSZWFjdFNlcnZlcih7XG4gICAgICAgIHNlcnZlcixcbiAgICAgICAgYXV0b0Rpc2NvdmVyZWRGaWxlczoge1xuICAgICAgICAgIHByb3BzTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgcGFnZU1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHJvb3RNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICBodG1sTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgcm91dGVNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICB1cmxNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgIHdvcmtlclBhdGhzOiB7fSxcbiAgICAgICAgICBzZXJ2ZXJFbnRyeTogbnVsbCxcbiAgICAgICAgICBjbGllbnRFbnRyeToge30sXG4gICAgICAgICAgY2xpZW50SW5wdXRzOiB7fSxcbiAgICAgICAgICBzdGF0aWNJbnB1dHM6IHt9LFxuICAgICAgICAgIHNlcnZlcklucHV0czoge30sXG4gICAgICAgICAgLy8gc3RhdGljTWFuaWZlc3QgcmVtb3ZlZCBmcm9tIEF1dG9EaXNjb3ZlcmVkRmlsZXNcbiAgICAgICAgICBzZXJ2ZXJBY3Rpb25zOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgdXNlck9wdGlvbnMsXG4gICAgICAgIGNvbmZpZ0VudjogY29uZmlnRW52ISxcbiAgICAgICAgc2VydmVyTWFuaWZlc3Q6IHt9LCBcbiAgICAgICAgcmVzb2x2ZWRDb25maWc6IHNlcnZlci5jb25maWcsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhvdFVwZGF0ZShjdHg6IGFueSkge1xuICAgICAgY29uc3QgeyBmaWxlLCBzZXJ2ZXIgfSA9IGN0eDtcbiAgICAgIGNvbnN0IGVudk5hbWUgPSBjdHguZW52aXJvbm1lbnQ/Lm5hbWUgPz8gJ3Vua25vd24nO1xuICAgICAgXG4gICAgICAvLyBPbmx5IHJ1biB3b3JrZXIgaW52YWxpZGF0aW9uIGZyb20gdGhlIGNsaWVudCBlbnZpcm9ubWVudCAob25jZSBwZXIgY2hhbmdlKVxuICAgICAgaWYgKGVudk5hbWUgIT09ICdjbGllbnQnKSByZXR1cm47XG4gICAgICBcbiAgICAgIC8vIFByZXZlbnQgcmVjdXJzaXZlIEhNUiB1cGRhdGVzXG4gICAgICBpZiAoaXNQcm9jZXNzaW5nSG1yKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBzZXJ2ZXIgY29tcG9uZW50IGZpbGUgY2hhbmdlc1xuICAgICAgY29uc3QgbW9kdWxlQmFzZSA9IHVzZXJPcHRpb25zLm1vZHVsZUJhc2UgfHwgXCJzcmNcIjtcbiAgICAgIGNvbnN0IHByb2plY3RSb290ID0gdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgc2VydmVyLmNvbmZpZy5yb290O1xuICAgICAgXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aHMgZm9yIGNvbXBhcmlzb24gKGhhbmRsZSBib3RoIGFic29sdXRlIGFuZCByZWxhdGl2ZSlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gZmlsZS5yZXBsYWNlKHByb2plY3RSb290LCAnJykucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gICAgICBjb25zdCBpc0luTW9kdWxlQmFzZSA9IG5vcm1hbGl6ZWRGaWxlLnN0YXJ0c1dpdGgobW9kdWxlQmFzZSArICcvJyk7XG4gICAgICBjb25zdCBpc1NvdXJjZUZpbGUgPSBpc0luTW9kdWxlQmFzZSAmJlxuICAgICAgICAoZmlsZS5lbmRzV2l0aCgnLnRzeCcpIHx8IGZpbGUuZW5kc1dpdGgoJy50cycpIHx8IGZpbGUuZW5kc1dpdGgoJy5qc3gnKSB8fCBmaWxlLmVuZHNXaXRoKCcuanMnKSk7XG4gICAgICAvLyBDU1MgZWRpdHMgcm91dGUgdGhyb3VnaCB0aGUgc2FtZSB3b3JrZXItaW52YWxpZGF0aW9uIHBhdGggc28gdGhlXG4gICAgICAvLyBNb2R1bGVSdW5uZXIgY2FjaGUgZHJvcHMgZXZlcnkgcmVhY2hhYmxlIENTUyBtb2R1bGUgYmVmb3JlIHRoZVxuICAgICAgLy8gbmV4dCByZW5kZXIgYXNrcyBmb3IgY2xhc3MtbmFtZSBoYXNoZXMuXG4gICAgICBjb25zdCBpc0Nzc0ZpbGUgPSBpc0luTW9kdWxlQmFzZSAmJiBDU1NfRVhULnRlc3QoZmlsZSk7XG5cbiAgICAgIC8vIFNraXAgY2xpZW50IGNvbXBvbmVudHMg4oCUIFZpdGUgb3ducyBjbGllbnQtc2lkZSBITVIgKEZhc3QgUmVmcmVzaFxuICAgICAgLy8gd2hlbiBgQHZpdGVqcy9wbHVnaW4tcmVhY3RgIGlzIGluc3RhbGxlZCwgcGxhaW4gcmVsb2FkIG90aGVyd2lzZSkuXG4gICAgICAvLyBXb3JrZXIgaW52YWxpZGF0aW9uIGlzIGZvciB0aGUgc2VydmVyIHRyZWUuXG4gICAgICBjb25zdCBpc0NsaWVudEZpbGUgPSBpc1NvdXJjZUZpbGUgJiYgKCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoZmlsZSwgXCJ1dGYtOFwiKTtcbiAgICAgICAgICByZXR1cm4gZGV0ZWN0Q2xpZW50TW9kdWxlKHsgc291cmNlLCBtb2R1bGVJZDogZmlsZSB9KTtcbiAgICAgICAgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgfSkoKTtcblxuICAgICAgLy8gQSBDU1MgbW9kdWxlIGltcG9ydGVkIHRyYW5zaXRpdmVseSBieSBhIFwidXNlIGNsaWVudFwiIGNvbXBvbmVudCBsaXZlc1xuICAgICAgLy8gaW4gdGhlIENMSUVOVCBtb2R1bGUgZ3JhcGggKHRoZSBicm93c2VyIGZldGNoZXMgaXQgZGlyZWN0bHkgYW5kIFZpdGVcbiAgICAgIC8vIGluamVjdHMgaXQgYXMgYSA8c3R5bGU+KSwgc28gVml0ZSdzIG5hdGl2ZSBDU1MgSE1SIGFscmVhZHkgdXBkYXRlcyBpdFxuICAgICAgLy8gaW4gcGxhY2Ug4oCUIG5vIHJlbG9hZCwgbm8gPGxpbms+IGNhY2hlLWJ1c3QuIERldGVjdCB0aGF0IGNhc2UgYnkgdGhlXG4gICAgICAvLyBwcmVzZW5jZSBvZiBjbGllbnQtZW52aXJvbm1lbnQgbW9kdWxlcyBmb3IgdGhpcyBmaWxlIGFuZCBoYW5kIHRoZVxuICAgICAgLy8gdXBkYXRlIGJhY2sgdG8gVml0ZSBieSByZXR1cm5pbmcgdW5kZWZpbmVkLiBUaGlzIGlzIHRoZSBkZXY6c3NyXG4gICAgICAvLyBjb3VudGVycGFydCB0byB0aGUgIzk2IGZpeCBpbiBwbHVnaW4uc2VydmVyLnRzOiB0aGF0IGZpeCBvbmx5IHRha2VzXG4gICAgICAvLyBlZmZlY3Qgb24gdGhlIGRldjpyc2MgbWFpbiB0aHJlYWQgKGNyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvci5zZXJ2ZXIuanNcbiAgICAgIC8vIC0+IHBsdWdpbi5zZXJ2ZXIudHMpLiBkZXY6c3NyIGxvYWRzIHBsdWdpbi5jbGllbnQudHMgaW5zdGVhZCwgc29cbiAgICAgIC8vIHdpdGhvdXQgdGhpcyBicmFuY2ggY2xpZW50LWdyYXBoIENTUyBmYWxscyBpbnRvIHRoZSBgcmV0dXJuIFtdYFxuICAgICAgLy8gc3VwcHJlc3Npb24gYmVsb3cgYW5kIFZpdGUncyBuYXRpdmUgQ1NTIEhNUiBuZXZlciBmaXJlcyDigJQgbGVhdmluZyB0aGVcbiAgICAgIC8vIGVkaXQgc3R1Y2sgdW50aWwgYSBtYW51YWwgcmVmcmVzaC5cbiAgICAgIGNvbnN0IGlzQ2xpZW50R3JhcGhDc3MgPSBpc0Nzc0ZpbGUgJiYgKGN0eC5tb2R1bGVzPy5sZW5ndGggPz8gMCkgPiAwO1xuICAgICAgaWYgKGlzQ2xpZW50R3JhcGhDc3MpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBsZXQgVml0ZSdzIG5hdGl2ZSBjbGllbnQgQ1NTIEhNUiBhcHBseSB0aGUgdXBkYXRlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzU2VydmVyRmlsZSA9IGlzU291cmNlRmlsZSAmJiAhaXNDbGllbnRGaWxlO1xuICAgICAgY29uc3Qgc2hvdWxkSW52YWxpZGF0ZVdvcmtlciA9IGlzU2VydmVyRmlsZSB8fCBpc0Nzc0ZpbGU7XG5cbiAgICAgIGlmIChzaG91bGRJbnZhbGlkYXRlV29ya2VyICYmIGhtckhhbmRsZXIpIHtcbiAgICAgICAgaXNQcm9jZXNzaW5nSG1yID0gdHJ1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBGaWxlIGNoYW5nZWQ6ICR7ZmlsZX0sIHNlbmRpbmcgSE1SIHVwZGF0ZS4uLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRlbGwgdGhlIHdvcmtlciB0byBpbnZhbGlkYXRlLiBJdHMgSE1SX1VQREFURSBoYW5kbGVyIGNsZWFycyB0aGVcbiAgICAgICAgICAvLyBNb2R1bGVSdW5uZXIgY2FjaGUgc28gdGhlIG5leHQgaW1wb3J0IHJlLWZldGNoZXMgdHJhbnNmb3JtZWQgY29kZVxuICAgICAgICAgIC8vIHRocm91Z2ggVml0ZSDigJQgbm8gd29ya2VyIHJlc3RhcnQgbmVlZGVkLlxuICAgICAgICAgIGhtckhhbmRsZXIuc2VuZEhtclVwZGF0ZShmaWxlKTtcblxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgYnJvd3NlciB0byByZWZldGNoIHRoZSBSU0Mgc3RyZWFtLiBJbiBkZXY6cnNjIHRoZVxuICAgICAgICAgIC8vIGVxdWl2YWxlbnQgc2VuZCBsaXZlcyBpbiBwbHVnaW4uc2VydmVyLnRzJ3MgaG1yUGx1Z2luLCB3aGljaCBvbmx5XG4gICAgICAgICAgLy8gcnVucyB1bmRlciB0aGUgcmVhY3Qtc2VydmVyIG9yY2hlc3RyYXRvci4gZGV2OnNzciAodGhpcyBwbHVnaW4pXG4gICAgICAgICAgLy8gbmV2ZXIgbG9hZHMgdGhhdCBvcmNoZXN0cmF0b3IsIHNvIHdpdGhvdXQgc2VuZGluZyB0aGUgZXZlbnQgaGVyZVxuICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaW52YWxpZGF0ZXMgY29ycmVjdGx5IGJ1dCB0aGUgYnJvd3NlciBrZWVwcyBzaG93aW5nXG4gICAgICAgICAgLy8gcHJlLWVkaXQgY29udGVudCDigJQgYHVzZVJzY0htcmAgbGlzdGVucyBmb3IgdGhpcyBldmVudCBhbmQgb25seVxuICAgICAgICAgIC8vIHJlZmV0Y2hlcyBvbiByZWNlaXB0LiBGb3IgQ1NTIGZpbGVzIHRoZSBjb25zdW1lcidzIDxsaW5rPiB0YWdcbiAgICAgICAgICAvLyBzdGlsbCBwb2ludHMgYXQgdGhlIHNhbWUgVVJMIGFmdGVyIHRoZSBlZGl0LCBzbyB3ZSB0YWcgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gc28gdGhlIGNsaWVudCBhbHNvIGNhY2hlLWJ1c3RzIG1hdGNoaW5nIHN0eWxlc2hlZXRzLlxuICAgICAgICAgIHNlcnZlci53cy5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBldmVudDogXCJ2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6c2VydmVyLWNvbXBvbmVudC11cGRhdGVcIixcbiAgICAgICAgICAgIGRhdGE6IHsgZmlsZTogbm9ybWFsaXplZEZpbGUsIHBhdGg6IGZpbGUsIGtpbmQ6IGlzQ3NzRmlsZSA/IFwiY3NzXCIgOiBcImNvbXBvbmVudFwiIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUaGUgcnVubmVyIHRha2VzIGNhcmUgb2YgcGVyLW1vZHVsZSBpbnZhbGlkYXRpb24sIHNvIHRoZSBvbmx5XG4gICAgICAgICAgLy8gdGhpbmcgbGVmdCB0byBjbGVhciBoZXJlIGlzIHRoZSBsb2NhbCBwcm9jZXNzaW5nIGZsYWcuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpc1Byb2Nlc3NpbmdIbXIgPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmVycm9yKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBFcnJvciBoYW5kbGluZyBITVIgdXBkYXRlOiAke2Vycm9yfWApO1xuICAgICAgICAgIGlzUHJvY2Vzc2luZ0htciA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIENTUyBlZGl0cyBpbiBkZXY6c3NyLCBzdXBwcmVzcyBWaXRlJ3MgZGVmYXVsdCBiZWhhdmlvci4gVml0ZSdzXG4gICAgICAgIC8vIGZhbGxiYWNrIGZvciBtb2R1bGUtZ3JhcGgtdW50cmFja2VkIENTUyBpcyBhIGZ1bGwgcGFnZSByZWxvYWQsIGFuZFxuICAgICAgICAvLyBldmVuIHRyYWNrZWQgQ1NTIG1vZHVsZXMgaW4gZGV2OnNzciBjYW4gZmFsbCBiYWNrIHRvIHJlbG9hZCBiZWNhdXNlXG4gICAgICAgIC8vIHZwcnMgcmVuZGVycyB0aGVtIHNlcnZlci1zaWRlIHZpYSB0aGUgPENzcyBjc3NGaWxlcz17Li4ufS8+IHBhdHRlcm5cbiAgICAgICAgLy8gKHRoZSBjbGllbnQgbmV2ZXIgZGlyZWN0bHkgaW1wb3J0cyB0aGVtLCBzbyBWaXRlJ3MgQ1NTIEhNUiBpc24ndFxuICAgICAgICAvLyByZWFjaGFibGUpLiB1c2VSc2NIbXIgaGFuZGxlcyBib3RoIHNoYXBlczpcbiAgICAgICAgLy8gIC0gaW5saW5lZCA8c3R5bGU+OiByZWZldGNoIGJyaW5ncyBuZXcgY29udGVudFxuICAgICAgICAvLyAgLSA8bGluayBocmVmPeKApj46ICAgcmVmcmVzaENzc0xpbmtzIGNhY2hlLWJ1c3RzIHRoZSBVUkxcbiAgICAgICAgaWYgKGlzQ3NzRmlsZSkgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJbnZhbGlkYXRlV29ya2VyICYmICFobXJIYW5kbGVyKSB7XG4gICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIud2FybihgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gU291cmNlIGZpbGUgY2hhbmdlZCBidXQgSE1SIGhhbmRsZXIgbm90IGF2YWlsYWJsZSB5ZXQ6ICR7ZmlsZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBzdXBwcmVzcyDigJQgcGx1Z2luLnNlcnZlci50cyBob3RVcGRhdGUgaGFuZGxlcyBwYWdlIHJlbG9hZCBwcmV2ZW50aW9uXG4gICAgfSxcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhYSxNQUFBLHdCQUFBLEdBQXlDLFNBQVMsK0JBQUEsQ0FBZ0MsT0FBUyxFQUFBO0FBQ3RHLEVBQUEsSUFBSSxXQUFXLElBQU0sRUFBQTtBQUNuQixJQUFNLE1BQUEsSUFBSSxNQUFNLHFCQUFxQixDQUFBO0FBQUE7QUFHdkMsRUFBQSxJQUFJLFFBQVEsT0FBUyxFQUFBO0FBR3JCLEVBQU0sTUFBQSxlQUFBLEdBQWtCLGVBQWUsT0FBTyxDQUFBO0FBQzlDLEVBQUksSUFBQSxlQUFBLENBQWdCLFNBQVMsT0FBUyxFQUFBO0FBQ3BDLElBQUksSUFBQSxlQUFBLENBQWdCLFNBQVMsSUFBTSxFQUFBO0FBQ2pDLE1BQUEsTUFBTSxlQUFnQixDQUFBLEtBQUE7QUFBQTtBQUV4QixJQUFNLE1BQUEsSUFBSSxNQUFNLDJCQUEyQixDQUFBO0FBQUE7QUFFN0MsRUFBQSxNQUFNLGNBQWMsZUFBZ0IsQ0FBQSxXQUFBO0FBR3BDLEVBQUksSUFBQSxTQUFBO0FBQ0osRUFBQSxJQUFJLFVBQWtGLEdBQUEsSUFBQTtBQUN0RixFQUFBLElBQUksZUFBa0IsR0FBQSxLQUFBO0FBRXRCLEVBQU8sT0FBQTtBQUFBLElBQ0wsSUFBTSxFQUFBLDRDQUFBO0FBQUEsSUFDTixLQUFPLEVBQUEsT0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBR1AsTUFBQSxDQUFPLFNBQVMsYUFBZSxFQUFBO0FBQzdCLE1BQVksU0FBQSxHQUFBLGFBQUE7QUFBQSxLQUVkO0FBQUEsSUFDQSxnQkFBZ0IsTUFBUSxFQUFBO0FBRXRCLE1BQU8sTUFBQSxDQUFBLE1BQUEsQ0FBTyxNQUFPLENBQUEsSUFBQSxDQUFLLENBQWdGLDhFQUFBLENBQUEsQ0FBQTtBQUkxRyxNQUFBLFVBQUEsR0FBYSxvQkFBcUIsQ0FBQTtBQUFBLFFBQ2hDLE1BQUE7QUFBQSxRQUNBLG1CQUFxQixFQUFBO0FBQUEsVUFDbkIsUUFBQSxzQkFBYyxHQUFJLEVBQUE7QUFBQSxVQUNsQixPQUFBLHNCQUFhLEdBQUksRUFBQTtBQUFBLFVBQ2pCLE9BQUEsc0JBQWEsR0FBSSxFQUFBO0FBQUEsVUFDakIsT0FBQSxzQkFBYSxHQUFJLEVBQUE7QUFBQSxVQUNqQixRQUFBLHNCQUFjLEdBQUksRUFBQTtBQUFBLFVBQ2xCLE1BQUEsc0JBQVksR0FBSSxFQUFBO0FBQUEsVUFDaEIsUUFBUSxFQUFDO0FBQUEsVUFDVCxhQUFhLEVBQUM7QUFBQSxVQUNkLFdBQWEsRUFBQSxJQUFBO0FBQUEsVUFDYixhQUFhLEVBQUM7QUFBQSxVQUNkLGNBQWMsRUFBQztBQUFBLFVBQ2YsY0FBYyxFQUFDO0FBQUEsVUFDZixjQUFjLEVBQUM7QUFBQTtBQUFBLFVBRWYsZUFBZTtBQUFDLFNBQ2xCO0FBQUEsUUFDQSxXQUFBO0FBQUEsUUFDQSxTQUFBO0FBQUEsUUFDQSxnQkFBZ0IsRUFBQztBQUFBLFFBQ2pCLGdCQUFnQixNQUFPLENBQUE7QUFBQSxPQUN4QixDQUFBO0FBQUEsS0FDSDtBQUFBLElBQ0EsVUFBVSxHQUFVLEVBQUE7QUFDbEIsTUFBTSxNQUFBLEVBQUUsSUFBTSxFQUFBLE1BQUEsRUFBVyxHQUFBLEdBQUE7QUFDekIsTUFBTSxNQUFBLE9BQUEsR0FBVSxHQUFJLENBQUEsV0FBQSxFQUFhLElBQVEsSUFBQSxTQUFBO0FBR3pDLE1BQUEsSUFBSSxZQUFZLFFBQVUsRUFBQTtBQUcxQixNQUFBLElBQUksZUFBaUIsRUFBQTtBQUNuQixRQUFPLE9BQUEsTUFBQTtBQUFBO0FBSVQsTUFBTSxNQUFBLFVBQUEsR0FBYSxZQUFZLFVBQWMsSUFBQSxLQUFBO0FBQzdDLE1BQUEsTUFBTSxXQUFjLEdBQUEsV0FBQSxDQUFZLFdBQWUsSUFBQSxNQUFBLENBQU8sTUFBTyxDQUFBLElBQUE7QUFHN0QsTUFBTSxNQUFBLGNBQUEsR0FBaUIsS0FBSyxPQUFRLENBQUEsV0FBQSxFQUFhLEVBQUUsQ0FBRSxDQUFBLE9BQUEsQ0FBUSxRQUFRLEVBQUUsQ0FBQTtBQUN2RSxNQUFBLE1BQU0sY0FBaUIsR0FBQSxjQUFBLENBQWUsVUFBVyxDQUFBLFVBQUEsR0FBYSxHQUFHLENBQUE7QUFDakUsTUFBQSxNQUFNLGVBQWUsY0FDbEIsS0FBQSxJQUFBLENBQUssUUFBUyxDQUFBLE1BQU0sS0FBSyxJQUFLLENBQUEsUUFBQSxDQUFTLEtBQUssQ0FBQSxJQUFLLEtBQUssUUFBUyxDQUFBLE1BQU0sQ0FBSyxJQUFBLElBQUEsQ0FBSyxTQUFTLEtBQUssQ0FBQSxDQUFBO0FBSWhHLE1BQUEsTUFBTSxTQUFZLEdBQUEsY0FBQSxJQUFrQixPQUFRLENBQUEsSUFBQSxDQUFLLElBQUksQ0FBQTtBQUtyRCxNQUFNLE1BQUEsWUFBQSxHQUFlLGlCQUFpQixNQUFNO0FBQzFDLFFBQUksSUFBQTtBQUNGLFVBQU0sTUFBQSxNQUFBLEdBQVMsWUFBYSxDQUFBLElBQUEsRUFBTSxPQUFPLENBQUE7QUFDekMsVUFBQSxPQUFPLGtCQUFtQixDQUFBLEVBQUUsTUFBUSxFQUFBLFFBQUEsRUFBVSxNQUFNLENBQUE7QUFBQSxTQUM5QyxDQUFBLE1BQUE7QUFBRSxVQUFPLE9BQUEsS0FBQTtBQUFBO0FBQU8sT0FDdkIsR0FBQTtBQWNILE1BQUEsTUFBTSxnQkFBbUIsR0FBQSxTQUFBLElBQUEsQ0FBYyxHQUFJLENBQUEsT0FBQSxFQUFTLFVBQVUsQ0FBSyxJQUFBLENBQUE7QUFDbkUsTUFBQSxJQUFJLGdCQUFrQixFQUFBO0FBQ3BCLFFBQUE7QUFBQTtBQUdGLE1BQU0sTUFBQSxZQUFBLEdBQWUsZ0JBQWdCLENBQUMsWUFBQTtBQUN0QyxNQUFBLE1BQU0seUJBQXlCLFlBQWdCLElBQUEsU0FBQTtBQUUvQyxNQUFBLElBQUksMEJBQTBCLFVBQVksRUFBQTtBQUN4QyxRQUFrQixlQUFBLEdBQUEsSUFBQTtBQUVsQixRQUFJLElBQUE7QUFDRixVQUFBLElBQUksWUFBWSxPQUFTLEVBQUE7QUFDdkIsWUFBQSxNQUFBLENBQU8sTUFBTyxDQUFBLE1BQUEsQ0FBTyxJQUFLLENBQUEsQ0FBQSx5Q0FBQSxFQUE0QyxJQUFJLENBQXlCLHVCQUFBLENBQUEsQ0FBQTtBQUFBO0FBTXJHLFVBQUEsVUFBQSxDQUFXLGNBQWMsSUFBSSxDQUFBO0FBVzdCLFVBQUEsTUFBQSxDQUFPLEdBQUcsSUFBSyxDQUFBO0FBQUEsWUFDYixJQUFNLEVBQUEsUUFBQTtBQUFBLFlBQ04sS0FBTyxFQUFBLGtEQUFBO0FBQUEsWUFDUCxJQUFBLEVBQU0sRUFBRSxJQUFNLEVBQUEsY0FBQSxFQUFnQixNQUFNLElBQU0sRUFBQSxJQUFBLEVBQU0sU0FBWSxHQUFBLEtBQUEsR0FBUSxXQUFZO0FBQUEsV0FDakYsQ0FBQTtBQUlELFVBQUEsVUFBQSxDQUFXLE1BQU07QUFDZixZQUFrQixlQUFBLEdBQUEsS0FBQTtBQUFBLGFBQ2pCLEdBQUcsQ0FBQTtBQUFBLGlCQUNDLEtBQU8sRUFBQTtBQUNkLFVBQUEsTUFBQSxDQUFPLE1BQU8sQ0FBQSxNQUFBLENBQU8sS0FBTSxDQUFBLENBQUEsc0RBQUEsRUFBeUQsS0FBSyxDQUFFLENBQUEsQ0FBQTtBQUMzRixVQUFrQixlQUFBLEdBQUEsS0FBQTtBQUFBO0FBV3BCLFFBQUksSUFBQSxTQUFBLFNBQWtCLEVBQUM7QUFBQSxPQUN6QixNQUFBLElBQVcsc0JBQTBCLElBQUEsQ0FBQyxVQUFZLEVBQUE7QUFDaEQsUUFBQSxJQUFJLFlBQVksT0FBUyxFQUFBO0FBQ3ZCLFVBQUEsTUFBQSxDQUFPLE1BQU8sQ0FBQSxNQUFBLENBQU8sSUFBSyxDQUFBLENBQUEsa0ZBQUEsRUFBcUYsSUFBSSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBQ3ZIO0FBQ0Y7QUFHRixHQUNGO0FBQ0Y7Ozs7In0=