UNPKG

vite-plugin-react-server

Version:
254 lines (252 loc) 30.8 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { parentPort, workerData, MessageChannel } from 'node:worker_threads'; import { messageHandler } from './messageHandler.server.js'; import { register } from 'node:module'; import { register as register$1 } from 'tsx/esm/api'; import { resolve } from 'node:path'; import { pluginRoot } from '../../root.js'; import { DEFAULT_CONFIG } from '../../config/defaults.js'; import { createLogger } from 'vite'; import { handleError } from '../../error/handleError.js'; import { sendMessage } from '../sendMessage.js'; import { setMaxListenersOnPort, unrefPort } from '../../stream/setMaxListeners.js'; if (!parentPort) { throw new Error("This module must be run as a worker"); } const logger = createLogger(workerData.resolvedConfig?.logLevel ?? "info", { prefix: "rsc-worker" }); const cssLoaderMessageHandler = (msg) => { messageHandler(msg); }; const envLoaderMessageHandler = (msg) => { messageHandler(msg); }; const reactLoaderMessageHandler = (msg) => { messageHandler(msg); }; try { const isBuildMode = workerData.configEnv?.command === "build"; if (isBuildMode) { logger.info("Build mode detected - skipping loader registration since files are already built"); } else { logger.info("Development/test mode detected - registering loaders for source file processing"); } const reactLoaderChannel = new MessageChannel(); const cssLoaderChannel = new MessageChannel(); const envLoaderChannel = new MessageChannel(); setMaxListenersOnPort(reactLoaderChannel.port1, 500); setMaxListenersOnPort(reactLoaderChannel.port2, 500); setMaxListenersOnPort(cssLoaderChannel.port1, 500); setMaxListenersOnPort(cssLoaderChannel.port2, 500); setMaxListenersOnPort(envLoaderChannel.port1, 500); setMaxListenersOnPort(envLoaderChannel.port2, 500); unrefPort(reactLoaderChannel.port1); unrefPort(reactLoaderChannel.port2); unrefPort(cssLoaderChannel.port1); unrefPort(cssLoaderChannel.port2); unrefPort(envLoaderChannel.port1); unrefPort(envLoaderChannel.port2); if (!isBuildMode) { reactLoaderChannel.port2.on("message", reactLoaderMessageHandler); reactLoaderChannel.port2.on("messageerror", (error) => { logger.error("React loader message serialization failed.", { error }); if (parentPort) { parentPort.postMessage({ type: "ERROR", id: "react-loader", error: { message: "Message serialization failed in react loader", name: "MessageError", stack: void 0 } }); } }); cssLoaderChannel.port2.on("message", cssLoaderMessageHandler); cssLoaderChannel.port2.on("messageerror", (error) => { logger.error("CSS loader message serialization failed.", { error }); if (parentPort) { parentPort.postMessage({ type: "ERROR", id: "css-loader", error: { message: "Message serialization failed in CSS loader", name: "MessageError", stack: void 0 } }); } }); envLoaderChannel.port2.on("message", envLoaderMessageHandler); envLoaderChannel.port2.on("messageerror", (error) => { logger.error("Env loader message serialization failed.", { error }); if (parentPort) { parentPort.postMessage({ type: "ERROR", id: "env-loader", error: { message: "Message serialization failed in env loader", name: "MessageError", stack: void 0 } }); } }); } const root = workerData.userOptions?.projectRoot || workerData.resolvedConfig?.root || process.cwd(); const reactLoaderPath = "file://" + (workerData.userOptions.reactLoaderPath ? resolve( root, workerData.userOptions.reactLoaderPath ) : resolve( root, DEFAULT_CONFIG.REACT_LOADER_PATH )); logger.info(`Using reactLoaderPath: ${reactLoaderPath}`); const cssLoaderPath = "file://" + (workerData.userOptions.cssLoaderPath ? resolve( root, workerData.userOptions.cssLoaderPath ) : resolve( root, DEFAULT_CONFIG.CSS_LOADER_PATH )); const envLoaderPath = "file://" + (workerData.userOptions.envLoaderPath ? resolve( root, workerData.userOptions.envLoaderPath ) : resolve( root, DEFAULT_CONFIG.ENV_LOADER_PATH )); if (!isBuildMode) { try { register(cssLoaderPath, { parentURL: pluginRoot, data: { id: "css-loader", port: cssLoaderChannel.port1, userOptions: workerData.userOptions, resolvedConfig: workerData.resolvedConfig }, transferList: [cssLoaderChannel.port1] }); } catch (err) { const handledError = handleError({ error: err, logger, panicThreshold: workerData.userOptions.panicThreshold, context: `register(${cssLoaderPath})` }); if (handledError != null) throw handledError; } register$1(); try { register(reactLoaderPath, { parentURL: pluginRoot, data: { id: "react-loader", port: reactLoaderChannel.port1, userOptions: workerData.userOptions, resolvedConfig: workerData.resolvedConfig }, transferList: [reactLoaderChannel.port1] }); } catch (err) { const handledError = handleError({ error: err, logger, panicThreshold: workerData.userOptions.panicThreshold, context: `register(${reactLoaderPath})` }); if (handledError != null) throw handledError; } try { register(envLoaderPath, { parentURL: pluginRoot, data: { id: "env-loader", port: envLoaderChannel.port1, resolvedConfig: workerData.resolvedConfig, userOptions: workerData.userOptions }, transferList: [envLoaderChannel.port1] }); } catch (err) { const handledError = handleError({ error: err, logger, panicThreshold: workerData.userOptions.panicThreshold, context: `register(${envLoaderPath})` }); if (handledError != null) throw handledError; } } else { register$1(); } setMaxListenersOnPort(parentPort, 500); parentPort.on("message", messageHandler); parentPort.on("messageerror", (error) => { console.error( "[rsc-worker] Parent port message serialization failed:", error ); }); const { hmrPort } = workerData; if (hmrPort) { hmrPort.start(); hmrPort.on("message", (message) => { if (message.type === "HMR_UPDATE") { parentPort.postMessage({ type: "HMR_UPDATE", id: message.id, routes: message.routes }); } else if (message.type === "HMR_ACCEPT") { parentPort.postMessage({ type: "HMR_ACCEPT", id: message.id, routes: message.routes }); } }); hmrPort.on("messageerror", (error) => { logger.error("HMR port message serialization failed.", { error }); if (parentPort) { parentPort.postMessage({ type: "ERROR", id: "hmr-port", error: { message: "Message serialization failed in HMR port", name: "MessageError", stack: void 0 } }); } }); } parentPort.postMessage({ type: "READY", env: process.env["NODE_ENV"], pid: process.pid, id: "worker/rsc" }); if (process.env["NODE_ENV"] === "production") { throw new Error("This module should not run in production mode."); } } catch (err) { const handledError = handleError({ error: err, logger, panicThreshold: workerData.userOptions.panicThreshold}); if (parentPort && handledError != null) { sendMessage({ type: "ERROR", id: "worker/rsc", error: handledError }, parentPort); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNjLXdvcmtlci5wcm9kdWN0aW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW4vd29ya2VyL3JzYy9yc2Mtd29ya2VyLnByb2R1Y3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyZW50UG9ydCwgTWVzc2FnZUNoYW5uZWwsIHdvcmtlckRhdGEgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuaW1wb3J0IHsgbWVzc2FnZUhhbmRsZXIgfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlci5zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyByZWdpc3RlciBhcyByZWdpc3RlclRzeCB9IGZyb20gXCJ0c3gvZXNtL2FwaVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBsdWdpblJvb3QgfSBmcm9tIFwiLi4vLi4vcm9vdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIbXJBY2NlcHRNZXNzYWdlLCBSZWFkeU1lc3NhZ2UgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3NzRmlsZU1lc3NhZ2UsXG4gIEhtclVwZGF0ZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVkRW52TG9hZGVyTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZWRSZWFjdExvYWRlck1lc3NhZ2UsXG4gIFJzY1dvcmtlcklucHV0TWVzc2FnZSxcbn0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL2hhbmRsZUVycm9yLmpzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHsgc2V0TWF4TGlzdGVuZXJzT25Qb3J0LCB1bnJlZlBvcnQgfSBmcm9tIFwiLi4vLi4vc3RyZWFtL3NldE1heExpc3RlbmVycy5qc1wiO1xuXG4vLyBJbml0aWFsaXplIHdvcmtlclxuaWYgKCFwYXJlbnRQb3J0KSB7XG4gIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbW9kdWxlIG11c3QgYmUgcnVuIGFzIGEgd29ya2VyXCIpO1xufVxuXG4vLyBJbiB0ZXN0IG1vZGUsIHdlIHdhbnQgZXJyb3JzIHRvIHByb3BhZ2F0ZSB1cCBpbW1lZGlhdGVseVxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHdvcmtlckRhdGEucmVzb2x2ZWRDb25maWc/LmxvZ0xldmVsID8/IFwiaW5mb1wiLCB7XG4gIHByZWZpeDogXCJyc2Mtd29ya2VyXCIsXG59KTtcbi8vIFNldCB1cCBsb2FkZXIgbWVzc2FnZSBoYW5kbGVyc1xuY29uc3QgY3NzTG9hZGVyTWVzc2FnZUhhbmRsZXIgPSAobXNnOiBDc3NGaWxlTWVzc2FnZSkgPT4ge1xuICBtZXNzYWdlSGFuZGxlcihtc2cpO1xufTtcblxuY29uc3QgZW52TG9hZGVyTWVzc2FnZUhhbmRsZXIgPSAobXNnOiBJbml0aWFsaXplZEVudkxvYWRlck1lc3NhZ2UpID0+IHtcbiAgbWVzc2FnZUhhbmRsZXIobXNnKTtcbn07XG5cbmNvbnN0IHJlYWN0TG9hZGVyTWVzc2FnZUhhbmRsZXIgPSAobXNnOiBJbml0aWFsaXplZFJlYWN0TG9hZGVyTWVzc2FnZSkgPT4ge1xuICBtZXNzYWdlSGFuZGxlcihtc2cpO1xufTtcblxudHJ5IHtcbiAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gYnVpbGQgbW9kZSAtIGlmIHNvLCBza2lwIGxvYWRlciByZWdpc3RyYXRpb24gc2luY2UgZmlsZXMgYXJlIGFscmVhZHkgYnVpbHRcbiAgY29uc3QgaXNCdWlsZE1vZGUgPSB3b3JrZXJEYXRhLmNvbmZpZ0Vudj8uY29tbWFuZCA9PT0gXCJidWlsZFwiXG4gIFxuXG4gIFxuICBpZiAoaXNCdWlsZE1vZGUpIHtcbiAgICBsb2dnZXIuaW5mbyhcIkJ1aWxkIG1vZGUgZGV0ZWN0ZWQgLSBza2lwcGluZyBsb2FkZXIgcmVnaXN0cmF0aW9uIHNpbmNlIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0XCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5pbmZvKFwiRGV2ZWxvcG1lbnQvdGVzdCBtb2RlIGRldGVjdGVkIC0gcmVnaXN0ZXJpbmcgbG9hZGVycyBmb3Igc291cmNlIGZpbGUgcHJvY2Vzc2luZ1wiKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBjaGFubmVscyBmb3IgZWFjaCBsb2FkZXJcbiAgY29uc3QgcmVhY3RMb2FkZXJDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIGNvbnN0IGNzc0xvYWRlckNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgY29uc3QgZW52TG9hZGVyQ2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICBcbiAgLy8gSW5jcmVhc2UgbWF4IGxpc3RlbmVycyB0byBwcmV2ZW50IHdhcm5pbmdzIGR1cmluZyBkZXZlbG9wbWVudFxuICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQocmVhY3RMb2FkZXJDaGFubmVsLnBvcnQxLCA1MDApO1xuICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQocmVhY3RMb2FkZXJDaGFubmVsLnBvcnQyLCA1MDApO1xuICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoY3NzTG9hZGVyQ2hhbm5lbC5wb3J0MSwgNTAwKTtcbiAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KGNzc0xvYWRlckNoYW5uZWwucG9ydDIsIDUwMCk7XG4gIHNldE1heExpc3RlbmVyc09uUG9ydChlbnZMb2FkZXJDaGFubmVsLnBvcnQxLCA1MDApO1xuICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoZW52TG9hZGVyQ2hhbm5lbC5wb3J0MiwgNTAwKTtcblxuICAvLyBVbnJlZiBhbGwgcG9ydHMgc28gdGhleSBkb24ndCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlXG4gIHVucmVmUG9ydChyZWFjdExvYWRlckNoYW5uZWwucG9ydDEpO1xuICB1bnJlZlBvcnQocmVhY3RMb2FkZXJDaGFubmVsLnBvcnQyKTtcbiAgdW5yZWZQb3J0KGNzc0xvYWRlckNoYW5uZWwucG9ydDEpO1xuICB1bnJlZlBvcnQoY3NzTG9hZGVyQ2hhbm5lbC5wb3J0Mik7XG4gIHVucmVmUG9ydChlbnZMb2FkZXJDaGFubmVsLnBvcnQxKTtcbiAgdW5yZWZQb3J0KGVudkxvYWRlckNoYW5uZWwucG9ydDIpO1xuXG4gIC8vIFNldCB1cCBtZXNzYWdlIGhhbmRsZXJzIGJlZm9yZSB0cmFuc2ZlcnJpbmcgcG9ydHMgKG9ubHkgbmVlZGVkIGlmIG5vdCBpbiBidWlsZCBtb2RlKVxuICBpZiAoIWlzQnVpbGRNb2RlKSB7XG4gICAgcmVhY3RMb2FkZXJDaGFubmVsLnBvcnQyLm9uKFwibWVzc2FnZVwiLCByZWFjdExvYWRlck1lc3NhZ2VIYW5kbGVyKTtcbiAgICByZWFjdExvYWRlckNoYW5uZWwucG9ydDIub24oXCJtZXNzYWdlZXJyb3JcIiwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiUmVhY3QgbG9hZGVyIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbiBmYWlsZWQuXCIsIHsgZXJyb3IgfSk7XG4gICAgICBpZiAocGFyZW50UG9ydCkge1xuICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcIkVSUk9SXCIsXG4gICAgICAgICAgaWQ6IFwicmVhY3QtbG9hZGVyXCIsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiTWVzc2FnZSBzZXJpYWxpemF0aW9uIGZhaWxlZCBpbiByZWFjdCBsb2FkZXJcIixcbiAgICAgICAgICAgIG5hbWU6IFwiTWVzc2FnZUVycm9yXCIsXG4gICAgICAgICAgICBzdGFjazogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY3NzTG9hZGVyQ2hhbm5lbC5wb3J0Mi5vbihcIm1lc3NhZ2VcIiwgY3NzTG9hZGVyTWVzc2FnZUhhbmRsZXIpO1xuICAgIGNzc0xvYWRlckNoYW5uZWwucG9ydDIub24oXCJtZXNzYWdlZXJyb3JcIiwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiQ1NTIGxvYWRlciBtZXNzYWdlIHNlcmlhbGl6YXRpb24gZmFpbGVkLlwiLCB7IGVycm9yIH0pO1xuICAgICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICAgIGlkOiBcImNzcy1sb2FkZXJcIixcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJNZXNzYWdlIHNlcmlhbGl6YXRpb24gZmFpbGVkIGluIENTUyBsb2FkZXJcIixcbiAgICAgICAgICAgIG5hbWU6IFwiTWVzc2FnZUVycm9yXCIsXG4gICAgICAgICAgICBzdGFjazogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZW52TG9hZGVyQ2hhbm5lbC5wb3J0Mi5vbihcIm1lc3NhZ2VcIiwgZW52TG9hZGVyTWVzc2FnZUhhbmRsZXIpO1xuICAgIGVudkxvYWRlckNoYW5uZWwucG9ydDIub24oXCJtZXNzYWdlZXJyb3JcIiwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiRW52IGxvYWRlciBtZXNzYWdlIHNlcmlhbGl6YXRpb24gZmFpbGVkLlwiLCB7IGVycm9yIH0pO1xuICAgICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICAgIGlkOiBcImVudi1sb2FkZXJcIixcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJNZXNzYWdlIHNlcmlhbGl6YXRpb24gZmFpbGVkIGluIGVudiBsb2FkZXJcIixcbiAgICAgICAgICAgIG5hbWU6IFwiTWVzc2FnZUVycm9yXCIsXG4gICAgICAgICAgICBzdGFjazogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgcm9vdCA9IHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290IHx8IHdvcmtlckRhdGEucmVzb2x2ZWRDb25maWc/LnJvb3QgfHwgcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCByZWFjdExvYWRlclBhdGggPVxuICAgIFwiZmlsZTovL1wiICtcbiAgICAod29ya2VyRGF0YS51c2VyT3B0aW9ucy5yZWFjdExvYWRlclBhdGhcbiAgICAgID8gcmVzb2x2ZShcbiAgICAgICAgICByb290LFxuICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnMucmVhY3RMb2FkZXJQYXRoXG4gICAgICAgIClcbiAgICAgIDogcmVzb2x2ZShcbiAgICAgICAgICByb290LFxuICAgICAgICAgIERFRkFVTFRfQ09ORklHLlJFQUNUX0xPQURFUl9QQVRIXG4gICAgICAgICkpO1xuICBsb2dnZXIuaW5mbyhgVXNpbmcgcmVhY3RMb2FkZXJQYXRoOiAke3JlYWN0TG9hZGVyUGF0aH1gKTtcbiAgY29uc3QgY3NzTG9hZGVyUGF0aCA9XG4gICAgXCJmaWxlOi8vXCIgK1xuICAgICh3b3JrZXJEYXRhLnVzZXJPcHRpb25zLmNzc0xvYWRlclBhdGhcbiAgICAgID8gcmVzb2x2ZShcbiAgICAgICAgICByb290LFxuICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnMuY3NzTG9hZGVyUGF0aFxuICAgICAgICApXG4gICAgICA6IHJlc29sdmUoICBcbiAgICAgICAgICByb290LFxuICAgICAgICAgIERFRkFVTFRfQ09ORklHLkNTU19MT0FERVJfUEFUSFxuICAgICAgICApKTtcbiAgY29uc3QgZW52TG9hZGVyUGF0aCA9XG4gICAgXCJmaWxlOi8vXCIgK1xuICAgICh3b3JrZXJEYXRhLnVzZXJPcHRpb25zLmVudkxvYWRlclBhdGhcbiAgICAgID8gcmVzb2x2ZShcbiAgICAgICAgICByb290LFxuICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnMuZW52TG9hZGVyUGF0aFxuICAgICAgICApXG4gICAgICA6IHJlc29sdmUoXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBERUZBVUxUX0NPTkZJRy5FTlZfTE9BREVSX1BBVEhcbiAgICAgICAgKSk7XG5cbiAgLy8gT25seSByZWdpc3RlciBsb2FkZXJzIGlmIG5vdCBpbiBidWlsZCBtb2RlXG4gIGlmICghaXNCdWlsZE1vZGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVnaXN0ZXIoY3NzTG9hZGVyUGF0aCwge1xuICAgICAgICBwYXJlbnRVUkw6IHBsdWdpblJvb3QsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogXCJjc3MtbG9hZGVyXCIsXG4gICAgICAgICAgcG9ydDogY3NzTG9hZGVyQ2hhbm5lbC5wb3J0MSxcbiAgICAgICAgICB1c2VyT3B0aW9uczogd29ya2VyRGF0YS51c2VyT3B0aW9ucyxcbiAgICAgICAgICByZXNvbHZlZENvbmZpZzogd29ya2VyRGF0YS5yZXNvbHZlZENvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJMaXN0OiBbY3NzTG9hZGVyQ2hhbm5lbC5wb3J0MV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWRFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBwYW5pY1RocmVzaG9sZDogd29ya2VyRGF0YS51c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgY29udGV4dDogYHJlZ2lzdGVyKCR7Y3NzTG9hZGVyUGF0aH0pYCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhbmRsZWRFcnJvciAhPSBudWxsKSB0aHJvdyBoYW5kbGVkRXJyb3I7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgdHN4XG4gICAgcmVnaXN0ZXJUc3goKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWdpc3RlciBsb2FkZXJzIHdpdGggdGhlaXIgcG9ydHNcbiAgICAgIHJlZ2lzdGVyKHJlYWN0TG9hZGVyUGF0aCwge1xuICAgICAgICBwYXJlbnRVUkw6IHBsdWdpblJvb3QsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogXCJyZWFjdC1sb2FkZXJcIixcbiAgICAgICAgICBwb3J0OiByZWFjdExvYWRlckNoYW5uZWwucG9ydDEsXG4gICAgICAgICAgdXNlck9wdGlvbnM6IHdvcmtlckRhdGEudXNlck9wdGlvbnMsXG4gICAgICAgICAgcmVzb2x2ZWRDb25maWc6IHdvcmtlckRhdGEucmVzb2x2ZWRDb25maWcsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZmVyTGlzdDogW3JlYWN0TG9hZGVyQ2hhbm5lbC5wb3J0MV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWRFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBwYW5pY1RocmVzaG9sZDogd29ya2VyRGF0YS51c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgY29udGV4dDogYHJlZ2lzdGVyKCR7cmVhY3RMb2FkZXJQYXRofSlgLFxuICAgICAgfSk7XG4gICAgICBpZiAoaGFuZGxlZEVycm9yICE9IG51bGwpIHRocm93IGhhbmRsZWRFcnJvcjtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBlbnYtbG9hZGVyIChlbnN1cmUgdGhpcyB0aGUgbGFzdClcbiAgICB0cnkge1xuICAgICAgcmVnaXN0ZXIoZW52TG9hZGVyUGF0aCwge1xuICAgICAgICBwYXJlbnRVUkw6IHBsdWdpblJvb3QsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogXCJlbnYtbG9hZGVyXCIsXG4gICAgICAgICAgcG9ydDogZW52TG9hZGVyQ2hhbm5lbC5wb3J0MSxcbiAgICAgICAgICByZXNvbHZlZENvbmZpZzogd29ya2VyRGF0YS5yZXNvbHZlZENvbmZpZyxcbiAgICAgICAgICB1c2VyT3B0aW9uczogd29ya2VyRGF0YS51c2VyT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJMaXN0OiBbZW52TG9hZGVyQ2hhbm5lbC5wb3J0MV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWRFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBwYW5pY1RocmVzaG9sZDogd29ya2VyRGF0YS51c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgY29udGV4dDogYHJlZ2lzdGVyKCR7ZW52TG9hZGVyUGF0aH0pYCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhbmRsZWRFcnJvciAhPSBudWxsKSB0aHJvdyBoYW5kbGVkRXJyb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEluIGJ1aWxkIG1vZGUsIGp1c3QgcmVnaXN0ZXIgdHN4IGZvciBiYXNpYyBUeXBlU2NyaXB0IHN1cHBvcnRcbiAgICByZWdpc3RlclRzeCgpO1xuICB9XG5cbiAgLy8gSW5jcmVhc2UgbWF4IGxpc3RlbmVycyBvbiBwYXJlbnRQb3J0IHRvIHByZXZlbnQgd2FybmluZ3NcbiAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KHBhcmVudFBvcnQsIDUwMCk7XG5cbiAgLy8gSGFuZGxlIGFsbCBtZXNzYWdlcyB0aHJvdWdoIHRoZSB1bmlmaWVkIG1lc3NhZ2VIYW5kbGVyXG4gIHBhcmVudFBvcnQhLm9uKFwibWVzc2FnZVwiLCBtZXNzYWdlSGFuZGxlcik7XG4gIHBhcmVudFBvcnQhLm9uKFwibWVzc2FnZWVycm9yXCIsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJbcnNjLXdvcmtlcl0gUGFyZW50IHBvcnQgbWVzc2FnZSBzZXJpYWxpemF0aW9uIGZhaWxlZDpcIixcbiAgICAgIGVycm9yXG4gICAgKTtcbiAgICAvLyBDYW4ndCBzZW5kIHZpYSBwYXJlbnRQb3J0IHNpbmNlIHRoYXQncyB3aGF0IGZhaWxlZCwgc28ganVzdCBsb2dcbiAgfSk7XG5cbiAgY29uc3QgeyBobXJQb3J0IH0gPSB3b3JrZXJEYXRhO1xuICBpZiAoaG1yUG9ydCkge1xuICAgIC8vIFN0YXJ0IHRoZSBtZXNzYWdlIHBvcnRcbiAgICBobXJQb3J0LnN0YXJ0KCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIEhNUiBtZXNzYWdlc1xuICAgIGhtclBvcnQub24oXCJtZXNzYWdlXCIsIChtZXNzYWdlOiBSc2NXb3JrZXJJbnB1dE1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiSE1SX1VQREFURVwiKSB7XG4gICAgICAgIC8vIEludmFsaWRhdGUgdGhlIG1vZHVsZSBpbiB0aGUgd29ya2VyXG4gICAgICAgIHBhcmVudFBvcnQhLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcIkhNUl9VUERBVEVcIixcbiAgICAgICAgICBpZDogbWVzc2FnZS5pZCxcbiAgICAgICAgICByb3V0ZXM6IG1lc3NhZ2Uucm91dGVzLFxuICAgICAgICB9IHNhdGlzZmllcyBIbXJVcGRhdGVNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcIkhNUl9BQ0NFUFRcIikge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIHVwZGF0ZVxuICAgICAgICBwYXJlbnRQb3J0IS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJITVJfQUNDRVBUXCIsXG4gICAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgICAgcm91dGVzOiBtZXNzYWdlLnJvdXRlcyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgSG1yQWNjZXB0TWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgSE1SIHBvcnQgbWVzc2FnZSBlcnJvcnNcbiAgICBobXJQb3J0Lm9uKFwibWVzc2FnZWVycm9yXCIsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcIkhNUiBwb3J0IG1lc3NhZ2Ugc2VyaWFsaXphdGlvbiBmYWlsZWQuXCIsIHsgZXJyb3IgfSk7XG4gICAgICBpZiAocGFyZW50UG9ydCkge1xuICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcIkVSUk9SXCIsXG4gICAgICAgICAgaWQ6IFwiaG1yLXBvcnRcIixcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJNZXNzYWdlIHNlcmlhbGl6YXRpb24gZmFpbGVkIGluIEhNUiBwb3J0XCIsXG4gICAgICAgICAgICBuYW1lOiBcIk1lc3NhZ2VFcnJvclwiLFxuICAgICAgICAgICAgc3RhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIE5vdGlmeSBwYXJlbnQgdGhhdCB3ZSdyZSByZWFkeVxuICBwYXJlbnRQb3J0IS5wb3N0TWVzc2FnZSh7XG4gICAgdHlwZTogXCJSRUFEWVwiLFxuICAgIGVudjogcHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSxcbiAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgIGlkOiBcIndvcmtlci9yc2NcIixcbiAgfSBzYXRpc2ZpZXMgUmVhZHlNZXNzYWdlKTtcblxuICBpZiAocHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1vZHVsZSBzaG91bGQgbm90IHJ1biBpbiBwcm9kdWN0aW9uIG1vZGUuXCIpO1xuICB9XG59IGNhdGNoIChlcnIpIHtcbiAgY29uc3QgaGFuZGxlZEVycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgIGVycm9yOiBlcnIsXG4gICAgbG9nZ2VyLFxuICAgIHBhbmljVGhyZXNob2xkOiB3b3JrZXJEYXRhLnVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgIGNvbnRleHQ6IFwicnNjLXdvcmtlclwiLFxuICB9KTtcbiAgLy8gSW4gZGV2IG1vZGUsIHRyeSB0byBzZW5kIGVycm9yIG1lc3NhZ2UgYmVmb3JlIGV4aXRpbmdcbiAgaWYgKHBhcmVudFBvcnQgJiYgaGFuZGxlZEVycm9yICE9IG51bGwpIHtcbiAgICBzZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIkVSUk9SXCIsXG4gICAgICBpZDogXCJ3b3JrZXIvcnNjXCIsXG4gICAgICBlcnJvcjogaGFuZGxlZEVycm9yLFxuICAgIH0sIHBhcmVudFBvcnQpO1xuICB9XG59XG4iXSwibmFtZXMiOlsicmVnaXN0ZXJUc3giXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLElBQUksQ0FBQyxVQUFZLEVBQUE7QUFDZixFQUFNLE1BQUEsSUFBSSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3ZEO0FBR0EsTUFBTSxNQUFTLEdBQUEsWUFBQSxDQUFhLFVBQVcsQ0FBQSxjQUFBLEVBQWdCLFlBQVksTUFBUSxFQUFBO0FBQUEsRUFDekUsTUFBUSxFQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQsTUFBTSx1QkFBQSxHQUEwQixDQUFDLEdBQXdCLEtBQUE7QUFDdkQsRUFBQSxjQUFBLENBQWUsR0FBRyxDQUFBO0FBQ3BCLENBQUE7QUFFQSxNQUFNLHVCQUFBLEdBQTBCLENBQUMsR0FBcUMsS0FBQTtBQUNwRSxFQUFBLGNBQUEsQ0FBZSxHQUFHLENBQUE7QUFDcEIsQ0FBQTtBQUVBLE1BQU0seUJBQUEsR0FBNEIsQ0FBQyxHQUF1QyxLQUFBO0FBQ3hFLEVBQUEsY0FBQSxDQUFlLEdB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