vite-plugin-react-server 1.2.0-alpha.1 → 1.2.1
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 +211 -51
- package/dist/client.d.ts +4 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -6
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -10
- package/dist/package.json +102 -27
- package/dist/plugin/bundle/bundles.d.ts +11 -0
- package/dist/plugin/bundle/bundles.d.ts.map +1 -0
- package/dist/plugin/bundle/bundles.js +11 -0
- package/dist/plugin/bundle/deferredStaticGeneration.d.ts +31 -0
- package/dist/plugin/bundle/deferredStaticGeneration.d.ts.map +1 -0
- package/dist/plugin/bundle/deferredStaticGeneration.js +44 -0
- package/dist/plugin/bundle/manifests.d.ts +20 -0
- package/dist/plugin/bundle/manifests.d.ts.map +1 -0
- package/dist/plugin/bundle/manifests.js +54 -0
- package/dist/plugin/components/css.d.ts +2 -5
- package/dist/plugin/components/css.d.ts.map +1 -1
- package/dist/plugin/components/css.js +7 -9
- package/dist/plugin/components/html.d.ts +2 -3
- package/dist/plugin/components/html.d.ts.map +1 -1
- package/dist/plugin/components/html.js +3 -3
- package/dist/plugin/components/index.d.ts +1 -1
- package/dist/plugin/components/index.d.ts.map +1 -1
- package/dist/plugin/components/root.d.ts.map +1 -1
- package/dist/plugin/components/root.js +4 -4
- package/dist/plugin/config/autoDiscover/createGlobAutoDiscover.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/createGlobAutoDiscover.js +6 -6
- package/dist/plugin/config/autoDiscover/pageAndPropFiles.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/pageAndPropFiles.js +1 -1
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts +6 -5
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +34 -51
- package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts +5 -1
- package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/resolveBuildPages.js +124 -52
- package/dist/plugin/config/createHandlerOptions.client.d.ts +4 -0
- package/dist/plugin/config/createHandlerOptions.client.d.ts.map +1 -0
- package/dist/plugin/config/createHandlerOptions.client.js +293 -0
- package/dist/plugin/config/createHandlerOptions.d.ts +4 -0
- package/dist/plugin/config/createHandlerOptions.d.ts.map +1 -0
- package/dist/plugin/config/createHandlerOptions.js +13 -0
- package/dist/plugin/config/createHandlerOptions.server.d.ts +4 -0
- package/dist/plugin/config/createHandlerOptions.server.d.ts.map +1 -0
- package/dist/plugin/config/createHandlerOptions.server.js +344 -0
- package/dist/plugin/config/createHandlerOptions.types.d.ts +114 -0
- package/dist/plugin/config/createHandlerOptions.types.d.ts.map +1 -0
- package/dist/plugin/config/createModuleID.d.ts +1 -1
- package/dist/plugin/config/createModuleID.d.ts.map +1 -1
- package/dist/plugin/config/createModuleID.js +121 -8
- package/dist/plugin/config/defaults.d.ts +46 -6
- package/dist/plugin/config/defaults.d.ts.map +1 -1
- package/dist/plugin/config/defaults.js +54 -11
- package/dist/plugin/config/envPrefixFromConfig.d.ts +3 -0
- package/dist/plugin/config/envPrefixFromConfig.d.ts.map +1 -0
- package/dist/plugin/config/envPrefixFromConfig.js +8 -0
- package/dist/plugin/config/getCondition.d.ts +54 -3
- package/dist/plugin/config/getCondition.d.ts.map +1 -1
- package/dist/plugin/config/getCondition.js +158 -6
- package/dist/plugin/{getNodeEnv.d.ts → config/getNodeEnv.d.ts} +1 -1
- package/dist/plugin/config/getNodeEnv.d.ts.map +1 -0
- package/dist/plugin/config/getNodeEnv.js +17 -0
- package/dist/plugin/config/index.d.ts +43 -1
- package/dist/plugin/config/index.d.ts.map +1 -1
- package/dist/plugin/config/index.js +9 -4
- package/dist/plugin/config/resolveDirectiveMatcher.d.ts +6 -6
- package/dist/plugin/config/resolveDirectiveMatcher.d.ts.map +1 -1
- package/dist/plugin/config/resolveDirectiveMatcher.js +7 -23
- package/dist/plugin/config/resolveEnv.d.ts.map +1 -1
- package/dist/plugin/config/resolveEnv.js +3 -6
- package/dist/plugin/config/resolveOptions.d.ts +3 -2
- package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
- package/dist/plugin/config/resolveOptions.js +188 -43
- package/dist/plugin/config/resolvePages.d.ts +1 -1
- package/dist/plugin/config/resolvePages.d.ts.map +1 -1
- package/dist/plugin/config/resolvePages.js +1 -1
- package/dist/plugin/config/resolvePatternWithValues.d.ts.map +1 -1
- package/dist/plugin/config/resolvePatternWithValues.js +7 -26
- package/dist/plugin/config/resolveUrlOption.d.ts +1 -1
- package/dist/plugin/config/resolveUrlOption.d.ts.map +1 -1
- package/dist/plugin/config/resolveUrlOption.js +2 -2
- package/dist/plugin/config/resolveUserConfig.d.ts +5 -3
- package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
- package/dist/plugin/config/resolveUserConfig.js +221 -75
- package/dist/plugin/config/stashedOptionsState.d.ts +66 -0
- package/dist/plugin/config/stashedOptionsState.d.ts.map +1 -0
- package/dist/plugin/config/stashedOptionsState.js +25 -0
- package/dist/plugin/dev-server/cleanupServerAction.client.d.ts +6 -0
- package/dist/plugin/dev-server/cleanupServerAction.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/cleanupServerAction.client.js +28 -0
- package/dist/plugin/dev-server/cleanupServerAction.d.ts +2 -0
- package/dist/plugin/dev-server/cleanupServerAction.d.ts.map +1 -0
- package/dist/plugin/dev-server/cleanupServerAction.js +4 -0
- package/dist/plugin/dev-server/cleanupServerAction.server.d.ts +8 -0
- package/dist/plugin/dev-server/cleanupServerAction.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/cleanupServerAction.server.js +15 -0
- package/dist/plugin/dev-server/configureReactServer.client.d.ts +7 -0
- package/dist/plugin/dev-server/configureReactServer.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureReactServer.client.js +85 -0
- package/dist/plugin/dev-server/configureReactServer.d.ts +2 -0
- package/dist/plugin/dev-server/configureReactServer.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureReactServer.js +13 -0
- package/dist/plugin/dev-server/configureReactServer.server.d.ts +3 -0
- package/dist/plugin/dev-server/configureReactServer.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureReactServer.server.js +444 -0
- package/dist/plugin/dev-server/configureRequestHandler.client.d.ts +13 -0
- package/dist/plugin/dev-server/configureRequestHandler.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureRequestHandler.client.js +307 -0
- package/dist/plugin/dev-server/configureRequestHandler.d.ts +2 -0
- package/dist/plugin/dev-server/configureRequestHandler.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureRequestHandler.js +4 -0
- package/dist/plugin/dev-server/configureRequestHandler.server.d.ts +6 -0
- package/dist/plugin/dev-server/configureRequestHandler.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/configureRequestHandler.server.js +44 -0
- package/dist/plugin/dev-server/handleServerAction.client.d.ts +11 -0
- package/dist/plugin/dev-server/handleServerAction.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/handleServerAction.client.js +97 -0
- package/dist/plugin/dev-server/handleServerAction.d.ts +2 -0
- package/dist/plugin/dev-server/handleServerAction.d.ts.map +1 -0
- package/dist/plugin/dev-server/handleServerAction.js +13 -0
- package/dist/plugin/dev-server/handleServerAction.server.d.ts +3 -0
- package/dist/plugin/dev-server/handleServerAction.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/handleServerAction.server.js +15 -0
- package/dist/plugin/dev-server/index.client.d.ts +7 -0
- package/dist/plugin/dev-server/index.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/index.client.js +11 -0
- package/dist/plugin/dev-server/index.d.ts +4 -0
- package/dist/plugin/dev-server/index.d.ts.map +1 -0
- package/dist/plugin/dev-server/index.js +19 -0
- package/dist/plugin/dev-server/index.server.d.ts +7 -0
- package/dist/plugin/dev-server/index.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/index.server.js +11 -0
- package/dist/plugin/dev-server/plugin.client.d.ts +7 -0
- package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/plugin.client.js +122 -0
- package/dist/plugin/dev-server/plugin.server.d.ts +8 -0
- package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/plugin.server.js +108 -0
- package/dist/plugin/dev-server/restartWorker.client.d.ts +3 -0
- package/dist/plugin/dev-server/restartWorker.client.d.ts.map +1 -0
- package/dist/plugin/dev-server/restartWorker.client.js +131 -0
- package/dist/plugin/dev-server/restartWorker.d.ts +2 -0
- package/dist/plugin/dev-server/restartWorker.d.ts.map +1 -0
- package/dist/plugin/dev-server/restartWorker.js +4 -0
- package/dist/plugin/dev-server/restartWorker.server.d.ts +3 -0
- package/dist/plugin/dev-server/restartWorker.server.d.ts.map +1 -0
- package/dist/plugin/dev-server/restartWorker.server.js +88 -0
- package/dist/plugin/dev-server/types.d.ts +38 -0
- package/dist/plugin/dev-server/types.d.ts.map +1 -0
- package/dist/plugin/dev-server/virtualRscHmrPlugin.d.ts +7 -0
- package/dist/plugin/dev-server/virtualRscHmrPlugin.d.ts.map +1 -0
- package/dist/plugin/dev-server/virtualRscHmrPlugin.js +80 -0
- package/dist/plugin/env/createConfigEnv.d.ts +7 -1
- package/dist/plugin/env/createConfigEnv.d.ts.map +1 -1
- package/dist/plugin/env/createConfigEnv.js +18 -5
- package/dist/plugin/env/createEnvPlugin.d.ts +3 -0
- package/dist/plugin/env/createEnvPlugin.d.ts.map +1 -0
- package/dist/plugin/env/createEnvPlugin.js +59 -0
- package/dist/plugin/env/getArgValue.js +47 -27
- package/dist/plugin/env/getEnvKey.d.ts +6 -0
- package/dist/plugin/env/getEnvKey.d.ts.map +1 -1
- package/dist/plugin/env/getEnvKey.js +11 -3
- package/dist/plugin/env/index.d.ts +2 -0
- package/dist/plugin/env/index.d.ts.map +1 -1
- package/dist/plugin/env/index.js +4 -0
- package/dist/plugin/env/plugin.client.d.ts +2 -0
- package/dist/plugin/env/plugin.client.d.ts.map +1 -0
- package/dist/plugin/env/plugin.client.js +2 -0
- package/dist/plugin/env/plugin.d.ts +4 -34
- package/dist/plugin/env/plugin.d.ts.map +1 -1
- package/dist/plugin/env/plugin.js +31 -64
- package/dist/plugin/env/plugin.server.d.ts +2 -0
- package/dist/plugin/env/plugin.server.d.ts.map +1 -0
- package/dist/plugin/env/plugin.server.js +2 -0
- package/dist/plugin/env/userConfigEnv.js +9 -18
- package/dist/plugin/environments/createBuildEventPlugin.d.ts +4 -0
- package/dist/plugin/environments/createBuildEventPlugin.d.ts.map +1 -0
- package/dist/plugin/environments/createBuildEventPlugin.js +100 -0
- package/dist/plugin/environments/createEnvironmentPlugin.d.ts +19 -0
- package/dist/plugin/environments/createEnvironmentPlugin.d.ts.map +1 -0
- package/dist/plugin/environments/createEnvironmentPlugin.js +257 -0
- package/dist/plugin/environments/hashCoordination.d.ts +14 -0
- package/dist/plugin/environments/hashCoordination.d.ts.map +1 -0
- package/dist/plugin/environments/hashCoordination.js +35 -0
- package/dist/plugin/environments/resolveEnvironmentConfig.d.ts +41 -0
- package/dist/plugin/environments/resolveEnvironmentConfig.d.ts.map +1 -0
- package/dist/plugin/environments/resolveEnvironmentConfig.js +232 -0
- package/dist/plugin/error/assertPanic.d.ts +2 -0
- package/dist/plugin/error/assertPanic.d.ts.map +1 -0
- package/dist/plugin/error/assertPanic.js +15 -0
- package/dist/plugin/error/handleError.d.ts +9 -0
- package/dist/plugin/error/handleError.d.ts.map +1 -0
- package/dist/plugin/error/handleError.js +51 -0
- package/dist/plugin/error/index.d.ts +3 -0
- package/dist/plugin/error/index.d.ts.map +1 -1
- package/dist/plugin/error/index.js +4 -1
- package/dist/plugin/error/logError.d.ts +6 -2
- package/dist/plugin/error/logError.d.ts.map +1 -1
- package/dist/plugin/error/logError.js +34 -36
- package/dist/plugin/error/panicThresholdHandler.d.ts +27 -0
- package/dist/plugin/error/panicThresholdHandler.d.ts.map +1 -0
- package/dist/plugin/error/panicThresholdHandler.js +13 -0
- package/dist/plugin/error/serializeError.d.ts +6 -2
- package/dist/plugin/error/serializeError.d.ts.map +1 -1
- package/dist/plugin/error/serializeError.js +30 -10
- package/dist/plugin/error/serializeErrorInfo.d.ts +5 -0
- package/dist/plugin/error/serializeErrorInfo.d.ts.map +1 -0
- package/dist/plugin/error/serializeErrorInfo.js +19 -0
- package/dist/plugin/error/setupGlobalErrorHandler.d.ts +4 -0
- package/dist/plugin/error/setupGlobalErrorHandler.d.ts.map +1 -0
- package/dist/plugin/error/setupGlobalErrorHandler.js +52 -0
- package/dist/plugin/error/shouldPanic.d.ts +6 -0
- package/dist/plugin/error/shouldPanic.d.ts.map +1 -0
- package/dist/plugin/error/shouldPanic.js +15 -0
- package/dist/plugin/error/toError.d.ts +5 -1
- package/dist/plugin/error/toError.d.ts.map +1 -1
- package/dist/plugin/error/toError.js +43 -19
- package/dist/plugin/error/types.d.ts +28 -0
- package/dist/plugin/error/types.d.ts.map +1 -0
- package/dist/plugin/error/types.js +1 -0
- package/dist/plugin/helpers/collectManifestCss.d.ts.map +1 -1
- package/dist/plugin/helpers/collectManifestCss.js +19 -5
- package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts +3 -3
- package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts.map +1 -1
- package/dist/plugin/helpers/collectViteModuleGraphCss.js +64 -3
- package/dist/plugin/helpers/createBufferedRscStream.d.ts +52 -0
- package/dist/plugin/helpers/createBufferedRscStream.d.ts.map +1 -0
- package/dist/plugin/helpers/createBufferedRscStream.js +147 -0
- package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
- package/dist/plugin/helpers/createCssProps.js +15 -14
- package/dist/plugin/helpers/createElementWithReact.d.ts +9 -0
- package/dist/plugin/helpers/createElementWithReact.d.ts.map +1 -0
- package/dist/plugin/helpers/createElementWithReact.js +87 -0
- package/dist/plugin/helpers/createPatternMatcher.d.ts +24 -0
- package/dist/plugin/helpers/createPatternMatcher.d.ts.map +1 -0
- package/dist/plugin/helpers/createPatternMatcher.js +50 -0
- package/dist/plugin/helpers/createRscRenderHelpers.d.ts +16 -0
- package/dist/plugin/helpers/createRscRenderHelpers.d.ts.map +1 -0
- package/dist/plugin/helpers/createRscRenderHelpers.js +60 -0
- package/dist/plugin/helpers/createSafePageComponent.d.ts +36 -0
- package/dist/plugin/helpers/createSafePageComponent.d.ts.map +1 -0
- package/dist/plugin/helpers/createSafePageComponent.js +50 -0
- package/dist/plugin/helpers/createSerializableHandlerOptions.d.ts +60 -0
- package/dist/plugin/helpers/createSerializableHandlerOptions.d.ts.map +1 -0
- package/dist/plugin/helpers/createSerializableHandlerOptions.js +94 -0
- package/dist/plugin/helpers/createSharedLoader.d.ts +44 -0
- package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -0
- package/dist/plugin/helpers/createSharedLoader.js +137 -0
- package/dist/plugin/helpers/createUnifiedCssProcessor.d.ts +70 -0
- package/dist/plugin/helpers/createUnifiedCssProcessor.d.ts.map +1 -0
- package/dist/plugin/helpers/createUnifiedCssProcessor.js +89 -0
- package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
- package/dist/plugin/helpers/getBundleManifest.js +2 -3
- package/dist/plugin/helpers/getRouteFiles.d.ts +1 -1
- package/dist/plugin/helpers/getRouteFiles.d.ts.map +1 -1
- package/dist/plugin/helpers/getRouteFiles.js +43 -41
- package/dist/plugin/helpers/handleServerAction.client.d.ts +29 -0
- package/dist/plugin/helpers/handleServerAction.client.d.ts.map +1 -0
- package/dist/plugin/helpers/handleServerAction.client.js +93 -0
- package/dist/plugin/helpers/handleServerAction.d.ts +2 -34
- package/dist/plugin/helpers/handleServerAction.d.ts.map +1 -1
- package/dist/plugin/helpers/handleServerAction.js +15 -45
- package/dist/plugin/helpers/handleServerAction.server.d.ts +25 -0
- package/dist/plugin/helpers/handleServerAction.server.d.ts.map +1 -0
- package/dist/plugin/helpers/handleServerAction.server.js +80 -0
- package/dist/plugin/helpers/handleServerActionHelper.d.ts +61 -0
- package/dist/plugin/helpers/handleServerActionHelper.d.ts.map +1 -0
- package/dist/plugin/helpers/handleServerActionHelper.js +183 -0
- package/dist/plugin/helpers/headlessStreamReuseHandler.d.ts +12 -0
- package/dist/plugin/helpers/headlessStreamReuseHandler.d.ts.map +1 -0
- package/dist/plugin/helpers/headlessStreamReuseHandler.js +29 -0
- package/dist/plugin/helpers/headlessStreamState.d.ts +71 -0
- package/dist/plugin/helpers/headlessStreamState.d.ts.map +1 -0
- package/dist/plugin/helpers/headlessStreamState.js +81 -0
- package/dist/plugin/helpers/hydrateUserOptions.d.ts +1 -1
- package/dist/plugin/helpers/hydrateUserOptions.d.ts.map +1 -1
- package/dist/plugin/helpers/hydrateUserOptions.js +2 -2
- package/dist/plugin/helpers/index.d.ts +12 -5
- package/dist/plugin/helpers/index.d.ts.map +1 -1
- package/dist/plugin/helpers/index.js +18 -4
- package/dist/plugin/helpers/logRenderStart.d.ts +17 -0
- package/dist/plugin/helpers/logRenderStart.d.ts.map +1 -0
- package/dist/plugin/helpers/logRenderStart.js +13 -0
- package/dist/plugin/helpers/mergeMessageWithDefaults.d.ts +90 -0
- package/dist/plugin/helpers/mergeMessageWithDefaults.d.ts.map +1 -0
- package/dist/plugin/helpers/mergeMessageWithDefaults.js +67 -0
- package/dist/plugin/helpers/pipeToResponse.d.ts +19 -0
- package/dist/plugin/helpers/pipeToResponse.d.ts.map +1 -0
- package/dist/plugin/helpers/pipeToResponse.js +55 -0
- package/dist/plugin/helpers/requestInfo.d.ts +2 -0
- package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
- package/dist/plugin/helpers/requestInfo.js +6 -2
- package/dist/plugin/helpers/resolveComponents.client.d.ts +34 -0
- package/dist/plugin/helpers/resolveComponents.client.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveComponents.client.js +126 -0
- package/dist/plugin/helpers/resolveModuleFromManifest.d.ts +36 -0
- package/dist/plugin/helpers/resolveModuleFromManifest.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveModuleFromManifest.js +60 -0
- package/dist/plugin/helpers/resolvePageAndProps.d.ts +23 -2
- package/dist/plugin/helpers/resolvePageAndProps.d.ts.map +1 -1
- package/dist/plugin/helpers/resolvePageAndProps.js +150 -9
- package/dist/plugin/helpers/resolveRenderUrl.d.ts +11 -0
- package/dist/plugin/helpers/resolveRenderUrl.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveRenderUrl.js +19 -0
- package/dist/plugin/helpers/resolveStreamElements.client.d.ts +14 -0
- package/dist/plugin/helpers/resolveStreamElements.client.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveStreamElements.client.js +36 -0
- package/dist/plugin/helpers/resolveStreamElements.d.ts +3 -0
- package/dist/plugin/helpers/resolveStreamElements.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveStreamElements.js +13 -0
- package/dist/plugin/helpers/resolveStreamElements.server.d.ts +15 -0
- package/dist/plugin/helpers/resolveStreamElements.server.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveStreamElements.server.js +35 -0
- package/dist/plugin/helpers/resolveStreamElements.types.d.ts +22 -0
- package/dist/plugin/helpers/resolveStreamElements.types.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveStreamElements.types.js +1 -0
- package/dist/plugin/helpers/resolveVirtualAndNodeModules.d.ts +15 -0
- package/dist/plugin/helpers/resolveVirtualAndNodeModules.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveVirtualAndNodeModules.js +45 -0
- package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.d.ts +18 -0
- package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.d.ts.map +1 -0
- package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.js +17 -0
- package/dist/plugin/helpers/serializeUserOptions.d.ts +2 -2
- package/dist/plugin/helpers/serializeUserOptions.d.ts.map +1 -1
- package/dist/plugin/helpers/serializeUserOptions.js +28 -13
- package/dist/plugin/helpers/tryManifest.d.ts +2 -2
- package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
- package/dist/plugin/helpers/tryManifest.js +12 -6
- package/dist/plugin/helpers/validateRscRenderMessage.d.ts +9 -0
- package/dist/plugin/helpers/validateRscRenderMessage.d.ts.map +1 -0
- package/dist/plugin/helpers/validateRscRenderMessage.js +13 -0
- package/dist/plugin/helpers/workerCleanup.d.ts +29 -0
- package/dist/plugin/helpers/workerCleanup.d.ts.map +1 -0
- package/dist/plugin/helpers/workerCleanup.js +28 -0
- package/dist/plugin/helpers/workerManager.d.ts +5 -0
- package/dist/plugin/helpers/workerManager.d.ts.map +1 -0
- package/dist/plugin/helpers/workerManager.js +18 -0
- package/dist/plugin/index.d.ts +4 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +5 -2
- package/dist/plugin/loader/createDefaultLoader.d.ts +1 -1
- package/dist/plugin/loader/createDefaultLoader.d.ts.map +1 -1
- package/dist/plugin/loader/createDefaultLoader.js +2 -22
- package/dist/plugin/loader/createTransformer.d.ts.map +1 -1
- package/dist/plugin/loader/createTransformer.js +155 -25
- package/dist/plugin/loader/directives/analyzeDirectives.d.ts +3 -2
- package/dist/plugin/loader/directives/analyzeDirectives.d.ts.map +1 -1
- package/dist/plugin/loader/directives/analyzeDirectives.js +53 -26
- package/dist/plugin/loader/directives/analyzeModule.d.ts.map +1 -1
- package/dist/plugin/loader/directives/analyzeModule.js +16 -9
- package/dist/plugin/loader/env-loader.js +2 -2
- package/dist/plugin/loader/react-loader.d.ts +4 -4
- package/dist/plugin/loader/react-loader.d.ts.map +1 -1
- package/dist/plugin/loader/react-loader.js +101 -73
- package/dist/plugin/loader/transformClientModule.d.ts +3 -3
- package/dist/plugin/loader/transformClientModule.d.ts.map +1 -1
- package/dist/plugin/loader/transformClientModule.js +63 -18
- package/dist/plugin/loader/transformModule.d.ts.map +1 -1
- package/dist/plugin/loader/transformModule.js +80 -16
- package/dist/plugin/loader/transformModuleIfNeeded.d.ts +6 -1
- package/dist/plugin/loader/transformModuleIfNeeded.d.ts.map +1 -1
- package/dist/plugin/loader/transformModuleIfNeeded.js +10 -18
- package/dist/plugin/loader/transformNonServerEnvironment.d.ts +1 -1
- package/dist/plugin/loader/transformNonServerEnvironment.d.ts.map +1 -1
- package/dist/plugin/loader/transformNonServerEnvironment.js +14 -12
- package/dist/plugin/loader/transformServerModule.d.ts +1 -1
- package/dist/plugin/loader/transformServerModule.d.ts.map +1 -1
- package/dist/plugin/loader/transformServerModule.js +54 -15
- package/dist/plugin/loader/types.d.ts +24 -7
- package/dist/plugin/loader/types.d.ts.map +1 -1
- package/dist/plugin/metrics/collectStreamMetrics.d.ts +1 -2
- package/dist/plugin/metrics/collectStreamMetrics.d.ts.map +1 -1
- package/dist/plugin/metrics/collectStreamMetrics.js +1 -1
- package/dist/plugin/metrics/convertStreamMetrics.d.ts +3 -0
- package/dist/plugin/metrics/convertStreamMetrics.d.ts.map +1 -0
- package/dist/plugin/metrics/convertStreamMetrics.js +26 -0
- package/dist/plugin/metrics/createModuleResolutionMetrics.d.ts +12 -0
- package/dist/plugin/metrics/createModuleResolutionMetrics.d.ts.map +1 -0
- package/dist/plugin/metrics/createModuleResolutionMetrics.js +32 -0
- package/dist/plugin/metrics/createRenderMetrics.d.ts +2 -2
- package/dist/plugin/metrics/createRenderMetrics.d.ts.map +1 -1
- package/dist/plugin/metrics/createRenderMetrics.js +45 -13
- package/dist/plugin/metrics/createStreamMetrics.d.ts +2 -2
- package/dist/plugin/metrics/createStreamMetrics.d.ts.map +1 -1
- package/dist/plugin/metrics/createStreamMetrics.js +15 -4
- package/dist/plugin/metrics/createWorkerStartupMetrics.d.ts +12 -0
- package/dist/plugin/metrics/createWorkerStartupMetrics.d.ts.map +1 -0
- package/dist/plugin/metrics/createWorkerStartupMetrics.js +14 -0
- package/dist/plugin/metrics/formatMetrics.d.ts +0 -6
- package/dist/plugin/metrics/formatMetrics.d.ts.map +1 -1
- package/dist/plugin/metrics/formatMetrics.js +7 -29
- package/dist/plugin/metrics/index.d.ts +6 -3
- package/dist/plugin/metrics/index.d.ts.map +1 -1
- package/dist/plugin/metrics/index.js +6 -3
- package/dist/plugin/metrics/metricWatcher.d.ts +9 -0
- package/dist/plugin/metrics/metricWatcher.d.ts.map +1 -0
- package/dist/plugin/metrics/metricWatcher.js +141 -0
- package/dist/plugin/metrics/types.d.ts +72 -6
- package/dist/plugin/metrics/types.d.ts.map +1 -1
- package/dist/plugin/orchestrator/createPluginOrchestrator.client.d.ts +3 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.client.d.ts.map +1 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +36 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.d.ts +19 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.d.ts.map +1 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.js +13 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.server.d.ts +3 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.server.d.ts.map +1 -0
- package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +44 -0
- package/dist/plugin/orchestrator/index.d.ts +2 -0
- package/dist/plugin/orchestrator/index.d.ts.map +1 -0
- package/dist/plugin/orchestrator/index.js +1 -0
- package/dist/plugin/orchestrator/plugin.js +7 -0
- package/dist/plugin/orchestrator/resolveStrategy.d.ts +19 -0
- package/dist/plugin/orchestrator/resolveStrategy.d.ts.map +1 -0
- package/dist/plugin/orchestrator/resolveStrategy.js +35 -0
- package/dist/plugin/orchestrator/types.d.ts +21 -0
- package/dist/plugin/orchestrator/types.d.ts.map +1 -0
- package/dist/plugin/orchestrator/types.js +1 -0
- package/dist/plugin/plugin.client.d.ts +11 -19
- package/dist/plugin/plugin.client.d.ts.map +1 -1
- package/dist/plugin/plugin.client.js +20 -13
- package/dist/plugin/plugin.d.ts +2 -1
- package/dist/plugin/plugin.d.ts.map +1 -1
- package/dist/plugin/plugin.js +4 -2
- package/dist/plugin/plugin.server.d.ts +13 -11
- package/dist/plugin/plugin.server.d.ts.map +1 -1
- package/dist/plugin/plugin.server.js +19 -18
- package/dist/plugin/process-env.d.ts +1 -0
- package/dist/plugin/process-env.d.ts.map +1 -1
- package/dist/plugin/react-client/createMessageHandlers.d.ts +2 -10
- package/dist/plugin/react-client/createMessageHandlers.d.ts.map +1 -1
- package/dist/plugin/react-client/createMessageHandlers.js +42 -69
- package/dist/plugin/react-client/index.client.d.ts +2 -0
- package/dist/plugin/react-client/index.client.d.ts.map +1 -0
- package/dist/plugin/react-client/index.client.js +1 -0
- package/dist/plugin/react-client/index.d.ts +3 -4
- package/dist/plugin/react-client/index.d.ts.map +1 -1
- package/dist/plugin/react-client/index.js +10 -5
- package/dist/plugin/react-client/index.server.d.ts +2 -0
- package/dist/plugin/react-client/index.server.d.ts.map +1 -0
- package/dist/plugin/react-client/index.server.js +1 -0
- package/dist/plugin/react-client/plugin.client.d.ts +15 -0
- package/dist/plugin/react-client/plugin.client.d.ts.map +1 -0
- package/dist/plugin/react-client/plugin.client.js +98 -0
- package/dist/plugin/react-client/plugin.d.ts +2 -5
- package/dist/plugin/react-client/plugin.d.ts.map +1 -1
- package/dist/plugin/react-client/plugin.js +6 -121
- package/dist/plugin/react-client/plugin.server.d.ts +15 -0
- package/dist/plugin/react-client/plugin.server.d.ts.map +1 -0
- package/dist/plugin/react-client/plugin.server.js +93 -0
- package/dist/plugin/react-client/types.d.ts +60 -0
- package/dist/plugin/react-client/types.d.ts.map +1 -0
- package/dist/plugin/react-client/types.js +1 -0
- package/dist/plugin/react-server/index.client.d.ts +2 -0
- package/dist/plugin/react-server/index.client.d.ts.map +1 -0
- package/dist/plugin/react-server/index.client.js +1 -0
- package/dist/plugin/react-server/index.d.ts +3 -1
- package/dist/plugin/react-server/index.d.ts.map +1 -1
- package/dist/plugin/react-server/index.js +13 -1
- package/dist/plugin/react-server/index.server.d.ts +2 -0
- package/dist/plugin/react-server/index.server.d.ts.map +1 -0
- package/dist/plugin/react-server/index.server.js +1 -0
- package/dist/plugin/react-server/plugin.client.d.ts +3 -0
- package/dist/plugin/react-server/plugin.client.d.ts.map +1 -0
- package/dist/plugin/react-server/plugin.client.js +40 -0
- package/dist/plugin/react-server/plugin.d.ts +2 -5
- package/dist/plugin/react-server/plugin.d.ts.map +1 -1
- package/dist/plugin/react-server/plugin.js +5 -143
- package/dist/plugin/react-server/plugin.server.d.ts +3 -0
- package/dist/plugin/react-server/plugin.server.d.ts.map +1 -0
- package/dist/plugin/react-server/plugin.server.js +18 -0
- package/dist/plugin/react-server/types.d.ts +11 -0
- package/dist/plugin/react-server/types.d.ts.map +1 -0
- package/dist/plugin/react-server/types.js +1 -0
- package/dist/plugin/react-static/collectHtmlContent.d.ts +15 -0
- package/dist/plugin/react-static/collectHtmlContent.d.ts.map +1 -0
- package/dist/plugin/react-static/collectHtmlContent.js +104 -0
- package/dist/plugin/react-static/collectRscContent.d.ts +10 -15
- package/dist/plugin/react-static/collectRscContent.d.ts.map +1 -1
- package/dist/plugin/react-static/collectRscContent.js +71 -20
- package/dist/plugin/react-static/configurePreviewServer.d.ts +1 -7
- package/dist/plugin/react-static/configurePreviewServer.d.ts.map +1 -1
- package/dist/plugin/react-static/configurePreviewServer.js +3 -6
- package/dist/plugin/react-static/createBuildLoader.client.d.ts +2 -0
- package/dist/plugin/react-static/createBuildLoader.client.d.ts.map +1 -0
- package/dist/plugin/react-static/createBuildLoader.client.js +7 -0
- package/dist/plugin/react-static/createBuildLoader.d.ts +3 -19
- package/dist/plugin/react-static/createBuildLoader.d.ts.map +1 -1
- package/dist/plugin/react-static/createBuildLoader.js +4 -226
- package/dist/plugin/react-static/createBuildLoader.server.d.ts +9 -0
- package/dist/plugin/react-static/createBuildLoader.server.d.ts.map +1 -0
- package/dist/plugin/react-static/createBuildLoader.server.js +253 -0
- package/dist/plugin/react-static/fileWriter.d.ts +3 -14
- package/dist/plugin/react-static/fileWriter.d.ts.map +1 -1
- package/dist/plugin/react-static/fileWriter.js +233 -42
- package/dist/plugin/react-static/index.client.d.ts +7 -0
- package/dist/plugin/react-static/index.client.d.ts.map +1 -0
- package/dist/plugin/react-static/index.client.js +6 -0
- package/dist/plugin/react-static/index.d.ts +7 -1
- package/dist/plugin/react-static/index.d.ts.map +1 -1
- package/dist/plugin/react-static/index.js +19 -1
- package/dist/plugin/react-static/index.server.d.ts +7 -0
- package/dist/plugin/react-static/index.server.d.ts.map +1 -0
- package/dist/plugin/react-static/index.server.js +6 -0
- package/dist/plugin/react-static/plugin.client.d.ts +32 -0
- package/dist/plugin/react-static/plugin.client.d.ts.map +1 -0
- package/dist/plugin/react-static/plugin.client.js +801 -0
- package/dist/plugin/react-static/plugin.d.ts +3 -20
- package/dist/plugin/react-static/plugin.d.ts.map +1 -1
- package/dist/plugin/react-static/plugin.js +4 -365
- package/dist/plugin/react-static/plugin.server.d.ts +18 -0
- package/dist/plugin/react-static/plugin.server.d.ts.map +1 -0
- package/dist/plugin/react-static/plugin.server.js +615 -0
- package/dist/plugin/react-static/processCssFilesForPages.d.ts +16 -0
- package/dist/plugin/react-static/processCssFilesForPages.d.ts.map +1 -0
- package/dist/plugin/react-static/processCssFilesForPages.js +94 -0
- package/dist/plugin/react-static/renderPage.client.d.ts +49 -0
- package/dist/plugin/react-static/renderPage.client.d.ts.map +1 -0
- package/dist/plugin/react-static/renderPage.client.js +555 -0
- package/dist/plugin/react-static/renderPage.d.ts +3 -4
- package/dist/plugin/react-static/renderPage.d.ts.map +1 -1
- package/dist/plugin/react-static/renderPage.js +6 -119
- package/dist/plugin/react-static/renderPage.server.d.ts +24 -0
- package/dist/plugin/react-static/renderPage.server.d.ts.map +1 -0
- package/dist/plugin/react-static/renderPage.server.js +533 -0
- package/dist/plugin/react-static/renderPages.d.ts +11 -3
- package/dist/plugin/react-static/renderPages.d.ts.map +1 -1
- package/dist/plugin/react-static/renderPages.js +533 -92
- package/dist/plugin/react-static/renderPagesBatched.d.ts +6 -0
- package/dist/plugin/react-static/renderPagesBatched.d.ts.map +1 -0
- package/dist/plugin/react-static/renderPagesBatched.js +195 -0
- package/dist/plugin/react-static/renderStreams.d.ts +2 -5
- package/dist/plugin/react-static/renderStreams.d.ts.map +1 -1
- package/dist/plugin/react-static/renderStreams.js +36 -24
- package/dist/plugin/react-static/rscToHtmlStream.client.d.ts +12 -0
- package/dist/plugin/react-static/rscToHtmlStream.client.d.ts.map +1 -0
- package/dist/plugin/react-static/rscToHtmlStream.client.js +32 -0
- package/dist/plugin/react-static/rscToHtmlStream.d.ts +3 -21
- package/dist/plugin/react-static/rscToHtmlStream.d.ts.map +1 -1
- package/dist/plugin/react-static/rscToHtmlStream.js +4 -53
- package/dist/plugin/react-static/rscToHtmlStream.server.d.ts +3 -0
- package/dist/plugin/react-static/rscToHtmlStream.server.d.ts.map +1 -0
- package/dist/plugin/react-static/rscToHtmlStream.server.js +39 -0
- package/dist/plugin/react-static/temporaryReferences.client.d.ts +2 -0
- package/dist/plugin/react-static/temporaryReferences.client.d.ts.map +1 -0
- package/dist/plugin/react-static/temporaryReferences.client.js +1 -0
- package/dist/plugin/react-static/temporaryReferences.d.ts +2 -1
- package/dist/plugin/react-static/temporaryReferences.d.ts.map +1 -1
- package/dist/plugin/react-static/temporaryReferences.js +6 -10
- package/dist/plugin/react-static/temporaryReferences.server.d.ts +2 -0
- package/dist/plugin/react-static/temporaryReferences.server.d.ts.map +1 -0
- package/dist/plugin/react-static/temporaryReferences.server.js +3 -0
- package/dist/plugin/react-static/types.d.ts +83 -9
- package/dist/plugin/react-static/types.d.ts.map +1 -1
- package/dist/plugin/root.d.ts.map +1 -1
- package/dist/plugin/root.js +2 -5
- package/dist/plugin/stream/MessagePortReadable.d.ts +22 -0
- package/dist/plugin/stream/MessagePortReadable.d.ts.map +1 -0
- package/dist/plugin/stream/MessagePortReadable.js +101 -0
- package/dist/plugin/stream/MessagePortWritable.d.ts +22 -0
- package/dist/plugin/stream/MessagePortWritable.d.ts.map +1 -0
- package/dist/plugin/stream/MessagePortWritable.js +85 -0
- package/dist/plugin/stream/client.js +12 -0
- package/dist/plugin/stream/createFromNodeStream.client.d.ts +9 -0
- package/dist/plugin/stream/createFromNodeStream.client.d.ts.map +1 -0
- package/dist/plugin/stream/createFromNodeStream.client.js +76 -0
- package/dist/plugin/stream/createFromNodeStream.d.ts +3 -0
- package/dist/plugin/stream/createFromNodeStream.d.ts.map +1 -0
- package/dist/plugin/stream/createFromNodeStream.js +6 -0
- package/dist/plugin/stream/createFromNodeStream.server.d.ts +9 -0
- package/dist/plugin/stream/createFromNodeStream.server.d.ts.map +1 -0
- package/dist/plugin/stream/createFromNodeStream.server.js +27 -0
- package/dist/plugin/stream/createFromNodeStream.types.d.ts +37 -0
- package/dist/plugin/stream/createFromNodeStream.types.d.ts.map +1 -0
- package/dist/plugin/stream/createFromNodeStream.types.js +1 -0
- package/dist/plugin/stream/createHtmlStream.client.d.ts +3 -0
- package/dist/plugin/stream/createHtmlStream.client.d.ts.map +1 -0
- package/dist/plugin/stream/createHtmlStream.client.js +42 -0
- package/dist/plugin/stream/createHtmlStream.d.ts +3 -0
- package/dist/plugin/stream/createHtmlStream.d.ts.map +1 -0
- package/dist/plugin/stream/createHtmlStream.js +6 -0
- package/dist/plugin/stream/createHtmlStream.server.d.ts +6 -0
- package/dist/plugin/stream/createHtmlStream.server.d.ts.map +1 -0
- package/dist/plugin/stream/createHtmlStream.server.js +224 -0
- package/dist/plugin/stream/createHtmlStream.types.d.ts +43 -0
- package/dist/plugin/stream/createHtmlStream.types.d.ts.map +1 -0
- package/dist/plugin/stream/createHtmlStream.types.js +1 -0
- package/dist/plugin/stream/createMainThreadHandlers.d.ts +11 -0
- package/dist/plugin/stream/createMainThreadHandlers.d.ts.map +1 -0
- package/dist/plugin/stream/createMainThreadHandlers.js +32 -0
- package/dist/plugin/stream/createMessageChannels.d.ts +29 -0
- package/dist/plugin/stream/createMessageChannels.d.ts.map +1 -0
- package/dist/plugin/stream/createMessageChannels.js +35 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.d.ts +10 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.d.ts.map +1 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.js +188 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.d.ts +3 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.d.ts.map +1 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.js +6 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.d.ts +45 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.d.ts.map +1 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.js +249 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.d.ts +17 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.d.ts.map +1 -0
- package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.js +1 -0
- package/dist/plugin/stream/createRscStream.client.d.ts +18 -0
- package/dist/plugin/stream/createRscStream.client.d.ts.map +1 -0
- package/dist/plugin/stream/createRscStream.client.js +79 -0
- package/dist/plugin/stream/createRscStream.d.ts +2 -0
- package/dist/plugin/stream/createRscStream.d.ts.map +1 -0
- package/dist/plugin/stream/createRscStream.js +13 -0
- package/dist/plugin/stream/createRscStream.server.d.ts +46 -0
- package/dist/plugin/stream/createRscStream.server.d.ts.map +1 -0
- package/dist/plugin/stream/createRscStream.server.js +113 -0
- package/dist/plugin/stream/createRscStream.types.d.ts +134 -0
- package/dist/plugin/stream/createRscStream.types.d.ts.map +1 -0
- package/dist/plugin/stream/createRscStream.types.js +1 -0
- package/dist/plugin/stream/createRscStream.utils.d.ts +54 -0
- package/dist/plugin/stream/createRscStream.utils.d.ts.map +1 -0
- package/dist/plugin/stream/createRscStream.utils.js +91 -0
- package/dist/plugin/stream/createRscWorkerStream.d.ts +41 -0
- package/dist/plugin/stream/createRscWorkerStream.d.ts.map +1 -0
- package/dist/plugin/stream/createRscWorkerStream.js +120 -0
- package/dist/plugin/stream/handleRscStream.client.d.ts +17 -0
- package/dist/plugin/stream/handleRscStream.client.d.ts.map +1 -0
- package/dist/plugin/stream/handleRscStream.client.js +163 -0
- package/dist/plugin/stream/handleRscStream.d.ts +3 -0
- package/dist/plugin/stream/handleRscStream.d.ts.map +1 -0
- package/dist/plugin/stream/handleRscStream.js +13 -0
- package/dist/plugin/stream/handleRscStream.server.d.ts +6 -0
- package/dist/plugin/stream/handleRscStream.server.d.ts.map +1 -0
- package/dist/plugin/stream/handleRscStream.server.js +70 -0
- package/dist/plugin/stream/handleRscStream.types.d.ts +28 -0
- package/dist/plugin/stream/handleRscStream.types.d.ts.map +1 -0
- package/dist/plugin/stream/handleRscStream.types.js +1 -0
- package/dist/plugin/stream/index.client.d.ts +7 -0
- package/dist/plugin/stream/index.client.d.ts.map +1 -0
- package/dist/plugin/stream/index.client.js +11 -0
- package/dist/plugin/stream/index.d.ts +95 -0
- package/dist/plugin/stream/index.d.ts.map +1 -0
- package/dist/plugin/stream/index.js +21 -0
- package/dist/plugin/stream/index.server.d.ts +7 -0
- package/dist/plugin/stream/index.server.d.ts.map +1 -0
- package/dist/plugin/stream/index.server.js +11 -0
- package/dist/plugin/stream/renderRscStream.server.d.ts +21 -0
- package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -0
- package/dist/plugin/stream/renderRscStream.server.js +153 -0
- package/dist/plugin/stream/renderRscStream.types.d.ts +36 -0
- package/dist/plugin/stream/renderRscStream.types.d.ts.map +1 -0
- package/dist/plugin/stream/renderRscStream.types.js +1 -0
- package/dist/plugin/stream/renderRscStreamHelpers.server.d.ts +9 -0
- package/dist/plugin/stream/renderRscStreamHelpers.server.d.ts.map +1 -0
- package/dist/plugin/stream/renderRscStreamHelpers.server.js +63 -0
- package/dist/plugin/stream/server.js +12 -0
- package/dist/plugin/stream/setMaxListeners.d.ts +16 -0
- package/dist/plugin/stream/setMaxListeners.d.ts.map +1 -0
- package/dist/plugin/stream/setMaxListeners.js +16 -0
- package/dist/plugin/transformer/createTransformerPlugin.d.ts +18 -0
- package/dist/plugin/transformer/createTransformerPlugin.d.ts.map +1 -0
- package/dist/plugin/transformer/createTransformerPlugin.js +269 -0
- package/dist/plugin/transformer/plugin.client.d.ts +2 -29
- package/dist/plugin/transformer/plugin.client.d.ts.map +1 -1
- package/dist/plugin/transformer/plugin.client.js +5 -96
- package/dist/plugin/transformer/plugin.server.d.ts +2 -29
- package/dist/plugin/transformer/plugin.server.d.ts.map +1 -1
- package/dist/plugin/transformer/plugin.server.js +5 -96
- package/dist/plugin/transformer/transformerEnv.d.ts +15 -0
- package/dist/plugin/transformer/transformerEnv.d.ts.map +1 -0
- package/dist/plugin/transformer/transformerEnv.js +26 -0
- package/dist/plugin/types.d.ts +366 -140
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js +1 -2
- package/dist/plugin/utils/callServer.d.ts +1 -1
- package/dist/plugin/utils/callServer.d.ts.map +1 -1
- package/dist/plugin/utils/createCallServer.d.ts +1 -1
- package/dist/plugin/utils/createCallServer.d.ts.map +1 -1
- package/dist/plugin/utils/createCallServer.js +4 -9
- package/dist/plugin/utils/createReactFetcher.d.ts +43 -2
- package/dist/plugin/utils/createReactFetcher.d.ts.map +1 -1
- package/dist/plugin/utils/createReactFetcher.js +14 -3
- package/dist/plugin/utils/envUrls.node.js +11 -12
- package/dist/plugin/utils/index.client.d.ts +8 -0
- package/dist/plugin/utils/index.client.d.ts.map +1 -0
- package/dist/plugin/utils/index.client.js +8 -0
- package/dist/plugin/utils/index.d.ts +1 -0
- package/dist/plugin/utils/index.d.ts.map +1 -1
- package/dist/plugin/utils/index.js +3 -2
- package/dist/plugin/utils/index.server.d.ts +6 -0
- package/dist/plugin/utils/index.server.d.ts.map +1 -0
- package/dist/plugin/utils/index.server.js +8 -0
- package/dist/plugin/utils/routeToURL.d.ts.map +1 -1
- package/dist/plugin/utils/routeToURL.js +4 -4
- package/dist/plugin/utils/urls.d.ts +1 -1
- package/dist/plugin/utils/urls.d.ts.map +1 -1
- package/dist/plugin/utils/urls.js +29 -8
- package/dist/plugin/utils/useRscHmr.d.ts +39 -0
- package/dist/plugin/utils/useRscHmr.d.ts.map +1 -0
- package/dist/plugin/utils/useRscHmr.js +27 -0
- package/dist/plugin/vendor/vendor.client.d.ts +3 -3
- package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.client.js +7 -6
- package/dist/plugin/vendor/vendor.d.ts +1 -1
- package/dist/plugin/vendor/vendor.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.js +4 -6
- package/dist/plugin/vendor/vendor.server.d.ts +4 -2
- package/dist/plugin/vendor/vendor.server.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.server.js +2 -3
- package/dist/plugin/vendor/vendor.static.d.ts +4 -0
- package/dist/plugin/vendor/vendor.static.d.ts.map +1 -0
- package/dist/plugin/vendor/vendor.static.js +15 -0
- package/dist/plugin/worker/createWorker.d.ts +16 -5
- package/dist/plugin/worker/createWorker.d.ts.map +1 -1
- package/dist/plugin/worker/createWorker.js +207 -30
- package/dist/plugin/worker/html/handleHtmlRender.d.ts +14 -0
- package/dist/plugin/worker/html/handleHtmlRender.d.ts.map +1 -0
- package/dist/plugin/worker/html/handleHtmlRender.js +190 -0
- package/dist/plugin/worker/html/html-worker.development.js +9 -26
- package/dist/plugin/worker/html/html-worker.js +4 -4
- package/dist/plugin/worker/html/html-worker.production.js +7 -13
- package/dist/plugin/worker/html/index.d.ts +1 -1
- package/dist/plugin/worker/html/index.js +6 -2
- package/dist/plugin/worker/html/messageHandler.d.ts +1 -1
- package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
- package/dist/plugin/worker/html/messageHandler.js +291 -104
- package/dist/plugin/worker/html/state.d.ts +10 -0
- package/dist/plugin/worker/html/state.d.ts.map +1 -0
- package/dist/plugin/worker/html/state.js +28 -0
- package/dist/plugin/worker/html/types.d.ts +52 -23
- package/dist/plugin/worker/html/types.d.ts.map +1 -1
- package/dist/plugin/worker/index.js +1 -1
- package/dist/plugin/worker/rsc/createBundleLoader.d.ts +22 -0
- package/dist/plugin/worker/rsc/createBundleLoader.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/createBundleLoader.js +55 -0
- package/dist/plugin/worker/rsc/createRscWorkerLoader.d.ts +23 -0
- package/dist/plugin/worker/rsc/createRscWorkerLoader.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/createRscWorkerLoader.js +79 -0
- package/dist/plugin/worker/rsc/handleRscRender.d.ts +32 -0
- package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/handleRscRender.js +349 -0
- package/dist/plugin/worker/rsc/handlers.d.ts +8 -2
- package/dist/plugin/worker/rsc/handlers.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/handlers.js +137 -200
- package/dist/plugin/worker/rsc/hydrateRscRenderMessage.d.ts +118 -0
- package/dist/plugin/worker/rsc/hydrateRscRenderMessage.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/hydrateRscRenderMessage.js +61 -0
- package/dist/plugin/worker/rsc/messageHandler.d.ts +1 -1
- package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.js +927 -49
- package/dist/plugin/worker/rsc/rsc-worker.development.js +153 -148
- package/dist/plugin/worker/rsc/rsc-worker.js +2 -3
- package/dist/plugin/worker/rsc/rsc-worker.production.js +238 -42
- package/dist/plugin/worker/rsc/state.d.ts +6 -0
- package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/state.js +37 -5
- package/dist/plugin/worker/rsc/types.d.ts +73 -12
- package/dist/plugin/worker/rsc/types.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/workerUserOptions.d.ts +10 -0
- package/dist/plugin/worker/rsc/workerUserOptions.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/workerUserOptions.js +39 -0
- package/dist/plugin/worker/sendMessage.d.ts +2 -3
- package/dist/plugin/worker/sendMessage.d.ts.map +1 -1
- package/dist/plugin/worker/sendMessage.js +24 -38
- package/dist/plugin/worker/types.d.ts +42 -56
- package/dist/plugin/worker/types.d.ts.map +1 -1
- package/dist/plugin/worker/worker-handlers.server.d.ts +2 -0
- package/dist/plugin/worker/worker-handlers.server.d.ts.map +1 -0
- package/dist/plugin/worker/worker-handlers.server.js +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -6
- package/dist/static.js +11 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +103 -28
- package/plugin/bundle/bundles.ts +22 -0
- package/plugin/bundle/deferredStaticGeneration.ts +48 -0
- package/plugin/bundle/manifests.ts +73 -0
- package/plugin/components/css.tsx +3 -7
- package/plugin/components/html.tsx +4 -3
- package/plugin/components/index.ts +1 -1
- package/plugin/components/root.tsx +3 -3
- package/plugin/config/autoDiscover/createGlobAutoDiscover.ts +10 -5
- package/plugin/config/autoDiscover/pageAndPropFiles.ts +4 -2
- package/plugin/config/autoDiscover/resolveAutoDiscover.ts +64 -79
- package/plugin/config/autoDiscover/resolveBuildPages.ts +181 -69
- package/plugin/config/createHandlerOptions.client.ts +403 -0
- package/plugin/config/createHandlerOptions.server.ts +477 -0
- package/plugin/config/createHandlerOptions.ts +46 -0
- package/plugin/config/createHandlerOptions.types.ts +119 -0
- package/plugin/config/createModuleID.ts +201 -10
- package/plugin/config/defaults.tsx +58 -9
- package/plugin/config/envPrefixFromConfig.ts +10 -0
- package/plugin/config/getCondition.ts +267 -10
- package/plugin/{getNodeEnv.ts → config/getNodeEnv.ts} +4 -2
- package/plugin/config/index.ts +60 -1
- package/plugin/config/resolveDirectiveMatcher.ts +13 -34
- package/plugin/config/resolveEnv.ts +3 -8
- package/plugin/config/resolveOptions.ts +295 -77
- package/plugin/config/resolvePages.ts +1 -1
- package/plugin/config/resolvePatternWithValues.ts +6 -26
- package/plugin/config/resolveUrlOption.ts +2 -2
- package/plugin/config/resolveUserConfig.ts +358 -133
- package/plugin/config/stashedOptionsState.ts +144 -0
- package/plugin/dev-server/cleanupServerAction.client.ts +47 -0
- package/plugin/dev-server/cleanupServerAction.server.ts +24 -0
- package/plugin/dev-server/cleanupServerAction.ts +8 -0
- package/plugin/dev-server/configureReactServer.client.ts +107 -0
- package/plugin/dev-server/configureReactServer.server.ts +558 -0
- package/plugin/dev-server/configureReactServer.ts +8 -0
- package/plugin/dev-server/configureRequestHandler.client.ts +382 -0
- package/plugin/dev-server/configureRequestHandler.server.ts +46 -0
- package/plugin/dev-server/configureRequestHandler.ts +8 -0
- package/plugin/dev-server/handleServerAction.client.ts +126 -0
- package/plugin/dev-server/handleServerAction.server.ts +10 -0
- package/plugin/dev-server/handleServerAction.ts +8 -0
- package/plugin/dev-server/index.client.ts +6 -0
- package/plugin/dev-server/index.server.ts +6 -0
- package/plugin/dev-server/index.ts +20 -0
- package/plugin/dev-server/plugin.client.ts +160 -0
- package/plugin/dev-server/plugin.server.ts +133 -0
- package/plugin/dev-server/restartWorker.client.ts +155 -0
- package/plugin/dev-server/restartWorker.server.ts +108 -0
- package/plugin/dev-server/restartWorker.ts +8 -0
- package/plugin/dev-server/types.ts +78 -0
- package/plugin/dev-server/virtualRscHmrPlugin.ts +82 -0
- package/plugin/env/createConfigEnv.ts +27 -8
- package/plugin/env/createEnvPlugin.ts +76 -0
- package/plugin/env/getArgValue.ts +1 -1
- package/plugin/env/getEnvKey.ts +20 -1
- package/plugin/env/index.ts +10 -0
- package/plugin/env/plugin.client.ts +3 -0
- package/plugin/env/plugin.server.ts +4 -0
- package/plugin/env/plugin.ts +48 -103
- package/plugin/environments/createBuildEventPlugin.ts +117 -0
- package/plugin/environments/createEnvironmentPlugin.ts +332 -0
- package/plugin/environments/hashCoordination.ts +39 -0
- package/plugin/environments/resolveEnvironmentConfig.ts +320 -0
- package/plugin/error/assertPanic.ts +9 -0
- package/plugin/error/handleError.ts +63 -0
- package/plugin/error/index.ts +4 -1
- package/plugin/error/logError.ts +63 -42
- package/plugin/error/panicThresholdHandler.ts +52 -0
- package/plugin/error/serializeError.ts +36 -11
- package/plugin/error/serializeErrorInfo.ts +17 -0
- package/plugin/error/setupGlobalErrorHandler.ts +71 -0
- package/plugin/error/shouldPanic.ts +14 -0
- package/plugin/error/toError.ts +59 -19
- package/plugin/error/types.ts +32 -0
- package/plugin/helpers/README.md +112 -0
- package/plugin/helpers/collectManifestCss.ts +24 -5
- package/plugin/helpers/collectViteModuleGraphCss.ts +83 -9
- package/plugin/helpers/createBufferedRscStream.ts +194 -0
- package/plugin/helpers/createCssProps.tsx +22 -19
- package/plugin/helpers/createElementWithReact.tsx +121 -0
- package/plugin/helpers/createPatternMatcher.ts +100 -0
- package/plugin/helpers/createRscRenderHelpers.ts +77 -0
- package/plugin/helpers/createSafePageComponent.ts +64 -0
- package/plugin/helpers/createSerializableHandlerOptions.ts +183 -0
- package/plugin/helpers/createSharedLoader.ts +207 -0
- package/plugin/helpers/createUnifiedCssProcessor.ts +175 -0
- package/plugin/helpers/getBundleManifest.ts +2 -3
- package/plugin/helpers/getRouteFiles.ts +28 -23
- package/plugin/helpers/handleServerAction.client.ts +145 -0
- package/plugin/helpers/handleServerAction.server.ts +151 -0
- package/plugin/helpers/handleServerAction.ts +19 -79
- package/plugin/helpers/handleServerActionHelper.ts +270 -0
- package/plugin/helpers/headlessStreamReuseHandler.ts +48 -0
- package/plugin/helpers/headlessStreamState.ts +122 -0
- package/plugin/helpers/hydrateUserOptions.ts +2 -2
- package/plugin/helpers/index.ts +32 -5
- package/plugin/helpers/logRenderStart.ts +26 -0
- package/plugin/helpers/mergeMessageWithDefaults.ts +80 -0
- package/plugin/helpers/pipeToResponse.ts +77 -0
- package/plugin/helpers/requestInfo.ts +9 -3
- package/plugin/helpers/resolveComponents.client.ts +183 -0
- package/plugin/helpers/resolveModuleFromManifest.ts +99 -0
- package/plugin/helpers/resolvePageAndProps.ts +237 -50
- package/plugin/helpers/resolveRenderUrl.ts +26 -0
- package/plugin/helpers/resolveStreamElements.client.ts +50 -0
- package/plugin/helpers/resolveStreamElements.server.ts +43 -0
- package/plugin/helpers/resolveStreamElements.ts +13 -0
- package/plugin/helpers/resolveStreamElements.types.ts +29 -0
- package/plugin/helpers/resolveVirtualAndNodeModules.ts +75 -0
- package/plugin/helpers/resolveWithDefaultRootAndHtml.ts +25 -0
- package/plugin/helpers/serializeUserOptions.ts +37 -15
- package/plugin/helpers/tryManifest.ts +15 -6
- package/plugin/helpers/validateRscRenderMessage.ts +13 -0
- package/plugin/helpers/workerCleanup.ts +85 -0
- package/plugin/helpers/workerManager.ts +16 -0
- package/plugin/index.ts +6 -2
- package/plugin/loader/createDefaultLoader.ts +0 -21
- package/plugin/loader/createTransformer.ts +231 -37
- package/plugin/loader/directives/analyzeDirectives.ts +163 -73
- package/plugin/loader/directives/analyzeModule.ts +18 -9
- package/plugin/loader/env-loader.ts +3 -3
- package/plugin/loader/react-loader.ts +133 -86
- package/plugin/loader/transformClientModule.ts +85 -23
- package/plugin/loader/transformModule.ts +101 -21
- package/plugin/loader/transformModuleIfNeeded.ts +20 -23
- package/plugin/loader/transformNonServerEnvironment.ts +21 -13
- package/plugin/loader/transformServerModule.ts +86 -22
- package/plugin/loader/types.ts +22 -7
- package/plugin/metrics/collectStreamMetrics.ts +1 -2
- package/plugin/metrics/convertStreamMetrics.ts +28 -0
- package/plugin/metrics/createModuleResolutionMetrics.ts +38 -0
- package/plugin/metrics/createRenderMetrics.ts +46 -13
- package/plugin/metrics/createStreamMetrics.ts +16 -6
- package/plugin/metrics/createWorkerStartupMetrics.ts +38 -0
- package/plugin/metrics/formatMetrics.ts +5 -33
- package/plugin/metrics/index.ts +6 -3
- package/plugin/metrics/metricWatcher.ts +216 -0
- package/plugin/metrics/types.ts +87 -8
- package/plugin/orchestrator/createPluginOrchestrator.client.ts +47 -0
- package/plugin/orchestrator/createPluginOrchestrator.server.ts +55 -0
- package/plugin/orchestrator/createPluginOrchestrator.ts +29 -0
- package/plugin/orchestrator/index.ts +1 -0
- package/plugin/orchestrator/resolveStrategy.ts +53 -0
- package/plugin/orchestrator/types.ts +24 -0
- package/plugin/plugin.client.ts +29 -34
- package/plugin/plugin.server.ts +36 -42
- package/plugin/plugin.ts +8 -2
- package/plugin/process-env.ts +3 -0
- package/plugin/react-client/createMessageHandlers.ts +9 -34
- package/plugin/react-client/index.client.ts +1 -0
- package/plugin/react-client/index.server.ts +1 -0
- package/plugin/react-client/index.ts +13 -4
- package/plugin/react-client/plugin.client.ts +124 -0
- package/plugin/react-client/plugin.server.ts +108 -0
- package/plugin/react-client/plugin.ts +13 -152
- package/plugin/react-client/types.ts +95 -0
- package/plugin/react-server/index.client.ts +1 -0
- package/plugin/react-server/index.server.ts +1 -0
- package/plugin/react-server/index.ts +13 -1
- package/plugin/react-server/plugin.client.ts +54 -0
- package/plugin/react-server/plugin.server.ts +27 -0
- package/plugin/react-server/plugin.ts +8 -183
- package/plugin/react-server/types.ts +24 -0
- package/plugin/react-static/collectHtmlContent.ts +131 -0
- package/plugin/react-static/collectRscContent.ts +92 -49
- package/plugin/react-static/configurePreviewServer.ts +8 -18
- package/plugin/react-static/createBuildLoader.client.ts +7 -0
- package/plugin/react-static/createBuildLoader.server.ts +333 -0
- package/plugin/react-static/createBuildLoader.ts +8 -300
- package/plugin/react-static/fileWriter.ts +303 -64
- package/plugin/react-static/index.client.ts +6 -0
- package/plugin/react-static/index.server.ts +6 -0
- package/plugin/react-static/index.ts +25 -1
- package/plugin/react-static/plugin.client.ts +932 -0
- package/plugin/react-static/plugin.server.ts +713 -0
- package/plugin/react-static/plugin.ts +8 -446
- package/plugin/react-static/processCssFilesForPages.ts +148 -0
- package/plugin/react-static/renderPage.client.ts +640 -0
- package/plugin/react-static/renderPage.server.ts +655 -0
- package/plugin/react-static/renderPage.ts +10 -160
- package/plugin/react-static/renderPages.ts +736 -139
- package/plugin/react-static/renderPagesBatched.ts +264 -0
- package/plugin/react-static/renderStreams.ts +12 -16
- package/plugin/react-static/rscToHtmlStream.client.ts +61 -0
- package/plugin/react-static/rscToHtmlStream.server.ts +66 -0
- package/plugin/react-static/rscToHtmlStream.ts +8 -80
- package/plugin/react-static/temporaryReferences.client.ts +1 -0
- package/plugin/react-static/temporaryReferences.server.ts +5 -0
- package/plugin/react-static/temporaryReferences.ts +11 -2
- package/plugin/react-static/types.ts +202 -8
- package/plugin/root.ts +1 -3
- package/plugin/stream/MessagePortReadable.ts +131 -0
- package/plugin/stream/MessagePortWritable.ts +104 -0
- package/plugin/stream/createFromNodeStream.client.ts +90 -0
- package/plugin/stream/createFromNodeStream.server.ts +30 -0
- package/plugin/stream/createFromNodeStream.ts +13 -0
- package/plugin/stream/createFromNodeStream.types.ts +53 -0
- package/plugin/stream/createHtmlStream.client.ts +47 -0
- package/plugin/stream/createHtmlStream.server.ts +312 -0
- package/plugin/stream/createHtmlStream.ts +13 -0
- package/plugin/stream/createHtmlStream.types.ts +63 -0
- package/plugin/stream/createMainThreadHandlers.ts +44 -0
- package/plugin/stream/createMessageChannels.ts +52 -0
- package/plugin/stream/createRenderToPipeableStreamHandler.client.ts +224 -0
- package/plugin/stream/createRenderToPipeableStreamHandler.server.ts +358 -0
- package/plugin/stream/createRenderToPipeableStreamHandler.ts +13 -0
- package/plugin/stream/createRenderToPipeableStreamHandler.types.ts +69 -0
- package/plugin/stream/createRscStream.client.ts +122 -0
- package/plugin/stream/createRscStream.server.ts +188 -0
- package/plugin/stream/createRscStream.ts +8 -0
- package/plugin/stream/createRscStream.types.ts +168 -0
- package/plugin/stream/createRscStream.utils.ts +171 -0
- package/plugin/stream/createRscWorkerStream.ts +178 -0
- package/plugin/stream/handleRscStream.client.ts +214 -0
- package/plugin/stream/handleRscStream.server.ts +82 -0
- package/plugin/stream/handleRscStream.ts +11 -0
- package/plugin/stream/handleRscStream.types.ts +70 -0
- package/plugin/stream/index.client.ts +15 -0
- package/plugin/stream/index.server.ts +15 -0
- package/plugin/stream/index.ts +137 -0
- package/plugin/stream/renderRscStream.server.ts +182 -0
- package/plugin/stream/renderRscStream.types.ts +43 -0
- package/plugin/stream/renderRscStreamHelpers.server.ts +88 -0
- package/plugin/stream/setMaxListeners.ts +30 -0
- package/plugin/transformer/README.md +2 -381
- package/plugin/transformer/createTransformerPlugin.ts +388 -0
- package/plugin/transformer/plugin.client.ts +6 -141
- package/plugin/transformer/plugin.server.ts +6 -142
- package/plugin/transformer/transformerEnv.ts +49 -0
- package/plugin/types/react-server-dom-esm.d.ts +269 -110
- package/plugin/types/virtual-rsc-hmr.d.ts +21 -0
- package/plugin/types.ts +636 -223
- package/plugin/utils/createCallServer.ts +8 -18
- package/plugin/utils/createReactFetcher.ts +87 -5
- package/plugin/utils/env.ts +1 -1
- package/plugin/utils/index.client.ts +8 -0
- package/plugin/utils/index.server.ts +8 -0
- package/plugin/utils/index.ts +5 -1
- package/plugin/utils/routeToURL.ts +3 -4
- package/plugin/utils/urls.ts +40 -8
- package/plugin/utils/useRscHmr.ts +72 -0
- package/plugin/vendor/vendor.client.ts +9 -7
- package/plugin/vendor/vendor.server.ts +5 -4
- package/plugin/vendor/vendor.static.ts +12 -0
- package/plugin/vendor/vendor.ts +10 -5
- package/plugin/worker/createWorker.ts +283 -41
- package/plugin/worker/html/README.md +2 -65
- package/plugin/worker/html/handleHtmlRender.ts +245 -0
- package/plugin/worker/html/html-worker.development.tsx +5 -17
- package/plugin/worker/html/html-worker.production.tsx +1 -1
- package/plugin/worker/html/html-worker.ts +5 -5
- package/plugin/worker/html/index.ts +6 -6
- package/plugin/worker/html/messageHandler.tsx +317 -98
- package/plugin/worker/html/state.ts +38 -0
- package/plugin/worker/html/types.ts +108 -35
- package/plugin/worker/rsc/README.md +2 -257
- package/plugin/worker/rsc/createBundleLoader.ts +92 -0
- package/plugin/worker/rsc/createRscWorkerLoader.ts +104 -0
- package/plugin/worker/rsc/handleRscRender.ts +510 -0
- package/plugin/worker/rsc/handlers.ts +159 -238
- package/plugin/worker/rsc/hydrateRscRenderMessage.ts +118 -0
- package/plugin/worker/rsc/messageHandler.tsx +1288 -58
- package/plugin/worker/rsc/rsc-worker.development.ts +198 -185
- package/plugin/worker/rsc/rsc-worker.production.ts +302 -64
- package/plugin/worker/rsc/rsc-worker.tsx +3 -5
- package/plugin/worker/rsc/state.ts +54 -2
- package/plugin/worker/rsc/types.ts +110 -32
- package/plugin/worker/rsc/workerUserOptions.ts +63 -0
- package/plugin/worker/sendMessage.ts +33 -53
- package/plugin/worker/types.ts +94 -91
- package/scripts/generate-toc.mjs +311 -0
- package/scripts/remove-toc.mjs +51 -0
- package/scripts/test-both.sh +82 -0
- package/dist/plugin/config/resolveDevServerConfig.d.ts +0 -2
- package/dist/plugin/config/resolveDevServerConfig.d.ts.map +0 -1
- package/dist/plugin/getNodeEnv.d.ts.map +0 -1
- package/dist/plugin/getNodeEnv.js +0 -17
- package/dist/plugin/helpers/collectBundleManifestCss.d.ts +0 -2
- package/dist/plugin/helpers/collectBundleManifestCss.d.ts.map +0 -1
- package/dist/plugin/helpers/collectBundleManifestCss.js +0 -2
- package/dist/plugin/helpers/createEventHandler.d.ts +0 -22
- package/dist/plugin/helpers/createEventHandler.d.ts.map +0 -1
- package/dist/plugin/helpers/createEventHandler.js +0 -36
- package/dist/plugin/helpers/createHandler.d.ts +0 -14
- package/dist/plugin/helpers/createHandler.d.ts.map +0 -1
- package/dist/plugin/helpers/createHandler.js +0 -75
- package/dist/plugin/helpers/createRscStream.d.ts +0 -26
- package/dist/plugin/helpers/createRscStream.d.ts.map +0 -1
- package/dist/plugin/helpers/createRscStream.js +0 -178
- package/dist/plugin/helpers/defaultFileWriter.d.ts +0 -2
- package/dist/plugin/helpers/defaultFileWriter.d.ts.map +0 -1
- package/dist/plugin/helpers/resolveComponents.d.ts +0 -27
- package/dist/plugin/helpers/resolveComponents.d.ts.map +0 -1
- package/dist/plugin/helpers/resolveComponents.js +0 -146
- package/dist/plugin/helpers/resolveUserComponents.d.ts +0 -33
- package/dist/plugin/helpers/resolveUserComponents.d.ts.map +0 -1
- package/dist/plugin/helpers/resolveUserComponents.js +0 -163
- package/dist/plugin/react-client/cleanupWorkerServerAction.d.ts +0 -11
- package/dist/plugin/react-client/cleanupWorkerServerAction.d.ts.map +0 -1
- package/dist/plugin/react-client/cleanupWorkerServerAction.js +0 -18
- package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts +0 -17
- package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts.map +0 -1
- package/dist/plugin/react-client/configureWorkerRequestHandler.js +0 -203
- package/dist/plugin/react-client/createWorkerStream.d.ts +0 -26
- package/dist/plugin/react-client/createWorkerStream.d.ts.map +0 -1
- package/dist/plugin/react-client/createWorkerStream.js +0 -163
- package/dist/plugin/react-client/handleWorkerRscStream.d.ts +0 -24
- package/dist/plugin/react-client/handleWorkerRscStream.d.ts.map +0 -1
- package/dist/plugin/react-client/handleWorkerRscStream.js +0 -91
- package/dist/plugin/react-client/handleWorkerServerAction.d.ts +0 -13
- package/dist/plugin/react-client/handleWorkerServerAction.d.ts.map +0 -1
- package/dist/plugin/react-client/handleWorkerServerAction.js +0 -62
- package/dist/plugin/react-client/restartWorker.d.ts +0 -12
- package/dist/plugin/react-client/restartWorker.d.ts.map +0 -1
- package/dist/plugin/react-client/restartWorker.js +0 -69
- package/dist/plugin/react-server/configureReactServer.d.ts +0 -10
- package/dist/plugin/react-server/configureReactServer.d.ts.map +0 -1
- package/dist/plugin/react-server/configureReactServer.js +0 -209
- package/dist/plugin/react-server/handleServerAction.d.ts +0 -6
- package/dist/plugin/react-server/handleServerAction.d.ts.map +0 -1
- package/dist/plugin/react-server/handleServerAction.js +0 -159
- package/dist/plugin/react-static/collectHtmlWorkerContent.d.ts +0 -25
- package/dist/plugin/react-static/collectHtmlWorkerContent.d.ts.map +0 -1
- package/dist/plugin/react-static/collectHtmlWorkerContent.js +0 -94
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.d.ts +0 -12
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.d.ts.map +0 -1
- package/dist/plugin/worker/html/createHtmlWorkerRenderState.js +0 -130
- package/dist/plugin/worker/html/sendHtmlWorkerMessage.d.ts +0 -3
- package/dist/plugin/worker/html/sendHtmlWorkerMessage.d.ts.map +0 -1
- package/dist/plugin/worker/html/sendHtmlWorkerMessage.js +0 -2
- package/dist/plugin/worker/rsc/handleRender.d.ts +0 -6
- package/dist/plugin/worker/rsc/handleRender.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/handleRender.js +0 -137
- package/dist/plugin/worker/rsc/sendRscWorkerMessage.d.ts +0 -3
- package/dist/plugin/worker/rsc/sendRscWorkerMessage.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/sendRscWorkerMessage.js +0 -11
- package/dist/plugin/worker/rsc/userOptions.d.ts +0 -2
- package/dist/plugin/worker/rsc/userOptions.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/userOptions.js +0 -16
- package/plugin/helpers/collectBundleManifestCss.ts +0 -1
- package/plugin/helpers/createEventHandler.ts +0 -44
- package/plugin/helpers/createHandler.ts +0 -97
- package/plugin/helpers/createRscStream.tsx +0 -226
- package/plugin/helpers/defaultFileWriter.ts +0 -0
- package/plugin/helpers/resolveComponents.ts +0 -202
- package/plugin/helpers/resolveUserComponents.ts +0 -190
- package/plugin/react-client/cleanupWorkerServerAction.ts +0 -33
- package/plugin/react-client/configureWorkerRequestHandler.ts +0 -249
- package/plugin/react-client/createWorkerStream.ts +0 -210
- package/plugin/react-client/handleWorkerRscStream.ts +0 -145
- package/plugin/react-client/handleWorkerServerAction.ts +0 -96
- package/plugin/react-client/restartWorker.ts +0 -90
- package/plugin/react-server/configureReactServer.ts +0 -235
- package/plugin/react-server/handleServerAction.ts +0 -192
- package/plugin/react-static/collectHtmlWorkerContent.ts +0 -147
- package/plugin/worker/html/createHtmlWorkerRenderState.tsx +0 -142
- package/plugin/worker/html/sendHtmlWorkerMessage.ts +0 -8
- package/plugin/worker/rsc/handleRender.ts +0 -168
- package/plugin/worker/rsc/sendRscWorkerMessage.ts +0 -7
- package/plugin/worker/rsc/userOptions.ts +0 -7
- /package/dist/plugin/config/{resolveDevServerConfig.js → createHandlerOptions.types.js} +0 -0
- /package/dist/plugin/{helpers/defaultFileWriter.js → dev-server/types.js} +0 -0
- /package/plugin/{config/resolveDevServerConfig.tsx → worker/worker-handlers.server.ts} +0 -0
|
@@ -3,95 +3,973 @@
|
|
|
3
3
|
* Copyright (c) Nico Brinkkemper
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { workerData, parentPort } from 'node:worker_threads';
|
|
7
|
+
import { PassThrough } from 'node:stream';
|
|
8
|
+
import { createLogger } from 'vite';
|
|
9
|
+
import { join, relative } from 'node:path';
|
|
10
|
+
import { createRscWorkerLoader } from './createRscWorkerLoader.js';
|
|
11
|
+
import { handleRscRender } from './handleRscRender.js';
|
|
12
|
+
import { setMaxListenersOnPort } from '../../stream/setMaxListeners.js';
|
|
9
13
|
import { toError } from '../../error/toError.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
14
|
+
import { decodeReply } from 'react-server-dom-esm/server';
|
|
15
|
+
import { createHandlers } from './handlers.js';
|
|
16
|
+
import { addModuleId, addCssFileContent, hmrState, clearAllCachedComponents, cssFiles, isModuleInvalidated, hasCachedComponent, getCachedComponent, clearCachedComponent, cacheComponent } from './state.js';
|
|
17
|
+
import { processInlineCssForState, combineCssFiles } from '../../helpers/createUnifiedCssProcessor.js';
|
|
18
|
+
import { routeToURL } from '../../utils/routeToURL.js';
|
|
19
|
+
import { DEFAULT_CONFIG } from '../../config/defaults.js';
|
|
20
|
+
import { resolvePageAndProps } from '../../helpers/resolvePageAndProps.js';
|
|
21
|
+
import { resolveComponent } from '../../helpers/resolveComponent.js';
|
|
22
|
+
import { Root } from '../../components/root.js';
|
|
23
|
+
import { workerUserOptions } from './workerUserOptions.js';
|
|
24
|
+
import { hydrateUserOptions } from '../../helpers/hydrateUserOptions.js';
|
|
25
|
+
import { React } from '../../vendor/vendor.server.js';
|
|
12
26
|
import { sendMessage } from '../sendMessage.js';
|
|
13
|
-
import {
|
|
14
|
-
import { logError } from '../../error/logError.js';
|
|
27
|
+
import { createModuleResolutionMetrics } from '../../metrics/createModuleResolutionMetrics.js';
|
|
15
28
|
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
const logger = createLogger(workerData.resolvedConfig?.logLevel ?? "info");
|
|
30
|
+
const verbose = workerData.userOptions.verbose ?? false;
|
|
31
|
+
process.on("uncaughtException", (error) => {
|
|
32
|
+
if (verbose) {
|
|
33
|
+
logger?.error(`[RSC-WORKER] Uncaught exception: ${error.message}`, {
|
|
34
|
+
error
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (parentPort) {
|
|
38
|
+
parentPort.postMessage({
|
|
39
|
+
type: "ERROR",
|
|
40
|
+
id: "uncaught-exception",
|
|
41
|
+
error: {
|
|
42
|
+
message: error.message,
|
|
43
|
+
stack: error.stack,
|
|
44
|
+
name: error.name
|
|
45
|
+
},
|
|
46
|
+
context: "Uncaught Exception in RSC Worker"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
const renderStates = /* @__PURE__ */ new Map();
|
|
52
|
+
let fallbackUserOptions = null;
|
|
53
|
+
function getUserOptions(renderId) {
|
|
54
|
+
if (renderId && renderStates.has(renderId)) {
|
|
55
|
+
const renderState = renderStates.get(renderId);
|
|
56
|
+
if (renderState.initialized) {
|
|
57
|
+
return renderState.userOptions;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (fallbackUserOptions) {
|
|
61
|
+
return fallbackUserOptions;
|
|
62
|
+
}
|
|
63
|
+
const userOptionsResult = hydrateUserOptions(workerData.userOptions);
|
|
64
|
+
if (userOptionsResult.type === "error") {
|
|
65
|
+
throw userOptionsResult.error;
|
|
66
|
+
}
|
|
67
|
+
fallbackUserOptions = userOptionsResult.userOptions;
|
|
68
|
+
if (verbose) {
|
|
69
|
+
logger?.info(
|
|
70
|
+
`[FALLBACK] Using fallback userOptions for renderId: ${renderId || "none"}`
|
|
71
|
+
);
|
|
72
|
+
logger?.info(
|
|
73
|
+
`[FALLBACK] fallbackUserOptions.build: ${JSON.stringify(
|
|
74
|
+
fallbackUserOptions.build
|
|
75
|
+
)}`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
return fallbackUserOptions;
|
|
79
|
+
}
|
|
80
|
+
function setRenderUserOptions(renderId, userOptions) {
|
|
81
|
+
renderStates.set(renderId, {
|
|
82
|
+
userOptions,
|
|
83
|
+
initialized: true
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function cleanupRenderState(renderId) {
|
|
87
|
+
renderStates.delete(renderId);
|
|
88
|
+
}
|
|
89
|
+
const activeRenders = /* @__PURE__ */ new Map();
|
|
90
|
+
const activeStreamsByRoute = /* @__PURE__ */ new Map();
|
|
91
|
+
const headlessStreamElements = /* @__PURE__ */ new Map();
|
|
92
|
+
const headlessStreamErrors = /* @__PURE__ */ new Map();
|
|
93
|
+
function cleanupRender(id) {
|
|
94
|
+
const rscStream = activeRenders.get(id);
|
|
95
|
+
if (rscStream) {
|
|
96
|
+
rscStream.destroy();
|
|
97
|
+
activeRenders.delete(id);
|
|
98
|
+
for (const [route, streamId] of activeStreamsByRoute.entries()) {
|
|
99
|
+
if (streamId === id) {
|
|
100
|
+
activeStreamsByRoute.delete(route);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
cleanupRenderState(id);
|
|
106
|
+
}
|
|
107
|
+
function clearHeadlessError(route) {
|
|
108
|
+
headlessStreamErrors.delete(route);
|
|
109
|
+
}
|
|
110
|
+
async function loadComponentsWithCache(options) {
|
|
111
|
+
const {
|
|
112
|
+
pagePath,
|
|
113
|
+
propsPath,
|
|
114
|
+
rootPath,
|
|
115
|
+
htmlPath,
|
|
116
|
+
pageExportName = "Page",
|
|
117
|
+
propsExportName = "props",
|
|
118
|
+
rootExportName = "Root",
|
|
119
|
+
htmlExportName = "Html",
|
|
120
|
+
url,
|
|
121
|
+
loader,
|
|
122
|
+
verbose: verbose2,
|
|
123
|
+
logger: logger2,
|
|
124
|
+
resolvedPageProps
|
|
125
|
+
} = options;
|
|
126
|
+
const normalizeUrlForCache = (urlStr) => {
|
|
127
|
+
if (urlStr.includes(".")) return urlStr;
|
|
128
|
+
return urlStr.endsWith("/") ? urlStr : urlStr + "/";
|
|
129
|
+
};
|
|
130
|
+
const normalizedUrl = normalizeUrlForCache(url);
|
|
131
|
+
let PageComponent;
|
|
132
|
+
let pageProps = resolvedPageProps;
|
|
133
|
+
let RootComponent;
|
|
134
|
+
let HtmlComponent;
|
|
135
|
+
if (verbose2) {
|
|
136
|
+
logger2?.info(
|
|
137
|
+
`[loadComponentsWithCache] pagePath=${pagePath}, propsPath=${propsPath}, url=${url}`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
if (pagePath) {
|
|
141
|
+
if (verbose2) {
|
|
142
|
+
logger2?.info(
|
|
143
|
+
`[loadComponentsWithCache] Loading page and props for pagePath=${pagePath}`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
const pageId = `${pagePath}#${pageExportName}`;
|
|
147
|
+
const isPageInvalidated = isModuleInvalidated(pagePath);
|
|
148
|
+
let needToLoadProps = false;
|
|
149
|
+
if (hasCachedComponent(pageId) && !isPageInvalidated) {
|
|
150
|
+
PageComponent = getCachedComponent(pageId);
|
|
151
|
+
if (verbose2) {
|
|
152
|
+
logger2?.info(
|
|
153
|
+
`[rsc-worker] Using cached Page component from: ${pagePath}`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
if (propsPath && !resolvedPageProps) {
|
|
157
|
+
const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
|
|
158
|
+
const isPropsInvalidated = isModuleInvalidated(propsPath);
|
|
159
|
+
if (hasCachedComponent(propsId) && !isPropsInvalidated) {
|
|
160
|
+
pageProps = getCachedComponent(propsId);
|
|
161
|
+
if (verbose2) {
|
|
162
|
+
logger2?.info(
|
|
163
|
+
`[rsc-worker] Using cached pageProps from: ${propsPath} for URL: ${url}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
if (isPropsInvalidated && hasCachedComponent(propsId)) {
|
|
168
|
+
clearCachedComponent(propsId);
|
|
169
|
+
}
|
|
170
|
+
needToLoadProps = true;
|
|
171
|
+
}
|
|
172
|
+
} else if (resolvedPageProps) {
|
|
173
|
+
if (verbose2) {
|
|
174
|
+
logger2?.info(
|
|
175
|
+
`[rsc-worker] Using pre-resolved pageProps from main thread: ${Object.keys(resolvedPageProps).length} keys`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
if (isPageInvalidated && hasCachedComponent(pageId)) {
|
|
181
|
+
clearCachedComponent(pageId);
|
|
182
|
+
if (verbose2) {
|
|
183
|
+
logger2?.info(
|
|
184
|
+
`[rsc-worker] Cleared invalidated Page component cache: ${pagePath}`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (propsPath && isPageInvalidated) {
|
|
189
|
+
const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
|
|
190
|
+
if (hasCachedComponent(propsId)) {
|
|
191
|
+
clearCachedComponent(propsId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const pageAndPropsResult = await resolvePageAndProps({
|
|
196
|
+
pagePath,
|
|
197
|
+
propsPath,
|
|
198
|
+
pageExportName,
|
|
199
|
+
propsExportName,
|
|
200
|
+
url: normalizedUrl,
|
|
201
|
+
loader,
|
|
202
|
+
verbose: verbose2 || false,
|
|
203
|
+
logger: logger2
|
|
204
|
+
});
|
|
205
|
+
if (verbose2) {
|
|
206
|
+
logger2?.info(
|
|
207
|
+
`[loadComponentsWithCache] pageAndPropsResult for ${pagePath}:`,
|
|
208
|
+
pageAndPropsResult
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
if (pageAndPropsResult.type === "success") {
|
|
212
|
+
PageComponent = pageAndPropsResult.PageComponent;
|
|
213
|
+
if (!resolvedPageProps) {
|
|
214
|
+
pageProps = pageAndPropsResult.pageProps;
|
|
215
|
+
}
|
|
216
|
+
cacheComponent(pageId, PageComponent);
|
|
217
|
+
if (propsPath) {
|
|
218
|
+
const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
|
|
219
|
+
cacheComponent(propsId, pageProps);
|
|
220
|
+
}
|
|
221
|
+
if (verbose2) {
|
|
222
|
+
logger2?.info(
|
|
223
|
+
`[rsc-worker] Loaded and cached PageComponent from: ${pagePath}`
|
|
224
|
+
);
|
|
225
|
+
if (propsPath) {
|
|
226
|
+
logger2?.info(
|
|
227
|
+
`[rsc-worker] Loaded and cached pageProps from: ${propsPath}`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
if (verbose2) {
|
|
231
|
+
logger2?.info(`[rsc-worker] Loaded pageProps:`, pageProps);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
if (verbose2) {
|
|
236
|
+
logger2?.warn(
|
|
237
|
+
`[rsc-worker] Failed to load page and props: ${pageAndPropsResult.error?.message}`
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
PageComponent = React.Fragment;
|
|
241
|
+
pageProps = {};
|
|
242
|
+
}
|
|
243
|
+
} catch (error) {
|
|
244
|
+
if (verbose2) {
|
|
245
|
+
logger2?.error(
|
|
246
|
+
`[loadComponentsWithCache] Failed to resolve page and props for ${pagePath}`,
|
|
247
|
+
{ error }
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
PageComponent = React.Fragment;
|
|
251
|
+
pageProps = {};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (needToLoadProps && propsPath) {
|
|
255
|
+
if (verbose2) {
|
|
256
|
+
logger2?.info(
|
|
257
|
+
`[rsc-worker] Loading props separately for URL: ${url} (Page was cached)`
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
const pageAndPropsResult = await resolvePageAndProps({
|
|
262
|
+
pagePath,
|
|
263
|
+
propsPath,
|
|
264
|
+
pageExportName,
|
|
265
|
+
propsExportName,
|
|
266
|
+
url: normalizedUrl,
|
|
267
|
+
loader,
|
|
268
|
+
verbose: verbose2 || false,
|
|
269
|
+
logger: logger2
|
|
270
|
+
});
|
|
271
|
+
if (pageAndPropsResult.type === "success") {
|
|
272
|
+
pageProps = pageAndPropsResult.pageProps;
|
|
273
|
+
const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
|
|
274
|
+
cacheComponent(propsId, pageProps);
|
|
275
|
+
if (verbose2) {
|
|
276
|
+
logger2?.info(
|
|
277
|
+
`[rsc-worker] Loaded and cached pageProps for URL: ${url}`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
} else {
|
|
281
|
+
if (verbose2) {
|
|
282
|
+
logger2?.warn(
|
|
283
|
+
`[rsc-worker] Failed to load props for URL ${url}: ${pageAndPropsResult.error?.message}`
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
pageProps = {};
|
|
287
|
+
}
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (verbose2) {
|
|
290
|
+
logger2?.error(
|
|
291
|
+
`[rsc-worker] Error loading props for URL ${url}`,
|
|
292
|
+
{ error }
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
pageProps = {};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (rootPath) {
|
|
300
|
+
const rootId = `${rootPath}#${rootExportName}`;
|
|
301
|
+
const isRootInvalidated = isModuleInvalidated(rootPath);
|
|
302
|
+
if (hasCachedComponent(rootId) && !isRootInvalidated) {
|
|
303
|
+
RootComponent = getCachedComponent(rootId);
|
|
304
|
+
if (verbose2) {
|
|
305
|
+
logger2?.info(
|
|
306
|
+
`[rsc-worker] Using cached Root component from: ${rootPath}`
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
} else {
|
|
310
|
+
if (isRootInvalidated && hasCachedComponent(rootId)) {
|
|
311
|
+
clearCachedComponent(rootId);
|
|
312
|
+
if (verbose2) {
|
|
313
|
+
logger2?.info(
|
|
314
|
+
`[rsc-worker] Cleared invalidated Root component cache: ${rootPath}`
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const rootResult = await resolveComponent({
|
|
319
|
+
componentPath: rootPath,
|
|
320
|
+
exportName: rootExportName,
|
|
321
|
+
loader
|
|
322
|
+
});
|
|
323
|
+
if (rootResult.type === "success") {
|
|
324
|
+
RootComponent = rootResult.component;
|
|
325
|
+
cacheComponent(rootId, RootComponent);
|
|
326
|
+
if (verbose2) {
|
|
327
|
+
logger2?.info(
|
|
328
|
+
`[rsc-worker] Loaded and cached Root component from: ${rootPath}`
|
|
329
|
+
);
|
|
330
|
+
logger2?.info(
|
|
331
|
+
`[rsc-worker] Root component type: ${typeof RootComponent}, isSymbol: ${typeof RootComponent === "symbol"}, keys: ${RootComponent ? Object.keys(RootComponent) : "null"}`
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
} else {
|
|
335
|
+
if (verbose2) {
|
|
336
|
+
logger2?.warn(
|
|
337
|
+
`[rsc-worker] Failed to load Root component: ${rootResult.error?.message}`
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
RootComponent = React.Fragment;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
} else {
|
|
344
|
+
RootComponent = Root;
|
|
345
|
+
if (verbose2) {
|
|
346
|
+
logger2?.info(`[rsc-worker] Using built-in default Root component`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (verbose2) {
|
|
350
|
+
logger2?.info(`[rsc-worker] Html component resolution: htmlPath='${htmlPath}' (type: ${typeof htmlPath})`);
|
|
351
|
+
}
|
|
352
|
+
if (htmlPath === "") {
|
|
353
|
+
HtmlComponent = React.Fragment;
|
|
354
|
+
if (verbose2) {
|
|
355
|
+
logger2?.info(`[rsc-worker] Using headless Html component (empty string)`);
|
|
356
|
+
}
|
|
357
|
+
} else if (htmlPath === void 0) {
|
|
358
|
+
if (verbose2) {
|
|
359
|
+
logger2?.info(`[rsc-worker] htmlPath is undefined, using default Html component`);
|
|
360
|
+
}
|
|
361
|
+
try {
|
|
362
|
+
const { Html } = await import('../../components/html.js');
|
|
363
|
+
HtmlComponent = Html;
|
|
364
|
+
if (verbose2) {
|
|
365
|
+
logger2?.info(`[rsc-worker] Successfully loaded default Html component`);
|
|
366
|
+
}
|
|
367
|
+
} catch (error) {
|
|
368
|
+
logger2?.warn(
|
|
369
|
+
`[rsc-worker] Error loading default Html component: ${error instanceof Error ? error.message : String(error)}`
|
|
370
|
+
);
|
|
371
|
+
HtmlComponent = React.Fragment;
|
|
372
|
+
}
|
|
373
|
+
} else if (htmlPath) {
|
|
374
|
+
if (verbose2) {
|
|
375
|
+
logger2?.info(`[rsc-worker] Attempting to load custom Html component from: ${htmlPath}`);
|
|
376
|
+
}
|
|
377
|
+
const htmlId = `${htmlPath}#${htmlExportName}`;
|
|
378
|
+
const isHtmlInvalidated = isModuleInvalidated(htmlPath);
|
|
379
|
+
if (hasCachedComponent(htmlId) && !isHtmlInvalidated) {
|
|
380
|
+
HtmlComponent = getCachedComponent(htmlId);
|
|
381
|
+
if (verbose2) {
|
|
382
|
+
logger2?.info(
|
|
383
|
+
`[rsc-worker] Using cached Html component from: ${htmlPath}`
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
} else {
|
|
387
|
+
if (isHtmlInvalidated && hasCachedComponent(htmlId)) {
|
|
388
|
+
clearCachedComponent(htmlId);
|
|
389
|
+
if (verbose2) {
|
|
390
|
+
logger2?.info(
|
|
391
|
+
`[rsc-worker] Cleared invalidated Html component cache: ${htmlPath}`
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
if (verbose2) {
|
|
396
|
+
logger2?.info(`[rsc-worker] Component not cached, calling resolveComponent with path: ${htmlPath}, exportName: ${htmlExportName}`);
|
|
397
|
+
}
|
|
398
|
+
const htmlResult = await resolveComponent({
|
|
399
|
+
componentPath: htmlPath,
|
|
400
|
+
exportName: htmlExportName,
|
|
401
|
+
loader
|
|
402
|
+
});
|
|
403
|
+
if (htmlResult.type === "success") {
|
|
404
|
+
HtmlComponent = htmlResult.component;
|
|
405
|
+
cacheComponent(htmlId, HtmlComponent);
|
|
406
|
+
if (verbose2) {
|
|
407
|
+
logger2?.info(
|
|
408
|
+
`[rsc-worker] Loaded and cached Html component from: ${htmlPath}`
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
} else {
|
|
412
|
+
if (verbose2) {
|
|
413
|
+
logger2?.warn(
|
|
414
|
+
`[rsc-worker] Failed to load Html component from ${htmlPath}: ${htmlResult.error?.message || "Unknown error"}`
|
|
415
|
+
);
|
|
416
|
+
logger2?.warn(`[rsc-worker] Html resolution error details:`, htmlResult.error);
|
|
417
|
+
}
|
|
418
|
+
HtmlComponent = React.Fragment;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
} else {
|
|
422
|
+
try {
|
|
423
|
+
const { Html } = await import('../../components/html.js');
|
|
424
|
+
HtmlComponent = Html;
|
|
425
|
+
if (verbose2) {
|
|
426
|
+
logger2?.info(`[rsc-worker] Using default Html component`);
|
|
427
|
+
}
|
|
428
|
+
} catch (error) {
|
|
429
|
+
logger2?.warn(
|
|
430
|
+
`[rsc-worker] Error loading default Html component: ${error}`
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return { PageComponent, pageProps, RootComponent, HtmlComponent };
|
|
435
|
+
}
|
|
436
|
+
let storedFromWorker;
|
|
437
|
+
let storedToWorker;
|
|
438
|
+
async function messageHandler(msg) {
|
|
439
|
+
if (msg.type === "INIT") {
|
|
440
|
+
storedFromWorker = msg.dataPort;
|
|
441
|
+
storedToWorker = msg.controlPort;
|
|
442
|
+
if (storedFromWorker) {
|
|
443
|
+
setMaxListenersOnPort(storedFromWorker, 500);
|
|
444
|
+
}
|
|
445
|
+
if (storedToWorker) {
|
|
446
|
+
setMaxListenersOnPort(storedToWorker, 500);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const effectiveHandlers = createHandlers(storedFromWorker, storedToWorker);
|
|
20
450
|
try {
|
|
21
|
-
if (
|
|
22
|
-
|
|
451
|
+
if (verbose) {
|
|
452
|
+
logger.info(
|
|
453
|
+
`[rsc-worker] Received message: ${msg.type} for id: ${msg.id}`
|
|
454
|
+
);
|
|
23
455
|
}
|
|
24
456
|
switch (msg.type) {
|
|
25
|
-
case "
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
457
|
+
case "INIT":
|
|
458
|
+
const currentStreamId = msg.options.id || msg.id;
|
|
459
|
+
const renderUserOptions = workerUserOptions(msg.options);
|
|
460
|
+
setRenderUserOptions(currentStreamId, renderUserOptions);
|
|
461
|
+
if (verbose) {
|
|
462
|
+
logger?.info(
|
|
463
|
+
`[INIT] Set render state for renderId: ${currentStreamId}`
|
|
464
|
+
);
|
|
465
|
+
logger?.info(
|
|
466
|
+
`[INIT] renderUserOptions.build: ${JSON.stringify(
|
|
467
|
+
renderUserOptions.build
|
|
468
|
+
)}`
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
const userOptions = renderUserOptions;
|
|
472
|
+
cleanupRender(currentStreamId);
|
|
473
|
+
const isHeadless = msg.options.htmlPath === "";
|
|
474
|
+
const rscVariant = isHeadless ? "rsc-headless" : "rsc-full";
|
|
475
|
+
if (verbose) {
|
|
476
|
+
logger.info(
|
|
477
|
+
`[rsc-worker] Processing ${rscVariant} render for route: ${msg.options.route} with ID: ${currentStreamId}`
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
const rscStream = msg.rscStream || new PassThrough();
|
|
481
|
+
activeRenders.set(currentStreamId, rscStream);
|
|
482
|
+
const moduleResolutionStartTime = performance.now();
|
|
483
|
+
const projectRoot = msg.options.projectRoot || userOptions.projectRoot || workerData.userOptions?.projectRoot || process.cwd();
|
|
484
|
+
const buildConfig = {
|
|
485
|
+
server: msg.options.build?.server || userOptions.build?.server || DEFAULT_CONFIG.BUILD.server,
|
|
486
|
+
client: msg.options.build?.client || userOptions.build?.client || DEFAULT_CONFIG.BUILD.client,
|
|
487
|
+
static: msg.options.build?.static || userOptions.build?.static || DEFAULT_CONFIG.BUILD.static,
|
|
488
|
+
outDir: msg.options.build?.outDir || userOptions.build?.outDir || DEFAULT_CONFIG.BUILD.outDir,
|
|
489
|
+
assetsDir: msg.options.build?.assetsDir || userOptions.build?.assetsDir || DEFAULT_CONFIG.BUILD.assetsDir,
|
|
490
|
+
rscOutputPath: msg.options.build?.rscOutputPath || userOptions.build?.rscOutputPath || DEFAULT_CONFIG.BUILD.rscOutputPath,
|
|
491
|
+
htmlOutputPath: msg.options.build?.htmlOutputPath || userOptions.build?.htmlOutputPath || DEFAULT_CONFIG.BUILD.htmlOutputPath,
|
|
492
|
+
preserveModulesRoot: msg.options.build?.preserveModulesRoot || userOptions.build?.preserveModulesRoot || DEFAULT_CONFIG.BUILD.preserveModulesRoot
|
|
493
|
+
};
|
|
494
|
+
const serverManifest = workerData.serverManifest || msg.options.manifest || {};
|
|
495
|
+
if (verbose) {
|
|
496
|
+
logger?.info(
|
|
497
|
+
`[rsc-worker:${msg.options.route}]
|
|
498
|
+
msg.options.build: ${JSON.stringify(msg.options.build)}
|
|
499
|
+
msg.options.route
|
|
500
|
+
userOptions.build: ${JSON.stringify(userOptions.build)}
|
|
501
|
+
final buildConfig: ${JSON.stringify(buildConfig)}`
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
const loader = createRscWorkerLoader({
|
|
505
|
+
verbose: msg.options.verbose ?? workerData.userOptions.verbose,
|
|
506
|
+
logger,
|
|
507
|
+
projectRoot,
|
|
508
|
+
manifest: serverManifest,
|
|
509
|
+
build: buildConfig
|
|
510
|
+
// bundle: workerData.bundle || {},
|
|
511
|
+
});
|
|
512
|
+
const url = msg.options.url || routeToURL(
|
|
513
|
+
msg.options.route,
|
|
514
|
+
userOptions.moduleBaseURL,
|
|
515
|
+
userOptions.build?.rscOutputPath ?? DEFAULT_CONFIG.BUILD.rscOutputPath
|
|
516
|
+
);
|
|
517
|
+
if (verbose) {
|
|
518
|
+
logger?.info(`[rsc-worker:messageHandler] Component paths for route ${msg.options.route}:`);
|
|
519
|
+
logger?.info(` pagePath: ${msg.options.pagePath}`);
|
|
520
|
+
logger?.info(` propsPath: ${msg.options.propsPath}`);
|
|
521
|
+
logger?.info(` rootPath: ${msg.options.rootPath}`);
|
|
522
|
+
logger?.info(` htmlPath: ${msg.options.htmlPath}`);
|
|
523
|
+
}
|
|
524
|
+
const { PageComponent, pageProps, RootComponent, HtmlComponent } = await loadComponentsWithCache({
|
|
525
|
+
pagePath: msg.options.pagePath,
|
|
526
|
+
propsPath: msg.options.propsPath,
|
|
527
|
+
rootPath: msg.options.rootPath,
|
|
528
|
+
htmlPath: msg.options.htmlPath,
|
|
529
|
+
pageExportName: msg.options.pageExportName ?? userOptions.pageExportName,
|
|
530
|
+
propsExportName: msg.options.propsExportName ?? userOptions.propsExportName,
|
|
531
|
+
rootExportName: msg.options.rootExportName ?? userOptions.rootExportName,
|
|
532
|
+
htmlExportName: msg.options.htmlExportName ?? userOptions.htmlExportName,
|
|
533
|
+
url,
|
|
534
|
+
loader,
|
|
535
|
+
verbose,
|
|
536
|
+
logger,
|
|
537
|
+
resolvedPageProps: msg.options.resolvedPageProps
|
|
538
|
+
// Pre-resolved from main thread
|
|
539
|
+
});
|
|
540
|
+
if (verbose) {
|
|
541
|
+
logger.info(
|
|
542
|
+
`[rsc-worker] Loaded components for route ${msg.options.route}:`
|
|
543
|
+
);
|
|
544
|
+
logger.info(`[rsc-worker] - PageComponent: ${typeof PageComponent}`);
|
|
545
|
+
logger.info(`[rsc-worker] - pageProps: ${JSON.stringify(pageProps)}`);
|
|
546
|
+
logger.info(`[rsc-worker] - RootComponent: ${typeof RootComponent}`);
|
|
547
|
+
logger.info(`[rsc-worker] - HtmlComponent: ${typeof HtmlComponent}`);
|
|
548
|
+
}
|
|
549
|
+
const moduleResolutionTime = performance.now() - moduleResolutionStartTime;
|
|
550
|
+
if (effectiveHandlers.onMetrics) {
|
|
551
|
+
const moduleResolutionMetric = createModuleResolutionMetrics({
|
|
552
|
+
route: msg.options.route,
|
|
553
|
+
workerType: "rsc",
|
|
554
|
+
resolutionTime: moduleResolutionTime,
|
|
555
|
+
fromMainThread: false,
|
|
556
|
+
fromRscWorker: true,
|
|
557
|
+
fromHtmlWorker: false,
|
|
558
|
+
description: `Module resolution for route ${msg.options.route}`
|
|
559
|
+
});
|
|
560
|
+
effectiveHandlers.onMetrics(msg.id, moduleResolutionMetric);
|
|
561
|
+
}
|
|
562
|
+
const messageCssFiles = new Map(msg.options.cssFiles || []);
|
|
563
|
+
processInlineCssForState(
|
|
564
|
+
messageCssFiles,
|
|
565
|
+
addCssFileContent,
|
|
566
|
+
userOptions
|
|
567
|
+
);
|
|
568
|
+
const combinedCssFiles = combineCssFiles(cssFiles, messageCssFiles);
|
|
569
|
+
const handlerOptions = {
|
|
570
|
+
route: msg.options.route,
|
|
571
|
+
url,
|
|
572
|
+
pageProps,
|
|
573
|
+
PageComponent,
|
|
574
|
+
RootComponent,
|
|
575
|
+
HtmlComponent,
|
|
576
|
+
cssFiles: combinedCssFiles,
|
|
577
|
+
globalCss: msg.options.globalCss ?? /* @__PURE__ */ new Map(),
|
|
578
|
+
manifest: msg.options.manifest || {},
|
|
579
|
+
projectRoot: userOptions.projectRoot || workerData.userOptions?.projectRoot || process.cwd(),
|
|
580
|
+
moduleBase: userOptions.moduleBase || workerData.userOptions?.moduleBase || DEFAULT_CONFIG.MODULE_BASE,
|
|
581
|
+
moduleBasePath: userOptions.moduleBasePath || workerData.userOptions?.moduleBasePath || DEFAULT_CONFIG.MODULE_BASE_PATH,
|
|
582
|
+
moduleBaseURL: userOptions.moduleBaseURL || workerData.userOptions?.moduleBaseURL || DEFAULT_CONFIG.MODULE_BASE_URL,
|
|
583
|
+
moduleRootPath: userOptions.moduleRootPath || workerData.userOptions?.moduleRootPath,
|
|
584
|
+
verbose: msg.options.verbose || verbose,
|
|
585
|
+
logger,
|
|
586
|
+
panicThreshold: msg.options.panicThreshold || "none",
|
|
587
|
+
rscTimeout: msg.options.rscTimeout,
|
|
588
|
+
serverPipeableStreamOptions: (() => {
|
|
589
|
+
const options = msg.options.serverPipeableStreamOptions || workerData.userOptions?.serverPipeableStreamOptions;
|
|
590
|
+
if (verbose) {
|
|
591
|
+
logger.info(
|
|
592
|
+
`[rsc-worker] ${isHeadless ? "Headless" : "Full"} stream serverPipeableStreamOptions: ${JSON.stringify(
|
|
593
|
+
options
|
|
594
|
+
)}`
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
return options;
|
|
598
|
+
})()
|
|
599
|
+
};
|
|
600
|
+
let result;
|
|
601
|
+
const headlessError = headlessStreamErrors.get(msg.options.route);
|
|
602
|
+
const shouldUseFallback = headlessError && !isHeadless;
|
|
603
|
+
if (isHeadless) {
|
|
604
|
+
headlessStreamErrors.delete(msg.options.route);
|
|
605
|
+
}
|
|
606
|
+
const shouldReuseElements = !isHeadless && msg.options.reuseHeadlessStreamId;
|
|
607
|
+
let reusableElements = null;
|
|
608
|
+
if (shouldReuseElements && msg.options.reuseHeadlessStreamId) {
|
|
609
|
+
reusableElements = headlessStreamElements.get(
|
|
610
|
+
msg.options.reuseHeadlessStreamId
|
|
611
|
+
);
|
|
612
|
+
if (verbose) {
|
|
613
|
+
if (reusableElements) {
|
|
614
|
+
logger.info(
|
|
615
|
+
`[rsc-worker] Found reusable elements from headless stream ${msg.options.reuseHeadlessStreamId}`
|
|
616
|
+
);
|
|
617
|
+
} else if (msg.options.reuseHeadlessStreamId) {
|
|
618
|
+
logger.info(
|
|
619
|
+
`[rsc-worker] No reusable elements found for headless stream ${msg.options.reuseHeadlessStreamId}`
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
const isStaticGeneration = msg.options.build && (msg.options.build.outDir || msg.options.build.static);
|
|
625
|
+
if (verbose) {
|
|
626
|
+
logger.info(
|
|
627
|
+
`[rsc-worker] Route: ${msg.options.route}, isHeadless: ${isHeadless}, isStaticGeneration: ${isStaticGeneration}`
|
|
628
|
+
);
|
|
629
|
+
logger.info(
|
|
630
|
+
`[rsc-worker] msg.options.build: ${JSON.stringify(
|
|
631
|
+
msg.options.build
|
|
632
|
+
)}`
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
if (shouldUseFallback) {
|
|
636
|
+
if (verbose) {
|
|
637
|
+
logger.info(
|
|
638
|
+
`[rsc-worker] Using fallback components due to previous error: ${headlessError.message}`
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
const fallbackHandlerOptions = {
|
|
642
|
+
...handlerOptions,
|
|
643
|
+
PageComponent: React.Fragment
|
|
644
|
+
// Keep the original HtmlComponent to ensure bootstrapScripts are rendered
|
|
645
|
+
};
|
|
646
|
+
result = handleRscRender(
|
|
647
|
+
{
|
|
648
|
+
...fallbackHandlerOptions,
|
|
649
|
+
id: currentStreamId,
|
|
650
|
+
reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
|
|
651
|
+
},
|
|
652
|
+
effectiveHandlers,
|
|
653
|
+
void 0,
|
|
654
|
+
headlessStreamElements,
|
|
655
|
+
headlessStreamErrors
|
|
656
|
+
);
|
|
657
|
+
} else {
|
|
658
|
+
try {
|
|
659
|
+
if (isHeadless) {
|
|
660
|
+
if (verbose) {
|
|
661
|
+
logger.info(
|
|
662
|
+
`[rsc-worker] Creating headless RSC stream for route ${msg.options.route} (no HTML wrapper)`
|
|
663
|
+
);
|
|
664
|
+
}
|
|
665
|
+
const headlessHandlerOptions = {
|
|
666
|
+
...handlerOptions,
|
|
667
|
+
HtmlComponent: React.Fragment
|
|
668
|
+
// Headless RSC - no HTML wrapper
|
|
669
|
+
};
|
|
670
|
+
result = handleRscRender(
|
|
671
|
+
{
|
|
672
|
+
...headlessHandlerOptions,
|
|
673
|
+
id: currentStreamId,
|
|
674
|
+
reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
|
|
675
|
+
},
|
|
676
|
+
effectiveHandlers,
|
|
677
|
+
void 0,
|
|
678
|
+
headlessStreamElements,
|
|
679
|
+
headlessStreamErrors
|
|
680
|
+
);
|
|
681
|
+
} else {
|
|
682
|
+
if (shouldReuseElements && reusableElements) {
|
|
683
|
+
if (verbose) {
|
|
684
|
+
logger.info(
|
|
685
|
+
`[rsc-worker] Creating full RSC stream with reused elements from headless stream for route ${msg.options.route}`
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
const reuseHandlerOptions = {
|
|
689
|
+
...handlerOptions,
|
|
690
|
+
PageComponent: () => reusableElements
|
|
691
|
+
// Reuse the headless stream's elements
|
|
692
|
+
};
|
|
693
|
+
result = handleRscRender(
|
|
694
|
+
{
|
|
695
|
+
...reuseHandlerOptions,
|
|
696
|
+
id: currentStreamId,
|
|
697
|
+
reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
|
|
698
|
+
},
|
|
699
|
+
effectiveHandlers,
|
|
700
|
+
void 0,
|
|
701
|
+
headlessStreamElements,
|
|
702
|
+
headlessStreamErrors
|
|
703
|
+
);
|
|
704
|
+
} else {
|
|
705
|
+
if (verbose) {
|
|
706
|
+
logger.info(
|
|
707
|
+
`[rsc-worker] Creating full RSC stream for route ${msg.options.route} (no element reuse)`
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
result = handleRscRender(
|
|
711
|
+
{
|
|
712
|
+
...handlerOptions,
|
|
713
|
+
id: currentStreamId,
|
|
714
|
+
reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
|
|
715
|
+
},
|
|
716
|
+
effectiveHandlers,
|
|
717
|
+
void 0,
|
|
718
|
+
headlessStreamElements,
|
|
719
|
+
headlessStreamErrors
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
} catch (error) {
|
|
724
|
+
if (verbose) {
|
|
725
|
+
logger.warn(
|
|
726
|
+
`[rsc-worker] Original PageComponent failed during creation for route ${msg.options.route}: ${error}`
|
|
727
|
+
);
|
|
728
|
+
}
|
|
729
|
+
const fallbackHandlerOptions = {
|
|
730
|
+
...handlerOptions,
|
|
731
|
+
PageComponent: React.Fragment
|
|
732
|
+
// Keep the original HtmlComponent to ensure bootstrapScripts are rendered
|
|
733
|
+
};
|
|
734
|
+
result = handleRscRender(
|
|
735
|
+
{
|
|
736
|
+
...fallbackHandlerOptions,
|
|
737
|
+
id: currentStreamId,
|
|
738
|
+
reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
|
|
739
|
+
},
|
|
740
|
+
effectiveHandlers,
|
|
741
|
+
void 0,
|
|
742
|
+
headlessStreamElements,
|
|
743
|
+
headlessStreamErrors
|
|
744
|
+
);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
if (verbose) {
|
|
748
|
+
logger.info(
|
|
749
|
+
`[rsc-worker] Processing single-use stream ${currentStreamId} for route: ${msg.options.route}`
|
|
750
|
+
);
|
|
751
|
+
}
|
|
752
|
+
clearHeadlessError(msg.options.route);
|
|
753
|
+
return result;
|
|
754
|
+
case "RESOLVE_COMPONENTS": {
|
|
755
|
+
const resolutionStartTime = performance.now();
|
|
756
|
+
const resolveUserOptions = getUserOptions(msg.id);
|
|
757
|
+
try {
|
|
758
|
+
if (verbose) {
|
|
759
|
+
logger.info(
|
|
760
|
+
`[rsc-worker] Resolving components for route: ${msg.route}`
|
|
761
|
+
);
|
|
762
|
+
logger.info(`[rsc-worker] pagePath: ${msg.pagePath}`);
|
|
763
|
+
logger.info(`[rsc-worker] propsPath: ${msg.propsPath}`);
|
|
764
|
+
logger.info(`[rsc-worker] rootPath: ${msg.rootPath}`);
|
|
765
|
+
logger.info(`[rsc-worker] htmlPath: ${msg.htmlPath}`);
|
|
766
|
+
}
|
|
767
|
+
if (verbose) {
|
|
768
|
+
logger?.info(
|
|
769
|
+
`[rsc-worker:${msg.route}] pagePath=${msg.pagePath}, propsPath=${msg.propsPath}`
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
const buildConfig2 = {
|
|
773
|
+
server: resolveUserOptions.build?.server || "server",
|
|
774
|
+
client: resolveUserOptions.build?.client || "client",
|
|
775
|
+
static: resolveUserOptions.build?.static || "static",
|
|
776
|
+
outDir: resolveUserOptions.build?.outDir || "dist"
|
|
777
|
+
};
|
|
778
|
+
if (verbose) {
|
|
779
|
+
logger?.info(
|
|
780
|
+
`[RESOLVE_COMPONENTS] Using outDir: ${buildConfig2.outDir}`
|
|
781
|
+
);
|
|
782
|
+
logger?.info(
|
|
783
|
+
`[RESOLVE_COMPONENTS] renderId: ${msg.id}, hasRenderState: ${renderStates.has(msg.id)}`
|
|
784
|
+
);
|
|
785
|
+
if (renderStates.has(msg.id)) {
|
|
786
|
+
const renderState = renderStates.get(msg.id);
|
|
787
|
+
logger?.info(
|
|
788
|
+
`[RESOLVE_COMPONENTS] renderState.initialized: ${renderState.initialized}`
|
|
789
|
+
);
|
|
790
|
+
logger?.info(
|
|
791
|
+
`[RESOLVE_COMPONENTS] renderState.userOptions.build: ${JSON.stringify(
|
|
792
|
+
renderState.userOptions.build
|
|
793
|
+
)}`
|
|
794
|
+
);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
const loader2 = createRscWorkerLoader({
|
|
798
|
+
verbose,
|
|
799
|
+
logger,
|
|
800
|
+
projectRoot: workerData.userOptions?.projectRoot,
|
|
801
|
+
manifest: workerData.serverManifest || {},
|
|
802
|
+
build: buildConfig2
|
|
803
|
+
});
|
|
804
|
+
await loadComponentsWithCache({
|
|
805
|
+
pagePath: msg.pagePath,
|
|
806
|
+
propsPath: msg.propsPath,
|
|
807
|
+
rootPath: msg.rootPath,
|
|
808
|
+
htmlPath: msg.htmlPath,
|
|
809
|
+
pageExportName: msg.pageExportName || "default",
|
|
810
|
+
propsExportName: msg.propsExportName || "props",
|
|
811
|
+
rootExportName: msg.rootExportName || "Root",
|
|
812
|
+
htmlExportName: msg.htmlExportName || "Html",
|
|
813
|
+
url: `/${msg.route}`,
|
|
814
|
+
// Simple URL for component resolution
|
|
815
|
+
loader: loader2,
|
|
816
|
+
verbose,
|
|
817
|
+
logger
|
|
818
|
+
});
|
|
819
|
+
const resolutionTime = performance.now() - resolutionStartTime;
|
|
820
|
+
if (verbose) {
|
|
821
|
+
logger.info(
|
|
822
|
+
`[rsc-worker] Components resolved for route: ${msg.route} in ${resolutionTime.toFixed(2)}ms`
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
const response = {
|
|
826
|
+
type: "COMPONENTS_RESOLVED",
|
|
827
|
+
id: msg.id,
|
|
828
|
+
route: msg.route,
|
|
829
|
+
resolutionTime
|
|
830
|
+
};
|
|
831
|
+
parentPort?.postMessage(response);
|
|
832
|
+
} catch (error) {
|
|
833
|
+
logger.error(
|
|
834
|
+
`[rsc-worker] Failed to resolve components for route ${msg.route}: ${error}`
|
|
835
|
+
);
|
|
836
|
+
effectiveHandlers.onError(msg.id, toError(error), {
|
|
837
|
+
route: msg.route,
|
|
838
|
+
context: `Component resolution failed for route ${msg.route}`
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
case "SERVER_ACTION": {
|
|
844
|
+
try {
|
|
845
|
+
const serverActionUserOptions = getUserOptions();
|
|
846
|
+
const [filePath2, exportName] = msg.id.split("#");
|
|
847
|
+
if (!filePath2 || !exportName) {
|
|
848
|
+
throw new Error(
|
|
849
|
+
`Invalid server action ID format: ${msg.id}. Expected format: "path/to/file.ts#exportName"`
|
|
850
|
+
);
|
|
851
|
+
}
|
|
852
|
+
const actionPath = filePath2.startsWith(
|
|
853
|
+
serverActionUserOptions.moduleBasePath
|
|
854
|
+
) ? filePath2.slice(serverActionUserOptions.moduleBasePath.length) : filePath2;
|
|
855
|
+
const fullPath = join(
|
|
856
|
+
workerData.userOptions?.projectRoot,
|
|
857
|
+
actionPath
|
|
858
|
+
);
|
|
859
|
+
const module = await import(fullPath);
|
|
860
|
+
const action = module[exportName];
|
|
861
|
+
if (typeof action !== "function") {
|
|
862
|
+
throw new Error(`Server action not found: ${msg.id}`);
|
|
863
|
+
}
|
|
864
|
+
let decodedArgs = msg.args;
|
|
865
|
+
if (msg.args.length === 1 && typeof msg.args[0] === "string") {
|
|
866
|
+
try {
|
|
867
|
+
const moduleBasePath = serverActionUserOptions.moduleBasePath ?? "/";
|
|
868
|
+
decodedArgs = await decodeReply(msg.args[0], moduleBasePath);
|
|
869
|
+
if (verbose) {
|
|
870
|
+
logger?.info(`[rsc-worker] Decoded server action args: ${JSON.stringify(decodedArgs)}`);
|
|
871
|
+
}
|
|
872
|
+
} catch {
|
|
873
|
+
if (verbose) {
|
|
874
|
+
logger?.info(`[rsc-worker] Using raw server action args`);
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
const result2 = await action(...decodedArgs);
|
|
879
|
+
effectiveHandlers.onServerActionResponse?.(msg.id, result2);
|
|
880
|
+
} catch (error) {
|
|
881
|
+
const errorMessage = toError(error).message;
|
|
882
|
+
effectiveHandlers.onServerActionResponse?.(
|
|
883
|
+
msg.id,
|
|
884
|
+
void 0,
|
|
885
|
+
errorMessage
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
29
890
|
case "INITIALIZED_REACT_LOADER":
|
|
30
891
|
case "INITIALIZED_CSS_LOADER":
|
|
31
892
|
case "INITIALIZED_ENV_LOADER":
|
|
32
893
|
return;
|
|
33
894
|
case "HMR_UPDATE":
|
|
34
|
-
|
|
895
|
+
const filePath = msg.path || msg.id;
|
|
896
|
+
const hmrProjectRoot = workerData.userOptions?.projectRoot || process.cwd();
|
|
897
|
+
const normalizedPath = filePath.startsWith(hmrProjectRoot) ? relative(hmrProjectRoot, filePath) : filePath;
|
|
898
|
+
hmrState.set(normalizedPath, {
|
|
35
899
|
timestamp: msg.timestamp || Date.now(),
|
|
36
900
|
invalidated: true,
|
|
37
901
|
routes: msg.routes || []
|
|
38
902
|
});
|
|
39
|
-
|
|
903
|
+
logger?.info(
|
|
904
|
+
`[rsc-worker] HMR_UPDATE: Invalidated module ${normalizedPath} (from ${filePath})`
|
|
905
|
+
);
|
|
906
|
+
if (headlessStreamElements.size > 0) {
|
|
907
|
+
if (verbose) {
|
|
908
|
+
logger?.info(
|
|
909
|
+
`[rsc-worker] HMR_UPDATE: Clearing ${headlessStreamElements.size} cached headless stream elements`
|
|
910
|
+
);
|
|
911
|
+
}
|
|
912
|
+
headlessStreamElements.clear();
|
|
913
|
+
}
|
|
914
|
+
clearAllCachedComponents();
|
|
915
|
+
if (verbose) {
|
|
916
|
+
logger?.info(
|
|
917
|
+
`[rsc-worker] HMR_UPDATE: Cleared all cached components from temporaryReferences`
|
|
918
|
+
);
|
|
919
|
+
}
|
|
920
|
+
headlessStreamErrors.clear();
|
|
921
|
+
effectiveHandlers.onHmrUpdate(normalizedPath, msg.routes || []);
|
|
922
|
+
return;
|
|
923
|
+
case "ABORT":
|
|
40
924
|
return;
|
|
41
925
|
case "HMR_CLEANUP":
|
|
42
926
|
hmrState.delete(msg.id);
|
|
43
|
-
|
|
927
|
+
effectiveHandlers.onHmrAccept(msg.id, msg.routes || []);
|
|
44
928
|
return;
|
|
45
929
|
case "CSS_FILE":
|
|
46
|
-
|
|
930
|
+
if (msg.id) {
|
|
931
|
+
const cssFileUserOptions = getUserOptions();
|
|
932
|
+
addCssFileContent(msg.id, msg.content, cssFileUserOptions);
|
|
933
|
+
}
|
|
934
|
+
effectiveHandlers.onCssFile?.(msg.id, msg.content);
|
|
47
935
|
return;
|
|
48
936
|
case "SERVER_MODULE":
|
|
49
|
-
|
|
937
|
+
addModuleId(msg.id, msg.url);
|
|
938
|
+
effectiveHandlers.onServerModule?.(msg.id, msg.url, msg.source);
|
|
50
939
|
return;
|
|
51
940
|
case "MODULE_REQUEST": {
|
|
52
941
|
const { id, path } = msg;
|
|
53
942
|
try {
|
|
54
|
-
const module = await import(join(workerData.userOptions
|
|
55
|
-
|
|
943
|
+
const module = await import(join(workerData.userOptions?.projectRoot, path));
|
|
944
|
+
effectiveHandlers.onServerModule?.(id, path, module);
|
|
56
945
|
} catch (error) {
|
|
57
|
-
|
|
946
|
+
effectiveHandlers.onError(id, toError(error));
|
|
58
947
|
}
|
|
59
948
|
return;
|
|
60
949
|
}
|
|
61
950
|
case "SHUTDOWN": {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
951
|
+
effectiveHandlers.onShutdown?.(msg.id);
|
|
952
|
+
if (parentPort) {
|
|
953
|
+
sendMessage(
|
|
954
|
+
{
|
|
955
|
+
type: "SHUTDOWN_COMPLETE",
|
|
956
|
+
id: msg.id
|
|
957
|
+
},
|
|
958
|
+
parentPort
|
|
959
|
+
);
|
|
70
960
|
}
|
|
71
|
-
handlers.onShutdown(msg.id);
|
|
72
961
|
return;
|
|
73
962
|
}
|
|
74
963
|
default: {
|
|
75
|
-
|
|
964
|
+
logger.info(`Unknown message: ${msg.type}`);
|
|
76
965
|
return;
|
|
77
966
|
}
|
|
78
967
|
}
|
|
79
968
|
} catch (error) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
sendMessage({
|
|
83
|
-
type: "ERROR",
|
|
84
|
-
id: "rsc-worker",
|
|
85
|
-
error: err
|
|
86
|
-
}, port);
|
|
87
|
-
}
|
|
88
|
-
if (!isDevEnv || isTestEnv) {
|
|
89
|
-
throw err;
|
|
90
|
-
} else {
|
|
91
|
-
logError(err, logger);
|
|
92
|
-
}
|
|
969
|
+
effectiveHandlers.onError("worker/rsc", toError(error));
|
|
970
|
+
effectiveHandlers.onShutdown?.("*");
|
|
93
971
|
}
|
|
94
972
|
}
|
|
95
973
|
|
|
96
974
|
export { messageHandler };
|
|
97
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUhhbmRsZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbi93b3JrZXIvcnNjL21lc3NhZ2VIYW5kbGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRQb3J0IH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB7IGFjdGl2ZVN0cmVhbXMsIGhtclN0YXRlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbmltcG9ydCB7IGhhbmRsZVJlbmRlciB9IGZyb20gXCIuL2hhbmRsZVJlbmRlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSc2NXb3JrZXJJbnB1dE1lc3NhZ2UgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVycyB9IGZyb20gXCIuL2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgd29ya2VyRGF0YSB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL2xvZ0Vycm9yLmpzXCI7XG5cbi8vIEluIHRlc3QgbW9kZSwgd2Ugd2FudCBlcnJvcnMgdG8gcHJvcGFnYXRlIHVwIGltbWVkaWF0ZWx5XG5jb25zdCBpc1Rlc3RFbnYgPSBwcm9jZXNzLmVudltcIlZJVEVTVFwiXSB8fCBwcm9jZXNzLmVudltcIk5PREVfRU5WXCJdID09PSBcInRlc3RcIjtcbmNvbnN0IGlzRGV2RW52ID0gcHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSAhPT0gXCJwcm9kdWN0aW9uXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih3b3JrZXJEYXRhLnJlc29sdmVkQ29uZmlnLmxvZ0xldmVsID8/ICdpbmZvJyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZXNzYWdlSGFuZGxlcihcbiAgbXNnOiBSc2NXb3JrZXJJbnB1dE1lc3NhZ2UsXG4gIHBvcnQgPSBwYXJlbnRQb3J0XG4pIHtcbiAgdHJ5IHtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBvcnQgZm91bmRcIik7XG4gICAgfVxuICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJSU0NfUkVOREVSXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVSZW5kZXIobXNnLCBoYW5kbGVycywgbG9nZ2VyKTtcbiAgICAgIGNhc2UgXCJTRVJWRVJfQUNUSU9OXCI6XG4gICAgICAgIHJldHVybiBoYW5kbGVycy5vblNlcnZlckFjdGlvbihtc2cuaWQsIG1zZy5hcmdzKTtcbiAgICAgIGNhc2UgXCJJTklUSUFMSVpFRF9SRUFDVF9MT0FERVJcIjpcbiAgICAgIGNhc2UgXCJJTklUSUFMSVpFRF9DU1NfTE9BREVSXCI6XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfRU5WX0xPQURFUlwiOlxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiSE1SX1VQREFURVwiOlxuICAgICAgICAvLyBNYXJrIHRoZSBtb2R1bGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgICAgaG1yU3RhdGUuc2V0KG1zZy5pZCwge1xuICAgICAgICAgIHRpbWVzdGFtcDogbXNnLnRpbWVzdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgICAgICAgIGludmFsaWRhdGVkOiB0cnVlLFxuICAgICAgICAgIHJvdXRlczogbXNnLnJvdXRlcyB8fCBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHVwZGF0ZVxuICAgICAgICBoYW5kbGVycy5vbkhtclVwZGF0ZShtc2cuaWQsIG1zZy5yb3V0ZXMgfHwgW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiSE1SX0NMRUFOVVBcIjpcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGludmFsaWRhdGlvbiBzdGF0ZVxuICAgICAgICBobXJTdGF0ZS5kZWxldGUobXNnLmlkKTtcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlJ3ZlIHByb2Nlc3NlZCB0aGUgY2xlYW51cFxuICAgICAgICBoYW5kbGVycy5vbkhtckFjY2VwdChtc2cuaWQsIG1zZy5yb3V0ZXMgfHwgW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiQ1NTX0ZJTEVcIjpcbiAgICAgICAgaGFuZGxlcnMub25Dc3NGaWxlKG1zZy5pZCwgbXNnLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiU0VSVkVSX01PRFVMRVwiOlxuICAgICAgICBoYW5kbGVycy5vblNlcnZlck1vZHVsZShtc2cuaWQsIG1zZy51cmwsIG1zZy5zb3VyY2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiTU9EVUxFX1JFUVVFU1RcIjoge1xuICAgICAgICBjb25zdCB7IGlkLCBwYXRoIH0gPSBtc2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGpvaW4od29ya2VyRGF0YS51c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCwgcGF0aCkpO1xuICAgICAgICAgIGhhbmRsZXJzLm9uU2VydmVyTW9kdWxlKGlkLCBwYXRoLCBtb2R1bGUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGhhbmRsZXJzLm9uRXJyb3IoaWQsIHRvRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiU0hVVERPV05cIjoge1xuICAgICAgICAvLyBJZiBpZCBpcyBcIipcIiwgY2xlYW4gdXAgYWxsIHJlbmRlciBzdGF0ZXNcbiAgICAgICAgaWYgKG1zZy5pZCA9PT0gXCIqXCIpIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW1zLmZvckVhY2goKHN0cmVhbSwgcmVuZGVySWQpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHJlbmRlcklkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJlbnRQb3J0Py5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShtc2cuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLm9uU2h1dGRvd24obXNnLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVua25vd24gbWVzc2FnZVwiLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVyciA9IHRvRXJyb3IoZXJyb3IpO1xuICAgIC8vIEluIGRldiBtb2RlLCB0cnkgdG8gc2VuZCBlcnJvciBtZXNzYWdlIGJlZm9yZSBleGl0aW5nXG4gICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgIHNlbmRNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICBpZDogXCJyc2Mtd29ya2VyXCIsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICB9LCBwb3J0KTtcbiAgICB9XG4gICAgaWYgKCFpc0RldkVudiB8fCBpc1Rlc3RFbnYpIHtcbiAgICAgIC8vIEluIHRlc3QgbW9kZSBvciBwcm9kdWN0aW9uIG1vZGUsIGp1c3QgdGhyb3cgdGhlIGVycm9yIHRvIGZhaWwgZmFzdFxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBs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
|
|
975
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUhhbmRsZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbi93b3JrZXIvcnNjL21lc3NhZ2VIYW5kbGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRQb3J0LCB3b3JrZXJEYXRhIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVSc2NXb3JrZXJMb2FkZXIgfSBmcm9tIFwiLi9jcmVhdGVSc2NXb3JrZXJMb2FkZXIuanNcIjtcbmltcG9ydCB7IGhhbmRsZVJzY1JlbmRlciB9IGZyb20gXCIuL2hhbmRsZVJzY1JlbmRlci5qc1wiO1xuaW1wb3J0IHsgc2V0TWF4TGlzdGVuZXJzT25Qb3J0IH0gZnJvbSBcIi4uLy4uL3N0cmVhbS9zZXRNYXhMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgUnNjV29ya2VySW5wdXRNZXNzYWdlLFxuICBDb21wb25lbnRzUmVzb2x2ZWRNZXNzYWdlLFxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci90b0Vycm9yLmpzXCI7XG4vLyBJbXBvcnQgZGVjb2RlUmVwbHkgZm9yIHNlcnZlciBhY3Rpb24gYXJndW1lbnQgZGVjb2RpbmdcbmltcG9ydCB7IGRlY29kZVJlcGx5IH0gZnJvbSBcInJlYWN0LXNlcnZlci1kb20tZXNtL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBjcmVhdGVIYW5kbGVycyB9IGZyb20gXCIuL2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQge1xuICBhZGRDc3NGaWxlQ29udGVudCxcbiAgYWRkTW9kdWxlSWQsXG4gIGNzc0ZpbGVzLFxuICBobXJTdGF0ZSxcbiAgY2FjaGVDb21wb25lbnQsXG4gIGdldENhY2hlZENvbXBvbmVudCxcbiAgaGFzQ2FjaGVkQ29tcG9uZW50LFxuICBjbGVhckNhY2hlZENvbXBvbmVudCxcbiAgaXNNb2R1bGVJbnZhbGlkYXRlZCxcbiAgY2xlYXJBbGxDYWNoZWRDb21wb25lbnRzLFxufSBmcm9tIFwiLi9zdGF0ZS5qc1wiO1xuaW1wb3J0IHtcbiAgY29tYmluZUNzc0ZpbGVzLFxuICBwcm9jZXNzSW5saW5lQ3NzRm9yU3RhdGUsXG59IGZyb20gXCIuLi8uLi9oZWxwZXJzL2NyZWF0ZVVuaWZpZWRDc3NQcm9jZXNzb3IuanNcIjtcbmltcG9ydCB7IHJvdXRlVG9VUkwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcm91dGVUb1VSTC5qc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlUGFnZUFuZFByb3BzIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvcmVzb2x2ZVBhZ2VBbmRQcm9wcy5qc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL3Jlc29sdmVDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFJvb3QgYXMgRGVmYXVsdFJvb3QgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9yb290LmpzXCI7XG5pbXBvcnQgeyB3b3JrZXJVc2VyT3B0aW9ucyB9IGZyb20gXCIuL3dvcmtlclVzZXJPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBoeWRyYXRlVXNlck9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9oeWRyYXRlVXNlck9wdGlvbnMuanNcIjtcbmltcG9ydCB7IFJlYWN0IH0gZnJvbSBcIi4uLy4uL3ZlbmRvci92ZW5kb3Iuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTW9kdWxlUmVzb2x1dGlvbk1ldHJpY3MgfSBmcm9tIFwiLi4vLi4vbWV0cmljcy9jcmVhdGVNb2R1bGVSZXNvbHV0aW9uTWV0cmljcy5qc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIod29ya2VyRGF0YS5yZXNvbHZlZENvbmZpZz8ubG9nTGV2ZWwgPz8gXCJpbmZvXCIpO1xuY29uc3QgdmVyYm9zZSA9IHdvcmtlckRhdGEudXNlck9wdGlvbnMudmVyYm9zZSA/PyBmYWxzZTtcblxuLy8gQWRkIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNhdGNoIFJlYWN0IHJlbmRlcmluZyBlcnJvcnNcbnByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLCAoZXJyb3IpID0+IHtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXI/LmVycm9yKGBbUlNDLVdPUktFUl0gVW5jYXVnaHQgZXhjZXB0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCwge1xuICAgICAgZXJyb3IsXG4gICAgfSk7XG4gIH1cblxuICAvLyBTZW5kIGVycm9yIHRocm91Z2ggY29udHJvbCBwb3J0IGlmIHdlIGhhdmUgYWN0aXZlIGhhbmRsZXJzXG4gIGlmIChwYXJlbnRQb3J0KSB7XG4gICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIkVSUk9SXCIsXG4gICAgICBpZDogXCJ1bmNhdWdodC1leGNlcHRpb25cIixcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgIH0sXG4gICAgICBjb250ZXh0OiBcIlVuY2F1Z2h0IEV4Y2VwdGlvbiBpbiBSU0MgV29ya2VyXCIsXG4gICAgfSk7XG4gIH1cblxuICAvLyBFeGl0IHRoZSB3b3JrZXIgd2l0aCBlcnJvciBjb2RlXG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG4vLyBSZW5kZXIgc3RhdGUgdG8gdHJhY2sgdXNlciBvcHRpb25zIHBlciByZW5kZXIgSURcbmNvbnN0IHJlbmRlclN0YXRlcyA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIHVzZXJPcHRpb25zOiBhbnk7XG4gICAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH1cbj4oKTtcblxuLy8gQ2FjaGUgZm9yIGZhbGxiYWNrIHVzZXIgb3B0aW9ucyB0byBhdm9pZCByZS1oeWRyYXRpbmdcbmxldCBmYWxsYmFja1VzZXJPcHRpb25zOiBhbnkgPSBudWxsO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHVzZXIgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYyByZW5kZXJcbmZ1bmN0aW9uIGdldFVzZXJPcHRpb25zKHJlbmRlcklkPzogc3RyaW5nKSB7XG4gIC8vIElmIHdlIGhhdmUgYSByZW5kZXIgSUQgYW5kIGl0J3MgaW5pdGlhbGl6ZWQsIHVzZSB0aGUgcmVuZGVyLXNwZWNpZmljIG9wdGlvbnNcbiAgaWYgKHJlbmRlcklkICYmIHJlbmRlclN0YXRlcy5oYXMocmVuZGVySWQpKSB7XG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KHJlbmRlcklkKSE7XG4gICAgaWYgKHJlbmRlclN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gcmVuZGVyU3RhdGUudXNlck9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGNhY2hlZCBmYWxsYmFjayBpZiBhdmFpbGFibGVcbiAgaWYgKGZhbGxiYWNrVXNlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tVc2VyT3B0aW9ucztcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIHdvcmtlckRhdGEgdXNlck9wdGlvbnMgaWYgbm8gcmVuZGVyLXNwZWNpZmljIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxuICBjb25zdCB1c2VyT3B0aW9uc1Jlc3VsdCA9IGh5ZHJhdGVVc2VyT3B0aW9ucyh3b3JrZXJEYXRhLnVzZXJPcHRpb25zKTtcbiAgaWYgKHVzZXJPcHRpb25zUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgIHRocm93IHVzZXJPcHRpb25zUmVzdWx0LmVycm9yO1xuICB9XG4gIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgZmFsbGJhY2tVc2VyT3B0aW9ucyA9IHVzZXJPcHRpb25zUmVzdWx0LnVzZXJPcHRpb25zO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgIGBbRkFMTEJBQ0tdIFVzaW5nIGZhbGxiYWNrIHVzZXJPcHRpb25zIGZvciByZW5kZXJJZDogJHtcbiAgICAgICAgcmVuZGVySWQgfHwgXCJub25lXCJcbiAgICAgIH1gXG4gICAgKTtcbiAgICBsb2dnZXI/LmluZm8oXG4gICAgICBgW0ZBTExCQUNLXSBmYWxsYmFja1VzZXJPcHRpb25zLmJ1aWxkOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBmYWxsYmFja1VzZXJPcHRpb25zLmJ1aWxkXG4gICAgICApfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBmYWxsYmFja1VzZXJPcHRpb25zO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVzZXIgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYyByZW5kZXJcbmZ1bmN0aW9uIHNldFJlbmRlclVzZXJPcHRpb25zKHJlbmRlcklkOiBzdHJpbmcsIHVzZXJPcHRpb25zOiBhbnkpIHtcbiAgcmVuZGVyU3RhdGVzLnNldChyZW5kZXJJZCwge1xuICAgIHVzZXJPcHRpb25zLFxuICAgIGluaXRpYWxpemVkOiB0cnVlLFxuICB9KTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFudXAgcmVuZGVyIHN0YXRlXG5mdW5jdGlvbiBjbGVhbnVwUmVuZGVyU3RhdGUocmVuZGVySWQ6IHN0cmluZykge1xuICByZW5kZXJTdGF0ZXMuZGVsZXRlKHJlbmRlcklkKTtcbn1cblxuLy8gVHJhY2sgYWN0aXZlIHJlbmRlcnMgLSBzdG9yZSB0aGUgUlNDIHN0cmVhbSBmb3IgZWFjaCB1bmlxdWUgcmVuZGVyIChpZClcbmNvbnN0IGFjdGl2ZVJlbmRlcnMgPSBuZXcgTWFwPHN0cmluZywgUGFzc1Rocm91Z2g+KCk7XG5cbi8vIEdsb2JhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgY29ycmVjdCBidWlsZCBjb25maWd1cmF0aW9uIGZyb20gSU5JVCBjYXNlXG4vLyBsZXQgY29ycmVjdEJ1aWxkQ29uZmlnOiBhbnkgPSBudWxsO1xuXG4vLyBUcmFjayBhY3RpdmUgc3RyZWFtcyBieSByb3V0ZSBmb3IgcmV1c2VcbmNvbnN0IGFjdGl2ZVN0cmVhbXNCeVJvdXRlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTsgLy8gcm91dGUgLT4gc3RyZWFtSWRcblxuLy8gVHJhY2sgaGVhZGxlc3Mgc3RyZWFtIGVsZW1lbnRzIGJ5IHN0cmVhbSBJRCBmb3IgcmV1c2UgaW4gZnVsbCBzdHJlYW1zXG5jb25zdCBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTsgLy8gc3RyZWFtSWQgLT4gUmVhY3QgZWxlbWVudHNcblxuLy8gVHJhY2sgaGVhZGxlc3Mgc3RyZWFtIGVycm9ycyBieSByb3V0ZSBmb3IgZnVsbCBzdHJlYW0gZXJyb3IgcHJvcGFnYXRpb25cbmNvbnN0IGhlYWRsZXNzU3RyZWFtRXJyb3JzID0gbmV3IE1hcDxzdHJpbmcsIEVycm9yPigpOyAvLyByb3V0ZSAtPiBlcnJvclxuXG5cbmZ1bmN0aW9uIGNsZWFudXBSZW5kZXIoaWQ6IHN0cmluZykge1xuICBjb25zdCByc2NTdHJlYW0gPSBhY3RpdmVSZW5kZXJzLmdldChpZCk7XG4gIGlmIChyc2NTdHJlYW0pIHtcbiAgICByc2NTdHJlYW0uZGVzdHJveSgpO1xuICAgIGFjdGl2ZVJlbmRlcnMuZGVsZXRlKGlkKTtcblxuICAgIC8vIENsZWFuIHVwIHJvdXRlIG1hcHBpbmdcbiAgICBmb3IgKGNvbnN0IFtyb3V0ZSwgc3RyZWFtSWRdIG9mIGFjdGl2ZVN0cmVhbXNCeVJvdXRlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0cmVhbUlkID09PSBpZCkge1xuICAgICAgICBhY3RpdmVTdHJlYW1zQnlSb3V0ZS5kZWxldGUocm91dGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCByZXVzYWJsZSBlbGVtZW50cyBvbmx5IGlmIHdlIGtub3cgd2hpY2ggaGVhZGxlc3Mgc3RyZWFtIHRoaXMgZnVsbCBzdHJlYW0gY29uc3VtZWRcbiAgICAvLyBUaGUgY2FsbGVyIHNob3VsZCB0ZWxsIHVzIHdoaWNoIGhlYWRsZXNzIHN0cmVhbSB0byBjbGVhbiB1cCwgbm90IGluZmVyIGZyb20gSUQgcGF0dGVybnNcbiAgICAvLyBOb3RlOiBFbGVtZW50IGNsZWFudXAgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSB0aGUgc3RyZWFtIHJldXNlIHN5c3RlbVxuICB9XG5cbiAgLy8gQ2xlYW4gdXAgcmVuZGVyIHN0YXRlXG4gIGNsZWFudXBSZW5kZXJTdGF0ZShpZCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFySGVhZGxlc3NFcnJvcihyb3V0ZTogc3RyaW5nKSB7XG4gIGhlYWRsZXNzU3RyZWFtRXJyb3JzLmRlbGV0ZShyb3V0ZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgY29tcG9uZW50cyB3aXRoIGNhY2hpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvbXBvbmVudHNXaXRoQ2FjaGUob3B0aW9uczoge1xuICBwYWdlUGF0aD86IHN0cmluZztcbiAgcHJvcHNQYXRoPzogc3RyaW5nO1xuICByb290UGF0aD86IHN0cmluZztcbiAgaHRtbFBhdGg/OiBzdHJpbmc7XG4gIHBhZ2VFeHBvcnROYW1lPzogc3RyaW5nO1xuICBwcm9wc0V4cG9ydE5hbWU/OiBzdHJpbmc7XG4gIHJvb3RFeHBvcnROYW1lPzogc3RyaW5nO1xuICBodG1sRXhwb3J0TmFtZT86IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGxvYWRlcjogYW55O1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgbG9nZ2VyPzogYW55O1xuICByZXNvbHZlZFBhZ2VQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyAgLy8gUHJlLXJlc29sdmVkIHByb3BzIGZyb20gbWFpbiB0aHJlYWRcbn0pIHtcbiAgY29uc3Qge1xuICAgIHBhZ2VQYXRoLFxuICAgIHByb3BzUGF0aCxcbiAgICByb290UGF0aCxcbiAgICBodG1sUGF0aCxcbiAgICBwYWdlRXhwb3J0TmFtZSA9IFwiUGFnZVwiLFxuICAgIHByb3BzRXhwb3J0TmFtZSA9IFwicHJvcHNcIixcbiAgICByb290RXhwb3J0TmFtZSA9IFwiUm9vdFwiLFxuICAgIGh0bWxFeHBvcnROYW1lID0gXCJIdG1sXCIsXG4gICAgdXJsLFxuICAgIGxvYWRlcixcbiAgICB2ZXJib3NlLFxuICAgIGxvZ2dlcixcbiAgICByZXNvbHZlZFBhZ2VQcm9wcyxcbiAgfSA9IG9wdGlvbnM7XG4gIFxuICAvLyBOb3JtYWxpemUgVVJMIGZvciBjYWNoZSBrZXkgLSBlbnN1cmUgdHJhaWxpbmcgc2xhc2ggZm9yIGZvbGRlciByb3V0ZXNcbiAgLy8gVGhpcyBlbnN1cmVzIC84bW1jL2xldmVscyBhbmQgLzhtbWMvbGV2ZWxzLyB1c2UgdGhlIHNhbWUgY2FjaGUga2V5XG4gIGNvbnN0IG5vcm1hbGl6ZVVybEZvckNhY2hlID0gKHVybFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAvLyBEb24ndCBhZGQgdHJhaWxpbmcgc2xhc2ggdG8gcGF0aHMgd2l0aCBmaWxlIGV4dGVuc2lvbnNcbiAgICBpZiAodXJsU3RyLmluY2x1ZGVzKCcuJykpIHJldHVybiB1cmxTdHI7XG4gICAgcmV0dXJuIHVybFN0ci5lbmRzV2l0aCgnLycpID8gdXJsU3RyIDogdXJsU3RyICsgJy8nO1xuICB9O1xuICBjb25zdCBub3JtYWxpemVkVXJsID0gbm9ybWFsaXplVXJsRm9yQ2FjaGUodXJsKTtcblxuICBsZXQgUGFnZUNvbXBvbmVudDogYW55O1xuICBsZXQgcGFnZVByb3BzOiBhbnkgPSByZXNvbHZlZFBhZ2VQcm9wczsgIC8vIFVzZSBwcmUtcmVzb2x2ZWQgcHJvcHMgaWYgYXZhaWxhYmxlXG4gIGxldCBSb290Q29tcG9uZW50OiBhbnk7XG4gIGxldCBIdG1sQ29tcG9uZW50OiBhbnk7XG5cbiAgLy8gTG9hZCBwYWdlIGFuZCBwcm9wcyB1c2luZyB0aGUgdW5pZmllZCBoZWxwZXJcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXI/LmluZm8oXG4gICAgICBgW2xvYWRDb21wb25lbnRzV2l0aENhY2hlXSBwYWdlUGF0aD0ke3BhZ2VQYXRofSwgcHJvcHNQYXRoPSR7cHJvcHNQYXRofSwgdXJsPSR7dXJsfWBcbiAgICApO1xuICB9XG4gIGlmIChwYWdlUGF0aCkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgIGBbbG9hZENvbXBvbmVudHNXaXRoQ2FjaGVdIExvYWRpbmcgcGFnZSBhbmQgcHJvcHMgZm9yIHBhZ2VQYXRoPSR7cGFnZVBhdGh9YFxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENoZWNrIGlmIFBhZ2UgbW9kdWxlIGlzIGludmFsaWRhdGVkIGJlZm9yZSB1c2luZyBjYWNoZVxuICAgIGNvbnN0IHBhZ2VJZCA9IGAke3BhZ2VQYXRofSMke3BhZ2VFeHBvcnROYW1lfWA7XG4gICAgY29uc3QgaXNQYWdlSW52YWxpZGF0ZWQgPSBpc01vZHVsZUludmFsaWRhdGVkKHBhZ2VQYXRoKTtcbiAgICBcbiAgICAvLyBUcmFjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcHJvcHMgc2VwYXJhdGVseSAod2hlbiBQYWdlIGlzIGNhY2hlZCBidXQgcHJvcHMgZm9yIHRoaXMgVVJMIGFyZW4ndClcbiAgICBsZXQgbmVlZFRvTG9hZFByb3BzID0gZmFsc2U7XG4gICAgXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QsIGJ1dCBvbmx5IGlmIG5vdCBpbnZhbGlkYXRlZFxuICAgIGlmIChoYXNDYWNoZWRDb21wb25lbnQocGFnZUlkKSAmJiAhaXNQYWdlSW52YWxpZGF0ZWQpIHtcbiAgICAgIFBhZ2VDb21wb25lbnQgPSBnZXRDYWNoZWRDb21wb25lbnQocGFnZUlkKTtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3JzYy13b3JrZXJdIFVzaW5nIGNhY2hlZCBQYWdlIGNvbXBvbmVudCBmcm9tOiAke3BhZ2VQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWxzbyBjaGVjayBwcm9wcyBjYWNoZSBpZiBwcm9wc1BhdGggZXhpc3RzIChza2lwIGlmIHJlc29sdmVkUGFnZVByb3BzIHByb3ZpZGVkKVxuICAgICAgLy8gQ1JJVElDQUw6IEluY2x1ZGUgVVJMIGluIGNhY2hlIGtleSBmb3IgcHJvcHMgLSBkeW5hbWljIHJvdXRlcyByZXR1cm4gZGlmZmVyZW50IHByb3BzIHBlciBVUkxcbiAgICAgIGlmIChwcm9wc1BhdGggJiYgIXJlc29sdmVkUGFnZVByb3BzKSB7XG4gICAgICAgIGNvbnN0IHByb3BzSWQgPSBgJHtwcm9wc1BhdGh9IyR7cHJvcHNFeHBvcnROYW1lfUAke25vcm1hbGl6ZWRVcmx9YDtcbiAgICAgICAgY29uc3QgaXNQcm9wc0ludmFsaWRhdGVkID0gaXNNb2R1bGVJbnZhbGlkYXRlZChwcm9wc1BhdGgpO1xuICAgICAgICBpZiAoaGFzQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpICYmICFpc1Byb3BzSW52YWxpZGF0ZWQpIHtcbiAgICAgICAgICBwYWdlUHJvcHMgPSBnZXRDYWNoZWRDb21wb25lbnQocHJvcHNJZCk7XG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBVc2luZyBjYWNoZWQgcGFnZVByb3BzIGZyb206ICR7cHJvcHNQYXRofSBmb3IgVVJMOiAke3VybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQcm9wcyBpbnZhbGlkYXRlZCBvciBub3QgY2FjaGVkIGZvciB0aGlzIFVSTCAtIG5lZWQgdG8gcmVsb2FkXG4gICAgICAgICAgaWYgKGlzUHJvcHNJbnZhbGlkYXRlZCAmJiBoYXNDYWNoZWRDb21wb25lbnQocHJvcHNJZCkpIHtcbiAgICAgICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNYXJrIHRoYXQgd2UgbmVlZCB0byBsb2FkIHByb3BzIHNlcGFyYXRlbHlcbiAgICAgICAgICBuZWVkVG9Mb2FkUHJvcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc29sdmVkUGFnZVByb3BzKSB7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBVc2luZyBwcmUtcmVzb2x2ZWQgcGFnZVByb3BzIGZyb20gbWFpbiB0aHJlYWQ6ICR7T2JqZWN0LmtleXMocmVzb2x2ZWRQYWdlUHJvcHMpLmxlbmd0aH0ga2V5c2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhZ2UgaW52YWxpZGF0ZWQgb3Igbm90IGNhY2hlZCAtIG5lZWQgdG8gcmVsb2FkXG4gICAgICBpZiAoaXNQYWdlSW52YWxpZGF0ZWQgJiYgaGFzQ2FjaGVkQ29tcG9uZW50KHBhZ2VJZCkpIHtcbiAgICAgICAgY2xlYXJDYWNoZWRDb21wb25lbnQocGFnZUlkKTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIENsZWFyZWQgaW52YWxpZGF0ZWQgUGFnZSBjb21wb25lbnQgY2FjaGU6ICR7cGFnZVBhdGh9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWxzbyBjbGVhciBwcm9wcyBjYWNoZSBpZiBwYWdlIGlzIGludmFsaWRhdGVkXG4gICAgICBpZiAocHJvcHNQYXRoICYmIGlzUGFnZUludmFsaWRhdGVkKSB7XG4gICAgICAgIGNvbnN0IHByb3BzSWQgPSBgJHtwcm9wc1BhdGh9IyR7cHJvcHNFeHBvcnROYW1lfUAke25vcm1hbGl6ZWRVcmx9YDtcbiAgICAgICAgaWYgKGhhc0NhY2hlZENvbXBvbmVudChwcm9wc0lkKSkge1xuICAgICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwYWdlIGFuZCBwcm9wc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFnZUFuZFByb3BzUmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBhZ2VBbmRQcm9wcyh7XG4gICAgICAgICAgcGFnZVBhdGgsXG4gICAgICAgICAgcHJvcHNQYXRoLFxuICAgICAgICAgIHBhZ2VFeHBvcnROYW1lLFxuICAgICAgICAgIHByb3BzRXhwb3J0TmFtZSxcbiAgICAgICAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gICAgICAgICAgbG9hZGVyLFxuICAgICAgICAgIHZlcmJvc2U6IHZlcmJvc2UgfHwgZmFsc2UsXG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbbG9hZENvbXBvbmVudHNXaXRoQ2FjaGVdIHBhZ2VBbmRQcm9wc1Jlc3VsdCBmb3IgJHtwYWdlUGF0aH06YCxcbiAgICAgICAgICAgIHBhZ2VBbmRQcm9wc1Jlc3VsdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZUFuZFByb3BzUmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgUGFnZUNvbXBvbmVudCA9IHBhZ2VBbmRQcm9wc1Jlc3VsdC5QYWdlQ29tcG9uZW50O1xuICAgICAgICAgIC8vIFVzZSBwcmUtcmVzb2x2ZWQgcHJvcHMgZnJvbSBtYWluIHRocmVhZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgbG9hZGVkIHByb3BzXG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhZ2VQcm9wcykge1xuICAgICAgICAgICAgcGFnZVByb3BzID0gcGFnZUFuZFByb3BzUmVzdWx0LnBhZ2VQcm9wcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDYWNoZSB0aGUgY29tcG9uZW50c1xuICAgICAgICAgIGNhY2hlQ29tcG9uZW50KHBhZ2VJZCwgUGFnZUNvbXBvbmVudCk7XG5cbiAgICAgICAgICBpZiAocHJvcHNQYXRoKSB7XG4gICAgICAgICAgICAvLyBDUklUSUNBTDogSW5jbHVkZSBVUkwgaW4gY2FjaGUga2V5IGZvciBwcm9wcyAtIGR5bmFtaWMgcm91dGVzIHJldHVybiBkaWZmZXJlbnQgcHJvcHMgcGVyIFVSTFxuICAgICAgICAgICAgY29uc3QgcHJvcHNJZCA9IGAke3Byb3BzUGF0aH0jJHtwcm9wc0V4cG9ydE5hbWV9QCR7bm9ybWFsaXplZFVybH1gO1xuICAgICAgICAgICAgY2FjaGVDb21wb25lbnQocHJvcHNJZCwgcGFnZVByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBhbmQgY2FjaGVkIFBhZ2VDb21wb25lbnQgZnJvbTogJHtwYWdlUGF0aH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHByb3BzUGF0aCkge1xuICAgICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBwYWdlUHJvcHMgZnJvbTogJHtwcm9wc1BhdGh9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gTG9hZGVkIHBhZ2VQcm9wczpgLCBwYWdlUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBIYW5kbGUgY29tcG9uZW50IHJlc29sdXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5IChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy53YXJuKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIEZhaWxlZCB0byBsb2FkIHBhZ2UgYW5kIHByb3BzOiAke3BhZ2VBbmRQcm9wc1Jlc3VsdC5lcnJvcj8ubWVzc2FnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVc2UgUmVhY3QuRnJhZ21lbnQgYXMgZmFsbGJhY2sgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICAgIFBhZ2VDb21wb25lbnQgPSBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgICBwYWdlUHJvcHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmVycm9yKFxuICAgICAgICAgICAgYFtsb2FkQ29tcG9uZW50c1dpdGhDYWNoZV0gRmFpbGVkIHRvIHJlc29sdmUgcGFnZSBhbmQgcHJvcHMgZm9yICR7cGFnZVBhdGh9YCxcbiAgICAgICAgICAgIHsgZXJyb3IgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGVycm9yIGdyYWNlZnVsbHkgLSB1c2UgZmFsbGJhY2sgY29tcG9uZW50c1xuICAgICAgICBQYWdlQ29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7XG4gICAgICAgIHBhZ2VQcm9wcyA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBQYWdlIHdhcyBjYWNoZWQgYnV0IHByb3BzIGZvciB0aGlzIFVSTCB3ZXJlbid0LCBsb2FkIHByb3BzIHNlcGFyYXRlbHlcbiAgICBpZiAobmVlZFRvTG9hZFByb3BzICYmIHByb3BzUGF0aCkge1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcnNjLXdvcmtlcl0gTG9hZGluZyBwcm9wcyBzZXBhcmF0ZWx5IGZvciBVUkw6ICR7dXJsfSAoUGFnZSB3YXMgY2FjaGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhZ2VBbmRQcm9wc1Jlc3VsdCA9IGF3YWl0IHJlc29sdmVQYWdlQW5kUHJvcHMoe1xuICAgICAgICAgIHBhZ2VQYXRoLFxuICAgICAgICAgIHByb3BzUGF0aCxcbiAgICAgICAgICBwYWdlRXhwb3J0TmFtZSxcbiAgICAgICAgICBwcm9wc0V4cG9ydE5hbWUsXG4gICAgICAgICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICAgICAgICAgIGxvYWRlcixcbiAgICAgICAgICB2ZXJib3NlOiB2ZXJib3NlIHx8IGZhbHNlLFxuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocGFnZUFuZFByb3BzUmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgcGFnZVByb3BzID0gcGFnZUFuZFByb3BzUmVzdWx0LnBhZ2VQcm9wcztcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgcHJvcHMgZm9yIHRoaXMgVVJMXG4gICAgICAgICAgY29uc3QgcHJvcHNJZCA9IGAke3Byb3BzUGF0aH0jJHtwcm9wc0V4cG9ydE5hbWV9QCR7bm9ybWFsaXplZFVybH1gO1xuICAgICAgICAgIGNhY2hlQ29tcG9uZW50KHByb3BzSWQsIHBhZ2VQcm9wcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBwYWdlUHJvcHMgZm9yIFVSTDogJHt1cmx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8ud2FybihcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGYWlsZWQgdG8gbG9hZCBwcm9wcyBmb3IgVVJMICR7dXJsfTogJHtwYWdlQW5kUHJvcHNSZXN1bHQuZXJyb3I/Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFnZVByb3BzID0ge307XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5lcnJvcihcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBwcm9wcyBmb3IgVVJMICR7dXJsfWAsXG4gICAgICAgICAgICB7IGVycm9yIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VQcm9wcyA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgUm9vdCBjb21wb25lbnRcbiAgaWYgKHJvb3RQYXRoKSB7XG4gICAgY29uc3Qgcm9vdElkID0gYCR7cm9vdFBhdGh9IyR7cm9vdEV4cG9ydE5hbWV9YDtcbiAgICAvLyBDUklUSUNBTDogQ2hlY2sgaWYgbW9kdWxlIGlzIGludmFsaWRhdGVkIGJlZm9yZSB1c2luZyBjYWNoZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBmaWxlIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBpbW1lZGlhdGVseVxuICAgIGNvbnN0IGlzUm9vdEludmFsaWRhdGVkID0gaXNNb2R1bGVJbnZhbGlkYXRlZChyb290UGF0aCk7XG4gICAgaWYgKGhhc0NhY2hlZENvbXBvbmVudChyb290SWQpICYmICFpc1Jvb3RJbnZhbGlkYXRlZCkge1xuICAgICAgUm9vdENvbXBvbmVudCA9IGdldENhY2hlZENvbXBvbmVudChyb290SWQpO1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcnNjLXdvcmtlcl0gVXNpbmcgY2FjaGVkIFJvb3QgY29tcG9uZW50IGZyb206ICR7cm9vdFBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBjYWNoZSBpZiBpbnZhbGlkYXRlZFxuICAgICAgaWYgKGlzUm9vdEludmFsaWRhdGVkICYmIGhhc0NhY2hlZENvbXBvbmVudChyb290SWQpKSB7XG4gICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHJvb3RJZCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDbGVhcmVkIGludmFsaWRhdGVkIFJvb3QgY29tcG9uZW50IGNhY2hlOiAke3Jvb3RQYXRofWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByb290UmVzdWx0ID0gYXdhaXQgcmVzb2x2ZUNvbXBvbmVudCh7XG4gICAgICAgIGNvbXBvbmVudFBhdGg6IHJvb3RQYXRoLFxuICAgICAgICBleHBvcnROYW1lOiByb290RXhwb3J0TmFtZSxcbiAgICAgICAgbG9hZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyb290UmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIFJvb3RDb21wb25lbnQgPSByb290UmVzdWx0LmNvbXBvbmVudDtcbiAgICAgICAgY2FjaGVDb21wb25lbnQocm9vdElkLCBSb290Q29tcG9uZW50KTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBhbmQgY2FjaGVkIFJvb3QgY29tcG9uZW50IGZyb206ICR7cm9vdFBhdGh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBSb290IGNvbXBvbmVudCB0eXBlOiAke3R5cGVvZiBSb290Q29tcG9uZW50fSwgaXNTeW1ib2w6ICR7dHlwZW9mIFJvb3RDb21wb25lbnQgPT09ICdzeW1ib2wnfSwga2V5czogJHtSb290Q29tcG9uZW50ID8gT2JqZWN0LmtleXMoUm9vdENvbXBvbmVudCkgOiAnbnVsbCd9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBjb21wb25lbnQgcmVzb2x1dGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8ud2FybihcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gRmFpbGVkIHRvIGxvYWQgUm9vdCBjb21wb25lbnQ6ICR7cm9vdFJlc3VsdC5lcnJvcj8ubWVzc2FnZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgUmVhY3QuRnJhZ21lbnQgYXMgZmFsbGJhY2sgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICBSb290Q29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vIHJvb3RQYXRoIHByb3ZpZGVkIC0gdXNlIGJ1aWx0LWluIGRlZmF1bHQgUm9vdCBjb21wb25lbnRcbiAgICBSb290Q29tcG9uZW50ID0gRGVmYXVsdFJvb3Q7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIFVzaW5nIGJ1aWx0LWluIGRlZmF1bHQgUm9vdCBjb21wb25lbnRgKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIEh0bWwgY29tcG9uZW50XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gSHRtbCBjb21wb25lbnQgcmVzb2x1dGlvbjogaHRtbFBhdGg9JyR7aHRtbFBhdGh9JyAodHlwZTogJHt0eXBlb2YgaHRtbFBhdGh9KWApO1xuICB9XG4gIFxuICBpZiAoaHRtbFBhdGggPT09IFwiXCIpIHtcbiAgICBIdG1sQ29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7IC8vIEVtcHR5IHN0cmluZyA9IGV4cGxpY2l0bHkgaGVhZGxlc3MgKG5vIEhUTUwgd3JhcHBlcilcbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gVXNpbmcgaGVhZGxlc3MgSHRtbCBjb21wb25lbnQgKGVtcHR5IHN0cmluZylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaHRtbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIHVuZGVmaW5lZCA9IHVzZSBkZWZhdWx0IEhUTUwgY29tcG9uZW50XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIGh0bWxQYXRoIGlzIHVuZGVmaW5lZCwgdXNpbmcgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBIdG1sIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9jb21wb25lbnRzL2h0bWwuanNcIik7XG4gICAgICBIdG1sQ29tcG9uZW50ID0gSHRtbDtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIFN1Y2Nlc3NmdWxseSBsb2FkZWQgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBkZWZhdWx0IEh0bWwgY29tcG9uZW50OiAke1xuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9YFxuICAgICAgKTtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBSZWFjdC5GcmFnbWVudDsgLy8gRmFsbGJhY2sgdG8gaGVhZGxlc3MgaWYgZGVmYXVsdCBmYWlsc1xuICAgIH1cbiAgfSBlbHNlIGlmIChodG1sUGF0aCkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oYFtyc2Mtd29ya2VyXSBBdHRlbXB0aW5nIHRvIGxvYWQgY3VzdG9tIEh0bWwgY29tcG9uZW50IGZyb206ICR7aHRtbFBhdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGh0bWxJZCA9IGAke2h0bWxQYXRofSMke2h0bWxFeHBvcnROYW1lfWA7XG4gICAgLy8gQ1JJVElDQUw6IENoZWNrIGlmIG1vZHVsZSBpcyBpbnZhbGlkYXRlZCBiZWZvcmUgdXNpbmcgY2FjaGVcbiAgICBjb25zdCBpc0h0bWxJbnZhbGlkYXRlZCA9IGlzTW9kdWxlSW52YWxpZGF0ZWQoaHRtbFBhdGgpO1xuICAgIGlmIChoYXNDYWNoZWRDb21wb25lbnQoaHRtbElkKSAmJiAhaXNIdG1sSW52YWxpZGF0ZWQpIHtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBnZXRDYWNoZWRDb21wb25lbnQoaHRtbElkKTtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3JzYy13b3JrZXJdIFVzaW5nIGNhY2hlZCBIdG1sIGNvbXBvbmVudCBmcm9tOiAke2h0bWxQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgY2FjaGUgaWYgaW52YWxpZGF0ZWRcbiAgICAgIGlmIChpc0h0bWxJbnZhbGlkYXRlZCAmJiBoYXNDYWNoZWRDb21wb25lbnQoaHRtbElkKSkge1xuICAgICAgICBjbGVhckNhY2hlZENvbXBvbmVudChodG1sSWQpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ2xlYXJlZCBpbnZhbGlkYXRlZCBIdG1sIGNvbXBvbmVudCBjYWNoZTogJHtodG1sUGF0aH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gQ29tcG9uZW50IG5vdCBjYWNoZWQsIGNhbGxpbmcgcmVzb2x2ZUNvbXBvbmVudCB3aXRoIHBhdGg6ICR7aHRtbFBhdGh9LCBleHBvcnROYW1lOiAke2h0bWxFeHBvcnROYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgaHRtbFJlc3VsdCA9IGF3YWl0IHJlc29sdmVDb21wb25lbnQoe1xuICAgICAgICBjb21wb25lbnRQYXRoOiBodG1sUGF0aCxcbiAgICAgICAgZXhwb3J0TmFtZTogaHRtbEV4cG9ydE5hbWUsXG4gICAgICAgIGxvYWRlcixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaHRtbFJlc3VsdC50eXBlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICBIdG1sQ29tcG9uZW50ID0gaHRtbFJlc3VsdC5jb21wb25lbnQ7XG4gICAgICAgIGNhY2hlQ29tcG9uZW50KGh0bWxJZCwgSHRtbENvbXBvbmVudCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBIdG1sIGNvbXBvbmVudCBmcm9tOiAke2h0bWxQYXRofWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgY29tcG9uZW50IHJlc29sdXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5IChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIEZhaWxlZCB0byBsb2FkIEh0bWwgY29tcG9uZW50IGZyb20gJHtodG1sUGF0aH06ICR7aHRtbFJlc3VsdC5lcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyPy53YXJuKGBbcnNjLXdvcmtlcl0gSHRtbCByZXNvbHV0aW9uIGVycm9yIGRldGFpbHM6YCwgaHRtbFJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIFJlYWN0LkZyYWdtZW50IGFzIGZhbGxiYWNrIChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgSHRtbENvbXBvbmVudCA9IFJlYWN0LkZyYWdtZW50O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgZGVmYXVsdCBIdG1sIGNvbXBvbmVudFxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IEh0bWwgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2NvbXBvbmVudHMvaHRtbC5qc1wiKTtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBIdG1sO1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gVXNpbmcgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBkZWZhdWx0IEh0bWwgY29tcG9uZW50OiAke2Vycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgUGFnZUNvbXBvbmVudCwgcGFnZVByb3BzLCBSb290Q29tcG9uZW50LCBIdG1sQ29tcG9uZW50IH07XG59XG5cbi8qKlxuICogTWFpbiBtZXNzYWdlIGhhbmRsZXIgZm9yIFJTQyB3b3JrZXIgdGhyZWFkLlxuICpcbiAqICoqUHVycG9zZSoqOiBQcm9jZXNzZXMgbWVzc2FnZXMgZnJvbSB0aGUgbWFpbiB0aHJlYWQgYW5kIGhhbmRsZXMgUlNDIHN0cmVhbSBjcmVhdGlvbixcbiAqIGNvbXBvbmVudCByZXNvbHV0aW9uLCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKlxuICogKipLZXkgUmVzcG9uc2liaWxpdGllcyoqOlxuICogLSAqKkNvbXBvbmVudCBSZXNvbHV0aW9uKio6IExvYWRzIGFuZCBjYWNoZXMgUmVhY3QgY29tcG9uZW50cyBmb3Igcm91dGVzXG4gKiAtICoqUlNDIFN0cmVhbSBDcmVhdGlvbioqOiBDcmVhdGVzIFJlYWN0IFNlcnZlciBDb21wb25lbnQgc3RyZWFtcyB1c2luZyBSZWFjdERPTVNlcnZlclxuICogLSAqKkVycm9yIEhhbmRsaW5nKio6IENhdGNoZXMgUmVhY3QgcmVuZGVyaW5nIGVycm9ycyBhbmQgY29tbXVuaWNhdGVzIHRoZW0gdG8gbWFpbiB0aHJlYWRcbiAqIC0gKipTdHJlYW0gUmV1c2UqKjogTWFuYWdlcyBoZWFkbGVzcyBzdHJlYW0gZWxlbWVudCByZXVzZSBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiAtICoqTGlmZWN5Y2xlIE1hbmFnZW1lbnQqKjogSGFuZGxlcyB3b3JrZXIgaW5pdGlhbGl6YXRpb24sIHNodXRkb3duLCBhbmQgY2xlYW51cFxuICpcbiAqICoqRXJyb3IgSGFuZGxpbmcgU3RyYXRlZ3kqKjpcbiAqIC0gUmVhY3QgcmVuZGVyaW5nIGVycm9ycyBhcmUgY2F1Z2h0IGJ5IFJlYWN0RE9NU2VydmVyLm9uRXJyb3IgY2FsbGJhY2tcbiAqIC0gRXJyb3JzIGFyZSBzZW50IHRvIG1haW4gdGhyZWFkIHZpYSBjb250cm9sIHBvcnQgd2l0aCBjb250ZXh0IGluZm9ybWF0aW9uXG4gKiAtIFVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYnkgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nKSBoYW5kbGVyXG4gKiAtIE1haW4gdGhyZWFkIGRlY2lkZXMgcGFuaWMgYmVoYXZpb3IgYmFzZWQgb24gcGFuaWNUaHJlc2hvbGQgY29uZmlndXJhdGlvblxuICpcbiAqIEBwYXJhbSBtc2cgLSBNZXNzYWdlIGZyb20gbWFpbiB0aHJlYWQgKElOSVQsIFJFU09MVkVfQ09NUE9ORU5UUywgU0hVVERPV04sIGV0Yy4pXG4gKiBAcGFyYW0gcG9ydCAtIE1lc3NhZ2VQb3J0IGZvciBjb21tdW5pY2F0aW9uIChkZWZhdWx0cyB0byBwYXJlbnRQb3J0KVxuICovXG4vLyBTdG9yZSBwb3J0cyBmb3IgY29uc2lzdGVudCB0d28tcG9ydCBjb21tdW5pY2F0aW9uXG5sZXQgc3RvcmVkRnJvbVdvcmtlcjogYW55O1xubGV0IHN0b3JlZFRvV29ya2VyOiBhbnk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZXNzYWdlSGFuZGxlcihcbiAgbXNnOiBSc2NXb3JrZXJJbnB1dE1lc3NhZ2Vcbikge1xuICAvLyBTdG9yZSBwb3J0cyBmcm9tIElOSVQgbWVzc2FnZSBmb3IgY29uc2lzdGVudCB0d28tcG9ydCBjb21tdW5pY2F0aW9uXG4gIGlmIChtc2cudHlwZSA9PT0gXCJJTklUXCIpIHtcbiAgICBzdG9yZWRGcm9tV29ya2VyID0gbXNnLmRhdGFQb3J0OyAgICAvLyBkYXRhUG9ydDogd29ya2VyIOKGkiBtYWluIChmb3Igc3RyZWFtaW5nIGRhdGEgb3V0KVxuICAgIHN0b3JlZFRvV29ya2VyID0gbXNnLmNvbnRyb2xQb3J0OyAgIC8vIGNvbnRyb2xQb3J0OiBtYWluIOKGkiB3b3JrZXIgKGZvciBjb250cm9sIG1lc3NhZ2VzIGluKVxuICAgIFxuICAgIC8vIEluY3JlYXNlIG1heCBsaXN0ZW5lcnMgb24gdHJhbnNmZXJyZWQgcG9ydHMgdG8gcHJldmVudCB3YXJuaW5nc1xuICAgIC8vIEVhY2ggcmVxdWVzdCBjcmVhdGVzIGEgbmV3IE1lc3NhZ2VQb3J0V3JpdGFibGUgdGhhdCBhZGRzIGxpc3RlbmVycyB0byB0aGVzZSBwb3J0c1xuICAgIGlmIChzdG9yZWRGcm9tV29ya2VyKSB7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoc3RvcmVkRnJvbVdvcmtlciwgNTAwKTtcbiAgICB9XG4gICAgaWYgKHN0b3JlZFRvV29ya2VyKSB7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoc3RvcmVkVG9Xb3JrZXIsIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGhhbmRsZXJzIGZvciB0d28tcG9ydCBjb21tdW5pY2F0aW9uIHVzaW5nIHN0b3JlZCBwb3J0c1xuICBjb25zdCBlZmZlY3RpdmVIYW5kbGVycyA9IGNyZWF0ZUhhbmRsZXJzKHN0b3JlZEZyb21Xb3JrZXIsIHN0b3JlZFRvV29ya2VyKTtcblxuICB0cnkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtyc2Mtd29ya2VyXSBSZWNlaXZlZCBtZXNzYWdlOiAke21zZy50eXBlfSBmb3IgaWQ6ICR7bXNnLmlkfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtc2cudHlwZSkge1xuICAgICAgY2FzZSBcIklOSVRcIjpcbiAgICAgICAgLy8gVXNlIHRoZSBJRCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gbXNnLmlkXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdHJlYW1JZCA9IG1zZy5vcHRpb25zLmlkIHx8IG1zZy5pZDtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlbmRlci1zcGVjaWZpYyB1c2VyIG9wdGlvbnMgZnJvbSBpbml0IG1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmVuZGVyVXNlck9wdGlvbnMgPSB3b3JrZXJVc2VyT3B0aW9ucyhtc2cub3B0aW9ucyk7XG4gICAgICAgIHNldFJlbmRlclVzZXJPcHRpb25zKGN1cnJlbnRTdHJlYW1JZCwgcmVuZGVyVXNlck9wdGlvbnMpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbSU5JVF0gU2V0IHJlbmRlciBzdGF0ZSBmb3IgcmVuZGVySWQ6ICR7Y3VycmVudFN0cmVhbUlkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbSU5JVF0gcmVuZGVyVXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHJlbmRlclVzZXJPcHRpb25zLmJ1aWxkXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdXNlciBvcHRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIGdldFVzZXJPcHRpb25zIGNhbGxzXG4gICAgICAgIGNvbnN0IHVzZXJPcHRpb25zID0gcmVuZGVyVXNlck9wdGlvbnM7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIHJlbmRlciBmb3IgdGhpcyBpZFxuICAgICAgICBjbGVhbnVwUmVuZGVyKGN1cnJlbnRTdHJlYW1JZCk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBoZWFkbGVzcyBSU0Mgc3RyZWFtIChubyBIVE1MIHdyYXBwZXIpXG4gICAgICAgIC8vIHVuZGVmaW5lZCA9IHVzZSBkZWZhdWx0IEhUTUwgY29tcG9uZW50LCBcIlwiID0gZXhwbGljaXRseSBoZWFkbGVzc1xuICAgICAgICBjb25zdCBpc0hlYWRsZXNzID0gbXNnLm9wdGlvbnMuaHRtbFBhdGggPT09IFwiXCI7XG4gICAgICAgIGNvbnN0IHJzY1ZhcmlhbnQgPSBpc0hlYWRsZXNzID8gXCJyc2MtaGVhZGxlc3NcIiA6IFwicnNjLWZ1bGxcIjtcblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBQcm9jZXNzaW5nICR7cnNjVmFyaWFudH0gcmVuZGVyIGZvciByb3V0ZTogJHttc2cub3B0aW9ucy5yb3V0ZX0gd2l0aCBJRDogJHtjdXJyZW50U3RyZWFtSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGFzc1Rocm91Z2ggc3RyZWFtIGZvciB0aGlzIHJlbmRlciwgb3IgdXNlIHRoZSBvbmUgcHJvdmlkZWRcbiAgICAgICAgY29uc3QgcnNjU3RyZWFtID0gKG1zZyBhcyBhbnkpLnJzY1N0cmVhbSB8fCBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgYWN0aXZlUmVuZGVycy5zZXQoY3VycmVudFN0cmVhbUlkLCByc2NTdHJlYW0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IG1lYXN1cmluZyBtb2R1bGUgcmVzb2x1dGlvbiB0aW1lIGZyb20gZmlyc3QgbW9kdWxlIGxvYWRcbiAgICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIC8vIExvYWQgbW9kdWxlcyAocGFnZSwgcHJvcHMsIGFuZCBjb21wb25lbnRzIHRvZ2V0aGVyKSAtIHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IHByb2plY3RSb290ID0gbXNnLm9wdGlvbnMucHJvamVjdFJvb3QgfHwgdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ucHJvamVjdFJvb3QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgY29uc3QgYnVpbGRDb25maWcgPSB7XG4gICAgICAgICAgc2VydmVyOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LnNlcnZlciB8fCB1c2VyT3B0aW9ucy5idWlsZD8uc2VydmVyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELnNlcnZlcixcbiAgICAgICAgICBjbGllbnQ6XG4gICAgICAgICAgICBtc2cub3B0aW9ucy5idWlsZD8uY2xpZW50IHx8IHVzZXJPcHRpb25zLmJ1aWxkPy5jbGllbnQgfHwgREVGQVVMVF9DT05GSUcuQlVJTEQuY2xpZW50LFxuICAgICAgICAgIHN0YXRpYzpcbiAgICAgICAgICAgIG1zZy5vcHRpb25zLmJ1aWxkPy5zdGF0aWMgfHwgdXNlck9wdGlvbnMuYnVpbGQ/LnN0YXRpYyB8fCBERUZBVUxUX0NPTkZJRy5CVUlMRC5zdGF0aWMsXG4gICAgICAgICAgb3V0RGlyOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/Lm91dERpciB8fCB1c2VyT3B0aW9ucy5idWlsZD8ub3V0RGlyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELm91dERpcixcbiAgICAgICAgICBhc3NldHNEaXI6IFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LmFzc2V0c0RpciB8fCB1c2VyT3B0aW9ucy5idWlsZD8uYXNzZXRzRGlyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELmFzc2V0c0RpcixcbiAgICAgICAgICByc2NPdXRwdXRQYXRoOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggfHwgdXNlck9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggfHwgREVGQVVMVF9DT05GSUcuQlVJTEQucnNjT3V0cHV0UGF0aCxcbiAgICAgICAgICBodG1sT3V0cHV0UGF0aDpcbiAgICAgICAgICAgIG1zZy5vcHRpb25zLmJ1aWxkPy5odG1sT3V0cHV0UGF0aCB8fCB1c2VyT3B0aW9ucy5idWlsZD8uaHRtbE91dHB1dFBhdGggfHwgREVGQVVMVF9DT05GSUcuQlVJTEQuaHRtbE91dHB1dFBhdGgsXG4gICAgICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogXG4gICAgICAgICAgICBtc2cub3B0aW9ucy5idWlsZD8ucHJlc2VydmVNb2R1bGVzUm9vdCB8fCB1c2VyT3B0aW9ucy5idWlsZD8ucHJlc2VydmVNb2R1bGVzUm9vdCB8fCBERUZBVUxUX0NPTkZJRy5CVUlMRC5wcmVzZXJ2ZU1vZHVsZXNSb290LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzZXJ2ZXJNYW5pZmVzdCA9IHdvcmtlckRhdGEuc2VydmVyTWFuaWZlc3QgfHwgbXNnLm9wdGlvbnMubWFuaWZlc3QgfHwge307XG5cbiAgICAgICAgLy8gQWx3YXlzIGxvZyBidWlsZCBjb25maWcgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcjoke21zZy5vcHRpb25zLnJvdXRlfV0gXG5tc2cub3B0aW9ucy5idWlsZDogJHtKU09OLnN0cmluZ2lmeShtc2cub3B0aW9ucy5idWlsZCl9XG5tc2cub3B0aW9ucy5yb3V0ZVxudXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkodXNlck9wdGlvbnMuYnVpbGQpfVxuZmluYWwgYnVpbGRDb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoYnVpbGRDb25maWcpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRlciA9IGNyZWF0ZVJzY1dvcmtlckxvYWRlcih7XG4gICAgICAgICAgdmVyYm9zZTogbXNnLm9wdGlvbnMudmVyYm9zZSA/PyB3b3JrZXJEYXRhLnVzZXJPcHRpb25zLnZlcmJvc2UsXG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIG1hbmlmZXN0OiBzZXJ2ZXJNYW5pZmVzdCxcbiAgICAgICAgICBidWlsZDogYnVpbGRDb25maWcsXG4gICAgICAgICAgLy8gYnVuZGxlOiB3b3JrZXJEYXRhLmJ1bmRsZSB8fCB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdXJsID1cbiAgICAgICAgICBtc2cub3B0aW9ucy51cmwgfHxcbiAgICAgICAgICByb3V0ZVRvVVJMKFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlVVJMLFxuICAgICAgICAgICAgdXNlck9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggPz9cbiAgICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuQlVJTEQucnNjT3V0cHV0UGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9hZCBjb21wb25lbnRzIHVzaW5nIHRoZSB1bmlmaWVkIGhlbHBlciBmdW5jdGlvblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXI6bWVzc2FnZUhhbmRsZXJdIENvbXBvbmVudCBwYXRocyBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX06YCk7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKGAgIHBhZ2VQYXRoOiAke21zZy5vcHRpb25zLnBhZ2VQYXRofWApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgICBwcm9wc1BhdGg6ICR7bXNnLm9wdGlvbnMucHJvcHNQYXRofWApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgICByb290UGF0aDogJHttc2cub3B0aW9ucy5yb290UGF0aH1gKTtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oYCAgaHRtbFBhdGg6ICR7bXNnLm9wdGlvbnMuaHRtbFBhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IFBhZ2VDb21wb25lbnQsIHBhZ2VQcm9wcywgUm9vdENvbXBvbmVudCwgSHRtbENvbXBvbmVudCB9ID1cbiAgICAgICAgICBhd2FpdCBsb2FkQ29tcG9uZW50c1dpdGhDYWNoZSh7XG4gICAgICAgICAgICBwYWdlUGF0aDogbXNnLm9wdGlvbnMucGFnZVBhdGgsXG4gICAgICAgICAgICBwcm9wc1BhdGg6IG1zZy5vcHRpb25zLnByb3BzUGF0aCxcbiAgICAgICAgICAgIHJvb3RQYXRoOiBtc2cub3B0aW9ucy5yb290UGF0aCxcbiAgICAgICAgICAgIGh0bWxQYXRoOiBtc2cub3B0aW9ucy5odG1sUGF0aCxcbiAgICAgICAgICAgIHBhZ2VFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5wYWdlRXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5wYWdlRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHByb3BzRXhwb3J0TmFtZTpcbiAgICAgICAgICAgICAgbXNnLm9wdGlvbnMucHJvcHNFeHBvcnROYW1lID8/IHVzZXJPcHRpb25zLnByb3BzRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHJvb3RFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5yb290RXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5yb290RXhwb3J0TmFtZSxcbiAgICAgICAgICAgIGh0bWxFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5odG1sRXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5odG1sRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGxvYWRlcixcbiAgICAgICAgICAgIHZlcmJvc2UsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICByZXNvbHZlZFBhZ2VQcm9wczogbXNnLm9wdGlvbnMucmVzb2x2ZWRQYWdlUHJvcHMsICAvLyBQcmUtcmVzb2x2ZWQgZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBjb21wb25lbnRzIGZvciByb3V0ZSAke21zZy5vcHRpb25zLnJvdXRlfTpgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIC0gUGFnZUNvbXBvbmVudDogJHt0eXBlb2YgUGFnZUNvbXBvbmVudH1gKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIC0gcGFnZVByb3BzOiAke0pTT04uc3RyaW5naWZ5KHBhZ2VQcm9wcyl9YCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtyc2Mtd29ya2VyXSAtIFJvb3RDb21wb25lbnQ6ICR7dHlwZW9mIFJvb3RDb21wb25lbnR9YCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtyc2Mtd29ya2VyXSAtIEh0bWxDb21wb25lbnQ6ICR7dHlwZW9mIEh0bWxDb21wb25lbnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IG1vZHVsZSByZXNvbHV0aW9uIG1ldHJpYyBhZnRlciBjb21wb25lbnRzIGFyZSBsb2FkZWRcbiAgICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvblRpbWUgPVxuICAgICAgICAgIHBlcmZvcm1hbmNlLm5vdygpIC0gbW9kdWxlUmVzb2x1dGlvblN0YXJ0VGltZTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUhhbmRsZXJzLm9uTWV0cmljcykge1xuICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc29sdXRpb25NZXRyaWMgPSBjcmVhdGVNb2R1bGVSZXNvbHV0aW9uTWV0cmljcyh7XG4gICAgICAgICAgICByb3V0ZTogbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgICB3b3JrZXJUeXBlOiBcInJzY1wiLFxuICAgICAgICAgICAgcmVzb2x1dGlvblRpbWU6IG1vZHVsZVJlc29sdXRpb25UaW1lLFxuICAgICAgICAgICAgZnJvbU1haW5UaHJlYWQ6IGZhbHNlLFxuICAgICAgICAgICAgZnJvbVJzY1dvcmtlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZyb21IdG1sV29ya2VyOiBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kdWxlIHJlc29sdXRpb24gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbk1ldHJpY3MobXNnLmlkLCBtb2R1bGVSZXNvbHV0aW9uTWV0cmljKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgQ1NTIGZpbGVzIHVzaW5nIHVuaWZpZWQgQ1NTIHByb2Nlc3NvclxuICAgICAgICBjb25zdCBtZXNzYWdlQ3NzRmlsZXMgPSBuZXcgTWFwKG1zZy5vcHRpb25zLmNzc0ZpbGVzIHx8IFtdKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGlubGluZSBDU1MgZm9yIHN0YXRlZnVsIHN5c3RlbSB1c2luZyB1bmlmaWVkIGhlbHBlclxuICAgICAgICBwcm9jZXNzSW5saW5lQ3NzRm9yU3RhdGUoXG4gICAgICAgICAgbWVzc2FnZUNzc0ZpbGVzLFxuICAgICAgICAgIGFkZENzc0ZpbGVDb250ZW50LFxuICAgICAgICAgIHVzZXJPcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ29tYmluZSBzdGF0ZWZ1bCBDU1Mgd2l0aCBtZXNzYWdlIENTUyB1c2luZyB1bmlmaWVkIGhlbHBlclxuICAgICAgICBjb25zdCBjb21iaW5lZENzc0ZpbGVzID0gY29tYmluZUNzc0ZpbGVzKGNzc0ZpbGVzLCBtZXNzYWdlQ3NzRmlsZXMpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBoYW5kbGVyIG9wdGlvbnMgZXhhY3RseSBsaWtlIHNlcnZlciBlbnZpcm9ubWVudFxuICAgICAgICBjb25zdCBoYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICByb3V0ZTogbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHBhZ2VQcm9wcyxcbiAgICAgICAgICBQYWdlQ29tcG9uZW50LFxuICAgICAgICAgIFJvb3RDb21wb25lbnQsXG4gICAgICAgICAgSHRtbENvbXBvbmVudCxcbiAgICAgICAgICBjc3NGaWxlczogY29tYmluZWRDc3NGaWxlcyxcbiAgICAgICAgICBnbG9iYWxDc3M6IG1zZy5vcHRpb25zLmdsb2JhbENzcyA/PyBuZXcgTWFwKCksXG4gICAgICAgICAgbWFuaWZlc3Q6IG1zZy5vcHRpb25zLm1hbmlmZXN0IHx8IHt9LFxuICAgICAgICAgIHByb2plY3RSb290OlxuICAgICAgICAgICAgdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHxcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290IHx8XG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIG1vZHVsZUJhc2U6XG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlIHx8XG4gICAgICAgICAgICB3b3JrZXJEYXRhLnVzZXJPcHRpb25zPy5tb2R1bGVCYXNlIHx8XG4gICAgICAgICAgICBERUZBVUxUX0NPTkZJRy5NT0RVTEVfQkFTRSxcbiAgICAgICAgICBtb2R1bGVCYXNlUGF0aDpcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoIHx8XG4gICAgICAgICAgICB3b3JrZXJEYXRhLnVzZXJPcHRpb25zPy5tb2R1bGVCYXNlUGF0aCB8fFxuICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuTU9EVUxFX0JBU0VfUEFUSCxcbiAgICAgICAgICBtb2R1bGVCYXNlVVJMOlxuICAgICAgICAgICAgdXNlck9wdGlvbnMubW9kdWxlQmFzZVVSTCB8fFxuICAgICAgICAgICAgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ubW9kdWxlQmFzZVVSTCB8fFxuICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuTU9EVUxFX0JBU0VfVVJMLFxuICAgICAgICAgIG1vZHVsZVJvb3RQYXRoOlxuICAgICAgICAgICAgdXNlck9wdGlvbnMubW9kdWxlUm9vdFBhdGggfHxcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/Lm1vZHVsZVJvb3RQYXRoLFxuICAgICAgICAgIHZlcmJvc2U6IG1zZy5vcHRpb25zLnZlcmJvc2UgfHwgdmVyYm9zZSxcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IG1zZy5vcHRpb25zLnBhbmljVGhyZXNob2xkIHx8IFwibm9uZVwiLFxuICAgICAgICAgIHJzY1RpbWVvdXQ6IG1zZy5vcHRpb25zLnJzY1RpbWVvdXQsXG4gICAgICAgICAgc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zOiAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQm90aCBoZWFkbGVzcyBhbmQgZnVsbCBzdHJlYW1zIHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdGVkIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9ucyB3aXRoIGJvb3RzdHJhcE1vZHVsZXNcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5zZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnMgfHxcbiAgICAgICAgICAgICAgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8uc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zO1xuXG4gICAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdICR7XG4gICAgICAgICAgICAgICAgICBpc0hlYWRsZXNzID8gXCJIZWFkbGVzc1wiIDogXCJGdWxsXCJcbiAgICAgICAgICAgICAgICB9IHN0cmVhbSBzZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgIH0pKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXNlIGhhbmRsZVJzY1JlbmRlciBmb3IgcHJvcGVyIHdvcmtlci1zaWRlIHJlbmRlcmluZ1xuICAgICAgICBsZXQgcmVzdWx0OiB2b2lkO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIGhlYWRsZXNzIGVycm9yIGZvciB0aGlzIHJvdXRlXG4gICAgICAgIGNvbnN0IGhlYWRsZXNzRXJyb3IgPSBoZWFkbGVzc1N0cmVhbUVycm9ycy5nZXQobXNnLm9wdGlvbnMucm91dGUpO1xuICAgICAgICBjb25zdCBzaG91bGRVc2VGYWxsYmFjayA9IGhlYWRsZXNzRXJyb3IgJiYgIWlzSGVhZGxlc3M7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGhlYWRsZXNzIHN0cmVhbSwgd2UgbmVlZCB0byB0cmFjayBhbnkgZXJyb3JzIHRoYXQgb2NjdXJcbiAgICAgICAgLy8gc28gdGhhdCBzdWJzZXF1ZW50IGZ1bGwgc3RyZWFtcyBjYW4gdXNlIGZhbGxiYWNrIGNvbXBvbmVudHNcbiAgICAgICAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICAgICAgICAvLyBDbGVhciBhbnkgcHJldmlvdXMgZXJyb3IgZm9yIHRoaXMgcm91dGUgd2hlbiBzdGFydGluZyBhIG5ldyBoZWFkbGVzcyBzdHJlYW1cbiAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9ycy5kZWxldGUobXNnLm9wdGlvbnMucm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldXNlIGVsZW1lbnRzIGZyb20gYSBwcmV2aW91cyBoZWFkbGVzcyBzdHJlYW1cbiAgICAgICAgY29uc3Qgc2hvdWxkUmV1c2VFbGVtZW50cyA9XG4gICAgICAgICAgIWlzSGVhZGxlc3MgJiYgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkO1xuICAgICAgICBsZXQgcmV1c2FibGVFbGVtZW50cyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHNob3VsZFJldXNlRWxlbWVudHMgJiYgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkKSB7XG4gICAgICAgICAgLy8gTG9vayB1cCBlbGVtZW50cyBkaXJlY3RseSBieSB0aGUgaGVhZGxlc3Mgc3RyZWFtIElEXG4gICAgICAgICAgcmV1c2FibGVFbGVtZW50cyA9IGhlYWRsZXNzU3RyZWFtRWxlbWVudHMuZ2V0KFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgaWYgKHJldXNhYmxlRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGb3VuZCByZXVzYWJsZSBlbGVtZW50cyBmcm9tIGhlYWRsZXNzIHN0cmVhbSAke21zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIE5vIHJldXNhYmxlIGVsZW1lbnRzIGZvdW5kIGZvciBoZWFkbGVzcyBzdHJlYW0gJHttc2cub3B0aW9ucy5yZXVzZUhlYWRsZXNzU3RyZWFtSWR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzU3RhdGljR2VuZXJhdGlvbiA9XG4gICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQgJiZcbiAgICAgICAgICAobXNnLm9wdGlvbnMuYnVpbGQub3V0RGlyIHx8IG1zZy5vcHRpb25zLmJ1aWxkLnN0YXRpYyk7XG5cbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gUm91dGU6ICR7bXNnLm9wdGlvbnMucm91dGV9LCBpc0hlYWRsZXNzOiAke2lzSGVhZGxlc3N9LCBpc1N0YXRpY0dlbmVyYXRpb246ICR7aXNTdGF0aWNHZW5lcmF0aW9ufWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBtc2cub3B0aW9ucy5idWlsZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGRcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdWxkVXNlRmFsbGJhY2spIHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gVXNpbmcgZmFsbGJhY2sgY29tcG9uZW50cyBkdWUgdG8gcHJldmlvdXMgZXJyb3I6ICR7aGVhZGxlc3NFcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENyZWF0ZSBhIGZhbGxiYWNrIGhhbmRsZXIgd2l0aCBSZWFjdC5GcmFnbWVudCBmb3IgUGFnZUNvbXBvbmVudCBidXQga2VlcCBvcmlnaW5hbCBIdG1sQ29tcG9uZW50XG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmhhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgUGFnZUNvbXBvbmVudDogUmVhY3QuRnJhZ21lbnQsXG4gICAgICAgICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBIdG1sQ29tcG9uZW50IHRvIGVuc3VyZSBib290c3RyYXBTY3JpcHRzIGFyZSByZW5kZXJlZFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVzdWx0ID0gaGFuZGxlUnNjUmVuZGVyKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5mYWxsYmFja0hhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICBpZDogY3VycmVudFN0cmVhbUlkLFxuICAgICAgICAgICAgICByZXVzZUhlYWRsZXNzU3RyZWFtSWQ6IG1zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRWxlbWVudHMsXG4gICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0hlYWRsZXNzKSB7XG4gICAgICAgICAgICAgIC8vIEhlYWRsZXNzIHN0cmVhbTogdXNlIEh0bWxDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50IChubyBIVE1MIHdyYXBwZXIpIGJ1dCBrZWVwIFJvb3RDb21wb25lbnRcbiAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ3JlYXRpbmcgaGVhZGxlc3MgUlNDIHN0cmVhbSBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX0gKG5vIEhUTUwgd3JhcHBlcilgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRsZXNzSGFuZGxlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgSHRtbENvbXBvbmVudDogUmVhY3QuRnJhZ21lbnQsIC8vIEhlYWRsZXNzIFJTQyAtIG5vIEhUTUwgd3JhcHBlclxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5oZWFkbGVzc0hhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgaWQ6IGN1cnJlbnRTdHJlYW1JZCxcbiAgICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEZ1bGwgc3RyZWFtOiByZXVzZSBlbGVtZW50cyBmcm9tIGhlYWRsZXNzIHN0cmVhbSBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgaWYgKHNob3VsZFJldXNlRWxlbWVudHMgJiYgcmV1c2FibGVFbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDcmVhdGluZyBmdWxsIFJTQyBzdHJlYW0gd2l0aCByZXVzZWQgZWxlbWVudHMgZnJvbSBoZWFkbGVzcyBzdHJlYW0gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaGFuZGxlciBvcHRpb25zIHRoYXQgcmV1c2UgdGhlIGhlYWRsZXNzIHN0cmVhbSdzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgY29uc3QgcmV1c2VIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmhhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgUGFnZUNvbXBvbmVudDogKCgpID0+IHJldXNhYmxlRWxlbWVudHMpIGFzIGFueSwgLy8gUmV1c2UgdGhlIGhlYWRsZXNzIHN0cmVhbSdzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmV1c2VIYW5kbGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGN1cnJlbnRTdHJlYW1JZCxcbiAgICAgICAgICAgICAgICAgICAgcmV1c2VIZWFkbGVzc1N0cmVhbUlkOiBtc2cub3B0aW9ucy5yZXVzZUhlYWRsZXNzU3RyZWFtSWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMsXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIHJldXNhYmxlIGVsZW1lbnRzIC0gY3JlYXRlIG5vcm1hbCBmdWxsIHN0cmVhbVxuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDcmVhdGluZyBmdWxsIFJTQyBzdHJlYW0gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9IChubyBlbGVtZW50IHJldXNlKWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBjdXJyZW50U3RyZWFtSWQsXG4gICAgICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLFxuICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRXJyb3JzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgdGhlIHNhbWUgd2F5IGFzIHNlcnZlciBlbnZpcm9ubWVudCAtIGNyZWF0ZSBmYWxsYmFjayB3aXRoIFJlYWN0LkZyYWdtZW50XG4gICAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIE9yaWdpbmFsIFBhZ2VDb21wb25lbnQgZmFpbGVkIGR1cmluZyBjcmVhdGlvbiBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX06ICR7ZXJyb3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBmYWxsYmFjayBoYW5kbGVyIHdpdGggUmVhY3QuRnJhZ21lbnQgZm9yIFBhZ2VDb21wb25lbnQgYnV0IGtlZXAgb3JpZ2luYWwgSHRtbENvbXBvbmVudFxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgIFBhZ2VDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50LFxuICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBIdG1sQ29tcG9uZW50IHRvIGVuc3VyZSBib290c3RyYXBTY3JpcHRzIGFyZSByZW5kZXJlZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlUnNjUmVuZGVyKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBpZDogY3VycmVudFN0cmVhbUlkLFxuICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycyxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzLFxuICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9yc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyBub3QgYXV0b21hdGljYWxseSB0cmFjayBzdHJlYW1zIGZvciByZXVzZVxuICAgICAgICAvLyBPbmx5IGZ1bGwgc3RyZWFtcyB0aGF0IGV4cGxpY2l0bHkgcmVxdWVzdCByZXVzZSBvZiBhIGhlYWRsZXNzIHN0cmVhbSB3aWxsIHRyaWdnZXIgcmV1c2UgbG9naWNcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gUHJvY2Vzc2luZyBzaW5nbGUtdXNlIHN0cmVhbSAke2N1cnJlbnRTdHJlYW1JZH0gZm9yIHJvdXRlOiAke21zZy5vcHRpb25zLnJvdXRlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGVycm9yIGZvciB0aGlzIHJvdXRlXG4gICAgICAgIGNsZWFySGVhZGxlc3NFcnJvcihtc2cub3B0aW9ucy5yb3V0ZSk7XG5cbiAgICAgICAgLy8gaGFuZGxlUnNjUmVuZGVyIGhhbmRsZXMgZXZlcnl0aGluZyBpbnRlcm5hbGx5IGluY2x1ZGluZyBlcnJvciBoYW5kbGluZ1xuXG4gICAgICAgIC8vIGhhbmRsZVJzY1JlbmRlciBoYW5kbGVzIGV2ZXJ5dGhpbmcgaW50ZXJuYWxseSBpbmNsdWRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgbWVzc2FnZXNcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FzZSBcIlJFU09MVkVfQ09NUE9ORU5UU1wiOiB7XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb25TdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgICAgICAvLyBDYWNoZSB1c2VyIG9wdGlvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgZ2V0VXNlck9wdGlvbnMgY2FsbHNcbiAgICAgICAgY29uc3QgcmVzb2x2ZVVzZXJPcHRpb25zID0gZ2V0VXNlck9wdGlvbnMobXNnLmlkKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBSZXNvbHZpbmcgY29tcG9uZW50cyBmb3Igcm91dGU6ICR7bXNnLnJvdXRlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIHBhZ2VQYXRoOiAke21zZy5wYWdlUGF0aH1gKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbcnNjLXdvcmtlcl0gcHJvcHNQYXRoOiAke21zZy5wcm9wc1BhdGh9YCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIHJvb3RQYXRoOiAke21zZy5yb290UGF0aH1gKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbcnNjLXdvcmtlcl0gaHRtbFBhdGg6ICR7bXNnLmh0bWxQYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXI6JHttc2cucm91dGV9XSBwYWdlUGF0aD0ke21zZy5wYWdlUGF0aH0sIHByb3BzUGF0aD0ke21zZy5wcm9wc1BhdGh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgbG9hZGVyIGZvciBjb21wb25lbnQgcmVzb2x1dGlvbiB3aXRoIGNvcnJlY3QgYnVpbGQgY29uZmlnXG4gICAgICAgICAgLy8gVXNlIHRoZSByZW5kZXItc3BlY2lmaWMgYnVpbGQgY29uZmlnIGZyb20gdGhlIElOSVQgY2FzZVxuICAgICAgICAgIGNvbnN0IGJ1aWxkQ29uZmlnID0ge1xuICAgICAgICAgICAgc2VydmVyOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LnNlcnZlciB8fCBcInNlcnZlclwiLFxuICAgICAgICAgICAgY2xpZW50OiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LmNsaWVudCB8fCBcImNsaWVudFwiLFxuICAgICAgICAgICAgc3RhdGljOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LnN0YXRpYyB8fCBcInN0YXRpY1wiLFxuICAgICAgICAgICAgb3V0RGlyOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/Lm91dERpciB8fCBcImRpc3RcIixcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gRGVidWcgbG9nIHRvIHNlZSB3aGF0IG91dERpciB3ZSdyZSB1c2luZ1xuICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSBVc2luZyBvdXREaXI6ICR7YnVpbGRDb25maWcub3V0RGlyfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSByZW5kZXJJZDogJHtcbiAgICAgICAgICAgICAgICBtc2cuaWRcbiAgICAgICAgICAgICAgfSwgaGFzUmVuZGVyU3RhdGU6ICR7cmVuZGVyU3RhdGVzLmhhcyhtc2cuaWQpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGVzLmhhcyhtc2cuaWQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldChtc2cuaWQpITtcbiAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSByZW5kZXJTdGF0ZS5pbml0aWFsaXplZDogJHtyZW5kZXJTdGF0ZS5pbml0aWFsaXplZH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICBgW1JFU09MVkVfQ09NUE9ORU5UU10gcmVuZGVyU3RhdGUudXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdGF0ZS51c2VyT3B0aW9ucy5idWlsZFxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGNyZWF0ZVJzY1dvcmtlckxvYWRlcih7XG4gICAgICAgICAgICB2ZXJib3NlOiB2ZXJib3NlLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LFxuICAgICAgICAgICAgbWFuaWZlc3Q6IHdvcmtlckRhdGEuc2VydmVyTWFuaWZlc3QgfHwge30sXG4gICAgICAgICAgICBidWlsZDogYnVpbGRDb25maWcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIGNvbXBvbmVudHMgdXNpbmcgdGhlIHVuaWZpZWQgaGVscGVyIGZ1bmN0aW9uIChjYWNoaW5nIGlzIGhhbmRsZWQgaW50ZXJuYWxseSlcbiAgICAgICAgICBhd2FpdCBsb2FkQ29tcG9uZW50c1dpdGhDYWNoZSh7XG4gICAgICAgICAgICBwYWdlUGF0aDogbXNnLnBhZ2VQYXRoLFxuICAgICAgICAgICAgcHJvcHNQYXRoOiBtc2cucHJvcHNQYXRoLFxuICAgICAgICAgICAgcm9vdFBhdGg6IG1zZy5yb290UGF0aCxcbiAgICAgICAgICAgIGh0bWxQYXRoOiBtc2cuaHRtbFBhdGgsXG4gICAgICAgICAgICBwYWdlRXhwb3J0TmFtZTogbXNnLnBhZ2VFeHBvcnROYW1lIHx8IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgcHJvcHNFeHBvcnROYW1lOiBtc2cucHJvcHNFeHBvcnROYW1lIHx8IFwicHJvcHNcIixcbiAgICAgICAgICAgIHJvb3RFeHBvcnROYW1lOiBtc2cucm9vdEV4cG9ydE5hbWUgfHwgXCJSb290XCIsXG4gICAgICAgICAgICBodG1sRXhwb3J0TmFtZTogbXNnLmh0bWxFeHBvcnROYW1lIHx8IFwiSHRtbFwiLFxuICAgICAgICAgICAgdXJsOiBgLyR7bXNnLnJvdXRlfWAsIC8vIFNpbXBsZSBVUkwgZm9yIGNvbXBvbmVudCByZXNvbHV0aW9uXG4gICAgICAgICAgICBsb2FkZXIsXG4gICAgICAgICAgICB2ZXJib3NlLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHJlc29sdXRpb25TdGFydFRpbWU7XG5cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ29tcG9uZW50cyByZXNvbHZlZCBmb3Igcm91dGU6ICR7XG4gICAgICAgICAgICAgICAgbXNnLnJvdXRlXG4gICAgICAgICAgICAgIH0gaW4gJHtyZXNvbHV0aW9uVGltZS50b0ZpeGVkKDIpfW1zYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHN1Y2Nlc3MgcmVzcG9uc2UgKHdpdGhvdXQgdGhlIGFjdHVhbCBjb21wb25lbnRzKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlOiBDb21wb25lbnRzUmVzb2x2ZWRNZXNzYWdlID0ge1xuICAgICAgICAgICAgdHlwZTogXCJDT01QT05FTlRTX1JFU09MVkVEXCIsXG4gICAgICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICAgICAgcm91dGU6IG1zZy5yb3V0ZSxcbiAgICAgICAgICAgIHJlc29sdXRpb25UaW1lLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZShyZXNwb25zZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGYWlsZWQgdG8gcmVzb2x2ZSBjb21wb25lbnRzIGZvciByb3V0ZSAke21zZy5yb3V0ZX06ICR7ZXJyb3J9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBbHdheXMgc2VuZCBlcnJvciB0byBtYWluIHRocmVhZCAtIGxldCBtYWluIHRocmVhZCBkZWNpZGUgcGFuaWMgc3RhdHVzXG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25FcnJvcihtc2cuaWQsIHRvRXJyb3IoZXJyb3IpLCB7XG4gICAgICAgICAgICByb3V0ZTogbXNnLnJvdXRlLFxuICAgICAgICAgICAgY29udGV4dDogYENvbXBvbmVudCByZXNvbHV0aW9uIGZhaWxlZCBmb3Igcm91dGUgJHttc2cucm91dGV9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiU0VSVkVSX0FDVElPTlwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FjaGUgdXNlciBvcHRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIGdldFVzZXJPcHRpb25zIGNhbGxzXG4gICAgICAgICAgY29uc3Qgc2VydmVyQWN0aW9uVXNlck9wdGlvbnMgPSBnZXRVc2VyT3B0aW9ucygpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhlIHNlcnZlciBhY3Rpb24gSUQgdG8gZ2V0IHRoZSBmaWxlIHBhdGggYW5kIGV4cG9ydCBuYW1lXG4gICAgICAgICAgY29uc3QgW2ZpbGVQYXRoLCBleHBvcnROYW1lXSA9IG1zZy5pZC5zcGxpdChcIiNcIik7XG4gICAgICAgICAgaWYgKCFmaWxlUGF0aCB8fCAhZXhwb3J0TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBzZXJ2ZXIgYWN0aW9uIElEIGZvcm1hdDogJHttc2cuaWR9LiBFeHBlY3RlZCBmb3JtYXQ6IFwicGF0aC90by9maWxlLnRzI2V4cG9ydE5hbWVcImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNlcnZlciBhY3Rpb24gSUQgdG8gYSBmaWxlIHBhdGhcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXRoID0gZmlsZVBhdGguc3RhcnRzV2l0aChcbiAgICAgICAgICAgIHNlcnZlckFjdGlvblVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyBmaWxlUGF0aC5zbGljZShzZXJ2ZXJBY3Rpb25Vc2VyT3B0aW9ucy5tb2R1bGVCYXNlUGF0aC5sZW5ndGgpXG4gICAgICAgICAgICA6IGZpbGVQYXRoO1xuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LFxuICAgICAgICAgICAgYWN0aW9uUGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBzZXJ2ZXIgYWN0aW9uIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydChmdWxsUGF0aCk7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gbW9kdWxlW2V4cG9ydE5hbWVdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2ZXIgYWN0aW9uIG5vdCBmb3VuZDogJHttc2cuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVjb2RlIGFyZ3MgaWYgdGhleSdyZSBpbiBSZWFjdCdzIGVuY29kZWQgZm9ybWF0XG4gICAgICAgICAgbGV0IGRlY29kZWRBcmdzID0gbXNnLmFyZ3M7XG4gICAgICAgICAgaWYgKG1zZy5hcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgbXNnLmFyZ3NbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIE1pZ2h0IGJlIFJlYWN0J3MgZW5jb2RlZCBmb3JtYXQgLSB0cnkgdG8gZGVjb2RlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtb2R1bGVCYXNlUGF0aCA9IHNlcnZlckFjdGlvblVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoID8/IFwiL1wiO1xuICAgICAgICAgICAgICBkZWNvZGVkQXJncyA9IGF3YWl0IGRlY29kZVJlcGx5KG1zZy5hcmdzWzBdLCBtb2R1bGVCYXNlUGF0aCk7XG4gICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gRGVjb2RlZCBzZXJ2ZXIgYWN0aW9uIGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoZGVjb2RlZEFyZ3MpfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gTm90IGVuY29kZWQgZm9ybWF0LCB1c2UgYXMtaXNcbiAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LmluZm8oYFtyc2Mtd29ya2VyXSBVc2luZyByYXcgc2VydmVyIGFjdGlvbiBhcmdzYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBzZXJ2ZXIgYWN0aW9uXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uKC4uLmRlY29kZWRBcmdzKTtcblxuICAgICAgICAgIC8vIFNlbmQgc3VjY2VzcyByZXNwb25zZVxuICAgICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uU2VydmVyQWN0aW9uUmVzcG9uc2U/Lihtc2cuaWQsIHJlc3VsdCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdG9FcnJvcihlcnJvcikubWVzc2FnZTtcbiAgICAgICAgICAvLyBTZW5kIGVycm9yIHJlc3BvbnNlXG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25TZXJ2ZXJBY3Rpb25SZXNwb25zZT8uKFxuICAgICAgICAgICAgbXNnLmlkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfUkVBQ1RfTE9BREVSXCI6XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfQ1NTX0xPQURFUlwiOlxuICAgICAgY2FzZSBcIklOSVRJQUxJWkVEX0VOVl9MT0FERVJcIjpcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkhNUl9VUERBVEVcIjpcbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIC0gdXNlIHBhdGggaWYgcHJvdmlkZWQgKGZ1bGwgcGF0aCksIG90aGVyd2lzZSB1c2UgaWQgKG5vcm1hbGl6ZWQgcGF0aClcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSAobXNnIGFzIGFueSkucGF0aCB8fCBtc2cuaWQ7XG4gICAgICAgIGNvbnN0IGhtclByb2plY3RSb290ID0gd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ucHJvamVjdFJvb3QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5zdGFydHNXaXRoKGhtclByb2plY3RSb290KVxuICAgICAgICAgID8gcmVsYXRpdmUoaG1yUHJvamVjdFJvb3QsIGZpbGVQYXRoKVxuICAgICAgICAgIDogZmlsZVBhdGg7XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIHRoZSBtb2R1bGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgICAgaG1yU3RhdGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiAobXNnIGFzIGFueSkudGltZXN0YW1wIHx8IERhdGUubm93KCksXG4gICAgICAgICAgaW52YWxpZGF0ZWQ6IHRydWUsXG4gICAgICAgICAgcm91dGVzOiAobXNnIGFzIGFueSkucm91dGVzIHx8IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFsd2F5cyBsb2cgSE1SIHVwZGF0ZXMgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtyc2Mtd29ya2VyXSBITVJfVVBEQVRFOiBJbnZhbGlkYXRlZCBtb2R1bGUgJHtub3JtYWxpemVkUGF0aH0gKGZyb20gJHtmaWxlUGF0aH0pYFxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgLy8gQ1JJVElDQUw6IENsZWFyIEFMTCBjYWNoZXMgd2hlbiBmaWxlcyBjaGFuZ2VcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGZyZXNoIGNvbXBvbmVudHMgYXJlIGxvYWRlZCBpbnN0ZWFkIG9mIGNhY2hlZCBvbmVzXG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBoZWFkbGVzcyBzdHJlYW0gZWxlbWVudHMgY2FjaGVcbiAgICAgICAgaWYgKGhlYWRsZXNzU3RyZWFtRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIEhNUl9VUERBVEU6IENsZWFyaW5nICR7aGVhZGxlc3NTdHJlYW1FbGVtZW50cy5zaXplfSBjYWNoZWQgaGVhZGxlc3Mgc3RyZWFtIGVsZW1lbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGVhZGxlc3NTdHJlYW1FbGVtZW50cy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBhbGwgY29tcG9uZW50IGNhY2hlcyAodGVtcG9yYXJ5UmVmZXJlbmNlcylcbiAgICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIE5vZGUuanMgY2FjaGVzIEVTIG1vZHVsZXMsIGFuZCBldmVuIGlmIHdlIHJlbG9hZCxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCBjYWNoZSBtaWdodCBzdGlsbCBoYXZlIHRoZSBvbGQgY29tcG9uZW50XG4gICAgICAgIGNsZWFyQWxsQ2FjaGVkQ29tcG9uZW50cygpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gSE1SX1VQREFURTogQ2xlYXJlZCBhbGwgY2FjaGVkIGNvbXBvbmVudHMgZnJvbSB0ZW1wb3JhcnlSZWZlcmVuY2VzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFsc28gY2xlYXIgaGVhZGxlc3Mgc3RyZWFtIGVycm9ycyBzaW5jZSB3ZSdyZSByZWxvYWRpbmdcbiAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnMuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHVwZGF0ZVxuICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbkhtclVwZGF0ZShub3JtYWxpemVkUGF0aCwgKG1zZyBhcyBhbnkpLnJvdXRlcyB8fCBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgXCJBQk9SVFwiOlxuICAgICAgICAvLyBBYm9ydCB0aGUgc3RyZWFtXG4gICAgICAgIC8vIGFjdGl2ZVN0cmVhbXMuZ2V0KG1zZy5pZCk/LmVtaXQoXCJhYm9ydFwiKTsgLy8gVGhpcyBsaW5lIHdhcyByZW1vdmVkIGFzIHBlciB0aGUgbmV3X2NvZGVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkhNUl9DTEVBTlVQXCI6XG4gICAgICAgIC8vIENsZWFyIHRoZSBpbnZhbGlkYXRpb24gc3RhdGVcbiAgICAgICAgaG1yU3RhdGUuZGVsZXRlKG1zZy5pZCk7XG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIGNsZWFudXBcbiAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25IbXJBY2NlcHQobXNnLmlkLCBtc2cucm91dGVzIHx8IFtdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkNTU19GSUxFXCI6XG4gICAgICAgIGlmIChtc2cuaWQpIHtcbiAgICAgICAgICAvLyBDYWNoZSB1c2VyIG9wdGlvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgZ2V0VXNlck9wdGlvbnMgY2FsbHNcbiAgICAgICAgICBjb25zdCBjc3NGaWxlVXNlck9wdGlvbnMgPSBnZXRVc2VyT3B0aW9ucygpO1xuICAgICAgICAgIC8vIEFkZCB0byBDU1MgcmVnaXN0cnlcbiAgICAgICAgICBhZGRDc3NGaWxlQ29udGVudChtc2cuaWQsIG1zZy5jb250ZW50LCBjc3NGaWxlVXNlck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uQ3NzRmlsZT8uKG1zZy5pZCwgbXNnLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiU0VSVkVSX01PRFVMRVwiOlxuICAgICAgICBhZGRNb2R1bGVJZChtc2cuaWQsIG1zZy51cmwpO1xuICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vblNlcnZlck1vZHVsZT8uKG1zZy5pZCwgbXNnLnVybCwgbXNnLnNvdXJjZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgXCJNT0RVTEVfUkVRVUVTVFwiOiB7XG4gICAgICAgIGNvbnN0IHsgaWQsIHBhdGggfSA9IG1zZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICBqb2luKHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LCBwYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25TZXJ2ZXJNb2R1bGU/LihpZCwgcGF0aCwgbW9kdWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbkVycm9yKGlkLCB0b0Vycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgXCJTSFVURE9XTlwiOiB7XG4gICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uU2h1dGRvd24/Lihtc2cuaWQpO1xuICAgICAgICAvLyBTZW5kIFNIVVRET1dOX0NPTVBMRVRFIG1lc3NhZ2UgdG8gc2lnbmFsIHRoYXQgc2h1dGRvd24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgICAgICBzZW5kTWVzc2FnZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJTSFVURE9XTl9DT01QTEVURVwiLFxuICAgICAgICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmVudFBvcnRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFVua25vd24gbWVzc2FnZTogJHttc2cudHlwZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBKdXN0IGNvbW11bmljYXRlIHRoZSBlcnJvciBkaXJlY3RseSAtIGxldCB0aGUgbWFpbiB0aHJlYWQgaGFuZGxlIHBhbmljIHRocmVzaG9sZCBsb2dpY1xuICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uRXJyb3IoXCJ3b3JrZXIvcnNjXCIsIHRvRXJyb3IoZXJyb3IpKTtcbiAgICAvLyBBbHdheXMgc2VuZCBTSFVURE9XTl9DT01QTEVURSB0byBwcmV2ZW50IGhhbmdpbmdcbiAgICBlZmZlY3RpdmVIYW5kbGVycy5vblNodXRkb3duPy4oXCIqXCIpO1xuICB9XG59XG4iXSwibmFtZXMiOlsidmVyYm9zZSIsImxvZ2dlciIsIkRlZmF1bHRSb290IiwiYnVpbGRDb25maWciLCJsb2FkZXIiLCJmaWxlUGF0aCIsInJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDQSxNQUFNLE1BQVMsR0FBQSxZQUFBLENBQWEsVUFBVyxDQUFBLGNBQUEsRUFBZ0IsWUFBWSxNQUFNLENBQUE7QUFDekUsTUFBTSxPQUFBLEdBQVUsVUFBVyxDQUFBLFdBQUEsQ0FBWSxPQUFXLElBQUEsS0FBQTtBQUdsRCxPQUFRLENBQUEsRUFBQSxD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
|