├── src ├── web │ ├── src │ │ ├── style.css │ │ ├── main.js │ │ ├── assets │ │ │ └── vue.svg │ │ ├── components │ │ │ └── PlanView.vue │ │ └── App.vue │ ├── .vscode │ │ └── extensions.json │ ├── public │ │ ├── webfonts │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-solid-900.woff │ │ │ ├── fa-solid-900.woff2 │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.woff │ │ │ └── fa-regular-400.woff2 │ │ └── pev2.css │ ├── vite.config.js │ ├── .gitignore │ ├── package.json │ ├── index.html │ └── yarn.lock └── main │ ├── resources │ ├── webview │ │ ├── webfonts │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-solid-900.woff │ │ │ ├── fa-solid-900.woff2 │ │ │ └── fa-regular-400.woff2 │ │ ├── index.html │ │ ├── pev2.css │ │ └── assets │ │ │ └── index-abe2673c.css │ └── META-INF │ │ └── plugin.xml │ └── java │ └── com │ └── tjhelmuth │ ├── ExplainVisualizerAction.java │ ├── ExplainAnalyzeVisualizerAction.java │ ├── browser │ ├── commands │ │ ├── SimpleCommandHandler.java │ │ ├── CommandResult.java │ │ ├── RerunPlan.java │ │ └── LoadStatic.java │ ├── ResourceHandlerState.java │ ├── ClosedConnection.java │ ├── LocalSchemeHandlerFactory.java │ ├── LocalResourceHandler.java │ └── OpenedConnection.java │ ├── ExplainWindowService.java │ ├── PgPlanModel.java │ ├── PlanProvider.java │ ├── ExplainContext.java │ ├── PlanModelBuilder.java │ ├── QueryExecutionListener.java │ ├── file │ ├── PgPlanVirtualFile.java │ ├── PgPlanEditorProvider.java │ ├── PgPlanFileType.java │ └── PgPlanEditor.java │ ├── RunQueryActionListener.java │ ├── PlanData.java │ ├── CustomStyles.java │ ├── VisualizerActionBase.java │ └── ExplainWindow.java ├── settings.gradle ├── gradlew ├── README.md ├── .gitignore ├── gradlew.bat └── ThemeKeys.txt /src/web/src/style.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'postgres-explain-visualizer' 2 | 3 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/gradlew -------------------------------------------------------------------------------- /src/web/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /src/web/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './style.css' 3 | import App from './App.vue' 4 | 5 | createApp(App).mount('#app') -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /src/web/public/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/web/public/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/main/resources/webview/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjhelmuth/postgres-explain-visualizer/HEAD/src/main/resources/webview/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/web/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | }) 8 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/ExplainVisualizerAction.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | //just explain 4 | public class ExplainVisualizerAction extends VisualizerActionBase { 5 | public ExplainVisualizerAction(){ 6 | super(false); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/ExplainAnalyzeVisualizerAction.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | //explain + analyze 4 | public class ExplainAnalyzeVisualizerAction extends VisualizerActionBase { 5 | public ExplainAnalyzeVisualizerAction(){ 6 | super(true); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pev2-idea", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "pev2": "^1.10.0", 13 | "vue": "^3.2.45" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^4.0.0", 17 | "vite": "^4.1.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # postgres-explain-visualizer 2 | 3 | This is an intellij plugin that wraps the functionality of the Dalibo pev2 vue component. https://github.com/dalibo/pev2 4 | 5 | 6 | The user interface is a vue.js webapp that is embedded through embedded chromium into an editor tab. The vue js app is 7 | built using vite and standard vite commands apply. It's located at src/web 8 | 9 | I manually copy the built files from src/web/dist into src/main/resources/webview -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/commands/SimpleCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser.commands; 2 | 3 | import org.cef.network.CefRequest; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | import java.io.IOException; 7 | 8 | public interface SimpleCommandHandler { 9 | @NotNull CommandResult execute(CefRequest request) throws IOException; 10 | 11 | default boolean isApplicable(CefRequest request){ 12 | return true; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/web/src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/ExplainWindowService.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.openapi.Disposable; 4 | import com.intellij.openapi.diagnostic.Logger; 5 | import com.intellij.openapi.fileEditor.FileEditor; 6 | import com.intellij.openapi.project.Project; 7 | import com.tjhelmuth.file.PgPlanVirtualFile; 8 | 9 | public class ExplainWindowService { 10 | public ExplainWindow createWindow(String plan, ExplainContext context) { 11 | return new ExplainWindow(plan, context); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/web/src/components/PlanView.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/commands/CommandResult.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser.commands; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Value; 5 | 6 | @Value @AllArgsConstructor 7 | public class CommandResult { 8 | T result; 9 | boolean handled; 10 | 11 | public static CommandResult emptyHandled(){ 12 | return new CommandResult<>(null, true); 13 | } 14 | 15 | public static CommandResult emptyNotHandled(){ 16 | return new CommandResult<>(null, false); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/ResourceHandlerState.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser; 2 | 3 | import org.cef.callback.CefCallback; 4 | import org.cef.misc.IntRef; 5 | import org.cef.misc.StringRef; 6 | import org.cef.network.CefResponse; 7 | 8 | import java.io.IOException; 9 | 10 | public interface ResourceHandlerState { 11 | void getResponseHeaders(CefResponse response, IntRef responseLength, StringRef redirectUrl); 12 | 13 | boolean readResponse(byte[] dataOut, int designedBytesToRead, IntRef bytesRead, CefCallback callback); 14 | 15 | void close(); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/PgPlanModel.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.plan.PlanModel; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | import java.util.EnumSet; 7 | 8 | public class PgPlanModel extends PlanModel { 9 | private final String json; 10 | 11 | public PgPlanModel(@NotNull GenericNode root, boolean actual, @NotNull EnumSet unsupported, String json) { 12 | super(root, actual, unsupported); 13 | this.json = json; 14 | } 15 | 16 | public String getJson(){ 17 | return json; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/PlanProvider.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.Dbms; 4 | import com.intellij.database.dialects.base.plan.AbstractPlanModelBuilder; 5 | import com.intellij.database.dialects.postgres.plan.PgExplainPlanProvider; 6 | import com.intellij.database.util.Version; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class PlanProvider extends PgExplainPlanProvider { 10 | public PlanProvider() { 11 | super(Dbms.POSTGRES); 12 | } 13 | 14 | @Override 15 | public AbstractPlanModelBuilder createBuilder(@NotNull Version version, boolean run) { 16 | return new PlanModelBuilder(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/ExplainContext.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.console.JdbcConsole; 4 | import com.tjhelmuth.file.PgPlanEditor; 5 | import com.tjhelmuth.file.PgPlanVirtualFile; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Value; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | @Value @AllArgsConstructor 11 | public class ExplainContext { 12 | @NotNull PgPlanVirtualFile file; 13 | @NotNull PgPlanEditor editor; 14 | 15 | @NotNull JdbcConsole console; 16 | 17 | /** 18 | * Did we actually execute the query... explain + analyze 19 | */ 20 | public boolean didExecute(){ 21 | return file.isExecuted(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/ClosedConnection.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser; 2 | 3 | import org.cef.callback.CefCallback; 4 | import org.cef.misc.IntRef; 5 | import org.cef.misc.StringRef; 6 | import org.cef.network.CefResponse; 7 | 8 | public class ClosedConnection implements ResourceHandlerState { 9 | @Override 10 | public void getResponseHeaders(CefResponse response, IntRef responseLength, StringRef redirectUrl) { 11 | response.setStatus(404); 12 | } 13 | 14 | @Override 15 | public boolean readResponse(byte[] dataOut, int designedBytesToRead, IntRef bytesRead, CefCallback callback) { 16 | return false; 17 | } 18 | 19 | @Override 20 | public void close() {} 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/LocalSchemeHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser; 2 | 3 | import com.intellij.ui.jcef.JBCefBrowser; 4 | import com.tjhelmuth.ExplainWindow; 5 | import lombok.RequiredArgsConstructor; 6 | import org.cef.browser.CefBrowser; 7 | import org.cef.browser.CefFrame; 8 | import org.cef.callback.CefSchemeHandlerFactory; 9 | import org.cef.handler.CefResourceHandler; 10 | import org.cef.network.CefRequest; 11 | 12 | @RequiredArgsConstructor 13 | public class LocalSchemeHandlerFactory implements CefSchemeHandlerFactory { 14 | private final ExplainWindow window; 15 | 16 | @Override 17 | public CefResourceHandler create(CefBrowser cefBrowser, CefFrame cefFrame, String s, CefRequest cefRequest) { 18 | return new LocalResourceHandler(window); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/PlanModelBuilder.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.dialects.postgres.plan.PgPlanModelBuilder; 4 | import com.intellij.database.dialects.postgres.plan.PgRawPlanData; 5 | import com.intellij.database.plan.PlanModel; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.EnumSet; 9 | 10 | public class PlanModelBuilder extends PgPlanModelBuilder { 11 | private static final EnumSet unsupportedFeatures = EnumSet.noneOf(PlanModel.Feature.class); 12 | @Override 13 | public @NotNull PgRawPlanData createData() { 14 | return new PlanData(); 15 | } 16 | 17 | @Override 18 | public @NotNull PlanModel build(@NotNull PgRawPlanData data) { 19 | return new PgPlanModel(this.getRootNode(), this.myActual, unsupportedFeatures, data.json); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/QueryExecutionListener.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.psi.DbPsiFacade; 4 | import com.intellij.execution.ExecutionListener; 5 | import com.intellij.execution.process.ProcessHandler; 6 | import com.intellij.execution.runners.ExecutionEnvironment; 7 | import com.intellij.openapi.diagnostic.Logger; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class QueryExecutionListener implements ExecutionListener { 11 | private static final Logger log = Logger.getInstance(QueryExecutionListener.class); 12 | private DbPsiFacade facade; 13 | 14 | @Override 15 | public void processStarted(@NotNull String executorId, @NotNull ExecutionEnvironment env, @NotNull ProcessHandler handler) { 16 | String message = String.format("EXECUTION STARTED: %s, %s, %s", executorId, env, handler); 17 | log.info(message); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/file/PgPlanVirtualFile.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.file; 2 | 3 | import com.intellij.database.console.JdbcConsole; 4 | import com.intellij.testFramework.LightVirtualFile; 5 | import lombok.Getter; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.UUID; 9 | 10 | @Getter 11 | public class PgPlanVirtualFile extends LightVirtualFile { 12 | //did we actually run the query with analyze 13 | private final boolean executed; 14 | 15 | private final UUID explainId = UUID.randomUUID(); 16 | 17 | //console that executed this explain query 18 | private final JdbcConsole console; 19 | 20 | private final String query; 21 | 22 | public PgPlanVirtualFile(@NotNull String name, @NotNull String planText, boolean executed, JdbcConsole console, String query) { 23 | super(name, PgPlanFileType.INSTANCE, planText); 24 | this.executed = executed; 25 | this.console = console; 26 | this.query = query; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/RunQueryActionListener.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.actions.ExplainActionBase; 4 | import com.intellij.openapi.actionSystem.AnAction; 5 | import com.intellij.openapi.actionSystem.AnActionEvent; 6 | import com.intellij.openapi.actionSystem.AnActionResult; 7 | import com.intellij.openapi.actionSystem.ex.AnActionListener; 8 | import com.intellij.openapi.diagnostic.Logger; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | public class RunQueryActionListener implements AnActionListener { 12 | private static final Logger log = Logger.getInstance(RunQueryActionListener.class); 13 | 14 | @Override 15 | public void afterActionPerformed(@NotNull AnAction action, @NotNull AnActionEvent event, @NotNull AnActionResult result) { 16 | if(action instanceof ExplainActionBase){ 17 | log.info("Running query"); 18 | } 19 | 20 | String message = String.format("ACTION PERFORMED %s -- %s : %s", action, event.getClass(), result.getClass()); 21 | log.info(message); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/file/PgPlanEditorProvider.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.file; 2 | 3 | import com.intellij.openapi.fileEditor.FileEditor; 4 | import com.intellij.openapi.fileEditor.FileEditorPolicy; 5 | import com.intellij.openapi.fileEditor.FileEditorProvider; 6 | import com.intellij.openapi.project.Project; 7 | import com.intellij.openapi.vfs.VirtualFile; 8 | import org.apache.commons.lang.StringUtils; 9 | import org.jetbrains.annotations.NonNls; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | public class PgPlanEditorProvider implements FileEditorProvider { 13 | @Override 14 | public boolean accept(@NotNull Project project, @NotNull VirtualFile virtualFile) { 15 | return virtualFile instanceof PgPlanVirtualFile; 16 | } 17 | 18 | @Override 19 | public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile virtualFile) { 20 | return new PgPlanEditor(project, virtualFile); 21 | } 22 | 23 | @Override 24 | public @NotNull 25 | @NonNls String getEditorTypeId() { 26 | return "pgplan"; 27 | } 28 | 29 | @Override 30 | public @NotNull FileEditorPolicy getPolicy() { 31 | return FileEditorPolicy.PLACE_BEFORE_DEFAULT_EDITOR; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/commands/RerunPlan.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser.commands; 2 | 3 | import com.intellij.openapi.actionSystem.ActionManager; 4 | import com.tjhelmuth.ExplainAnalyzeVisualizerAction; 5 | import com.tjhelmuth.ExplainContext; 6 | import com.tjhelmuth.ExplainWindow; 7 | import com.tjhelmuth.PlanProvider; 8 | import lombok.RequiredArgsConstructor; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.cef.network.CefRequest; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.io.IOException; 14 | 15 | @Slf4j 16 | @RequiredArgsConstructor 17 | public class RerunPlan implements SimpleCommandHandler { 18 | private final ExplainWindow window; 19 | 20 | @NotNull 21 | @Override 22 | public CommandResult execute(CefRequest request) throws IOException { 23 | log.info("Refreshing plan"); 24 | 25 | ExplainContext context = window.getContext(); 26 | new ExplainAnalyzeVisualizerAction().updateExisting(context.getConsole(), context.getFile()); 27 | 28 | return CommandResult.emptyHandled(); 29 | } 30 | 31 | @Override 32 | public boolean isApplicable(CefRequest request) { 33 | return request.getURL().contains("myapp/rerun"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/file/PgPlanFileType.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.file; 2 | 3 | import com.intellij.icons.AllIcons; 4 | import com.intellij.openapi.fileTypes.FileType; 5 | import com.intellij.openapi.util.NlsContexts; 6 | import com.intellij.openapi.util.NlsSafe; 7 | import org.jetbrains.annotations.NonNls; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import javax.swing.*; 12 | 13 | public class PgPlanFileType implements FileType { 14 | public static final String EXTENSION = "pgplan"; 15 | public static final PgPlanFileType INSTANCE = new PgPlanFileType(); 16 | 17 | @Override 18 | public @NonNls 19 | @NotNull String getName() { 20 | return "PGPLAN"; 21 | } 22 | 23 | @Override 24 | public @NlsContexts.Label 25 | @NotNull String getDescription() { 26 | return "Postgres visualizer plugin plan"; 27 | } 28 | 29 | @Override 30 | public @NlsSafe 31 | @NotNull String getDefaultExtension() { 32 | return EXTENSION; 33 | } 34 | 35 | @Override 36 | public @Nullable Icon getIcon() { 37 | return AllIcons.FileTypes.Diagram; 38 | } 39 | 40 | @Override 41 | public boolean isBinary() { 42 | return true; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/web/src/App.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/PlanData.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.dataSource.DatabaseConnectionCore; 4 | import com.intellij.database.dialects.postgres.plan.PgRawPlanData; 5 | import com.intellij.database.plan.PlanRetrievalException; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public class PlanData extends PgRawPlanData { 9 | @Override 10 | public void load(@NotNull DatabaseConnectionCore connection, @NotNull String statement, boolean run) { 11 | this.json = null; 12 | //analyze, verbose, costs, buffers, format json 13 | useStatementWithPreserved(connection, s -> 14 | s.noisy().execute("EXPLAIN (FORMAT JSON, VERBOSE, COSTS" + (run ? ", BUFFERS, ANALYSE" : "") + ") " + statement, 15 | PgRawPlanData.processing((rs) -> { 16 | if (!rs.next()) { 17 | PgRawPlanData.failWithEmptyResultSetError(); 18 | } 19 | 20 | if (rs.getMetaData().getColumnCount() != 1) { 21 | throw new PlanRetrievalException("Database returned data in unknown format"); 22 | } else { 23 | String res = rs.getString(1); 24 | if (res == null) { 25 | throw new PlanRetrievalException("Database returned null plan"); 26 | } else if (rs.next()) { 27 | throw new PlanRetrievalException("Database returned too many data"); 28 | } else { 29 | PlanData.this.json = res; 30 | } 31 | } 32 | }))); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/commands/LoadStatic.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser.commands; 2 | 3 | import com.tjhelmuth.browser.OpenedConnection; 4 | import com.tjhelmuth.browser.ResourceHandlerState; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.commons.lang3.Validate; 7 | import org.cef.network.CefRequest; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.io.IOException; 11 | import java.net.URL; 12 | 13 | /** 14 | * Load a static resource from our resources/webview directory 15 | * 16 | */ 17 | @Slf4j 18 | public class LoadStatic implements SimpleCommandHandler { 19 | 20 | /** 21 | * Load a static resource from our resources/webview directory 22 | * @param request - the request from embedded browser 23 | * @return - resource handler state for this resource 24 | */ 25 | @NotNull 26 | @Override 27 | public CommandResult execute(CefRequest request) throws IOException { 28 | String requestUrl = request.getURL(); 29 | 30 | Validate.notBlank(requestUrl, "Request URL cannot be blank"); 31 | 32 | String pathToResource = requestUrl.replace("http://myapp", "webview/"); 33 | URL newUrl = getClass().getClassLoader().getResource(pathToResource); 34 | 35 | log.info("Loading static resource: {}", pathToResource); 36 | 37 | if(newUrl == null){ 38 | log.info("Unable to find resource for URL: {}", requestUrl); 39 | return CommandResult.emptyNotHandled(); 40 | } 41 | 42 | log.info("Loaded: {}", newUrl.getPath()); 43 | 44 | var conn = new OpenedConnection(newUrl.openConnection());; 45 | 46 | return new CommandResult<>(conn, true); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/**/workspace.xml 3 | .idea/**/tasks.xml 4 | .idea/**/usage.statistics.xml 5 | .idea/**/dictionaries 6 | .idea/**/shelf 7 | 8 | # AWS User-specific 9 | .idea/**/aws.xml 10 | 11 | # Generated files 12 | .idea/**/contentModel.xml 13 | 14 | # Sensitive or high-churn files 15 | .idea/**/dataSources/ 16 | .idea/**/dataSources.ids 17 | .idea/**/dataSources.local.xml 18 | .idea/**/sqlDataSources.xml 19 | .idea/**/dynamic.xml 20 | .idea/**/uiDesigner.xml 21 | .idea/**/dbnavigator.xml 22 | 23 | # Gradle 24 | .idea/**/gradle.xml 25 | .idea/**/libraries 26 | 27 | # Gradle and Maven with auto-import 28 | # When using Gradle or Maven with auto-import, you should exclude module files, 29 | # since they will be recreated, and may cause churn. Uncomment if using 30 | # auto-import. 31 | # .idea/artifacts 32 | # .idea/compiler.xml 33 | # .idea/jarRepositories.xml 34 | # .idea/modules.xml 35 | # .idea/*.iml 36 | # .idea/modules 37 | # *.iml 38 | # *.ipr 39 | 40 | # CMake 41 | cmake-build-*/ 42 | 43 | # Mongo Explorer plugin 44 | .idea/**/mongoSettings.xml 45 | 46 | # File-based project format 47 | *.iws 48 | 49 | # IntelliJ 50 | out/ 51 | 52 | # mpeltonen/sbt-idea plugin 53 | .idea_modules/ 54 | 55 | # JIRA plugin 56 | atlassian-ide-plugin.xml 57 | 58 | # Cursive Clojure plugin 59 | .idea/replstate.xml 60 | 61 | # SonarLint plugin 62 | .idea/sonarlint/ 63 | 64 | # Crashlytics plugin (for Android Studio and IntelliJ) 65 | com_crashlytics_export_strings.xml 66 | crashlytics.properties 67 | crashlytics-build.properties 68 | fabric.properties 69 | 70 | # Editor-based Rest Client 71 | .idea/httpRequests 72 | 73 | # Android studio 3.1+ serialized cache file 74 | .idea/caches/build_file_checksums.ser 75 | 76 | build/ 77 | gradle/ 78 | .idea/ 79 | .gradle/ -------------------------------------------------------------------------------- /src/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite + Vue 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 63 | 64 | 65 | 66 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/main/resources/webview/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite + Vue 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 65 | 66 | 67 | 68 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/LocalResourceHandler.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser; 2 | 3 | import com.tjhelmuth.ExplainWindow; 4 | import com.tjhelmuth.browser.commands.LoadStatic; 5 | import com.tjhelmuth.browser.commands.RerunPlan; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.cef.callback.CefCallback; 8 | import org.cef.handler.CefResourceHandler; 9 | import org.cef.misc.IntRef; 10 | import org.cef.misc.StringRef; 11 | import org.cef.network.CefRequest; 12 | import org.cef.network.CefResponse; 13 | 14 | import java.io.IOException; 15 | 16 | @Slf4j 17 | public class LocalResourceHandler implements CefResourceHandler { 18 | private final ExplainWindow window; 19 | private final RerunPlan refreshPlan; 20 | private final LoadStatic loadStatic = new LoadStatic(); 21 | 22 | private ResourceHandlerState state = new ClosedConnection(); 23 | 24 | public LocalResourceHandler(ExplainWindow window) { 25 | this.window = window; 26 | this.refreshPlan = new RerunPlan(window); 27 | } 28 | 29 | 30 | @Override 31 | public boolean processRequest(CefRequest cefRequest, CefCallback cefCallback) { 32 | log.info("Processing request: {}", cefRequest.getURL()); 33 | 34 | try { 35 | boolean handled; 36 | if(refreshPlan.isApplicable(cefRequest)){ 37 | var result = refreshPlan.execute(cefRequest); 38 | handled = result.isHandled(); 39 | } else { 40 | var result = loadStatic.execute(cefRequest); 41 | this.state = result.isHandled() ? result.getResult() : new ClosedConnection(); 42 | 43 | handled = result.isHandled(); 44 | } 45 | 46 | if(handled){ 47 | cefCallback.Continue(); 48 | return true; 49 | } else { 50 | cefCallback.cancel(); 51 | return false; 52 | } 53 | 54 | } catch (IOException e){ 55 | log.error("Error processing cef request", e); 56 | return false; 57 | } 58 | } 59 | 60 | @Override 61 | public void getResponseHeaders(CefResponse cefResponse, IntRef intRef, StringRef stringRef) { 62 | state.getResponseHeaders(cefResponse, intRef, stringRef); 63 | } 64 | 65 | @Override 66 | public boolean readResponse(byte[] bytes, int i, IntRef intRef, CefCallback cefCallback) { 67 | return state.readResponse(bytes, i, intRef, cefCallback); 68 | } 69 | 70 | @Override 71 | public void cancel() { 72 | state.close(); 73 | state = new ClosedConnection(); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/browser/OpenedConnection.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.browser; 2 | 3 | import org.cef.callback.CefCallback; 4 | import org.cef.handler.CefLoadHandler; 5 | import org.cef.misc.IntRef; 6 | import org.cef.misc.StringRef; 7 | import org.cef.network.CefResponse; 8 | 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.net.URLConnection; 12 | 13 | public class OpenedConnection implements ResourceHandlerState { 14 | private final URLConnection connection; 15 | private final InputStream inputStream; 16 | 17 | public OpenedConnection(URLConnection connection) { 18 | this.connection = connection; 19 | 20 | try { 21 | inputStream = connection.getInputStream(); 22 | } catch (IOException e) { 23 | throw new RuntimeException(e); 24 | } 25 | } 26 | 27 | @Override 28 | public void getResponseHeaders(CefResponse response, IntRef responseLength, StringRef redirectUrl) { 29 | try { 30 | String url = connection.getURL().toString(); 31 | String mimeType = connection.getContentType(); 32 | if(url.contains(".css")) mimeType = "text/css"; 33 | if(url.contains(".js")) mimeType = "text/javascript"; 34 | if(url.contains(".html")) mimeType = "text/html"; 35 | 36 | response.setMimeType(mimeType); 37 | responseLength.set(inputStream.available()); 38 | response.setStatus(200); 39 | } catch (IOException e){ 40 | response.setError(CefLoadHandler.ErrorCode.ERR_FILE_NOT_FOUND); 41 | response.setStatusText(e.getLocalizedMessage()); 42 | response.setStatus(404); 43 | } 44 | } 45 | 46 | @Override 47 | public boolean readResponse(byte[] dataOut, int designedBytesToRead, IntRef totalRead, CefCallback callback) { 48 | try { 49 | int availableSize = inputStream.available(); 50 | if (availableSize <= 0) { 51 | this.close(); 52 | return false; 53 | } 54 | 55 | int maxBytesToRead = Math.min(availableSize, designedBytesToRead); 56 | int bytesRead = inputStream.read(dataOut, 0, maxBytesToRead); 57 | totalRead.set(bytesRead); 58 | return true; 59 | 60 | } catch (Exception e){ 61 | e.printStackTrace(); 62 | return false; 63 | } 64 | } 65 | 66 | @Override 67 | public void close() { 68 | try { 69 | inputStream.close(); 70 | } catch (IOException e) { 71 | //ignored 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/CustomStyles.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.util.ArrayList; 6 | import java.util.Collections; 7 | import java.util.Map; 8 | 9 | public enum CustomStyles { 10 | INSTANCE; 11 | 12 | private final Color editorBackground; 13 | private final Color editorForeground; 14 | private final Color textColor; 15 | 16 | private final Color panelBg; 17 | private final Color panelFg; 18 | 19 | private final String uiPanelSelector = ".splitpanes.default-theme .splitpanes__pane"; 20 | private final String uselessHeaderSelector = ".nav.nav-pills"; 21 | private final String statsHeaderSelector = ".plan-stats"; 22 | private final String borderBottomSelector = ".border-bottom"; 23 | private final String borderTopSelector = ".border-top"; 24 | 25 | private final String rightPanelSelector = ".small.p-2.border-left"; 26 | private final String nodeTypeSelector = ".node-type"; 27 | private final String subPlanSelector = ".subplan"; 28 | 29 | private final Color desktopBackground; 30 | 31 | CustomStyles(){ 32 | this.editorBackground = UIManager.getColor("EditorPane.background"); 33 | this.editorForeground = UIManager.getColor("EditorPane.foreground"); 34 | this.textColor = UIManager.getColor("Tree.textForeground"); 35 | this.panelBg = UIManager.getColor("Panel.background"); 36 | this.panelFg = UIManager.getColor("Panel.foreground"); 37 | this.desktopBackground = UIManager.getColor("OptionPane.foreground"); 38 | } 39 | 40 | public String generateCssBlock(){ 41 | StringBuilder sb = new StringBuilder(); 42 | sb.append(""); 53 | return sb.toString(); 54 | } 55 | 56 | private String colorStr(Color color){ 57 | return String.format("rgb(%s, %s, %s)", color.getRed(), color.getBlue(), color.getGreen()); 58 | } 59 | 60 | private String block(String selector, String key, String value){ 61 | StringBuilder sb = new StringBuilder(); 62 | sb.append(selector).append(" {"); 63 | sb.append(key).append(": ").append(value).append(";").append(System.lineSeparator()); 64 | sb.append("}").append(System.lineSeparator()); 65 | return sb.toString(); 66 | } 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/file/PgPlanEditor.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth.file; 2 | 3 | import com.intellij.openapi.fileEditor.FileEditor; 4 | import com.intellij.openapi.fileEditor.FileEditorLocation; 5 | import com.intellij.openapi.fileEditor.FileEditorState; 6 | import com.intellij.openapi.project.Project; 7 | import com.intellij.openapi.util.UserDataHolderBase; 8 | import com.intellij.openapi.vfs.VirtualFile; 9 | import com.tjhelmuth.ExplainContext; 10 | import com.tjhelmuth.ExplainWindow; 11 | import com.tjhelmuth.ExplainWindowService; 12 | import lombok.Getter; 13 | import org.jetbrains.annotations.Nls; 14 | import org.jetbrains.annotations.NotNull; 15 | import org.jetbrains.annotations.Nullable; 16 | 17 | import javax.swing.*; 18 | import java.beans.PropertyChangeListener; 19 | 20 | /** 21 | * This is the editor that contains our explain diagram. 22 | */ 23 | public class PgPlanEditor extends UserDataHolderBase implements FileEditor { 24 | private final Project project; 25 | private final VirtualFile file; 26 | 27 | @Getter 28 | private ExplainWindow explainWindow; 29 | 30 | public PgPlanEditor(Project project, VirtualFile file){ 31 | this.project = project; 32 | this.file = file; 33 | } 34 | 35 | @Override 36 | public @NotNull JComponent getComponent() { 37 | if(this.explainWindow != null){ 38 | return this.explainWindow.getContent(); 39 | } 40 | 41 | PgPlanVirtualFile planFile = (PgPlanVirtualFile) file; 42 | 43 | ExplainWindowService service = project.getService(ExplainWindowService.class); 44 | this.explainWindow = service.createWindow(planFile.getContent().toString(), new ExplainContext(planFile, this, planFile.getConsole())); 45 | return explainWindow.getContent(); 46 | } 47 | 48 | @Override 49 | public @Nullable JComponent getPreferredFocusedComponent() { 50 | return this.getComponent(); 51 | } 52 | 53 | @Override 54 | public @Nls(capitalization = Nls.Capitalization.Title) 55 | @NotNull String getName() { 56 | return file.getName(); 57 | } 58 | 59 | @Override 60 | public void setState(@NotNull FileEditorState fileEditorState) { 61 | 62 | } 63 | 64 | @Override 65 | public boolean isModified() { 66 | return false; 67 | } 68 | 69 | @Override 70 | public boolean isValid() { 71 | return true; 72 | } 73 | 74 | @Override 75 | public void addPropertyChangeListener(@NotNull PropertyChangeListener propertyChangeListener) { 76 | 77 | } 78 | 79 | @Override 80 | public void removePropertyChangeListener(@NotNull PropertyChangeListener propertyChangeListener) { 81 | 82 | } 83 | 84 | @Override 85 | public @Nullable FileEditorLocation getCurrentLocation() { 86 | return null; 87 | } 88 | 89 | @Override 90 | public @Nullable VirtualFile getFile() { 91 | return file; 92 | } 93 | 94 | @Override 95 | public void dispose() { 96 | 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | com.tjhelmuth.postgres-explain-visualizer 3 | Postgres Explain Visualizer 4 | Tyler Helmuth 5 | 6 | 7 | 8 | Postgres query plan visualizer 9 |

More in depth and easy to use than the included UML diagram in the database plugin.

10 |

Based on vue js component from https://github.com/dalibo/pev2

11 | 12 |

Usage

13 |
    14 |
  1. Write a postgres query in a query console for a PostgreSQL datasource
  2. 15 |
  3. Right click the selected query, and in the context menu choose "Visualize Explain or Visualize Explain + Analyze"
  4. 16 |
17 | ]]>
18 | 19 | 20 | * Fixed bug with just Explain (without analyze) on postgres versions < 13 21 | * Added button to the plan viewer to rerun plan generation from inside the tab 22 | * Updated pev2 vue component to 1.7. 23 | 24 | 25 | 27 | com.intellij.modules.platform 28 | com.intellij.database 29 | com.intellij.modules.ultimate 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 52 | 53 | 54 | 55 | 59 | 60 | 61 | 62 |
-------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/VisualizerActionBase.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.database.actions.ExplainActionBase; 4 | import com.intellij.database.console.JdbcConsole; 5 | import com.intellij.database.datagrid.DataRequest; 6 | import com.intellij.database.plan.ExplainPlanProvider; 7 | import com.intellij.openapi.actionSystem.AnActionEvent; 8 | import com.intellij.openapi.application.ApplicationManager; 9 | import com.intellij.openapi.fileEditor.FileEditor; 10 | import com.intellij.openapi.fileEditor.FileEditorManager; 11 | import com.intellij.util.ui.UIUtil; 12 | import com.tjhelmuth.file.PgPlanEditor; 13 | import com.tjhelmuth.file.PgPlanVirtualFile; 14 | import lombok.extern.slf4j.Slf4j; 15 | import org.apache.commons.lang3.StringUtils; 16 | import org.jetbrains.annotations.NotNull; 17 | 18 | import java.util.Arrays; 19 | import java.util.UUID; 20 | 21 | @Slf4j 22 | public abstract class VisualizerActionBase extends ExplainActionBase.Ui { 23 | private final ExplainPlanProvider planProvider = new PlanProvider(); 24 | 25 | public VisualizerActionBase(boolean run){ 26 | super(run); 27 | } 28 | 29 | @Override 30 | public void setDefaultIcon(boolean isDefaultIconSet) { 31 | super.setDefaultIcon(isDefaultIconSet); 32 | } 33 | 34 | @Override 35 | protected boolean isSupported(AnActionEvent e) { 36 | JdbcConsole console = getConsole(e); 37 | ExplainPlanProvider provider = console != null ? ExplainPlanProvider.getDefaultProvider(console.getDataSource()) : null; 38 | return provider != null && console.getDataSource().getDbms().isPostgres() && provider.isSupported(console.getDataSource().getVersion(), this.myRun); 39 | } 40 | 41 | /** 42 | * Refresh an existing explain plan that we have an id for 43 | */ 44 | public void updateExisting(@NotNull JdbcConsole console, PgPlanVirtualFile existingFile){ 45 | this.doExplain(console, existingFile.getQuery(), existingFile); 46 | } 47 | 48 | @Override 49 | protected void explainStatement(@NotNull ExplainPlanProvider provider, @NotNull JdbcConsole console, @NotNull String statement) { 50 | //intentionally ignoring provider so we can use our own 51 | this.doExplain(console, statement, null); 52 | } 53 | 54 | private void doExplain(@NotNull JdbcConsole console, @NotNull String statement, PgPlanVirtualFile existingFile){ 55 | DataRequest.RawRequest request = planProvider.createExplainRequest(console, (model) -> { 56 | if(model instanceof PgPlanModel){ 57 | 58 | ApplicationManager.getApplication().invokeLater(() -> { 59 | PgPlanModel mdl = (PgPlanModel) model; 60 | 61 | PgPlanVirtualFile file = existingFile == null 62 | ? new PgPlanVirtualFile(getFileName(statement), mdl.getJson(), myRun, console, statement) 63 | : existingFile; 64 | 65 | //we will either open the file for the first time, or open it in the existing editor 66 | FileEditor[] editors = FileEditorManager.getInstance(console.getProject()).openFile(file, true); 67 | if(existingFile != null){ 68 | Arrays.stream(editors).filter(e -> e instanceof PgPlanEditor).forEach(e -> { 69 | PgPlanEditor editor = (PgPlanEditor) e; 70 | editor.getExplainWindow().updatePlan(mdl.getJson()); 71 | }); 72 | } 73 | }); 74 | } 75 | }, console.getDataSource(), statement, this.myRun); 76 | 77 | if (request != null) { 78 | console.getMessageBus().getDataProducer().processRequest(request); 79 | } 80 | } 81 | 82 | private String getFileName(String statement){ 83 | return String.format("Explain: %s", StringUtils.substring(statement, 0, 6)); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/tjhelmuth/ExplainWindow.java: -------------------------------------------------------------------------------- 1 | package com.tjhelmuth; 2 | 3 | import com.intellij.openapi.diagnostic.Logger; 4 | import com.intellij.openapi.util.Disposer; 5 | import com.intellij.ui.jcef.JBCefBrowser; 6 | import com.tjhelmuth.browser.LocalSchemeHandlerFactory; 7 | import lombok.Getter; 8 | import org.cef.CefApp; 9 | import org.cef.browser.CefBrowser; 10 | import org.cef.browser.CefFrame; 11 | import org.cef.handler.CefLoadHandlerAdapter; 12 | 13 | import javax.swing.*; 14 | 15 | public class ExplainWindow { 16 | private final Logger log = Logger.getInstance(ExplainWindow.class); 17 | 18 | @Getter 19 | private final ExplainContext context; 20 | 21 | @Getter 22 | private JBCefBrowser browser; 23 | 24 | private String plan; 25 | 26 | 27 | /** 28 | * The actual window that contains the rendered query plan 29 | * 30 | * //TODO: cleanup this code 😩😩😩😩 31 | */ 32 | public ExplainWindow(String plan, ExplainContext context) { 33 | this.context = context; 34 | this.setPlan(plan); 35 | 36 | this.browser = new JBCefBrowser(); 37 | registerAppSchemeHandler(); 38 | browser.loadURL("http://myapp/index.html"); 39 | 40 | browser.getJBCefClient().addLoadHandler(new CefLoadHandlerAdapter() { 41 | @Override 42 | public void onLoadEnd(CefBrowser cefBrowser, CefFrame cefFrame, int i) { 43 | String code = String.format("window.QUERY_PLAN = '%s'; if(window.setPlan) window.setPlan(window.QUERY_PLAN);", ExplainWindow.this.plan); 44 | log.info(code); 45 | 46 | // String cssCode = CustomStyles.INSTANCE.generateCssBlock() 47 | // .replaceAll("[\r\n]+", " ") 48 | // .replace("\"", "\\\"") 49 | // .replace("'", "\\'"); 50 | 51 | // System.out.println(cssCode); 52 | 53 | // String injectCss = String.format("document.head.insertAdjacentHTML( 'beforeend', \"%s\" );", cssCode); 54 | // System.out.println(injectCss); 55 | // cefBrowser.executeJavaScript(injectCss, browser.getCefBrowser().getURL(), 0); 56 | 57 | runJavascript(code); 58 | 59 | selectAppropriateMetric(cefBrowser); 60 | } 61 | }, browser.getCefBrowser()); 62 | 63 | Disposer.register(context.getEditor(), browser); 64 | } 65 | 66 | public void updatePlan(String plan){ 67 | log.debug("Updating plan"); 68 | this.setPlan(plan); 69 | 70 | String code = String.format("window.QUERY_PLAN = '%s'; if(window.setPlan) window.setPlan(window.QUERY_PLAN); " 71 | + "window.setLoading(false);", ExplainWindow.this.plan); 72 | runJavascript(code); 73 | } 74 | 75 | 76 | private void selectAppropriateMetric(CefBrowser browser){ 77 | StringBuilder query = new StringBuilder(); 78 | if(context.didExecute()){ 79 | query.append("Array.from(document.querySelectorAll('button'))\n" + 80 | " .filter(el => el.textContent === 'duration').forEach(btn => btn.click());\n"); 81 | query.append("Array.from(document.querySelectorAll('button'))\n" + 82 | " .filter(el => el.textContent === 'time').forEach(btn => btn.click());\n"); 83 | } else { 84 | query.append("Array.from(document.querySelectorAll('button'))\n" + 85 | " .filter(el => el.textContent === 'cost').forEach(btn => btn.click());"); 86 | } 87 | 88 | log.info(query.toString()); 89 | 90 | runJavascript(query.toString()); 91 | } 92 | 93 | private void runJavascript(String code){ 94 | browser.getCefBrowser().executeJavaScript(code, null, 0); 95 | } 96 | 97 | public JComponent getContent(){ 98 | return browser.getComponent(); 99 | } 100 | 101 | private void setPlan(String plan){ 102 | this.plan = plan 103 | .replaceAll("[\r\n]+", " ") 104 | .replace("\"", "\\\"") 105 | .replace("'", "\\'"); 106 | } 107 | 108 | private void registerAppSchemeHandler() { 109 | log.info("Registering scheme handler monkaW"); 110 | 111 | CefApp.getInstance() 112 | .registerSchemeHandlerFactory("http", "myapp", new LocalSchemeHandlerFactory(this)); 113 | } 114 | } -------------------------------------------------------------------------------- /ThemeKeys.txt: -------------------------------------------------------------------------------- 1 | ActionButton.focusedBorderColor 2 | ActionButton.hoverBackground 3 | ActionButton.hoverBorderColor 4 | ActionButton.pressedBackground 5 | ActionButton.pressedBorderColor 6 | Bookmark.Mnemonic.iconBackground 7 | Bookmark.Mnemonic.iconBorderColor 8 | Bookmark.Mnemonic.iconForeground 9 | Bookmark.iconBackground 10 | BookmarkMnemonicAssigned.background 11 | BookmarkMnemonicAssigned.borderColor 12 | BookmarkMnemonicAssigned.foreground 13 | BookmarkMnemonicAvailable.background 14 | BookmarkMnemonicAvailable.borderColor 15 | BookmarkMnemonicAvailable.foreground 16 | BookmarkMnemonicCurrent.background 17 | BookmarkMnemonicCurrent.borderColor 18 | BookmarkMnemonicCurrent.foreground 19 | Borders.ContrastBorderColor 20 | Button.background 21 | Button.darkShadow 22 | Button.default.endBackground 23 | Button.default.endBorderColor 24 | Button.default.focusColor 25 | Button.default.focusedBorderColor 26 | Button.default.foreground 27 | Button.default.startBackground 28 | Button.default.startBorderColor 29 | Button.disabledBorderColor 30 | Button.disabledText 31 | Button.disabledToolBarBorderBackground 32 | Button.endBackground 33 | Button.endBorderColor 34 | Button.focus 35 | Button.focusedBorderColor 36 | Button.foreground 37 | Button.highlight 38 | Button.light 39 | Button.select 40 | Button.shadow 41 | Button.shadowColor 42 | Button.startBackground 43 | Button.startBorderColor 44 | Button.toolBarBorderBackground 45 | CheckBox.background 46 | CheckBox.disabledText 47 | CheckBox.focus 48 | CheckBox.foreground 49 | CheckBoxMenuItem.acceleratorForeground 50 | CheckBoxMenuItem.acceleratorSelectionForeground 51 | CheckBoxMenuItem.background 52 | CheckBoxMenuItem.disabledForeground 53 | CheckBoxMenuItem.foreground 54 | CheckBoxMenuItem.selectionBackground 55 | CheckBoxMenuItem.selectionForeground 56 | Checkbox.select 57 | ColorChooser.background 58 | ColorChooser.foreground 59 | ColorChooser.swatchesDefaultRecentColor 60 | ComboBox.ArrowButton.background 61 | ComboBox.ArrowButton.disabledIconColor 62 | ComboBox.ArrowButton.iconColor 63 | ComboBox.ArrowButton.nonEditableBackground 64 | ComboBox.background 65 | ComboBox.buttonBackground 66 | ComboBox.buttonDarkShadow 67 | ComboBox.buttonHighlight 68 | ComboBox.buttonShadow 69 | ComboBox.disabledBackground 70 | ComboBox.disabledForeground 71 | ComboBox.foreground 72 | ComboBox.nonEditableBackground 73 | ComboBox.selectionBackground 74 | ComboBox.selectionForeground 75 | ComboBoxButton.background 76 | Component.borderColor 77 | Component.disabledBorderColor 78 | Component.errorFocusColor 79 | Component.focusColor 80 | Component.focusedBorderColor 81 | Component.inactiveErrorFocusColor 82 | Component.inactiveWarningFocusColor 83 | Component.infoForeground 84 | Component.warningFocusColor 85 | DefaultTabs.background 86 | Desktop.background 87 | DesktopIcon.background 88 | DesktopIcon.foreground 89 | DragAndDrop.areaBackground 90 | DragAndDrop.areaBorderColor 91 | DragAndDrop.areaForeground 92 | DragAndDrop.borderColor 93 | DragAndDrop.rowBackground 94 | Editor.SearchField.background 95 | EditorPane.background 96 | EditorPane.caretForeground 97 | EditorPane.foreground 98 | EditorPane.inactiveBackground 99 | EditorPane.inactiveForeground 100 | EditorPane.selectionBackground 101 | EditorPane.selectionForeground 102 | EditorTabs.underlinedTabBackground 103 | Focus.color 104 | FormattedTextField.background 105 | FormattedTextField.caretForeground 106 | FormattedTextField.foreground 107 | FormattedTextField.inactiveBackground 108 | FormattedTextField.inactiveForeground 109 | FormattedTextField.selectionBackground 110 | FormattedTextField.selectionForeground 111 | Group.separatorColor 112 | Hyperlink.linkColor 113 | InternalFrame.activeTitleBackground 114 | InternalFrame.activeTitleForeground 115 | InternalFrame.borderColor 116 | InternalFrame.borderDarkShadow 117 | InternalFrame.borderHighlight 118 | InternalFrame.borderLight 119 | InternalFrame.borderShadow 120 | InternalFrame.inactiveTitleBackground 121 | InternalFrame.inactiveTitleForeground 122 | Label.background 123 | Label.disabledForeground 124 | Label.disabledShadow 125 | Label.foreground 126 | Label.selectedForeground 127 | Lesson.Badge.newLessonBackground 128 | Lesson.Badge.newLessonForeground 129 | Lesson.shortcutBackground 130 | Lesson.stepNumberForeground 131 | Link.activeForeground 132 | Link.hoverForeground 133 | Link.pressedForeground 134 | Link.visitedForeground 135 | List.background 136 | List.dropCellBackground 137 | List.dropLineColor 138 | List.foreground 139 | List.selectionBackground 140 | List.selectionForeground 141 | MainToolbar.Dropdown.background 142 | MainToolbar.Dropdown.hoverBackground 143 | MainToolbar.Dropdown.pressedBackground 144 | MainToolbar.Icon.background 145 | MainToolbar.Icon.hoverBackground 146 | MainToolbar.Icon.pressedBackground 147 | MainToolbar.background 148 | Menu.acceleratorForeground 149 | Menu.acceleratorSelectionForeground 150 | Menu.background 151 | Menu.borderColor 152 | Menu.disabledForeground 153 | Menu.foreground 154 | Menu.selectionBackground 155 | Menu.selectionForeground 156 | Menu.separatorColor 157 | MenuBar.background 158 | MenuBar.borderColor 159 | MenuBar.disabledBackground 160 | MenuBar.foreground 161 | MenuBar.highlight 162 | MenuBar.shadow 163 | MenuItem.acceleratorForeground 164 | MenuItem.acceleratorSelectionForeground 165 | MenuItem.background 166 | MenuItem.disabledForeground 167 | MenuItem.foreground 168 | MenuItem.selectionBackground 169 | MenuItem.selectionForeground 170 | NavBar.borderColor 171 | NewClass.Panel.background 172 | NewClass.SearchField.background 173 | OptionPane.background 174 | OptionPane.errorDialog.border.background 175 | OptionPane.errorDialog.titlePane.background 176 | OptionPane.errorDialog.titlePane.foreground 177 | OptionPane.errorDialog.titlePane.shadow 178 | OptionPane.foreground 179 | OptionPane.messageForeground 180 | OptionPane.questionDialog.border.background 181 | OptionPane.questionDialog.titlePane.background 182 | OptionPane.questionDialog.titlePane.foreground 183 | OptionPane.questionDialog.titlePane.shadow 184 | OptionPane.warningDialog.border.background 185 | OptionPane.warningDialog.titlePane.background 186 | OptionPane.warningDialog.titlePane.foreground 187 | OptionPane.warningDialog.titlePane.shadow 188 | Panel.background 189 | Panel.foreground 190 | PasswordField.background 191 | PasswordField.caretForeground 192 | PasswordField.foreground 193 | PasswordField.inactiveBackground 194 | PasswordField.inactiveForeground 195 | PasswordField.selectionBackground 196 | PasswordField.selectionForeground 197 | Plugins.borderColor 198 | Popup.Header.activeBackground 199 | Popup.Header.inactiveBackground 200 | Popup.Toolbar.background 201 | Popup.Toolbar.borderColor 202 | Popup.borderColor 203 | Popup.inactiveBorderColor 204 | PopupMenu.background 205 | PopupMenu.foreground 206 | PopupMenu.translucentBackground 207 | ProgressBar.background 208 | ProgressBar.failedColor 209 | ProgressBar.failedEndColor 210 | ProgressBar.foreground 211 | ProgressBar.indeterminateEndColor 212 | ProgressBar.indeterminateStartColor 213 | ProgressBar.passedColor 214 | ProgressBar.passedEndColor 215 | ProgressBar.progressColor 216 | ProgressBar.selectionBackground 217 | ProgressBar.selectionForeground 218 | ProgressBar.trackColor 219 | RadioButton.background 220 | RadioButton.darcula.selectionDisabledColor 221 | RadioButton.darcula.selectionDisabledShadowColor 222 | RadioButton.darcula.selectionEnabledColor 223 | RadioButton.darcula.selectionEnabledShadowColor 224 | RadioButton.darkShadow 225 | RadioButton.disabledText 226 | RadioButton.focus 227 | RadioButton.foreground 228 | RadioButton.highlight 229 | RadioButton.light 230 | RadioButton.select 231 | RadioButton.shadow 232 | RadioButtonMenuItem.acceleratorForeground 233 | RadioButtonMenuItem.acceleratorSelectionForeground 234 | RadioButtonMenuItem.background 235 | RadioButtonMenuItem.disabledForeground 236 | RadioButtonMenuItem.foreground 237 | RadioButtonMenuItem.selectionBackground 238 | RadioButtonMenuItem.selectionForeground 239 | ScrollBar.background 240 | ScrollBar.darkShadow 241 | ScrollBar.foreground 242 | ScrollBar.highlight 243 | ScrollBar.shadow 244 | ScrollBar.thumb 245 | ScrollBar.thumbDarkShadow 246 | ScrollBar.thumbHighlight 247 | ScrollBar.thumbShadow 248 | ScrollBar.track 249 | ScrollBar.trackHighlight 250 | ScrollPane.background 251 | ScrollPane.foreground 252 | SearchEverywhere.Advertiser.background 253 | SearchEverywhere.Advertiser.foreground 254 | SearchEverywhere.Header.background 255 | SearchEverywhere.List.separatorColor 256 | SearchEverywhere.SearchField.background 257 | SearchEverywhere.SearchField.borderColor 258 | SearchEverywhere.SearchField.infoForeground 259 | SearchEverywhere.Tab.selectedBackground 260 | SearchEverywhere.Tab.selectedForeground 261 | SegmentedButton.focusedSelectedButtonColor 262 | SegmentedButton.selectedButtonColor 263 | SegmentedButton.selectedEndBorderColor 264 | SegmentedButton.selectedStartBorderColor 265 | Separator.background 266 | Separator.foreground 267 | Separator.highlight 268 | Separator.separatorColor 269 | Separator.shadow 270 | Slider.altTrackColor 271 | Slider.background 272 | Slider.focus 273 | Slider.foreground 274 | Slider.highlight 275 | Slider.shadow 276 | Slider.tickColor 277 | Spinner.background 278 | Spinner.foreground 279 | SplitPane.background 280 | SplitPane.darkShadow 281 | SplitPane.dividerFocusColor 282 | SplitPane.highlight 283 | SplitPane.shadow 284 | SplitPaneDivider.draggingColor 285 | StatusBar.LightEditBackground 286 | StatusBar.borderColor 287 | StatusBar.hoverBackground 288 | TabbedPane.background 289 | TabbedPane.borderHightlightColor 290 | TabbedPane.contentAreaColor 291 | TabbedPane.darkShadow 292 | TabbedPane.disabledForeground 293 | TabbedPane.disabledUnderlineColor 294 | TabbedPane.focus 295 | TabbedPane.focusColor 296 | TabbedPane.foreground 297 | TabbedPane.highlight 298 | TabbedPane.hoverColor 299 | TabbedPane.light 300 | TabbedPane.selectHighlight 301 | TabbedPane.selected 302 | TabbedPane.shadow 303 | TabbedPane.tabAreaBackground 304 | TabbedPane.underlineColor 305 | TabbedPane.unselectedBackground 306 | Table.background 307 | Table.dropCellBackground 308 | Table.dropLineColor 309 | Table.dropLineShortColor 310 | Table.focusCellBackground 311 | Table.focusCellForeground 312 | Table.foreground 313 | Table.gridColor 314 | Table.selectionBackground 315 | Table.selectionForeground 316 | Table.sortIconColor 317 | TableHeader.background 318 | TableHeader.bottomSeparatorColor 319 | TableHeader.focusCellBackground 320 | TableHeader.foreground 321 | TableHeader.separatorColor 322 | Tag.background 323 | TextArea.background 324 | TextArea.caretForeground 325 | TextArea.foreground 326 | TextArea.inactiveForeground 327 | TextArea.selectionBackground 328 | TextArea.selectionForeground 329 | TextField.background 330 | TextField.caretForeground 331 | TextField.darkShadow 332 | TextField.disabledBackground 333 | TextField.foreground 334 | TextField.highlight 335 | TextField.inactiveBackground 336 | TextField.inactiveForeground 337 | TextField.light 338 | TextField.selectionBackground 339 | TextField.selectionForeground 340 | TextField.shadow 341 | TextPane.background 342 | TextPane.caretForeground 343 | TextPane.foreground 344 | TextPane.inactiveForeground 345 | TextPane.selectionBackground 346 | TextPane.selectionForeground 347 | TitledBorder.titleColor 348 | ToggleButton.background 349 | ToggleButton.darkShadow 350 | ToggleButton.disabledText 351 | ToggleButton.focus 352 | ToggleButton.foreground 353 | ToggleButton.highlight 354 | ToggleButton.light 355 | ToggleButton.select 356 | ToggleButton.shadow 357 | ToolBar.background 358 | ToolBar.borderColor 359 | ToolBar.darkShadow 360 | ToolBar.dockingBackground 361 | ToolBar.dockingForeground 362 | ToolBar.floatingBackground 363 | ToolBar.floatingForeground 364 | ToolBar.foreground 365 | ToolBar.highlight 366 | ToolBar.light 367 | ToolBar.shadow 368 | ToolTip.background 369 | ToolTip.backgroundInactive 370 | ToolTip.foreground 371 | ToolTip.foregroundInactive 372 | ToolTip.infoForeground 373 | ToolWindow.Header.background 374 | ToolWindow.Header.inactiveBackground 375 | ToolWindow.HeaderCloseButton.background 376 | ToolWindow.HeaderTab.selectedBackground 377 | ToolWindow.HeaderTab.selectedInactiveBackground 378 | Tooltip.Learning.background 379 | Tooltip.Learning.borderColor 380 | Tooltip.Learning.foreground 381 | Tooltip.Learning.spanBackground 382 | Tooltip.Learning.spanForeground 383 | Tooltip.Learning.stepNumberForeground 384 | Tree.background 385 | Tree.dropCellBackground 386 | Tree.dropLineColor 387 | Tree.foreground 388 | Tree.hash 389 | Tree.line 390 | Tree.selectionBackground 391 | Tree.selectionBorderColor 392 | Tree.selectionForeground 393 | Tree.textBackground 394 | Tree.textForeground 395 | ValidationTooltip.errorBackground 396 | ValidationTooltip.errorBorderColor 397 | ValidationTooltip.warningBackground 398 | ValidationTooltip.warningBorderColor 399 | Viewport.background 400 | Viewport.foreground 401 | activeCaption 402 | activeCaptionBorder 403 | activeCaptionText 404 | control 405 | controlDkShadow 406 | controlHighlight 407 | controlLtHighlight 408 | controlShadow 409 | controlText 410 | desktop 411 | inactiveCaption 412 | inactiveCaptionBorder 413 | inactiveCaptionText 414 | info 415 | infoText 416 | menu 417 | menuText 418 | scrollbar 419 | text 420 | textHighlight 421 | textHighlightText 422 | textInactiveText 423 | textText 424 | window 425 | windowBorder 426 | windowText -------------------------------------------------------------------------------- /src/web/public/pev2.css: -------------------------------------------------------------------------------- 1 | .plan-node[data-v-afdcbefd]{cursor:pointer}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.splitpanes{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:100%}.splitpanes--vertical{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.splitpanes--horizontal{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.splitpanes--dragging *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.splitpanes__pane{width:100%;height:100%;overflow:hidden}.splitpanes--vertical .splitpanes__pane{-webkit-transition:width .2s ease-out;-o-transition:width .2s ease-out;transition:width .2s ease-out}.splitpanes--horizontal .splitpanes__pane{-webkit-transition:height .2s ease-out;-o-transition:height .2s ease-out;transition:height .2s ease-out}.splitpanes--dragging .splitpanes__pane{-webkit-transition:none;-o-transition:none;transition:none}.splitpanes__splitter{-ms-touch-action:none;touch-action:none}.splitpanes--vertical>.splitpanes__splitter{min-width:1px;cursor:col-resize}.splitpanes--horizontal>.splitpanes__splitter{min-height:1px;cursor:row-resize}.splitpanes.default-theme .splitpanes__pane{background-color:#f2f2f2}.splitpanes.default-theme .splitpanes__splitter{background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;-ms-flex-negative:0;flex-shrink:0}.splitpanes.default-theme .splitpanes__splitter:before,.splitpanes.default-theme .splitpanes__splitter:after{content:"";position:absolute;top:50%;left:50%;background-color:#00000026;-webkit-transition:background-color .3s;-o-transition:background-color .3s;transition:background-color .3s}.splitpanes.default-theme .splitpanes__splitter:hover:before,.splitpanes.default-theme .splitpanes__splitter:hover:after{background-color:#00000040}.splitpanes.default-theme .splitpanes__splitter:first-child{cursor:auto}.default-theme.splitpanes .splitpanes .splitpanes__splitter{z-index:1}.default-theme.splitpanes--vertical>.splitpanes__splitter,.default-theme .splitpanes--vertical>.splitpanes__splitter{width:7px;border-left:1px solid #eee;margin-left:-1px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:1px;height:30px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:before{margin-left:-2px}.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{margin-left:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter,.default-theme .splitpanes--horizontal>.splitpanes__splitter{height:7px;border-top:1px solid #eee;margin-top:-1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translate(-50%);width:30px;height:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before{margin-top:-2px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{margin-top:1px}.alert.c-1{background-color:#ccc;color:#454545;font-weight:700}.alert.c-1 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-1{background-color:#ccc;border-color:#ccc!important}.text-c-1{color:#ccc}.alert.c-2{background-color:#fddb61;color:#454545;font-weight:700}.alert.c-2 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-2{background-color:#fddb61;border-color:#fddb61!important}.text-c-2{color:#fddb61}.alert.c-3{background-color:#e80;color:#454545;font-weight:700}.alert.c-3 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-3{background-color:#e80;border-color:#e80!important}.text-c-3{color:#e80}.alert.c-4{background-color:#800;color:#fff;font-weight:700}.alert.c-4 .text-muted{color:#fff!important;font-weight:400}.progress-bar.c-4{background-color:#800;border-color:#800!important}.text-c-4{color:#800}.bg-hit{background-color:#ccc}.border-hit{border-color:#ccc!important}.bg-read{background-color:#fddb61}.border-read{border-color:#fddb61!important}.bg-dirtied{background-color:#e80}.border-dirtied{border-color:#e80!important}.bg-written{background-color:#800}.border-written{border-color:#800!important}.btn-group-xs>.btn,.btn-xs{padding:.25rem .4rem;font-size:12px;border-radius:.2rem}.btn-group-xs>.btn,.btn-group-xs>.btn .fa,.btn-xs,.btn-xs .fa{line-height:.5}.plan-node.never-executed .plan-node-body,.bg-hatched{background-image:linear-gradient(45deg,#f7f7f7 25%,transparent 25%,transparent 50%,#f7f7f7 50%,#f7f7f7 75%,transparent 75%,transparent);background-size:1rem 1rem}.border-dashed{border-style:dashed!important;background-color:transparent!important}.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden}.bg-secondary-light{background-color:#dedede!important}.plan-container{font-family:Noto Sans,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.plan-container .menu{position:absolute;z-index:1;right:0}.plan-container .menu-hidden ul,.plan-container .menu-hidden h3{display:none}.plan-container .grab-bing{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:grab}.plan-container .grab-bing:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:grabbing}.plan-container .text-muted{color:#ababab!important}.plan-container .cursor-help{cursor:help}.plan-container pre{overflow:initial}.plan .btn-close{border-radius:50%;box-shadow:0;line-height:1.5;border:1px solid #dedede;background-color:#fff;font-size:12px}.plan-stats{font-size:13px}.plan-stats .stat-dropdown-container{border:1px solid #dedede;padding:18px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:6;right:0;width:300px;max-height:70vh;overflow:auto}.plan-stats .stat-dropdown-container .btn-close{border-radius:50%;box-shadow:0;line-height:1.5;border:1px solid #dedede;background-color:#fff;font-size:12px}.plan-stats .stat-dropdown-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.tippy-popper .tippy-tooltip{text-align:left}.tippy-popper .text-muted{color:inherit!important}.splitpanes__pane{transition:none!important}.no-focus-outline:focus{outline:none}.table-nonfluid{width:auto!important}.more-info[title]{text-decoration-line:underline;text-decoration-style:dotted;text-decoration-color:#ababab;cursor:help}foreignObject{overflow:visible}.plan-diagram{line-height:.85em;font-family:Noto Sans,sans-serif}.plan-diagram.plan-diagram-top{max-height:30%}.plan-diagram table tr td:nth-child(3){width:50%}.plan-diagram table tr td:nth-child(2){max-width:0;width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.plan-diagram .legend ul li{font-size:13px}.plan-diagram .legend ul li span{display:inline-block;width:8px;height:8px;border-radius:50%}.plan-diagram tbody:after{content:"";display:block;height:10px}.plan-diagram th,.plan-diagram td{margin:0;color:#4d525a;white-space:nowrap}.plan-diagram th.node-index,.plan-diagram th.node-type,.plan-diagram th.subplan,.plan-diagram td.node-index,.plan-diagram td.node-type,.plan-diagram td.subplan{font-size:13px}.plan-diagram th.node-type,.plan-diagram td.node-type{font-weight:700}.plan-diagram th{font-size:13px}.plan-diagram tr.node{cursor:pointer}.plan-diagram tr.selected{outline:1px solid #00B5E2;box-shadow:0 0 5px 2px #00b5e266}.plan-diagram tr.highlight,.plan-diagram tr.selected{background-color:#fff}.plan-diagram table.highlight tr{opacity:50%}.plan-diagram table.highlight tr.highlight{opacity:100%}.plan-diagram .tree-lines{font-family:"monospace"}.plan-node{text-decoration:none;color:#4d525a;display:inline-block;position:relative;font-size:12px;margin-bottom:4px;overflow-wrap:break-word;word-wrap:break-word;width:240px}.plan-node .plan-node-body{position:relative;border:1px solid #dedede;border-radius:3px;background-color:#fff;box-shadow:1px 1px 3px #0000001a}.plan-node .plan-node-body .header.card-body:hover{background-color:#f7f7f7}.plan-node .plan-node-body.card .card-body,.plan-node .plan-node-body.card .card-header{padding:6px 10px}.plan-node .plan-node-body.card .card-header .card-header-tabs{margin:6px 0 -6px}.plan-node .plan-node-body.card .card-header .card-header-tabs .nav-link{padding:3px 10px}.plan-node.parallel .plan-node-body{box-shadow:none}.plan-node header{margin-bottom:6px;overflow:hidden}.plan-node header h4{font-size:14px;float:left;font-weight:600;margin:0;line-height:inherit;color:#000!important}.plan-node header .node-duration{float:right;margin-left:10px;font-size:13px}.plan-node .prop-list{color:inherit;table-layout:fixed}.plan-node:hover .plan-node-body,.plan-node.highlight .plan-node-body{box-shadow:1px 1px 5px #0006}.plan-node:hover .workers>div,.plan-node.highlight .workers>div{border-color:#0003}.plan-node.selected .plan-node-body{border-color:#00b5e2;box-shadow:0 0 5px 2px #00b5e266}.plan-node.selected .workers>div{border-color:#00b5e233}.plan-node .node-description{text-align:left;font-style:italic;word-break:normal}.plan-node .node-description .node-type{font-weight:600;background-color:#00b5e2;color:#fff;padding:0 6px}.plan-node .btn-default{border:0}.plan-node .text-muted{color:#999ea7}.plan-node .plan-query-container{border:1px solid #dedede;padding:18px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:1;left:0}.plan-node .plan-query-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.plan-node .workers{position:absolute;left:-1px;top:1px;width:100%;height:100%;cursor:pointer}.plan-node .workers>div{border:1px solid #dedede;border-radius:3px;background-color:#fff;width:100%;height:100%;position:absolute}.plan-node .workers-handle{cursor:pointer;position:absolute;top:0;right:-5px}.plan-node .workers-handle>div{position:absolute;top:0;background-color:#fff;border:1px solid #efefef;border-radius:3px}.plan-node .workers-handle>div:hover{background-color:#f7f7f7;border-color:#dedede}.plan-node .subplan-name{background-color:#b3d7d7;border-radius:3px}.plan-node button .fa-chevron-right{display:inline-block}.plan-node button .fa-chevron-down{display:none}.plan-node button[aria-expanded=true] .fa-chevron-right{display:none!important}.plan-node button[aria-expanded=true] .fa-chevron-down{display:inline-block!important}.plan-node.plan-node-detail .text-truncate{overflow:initial;white-space:initial;text-overflow:initial}.node-bar-container{height:5px;margin-top:10px;margin-bottom:3px;border-radius:6px;background-color:#dedede;position:relative}.node-bar-container .node-bar{border-radius:6px;height:100%;text-align:left;position:absolute;left:0;top:0}.node-bar-label{text-align:left;display:block}.detailed{width:400px!important}*>.copy{display:none}*:hover>.copy{display:block}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! 2 | Theme: StackOverflow Light 3 | Description: Light theme as used on stackoverflow.com 4 | Author: stackoverflow.com 5 | Maintainer: @Hirse 6 | Website: https://github.com/StackExchange/Stacks 7 | License: MIT 8 | Updated: 2021-05-15 9 | 10 | Updated for @stackoverflow/stacks v0.64.0 11 | Code Blocks: /blob/v0.64.0/lib/css/components/_stacks-code-blocks.less 12 | Colors: /blob/v0.64.0/lib/css/exports/_stacks-constants-colors.less 13 | */.hljs{color:#2f3337;background:#f6f6f6}.hljs-subst{color:#2f3337}.hljs-comment{color:#656e77}.hljs-attr,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-section,.hljs-selector-tag{color:#015692}.hljs-attribute{color:#803378}.hljs-name,.hljs-number,.hljs-quote,.hljs-selector-id,.hljs-template-tag,.hljs-type{color:#b75501}.hljs-selector-class{color:#015692}.hljs-link,.hljs-regexp,.hljs-selector-attr,.hljs-string,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#54790d}.hljs-meta,.hljs-selector-pseudo{color:#015692}.hljs-built_in,.hljs-literal,.hljs-title{color:#b75501}.hljs-bullet,.hljs-code{color:#535a60}.hljs-meta .hljs-string{color:#54790d}.hljs-deletion{color:#c02d2e}.hljs-addition{color:#2f6f44}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}path{stroke-linecap:butt}path.never-executed{stroke-dasharray:.5em;stroke-opacity:.5} 14 | -------------------------------------------------------------------------------- /src/main/resources/webview/pev2.css: -------------------------------------------------------------------------------- 1 | .plan-node[data-v-afdcbefd]{cursor:pointer}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.splitpanes{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:100%}.splitpanes--vertical{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.splitpanes--horizontal{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.splitpanes--dragging *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.splitpanes__pane{width:100%;height:100%;overflow:hidden}.splitpanes--vertical .splitpanes__pane{-webkit-transition:width .2s ease-out;-o-transition:width .2s ease-out;transition:width .2s ease-out}.splitpanes--horizontal .splitpanes__pane{-webkit-transition:height .2s ease-out;-o-transition:height .2s ease-out;transition:height .2s ease-out}.splitpanes--dragging .splitpanes__pane{-webkit-transition:none;-o-transition:none;transition:none}.splitpanes__splitter{-ms-touch-action:none;touch-action:none}.splitpanes--vertical>.splitpanes__splitter{min-width:1px;cursor:col-resize}.splitpanes--horizontal>.splitpanes__splitter{min-height:1px;cursor:row-resize}.splitpanes.default-theme .splitpanes__pane{background-color:#f2f2f2}.splitpanes.default-theme .splitpanes__splitter{background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;-ms-flex-negative:0;flex-shrink:0}.splitpanes.default-theme .splitpanes__splitter:before,.splitpanes.default-theme .splitpanes__splitter:after{content:"";position:absolute;top:50%;left:50%;background-color:#00000026;-webkit-transition:background-color .3s;-o-transition:background-color .3s;transition:background-color .3s}.splitpanes.default-theme .splitpanes__splitter:hover:before,.splitpanes.default-theme .splitpanes__splitter:hover:after{background-color:#00000040}.splitpanes.default-theme .splitpanes__splitter:first-child{cursor:auto}.default-theme.splitpanes .splitpanes .splitpanes__splitter{z-index:1}.default-theme.splitpanes--vertical>.splitpanes__splitter,.default-theme .splitpanes--vertical>.splitpanes__splitter{width:7px;border-left:1px solid #eee;margin-left:-1px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:1px;height:30px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:before{margin-left:-2px}.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{margin-left:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter,.default-theme .splitpanes--horizontal>.splitpanes__splitter{height:7px;border-top:1px solid #eee;margin-top:-1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translate(-50%);width:30px;height:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before{margin-top:-2px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{margin-top:1px}.alert.c-1{background-color:#ccc;color:#454545;font-weight:700}.alert.c-1 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-1{background-color:#ccc;border-color:#ccc!important}.text-c-1{color:#ccc}.alert.c-2{background-color:#fddb61;color:#454545;font-weight:700}.alert.c-2 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-2{background-color:#fddb61;border-color:#fddb61!important}.text-c-2{color:#fddb61}.alert.c-3{background-color:#e80;color:#454545;font-weight:700}.alert.c-3 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-3{background-color:#e80;border-color:#e80!important}.text-c-3{color:#e80}.alert.c-4{background-color:#800;color:#fff;font-weight:700}.alert.c-4 .text-muted{color:#fff!important;font-weight:400}.progress-bar.c-4{background-color:#800;border-color:#800!important}.text-c-4{color:#800}.bg-hit{background-color:#ccc}.border-hit{border-color:#ccc!important}.bg-read{background-color:#fddb61}.border-read{border-color:#fddb61!important}.bg-dirtied{background-color:#e80}.border-dirtied{border-color:#e80!important}.bg-written{background-color:#800}.border-written{border-color:#800!important}.btn-group-xs>.btn,.btn-xs{padding:.25rem .4rem;font-size:12px;border-radius:.2rem}.btn-group-xs>.btn,.btn-group-xs>.btn .fa,.btn-xs,.btn-xs .fa{line-height:.5}.plan-node.never-executed .plan-node-body,.bg-hatched{background-image:linear-gradient(45deg,#f7f7f7 25%,transparent 25%,transparent 50%,#f7f7f7 50%,#f7f7f7 75%,transparent 75%,transparent);background-size:1rem 1rem}.border-dashed{border-style:dashed!important;background-color:transparent!important}.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden}.bg-secondary-light{background-color:#dedede!important}.plan-container{font-family:Noto Sans,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.plan-container .menu{position:absolute;z-index:1;right:0}.plan-container .menu-hidden ul,.plan-container .menu-hidden h3{display:none}.plan-container .grab-bing{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:grab}.plan-container .grab-bing:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:grabbing}.plan-container .text-muted{color:#ababab!important}.plan-container .cursor-help{cursor:help}.plan-container pre{overflow:initial}.plan .btn-close{border-radius:50%;box-shadow:0;line-height:1.5;border:1px solid #dedede;background-color:#fff;font-size:12px}.plan-stats{font-size:13px}.plan-stats .stat-dropdown-container{border:1px solid #dedede;padding:18px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:6;right:0;width:300px;max-height:70vh;overflow:auto}.plan-stats .stat-dropdown-container .btn-close{border-radius:50%;box-shadow:0;line-height:1.5;border:1px solid #dedede;background-color:#fff;font-size:12px}.plan-stats .stat-dropdown-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.tippy-popper .tippy-tooltip{text-align:left}.tippy-popper .text-muted{color:inherit!important}.splitpanes__pane{transition:none!important}.no-focus-outline:focus{outline:none}.table-nonfluid{width:auto!important}.more-info[title]{text-decoration-line:underline;text-decoration-style:dotted;text-decoration-color:#ababab;cursor:help}foreignObject{overflow:visible}.plan-diagram{line-height:.85em;font-family:Noto Sans,sans-serif}.plan-diagram.plan-diagram-top{max-height:30%}.plan-diagram table tr td:nth-child(3){width:50%}.plan-diagram table tr td:nth-child(2){max-width:0;width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.plan-diagram .legend ul li{font-size:13px}.plan-diagram .legend ul li span{display:inline-block;width:8px;height:8px;border-radius:50%}.plan-diagram tbody:after{content:"";display:block;height:10px}.plan-diagram th,.plan-diagram td{margin:0;color:#4d525a;white-space:nowrap}.plan-diagram th.node-index,.plan-diagram th.node-type,.plan-diagram th.subplan,.plan-diagram td.node-index,.plan-diagram td.node-type,.plan-diagram td.subplan{font-size:13px}.plan-diagram th.node-type,.plan-diagram td.node-type{font-weight:700}.plan-diagram th{font-size:13px}.plan-diagram tr.node{cursor:pointer}.plan-diagram tr.selected{outline:1px solid #00B5E2;box-shadow:0 0 5px 2px #00b5e266}.plan-diagram tr.highlight,.plan-diagram tr.selected{background-color:#fff}.plan-diagram table.highlight tr{opacity:50%}.plan-diagram table.highlight tr.highlight{opacity:100%}.plan-diagram .tree-lines{font-family:"monospace"}.plan-node{text-decoration:none;color:#4d525a;display:inline-block;position:relative;font-size:12px;margin-bottom:4px;overflow-wrap:break-word;word-wrap:break-word;width:240px}.plan-node .plan-node-body{position:relative;border:1px solid #dedede;border-radius:3px;background-color:#fff;box-shadow:1px 1px 3px #0000001a}.plan-node .plan-node-body .header.card-body:hover{background-color:#f7f7f7}.plan-node .plan-node-body.card .card-body,.plan-node .plan-node-body.card .card-header{padding:6px 10px}.plan-node .plan-node-body.card .card-header .card-header-tabs{margin:6px 0 -6px}.plan-node .plan-node-body.card .card-header .card-header-tabs .nav-link{padding:3px 10px}.plan-node.parallel .plan-node-body{box-shadow:none}.plan-node header{margin-bottom:6px;overflow:hidden}.plan-node header h4{font-size:14px;float:left;font-weight:600;margin:0;line-height:inherit;color:#000!important}.plan-node header .node-duration{float:right;margin-left:10px;font-size:13px}.plan-node .prop-list{color:inherit;table-layout:fixed}.plan-node:hover .plan-node-body,.plan-node.highlight .plan-node-body{box-shadow:1px 1px 5px #0006}.plan-node:hover .workers>div,.plan-node.highlight .workers>div{border-color:#0003}.plan-node.selected .plan-node-body{border-color:#00b5e2;box-shadow:0 0 5px 2px #00b5e266}.plan-node.selected .workers>div{border-color:#00b5e233}.plan-node .node-description{text-align:left;font-style:italic;word-break:normal}.plan-node .node-description .node-type{font-weight:600;background-color:#00b5e2;color:#fff;padding:0 6px}.plan-node .btn-default{border:0}.plan-node .text-muted{color:#999ea7}.plan-node .plan-query-container{border:1px solid #dedede;padding:18px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:1;left:0}.plan-node .plan-query-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.plan-node .workers{position:absolute;left:-1px;top:1px;width:100%;height:100%;cursor:pointer}.plan-node .workers>div{border:1px solid #dedede;border-radius:3px;background-color:#fff;width:100%;height:100%;position:absolute}.plan-node .workers-handle{cursor:pointer;position:absolute;top:0;right:-5px}.plan-node .workers-handle>div{position:absolute;top:0;background-color:#fff;border:1px solid #efefef;border-radius:3px}.plan-node .workers-handle>div:hover{background-color:#f7f7f7;border-color:#dedede}.plan-node .subplan-name{background-color:#b3d7d7;border-radius:3px}.plan-node button .fa-chevron-right{display:inline-block}.plan-node button .fa-chevron-down{display:none}.plan-node button[aria-expanded=true] .fa-chevron-right{display:none!important}.plan-node button[aria-expanded=true] .fa-chevron-down{display:inline-block!important}.plan-node.plan-node-detail .text-truncate{overflow:initial;white-space:initial;text-overflow:initial}.node-bar-container{height:5px;margin-top:10px;margin-bottom:3px;border-radius:6px;background-color:#dedede;position:relative}.node-bar-container .node-bar{border-radius:6px;height:100%;text-align:left;position:absolute;left:0;top:0}.node-bar-label{text-align:left;display:block}.detailed{width:400px!important}*>.copy{display:none}*:hover>.copy{display:block}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! 2 | Theme: StackOverflow Light 3 | Description: Light theme as used on stackoverflow.com 4 | Author: stackoverflow.com 5 | Maintainer: @Hirse 6 | Website: https://github.com/StackExchange/Stacks 7 | License: MIT 8 | Updated: 2021-05-15 9 | 10 | Updated for @stackoverflow/stacks v0.64.0 11 | Code Blocks: /blob/v0.64.0/lib/css/components/_stacks-code-blocks.less 12 | Colors: /blob/v0.64.0/lib/css/exports/_stacks-constants-colors.less 13 | */.hljs{color:#2f3337;background:#f6f6f6}.hljs-subst{color:#2f3337}.hljs-comment{color:#656e77}.hljs-attr,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-section,.hljs-selector-tag{color:#015692}.hljs-attribute{color:#803378}.hljs-name,.hljs-number,.hljs-quote,.hljs-selector-id,.hljs-template-tag,.hljs-type{color:#b75501}.hljs-selector-class{color:#015692}.hljs-link,.hljs-regexp,.hljs-selector-attr,.hljs-string,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#54790d}.hljs-meta,.hljs-selector-pseudo{color:#015692}.hljs-built_in,.hljs-literal,.hljs-title{color:#b75501}.hljs-bullet,.hljs-code{color:#535a60}.hljs-meta .hljs-string{color:#54790d}.hljs-deletion{color:#c02d2e}.hljs-addition{color:#2f6f44}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}path{stroke-linecap:butt}path.never-executed{stroke-dasharray:.5em;stroke-opacity:.5} 14 | -------------------------------------------------------------------------------- /src/main/resources/webview/assets/index-abe2673c.css: -------------------------------------------------------------------------------- 1 | .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.splitpanes{display:flex;width:100%;height:100%}.splitpanes--vertical{flex-direction:row}.splitpanes--horizontal{flex-direction:column}.splitpanes--dragging *{-webkit-user-select:none;user-select:none}.splitpanes__pane{width:100%;height:100%;overflow:hidden}.splitpanes--vertical .splitpanes__pane{transition:width .2s ease-out}.splitpanes--horizontal .splitpanes__pane{transition:height .2s ease-out}.splitpanes--dragging .splitpanes__pane{transition:none}.splitpanes__splitter{touch-action:none}.splitpanes--vertical>.splitpanes__splitter{min-width:1px;cursor:col-resize}.splitpanes--horizontal>.splitpanes__splitter{min-height:1px;cursor:row-resize}.splitpanes.default-theme .splitpanes__pane{background-color:#f2f2f2}.splitpanes.default-theme .splitpanes__splitter{background-color:#fff;box-sizing:border-box;position:relative;flex-shrink:0}.splitpanes.default-theme .splitpanes__splitter:before,.splitpanes.default-theme .splitpanes__splitter:after{content:"";position:absolute;top:50%;left:50%;background-color:#00000026;transition:background-color .3s}.splitpanes.default-theme .splitpanes__splitter:hover:before,.splitpanes.default-theme .splitpanes__splitter:hover:after{background-color:#00000040}.splitpanes.default-theme .splitpanes__splitter:first-child{cursor:auto}.default-theme.splitpanes .splitpanes .splitpanes__splitter{z-index:1}.default-theme.splitpanes--vertical>.splitpanes__splitter,.default-theme .splitpanes--vertical>.splitpanes__splitter{width:7px;border-left:1px solid #eee;margin-left:-1px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{transform:translateY(-50%);width:1px;height:30px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:before{margin-left:-2px}.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{margin-left:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter,.default-theme .splitpanes--horizontal>.splitpanes__splitter{height:7px;border-top:1px solid #eee;margin-top:-1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{transform:translate(-50%);width:30px;height:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before{margin-top:-2px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{margin-top:1px}.alert.c-1{background-color:#ccc;color:#454545;font-weight:700}.alert.c-1 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-1{background-color:#ccc;border-color:#ccc!important}.text-c-1{color:#ccc}svg circle.c-1{fill:#ccc}.alert.c-2{background-color:#fddb61;color:#454545;font-weight:700}.alert.c-2 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-2{background-color:#fddb61;border-color:#fddb61!important}.text-c-2{color:#fddb61}svg circle.c-2{fill:#fddb61}.alert.c-3{background-color:#e80;color:#454545;font-weight:700}.alert.c-3 .text-muted{color:#454545!important;font-weight:400}.progress-bar.c-3{background-color:#e80;border-color:#e80!important}.text-c-3{color:#e80}svg circle.c-3{fill:#e80}.alert.c-4{background-color:#800;color:#fff;font-weight:700}.alert.c-4 .text-muted{color:#fff!important;font-weight:400}.progress-bar.c-4{background-color:#800;border-color:#800!important}.text-c-4{color:#800}svg circle.c-4{fill:#800}.bg-hit{background-color:#ccc}.border-hit{border-color:#ccc!important}.bg-read{background-color:#fddb61}.border-read{border-color:#fddb61!important}.bg-dirtied{background-color:#e80}.border-dirtied{border-color:#e80!important}.bg-written{background-color:#800}.border-written{border-color:#800!important}.btn-group-xs>.btn,.btn-xs{padding:.25rem .4rem;font-size:12px;border-radius:.2rem}.btn-group-xs>.btn,.btn-group-xs>.btn .fa,.btn-xs,.btn-xs .fa{line-height:.5}.plan-node.never-executed .plan-node-body,.bg-hatched{background-image:linear-gradient(45deg,#f7f7f7 25%,transparent 25%,transparent 50%,#f7f7f7 50%,#f7f7f7 75%,transparent 75%,transparent);background-size:1rem 1rem}.border-dashed{border-style:dashed!important;background-color:transparent!important}.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden}.opacity-20{opacity:.2!important}.bg-secondary-light{background-color:#dedede!important}.plan-container{font-family:Noto Sans,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.plan-container .menu{position:absolute;z-index:1;right:0}.plan-container .menu-hidden ul,.plan-container .menu-hidden h3{display:none}.plan-container .grab-bing{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:grab}.plan-container .grab-bing:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:grabbing}.plan-container .text-muted{color:#ababab!important}.plan-container .cursor-help{cursor:help}.plan-container pre{overflow:initial}.plan-stats{font-size:13px}.plan-stats .stat-dropdown-container{border:1px solid #dedede;padding:10px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:6;right:0;width:300px;max-height:70vh;overflow:auto}.plan-stats .stat-dropdown-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.tippy-popper .tippy-tooltip{text-align:left}.tippy-popper .text-muted{color:inherit!important}.splitpanes__pane{transition:none!important}.no-focus-outline:focus{outline:none}.table-nonfluid{width:auto!important}.more-info[title]{text-decoration-line:underline;text-decoration-style:dotted;text-decoration-color:#ababab;cursor:help}foreignObject{overflow:visible}.plan-diagram{line-height:.85em;font-family:Noto Sans,sans-serif}.plan-diagram.plan-diagram-top{max-height:30%}.plan-diagram table tr td:nth-child(3){width:50%}.plan-diagram table tr td:nth-child(2){max-width:0;width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.plan-diagram .legend ul li{font-size:13px}.plan-diagram .legend ul li span{display:inline-block;width:8px;height:8px;border-radius:50%}.plan-diagram tbody:after{content:"";display:block;height:10px}.plan-diagram th,.plan-diagram td{margin:0;color:#4d525a;white-space:nowrap}.plan-diagram th.node-index,.plan-diagram th.node-type,.plan-diagram th.subplan,.plan-diagram td.node-index,.plan-diagram td.node-type,.plan-diagram td.subplan{font-size:13px}.plan-diagram th.node-type,.plan-diagram td.node-type{font-weight:700}.plan-diagram th{font-size:13px}.plan-diagram tr.node{cursor:pointer}.plan-diagram tr.selected{outline:1px solid #00B5E2;box-shadow:0 0 5px 2px #00b5e266}.plan-diagram tr.highlight,.plan-diagram tr.selected{background-color:#fff}.plan-diagram table.highlight tr{opacity:50%}.plan-diagram table.highlight tr.highlight{opacity:100%}.plan-diagram .tree-lines{font-family:"monospace"}.plan-grid{background-color:#fff;line-height:.85em}.plan-grid>table{border-collapse:separate;border-spacing:0}.plan-grid>table>tbody>tr>th,.plan-grid>table>tbody>tr>td,.plan-grid>table>thead>tr>th,.plan-grid>table>thead>tr>td,.plan-grid>table>tr>th,.plan-grid>table>tr>td{font-size:13px;min-width:20px;padding-left:.5rem;padding-right:.5rem}.plan-grid .detailed{line-height:initial;margin:5px;width:calc(100% - 10px)!important;max-width:700px}.plan-grid .tree-lines{font-family:"monospace"}.plan-grid tr.node{cursor:pointer}.plan-grid .grid-progress-cell{position:relative;background-color:transparent}.plan-grid .grid-progress-cell .grid-progress{margin-top:1px}.plan-grid .grid-progress{position:absolute;width:100%;height:initial;left:calc(.5rem - 2px);top:calc(-3px + .25rem);height:calc(1em + 4px);width:calc(100% - 1rem + 4px);z-index:0;font-size:inherit}.plan-node{cursor:default;text-decoration:none;color:#4d525a;display:inline-block;position:relative;font-size:12px;margin-bottom:4px;overflow-wrap:break-word;word-wrap:break-word;width:240px}.plan-node .plan-node-body{position:relative;border:1px solid #dedede;border-radius:3px;background-color:#fff;box-shadow:1px 1px 3px #0000001a}.plan-node .plan-node-body.card .card-body,.plan-node .plan-node-body.card .card-header{padding:6px 10px}.plan-node .plan-node-body.card .card-header .card-header-tabs{margin:6px 0 -6px}.plan-node .plan-node-body.card .card-header .card-header-tabs .nav-link{padding:3px 10px}.plan-node.parallel .plan-node-body{box-shadow:none}.plan-node header{margin-bottom:6px;overflow:hidden}.plan-node header h4{font-size:13px;font-weight:600;margin:0;line-height:inherit;color:#000!important}.plan-node header .node-duration{float:right;margin-left:10px;font-size:13px}.plan-node .prop-list{color:inherit;table-layout:fixed}.plan-node:hover .plan-node-body,.plan-node.highlight .plan-node-body{box-shadow:1px 1px 5px #0006}.plan-node:hover .workers>div,.plan-node.highlight .workers>div{border-color:#0003}.plan-node.selected .plan-node-body{border-color:#00b5e2;box-shadow:0 0 5px 2px #00b5e266}.plan-node.selected .workers>div{border-color:#00b5e233}.plan-node .node-description{text-align:left;font-style:italic;word-break:normal}.plan-node .node-description .node-type{font-weight:600;background-color:#00b5e2;color:#fff;padding:0 6px}.plan-node .btn-default{border:0}.plan-node .text-muted{color:#999ea7}.plan-node .plan-query-container{border:1px solid #dedede;padding:18px;background-color:#fff;position:absolute;box-shadow:0 0 10px 2px #0000004d;border-radius:3px;margin-bottom:18px;z-index:1;left:0}.plan-node .plan-query-container h3{font-size:17px;width:93%;text-align:left;border-bottom:1px solid #dedede;padding-bottom:6px;margin-bottom:10px}.plan-node .workers{position:absolute;left:-1px;top:1px;width:100%;height:100%;cursor:pointer}.plan-node .workers>div{border:1px solid #dedede;border-radius:3px;background-color:#fff;width:100%;height:100%;position:absolute}.plan-node .workers-handle{cursor:pointer;position:absolute;top:0;right:-5px}.plan-node .workers-handle>div{position:absolute;top:0;background-color:#fff;border:1px solid #efefef;border-radius:3px}.plan-node .workers-handle>div:hover{background-color:#f7f7f7;border-color:#dedede}.plan-node .subplan-name{background-color:#b3d7d7;border-radius:3px}.plan-node button .fa-chevron-right{display:inline-block}.plan-node button .fa-chevron-down{display:none}.plan-node button[aria-expanded=true] .fa-chevron-right{display:none!important}.plan-node button[aria-expanded=true] .fa-chevron-down{display:inline-block!important}.plan-node.plan-node-detail .text-truncate{overflow:initial;white-space:initial;text-overflow:initial}.node-bar-container{height:5px;margin-top:10px;margin-bottom:3px;border-radius:6px;background-color:#dedede;position:relative}.node-bar-container .node-bar{border-radius:6px;height:100%;text-align:left;position:absolute;left:0;top:0}.node-bar-label{text-align:left;display:block}.detailed{width:400px!important}*>.copy{display:none}*:hover>.copy{display:block}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! 2 | Theme: StackOverflow Light 3 | Description: Light theme as used on stackoverflow.com 4 | Author: stackoverflow.com 5 | Maintainer: @Hirse 6 | Website: https://github.com/StackExchange/Stacks 7 | License: MIT 8 | Updated: 2021-05-15 9 | 10 | Updated for @stackoverflow/stacks v0.64.0 11 | Code Blocks: /blob/v0.64.0/lib/css/components/_stacks-code-blocks.less 12 | Colors: /blob/v0.64.0/lib/css/exports/_stacks-constants-colors.less 13 | */.hljs{color:#2f3337;background:#f6f6f6}.hljs-subst{color:#2f3337}.hljs-comment{color:#656e77}.hljs-attr,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-section,.hljs-selector-tag{color:#015692}.hljs-attribute{color:#803378}.hljs-name,.hljs-number,.hljs-quote,.hljs-selector-id,.hljs-template-tag,.hljs-type{color:#b75501}.hljs-selector-class{color:#015692}.hljs-link,.hljs-regexp,.hljs-selector-attr,.hljs-string,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#54790d}.hljs-meta,.hljs-selector-pseudo{color:#015692}.hljs-built_in,.hljs-literal,.hljs-title{color:#b75501}.hljs-bullet,.hljs-code{color:#535a60}.hljs-meta .hljs-string{color:#54790d}.hljs-deletion{color:#c02d2e}.hljs-addition{color:#2f6f44}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}path{stroke-linecap:butt}path.never-executed{stroke-dasharray:.5em;stroke-opacity:.5}#plan-container[data-v-f0c505e7]{width:100vw;height:100vh;display:flex}#overlay[data-v-854f8053]{position:absolute;top:0;left:0;width:100vw;height:100vh;background-color:#0003;z-index:100;display:flex;justify-content:center;align-items:center}#overlay-text[data-v-854f8053]{padding:16px;background-color:#0000004d;font-size:2rem;border-radius:4px;color:#fff} 14 | -------------------------------------------------------------------------------- /src/web/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/parser@^7.16.4": 6 | version "7.20.15" 7 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" 8 | integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== 9 | 10 | "@esbuild/android-arm64@0.16.17": 11 | version "0.16.17" 12 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" 13 | integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== 14 | 15 | "@esbuild/android-arm@0.16.17": 16 | version "0.16.17" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" 18 | integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== 19 | 20 | "@esbuild/android-x64@0.16.17": 21 | version "0.16.17" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" 23 | integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== 24 | 25 | "@esbuild/darwin-arm64@0.16.17": 26 | version "0.16.17" 27 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" 28 | integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== 29 | 30 | "@esbuild/darwin-x64@0.16.17": 31 | version "0.16.17" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" 33 | integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== 34 | 35 | "@esbuild/freebsd-arm64@0.16.17": 36 | version "0.16.17" 37 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" 38 | integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== 39 | 40 | "@esbuild/freebsd-x64@0.16.17": 41 | version "0.16.17" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" 43 | integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== 44 | 45 | "@esbuild/linux-arm64@0.16.17": 46 | version "0.16.17" 47 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" 48 | integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== 49 | 50 | "@esbuild/linux-arm@0.16.17": 51 | version "0.16.17" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" 53 | integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== 54 | 55 | "@esbuild/linux-ia32@0.16.17": 56 | version "0.16.17" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" 58 | integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== 59 | 60 | "@esbuild/linux-loong64@0.16.17": 61 | version "0.16.17" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" 63 | integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== 64 | 65 | "@esbuild/linux-mips64el@0.16.17": 66 | version "0.16.17" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" 68 | integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== 69 | 70 | "@esbuild/linux-ppc64@0.16.17": 71 | version "0.16.17" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" 73 | integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== 74 | 75 | "@esbuild/linux-riscv64@0.16.17": 76 | version "0.16.17" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" 78 | integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== 79 | 80 | "@esbuild/linux-s390x@0.16.17": 81 | version "0.16.17" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" 83 | integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== 84 | 85 | "@esbuild/linux-x64@0.16.17": 86 | version "0.16.17" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" 88 | integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== 89 | 90 | "@esbuild/netbsd-x64@0.16.17": 91 | version "0.16.17" 92 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" 93 | integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== 94 | 95 | "@esbuild/openbsd-x64@0.16.17": 96 | version "0.16.17" 97 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" 98 | integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== 99 | 100 | "@esbuild/sunos-x64@0.16.17": 101 | version "0.16.17" 102 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" 103 | integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== 104 | 105 | "@esbuild/win32-arm64@0.16.17": 106 | version "0.16.17" 107 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" 108 | integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== 109 | 110 | "@esbuild/win32-ia32@0.16.17": 111 | version "0.16.17" 112 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" 113 | integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== 114 | 115 | "@esbuild/win32-x64@0.16.17": 116 | version "0.16.17" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" 118 | integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== 119 | 120 | "@fortawesome/fontawesome-common-types@6.2.1": 121 | version "6.2.1" 122 | resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz#411e02a820744d3f7e0d8d9df9d82b471beaa073" 123 | integrity sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ== 124 | 125 | "@fortawesome/fontawesome-svg-core@^6.2.0": 126 | version "6.2.1" 127 | resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz#e87e905e444b5e7b715af09b64d27b53d4c8f9d9" 128 | integrity sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA== 129 | dependencies: 130 | "@fortawesome/fontawesome-common-types" "6.2.1" 131 | 132 | "@fortawesome/free-brands-svg-icons@^6.2.0": 133 | version "6.2.1" 134 | resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz#04a6d6f7898f7ef392aba7a65030a584d4f4c84f" 135 | integrity sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig== 136 | dependencies: 137 | "@fortawesome/fontawesome-common-types" "6.2.1" 138 | 139 | "@fortawesome/free-regular-svg-icons@^6.2.0": 140 | version "6.2.1" 141 | resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz#650e56d937755a8341f2eef258ecb6f95458820f" 142 | integrity sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA== 143 | dependencies: 144 | "@fortawesome/fontawesome-common-types" "6.2.1" 145 | 146 | "@fortawesome/free-solid-svg-icons@^6.2.0": 147 | version "6.2.1" 148 | resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz#2290ea5adcf1537cbd0c43de6feb38af02141d27" 149 | integrity sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw== 150 | dependencies: 151 | "@fortawesome/fontawesome-common-types" "6.2.1" 152 | 153 | "@fortawesome/vue-fontawesome@^3.0.3": 154 | version "3.0.6" 155 | resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.6.tgz#c5e627475c10869a091280610c96411d18206f3a" 156 | integrity sha512-akrL7lTroyNpPkoHtvK2UpsMzJr6jXdHaQ0YdcwqDsB8jdwlpNHZYijpOUd9KJsARr+VB3WXY4EyObepqJ4ytQ== 157 | 158 | "@popperjs/core@^2.9.0": 159 | version "2.11.6" 160 | resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" 161 | integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== 162 | 163 | "@vitejs/plugin-vue@^4.0.0": 164 | version "4.0.0" 165 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e" 166 | integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA== 167 | 168 | "@vue/compiler-core@3.2.47": 169 | version "3.2.47" 170 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8" 171 | integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== 172 | dependencies: 173 | "@babel/parser" "^7.16.4" 174 | "@vue/shared" "3.2.47" 175 | estree-walker "^2.0.2" 176 | source-map "^0.6.1" 177 | 178 | "@vue/compiler-dom@3.2.47": 179 | version "3.2.47" 180 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" 181 | integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== 182 | dependencies: 183 | "@vue/compiler-core" "3.2.47" 184 | "@vue/shared" "3.2.47" 185 | 186 | "@vue/compiler-sfc@3.2.47": 187 | version "3.2.47" 188 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" 189 | integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== 190 | dependencies: 191 | "@babel/parser" "^7.16.4" 192 | "@vue/compiler-core" "3.2.47" 193 | "@vue/compiler-dom" "3.2.47" 194 | "@vue/compiler-ssr" "3.2.47" 195 | "@vue/reactivity-transform" "3.2.47" 196 | "@vue/shared" "3.2.47" 197 | estree-walker "^2.0.2" 198 | magic-string "^0.25.7" 199 | postcss "^8.1.10" 200 | source-map "^0.6.1" 201 | 202 | "@vue/compiler-ssr@3.2.47": 203 | version "3.2.47" 204 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" 205 | integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== 206 | dependencies: 207 | "@vue/compiler-dom" "3.2.47" 208 | "@vue/shared" "3.2.47" 209 | 210 | "@vue/reactivity-transform@3.2.47": 211 | version "3.2.47" 212 | resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e" 213 | integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== 214 | dependencies: 215 | "@babel/parser" "^7.16.4" 216 | "@vue/compiler-core" "3.2.47" 217 | "@vue/shared" "3.2.47" 218 | estree-walker "^2.0.2" 219 | magic-string "^0.25.7" 220 | 221 | "@vue/reactivity@3.2.47": 222 | version "3.2.47" 223 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" 224 | integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== 225 | dependencies: 226 | "@vue/shared" "3.2.47" 227 | 228 | "@vue/runtime-core@3.2.47": 229 | version "3.2.47" 230 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d" 231 | integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== 232 | dependencies: 233 | "@vue/reactivity" "3.2.47" 234 | "@vue/shared" "3.2.47" 235 | 236 | "@vue/runtime-dom@3.2.47": 237 | version "3.2.47" 238 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" 239 | integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== 240 | dependencies: 241 | "@vue/runtime-core" "3.2.47" 242 | "@vue/shared" "3.2.47" 243 | csstype "^2.6.8" 244 | 245 | "@vue/server-renderer@3.2.47": 246 | version "3.2.47" 247 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" 248 | integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== 249 | dependencies: 250 | "@vue/compiler-ssr" "3.2.47" 251 | "@vue/shared" "3.2.47" 252 | 253 | "@vue/shared@3.2.47": 254 | version "3.2.47" 255 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" 256 | integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== 257 | 258 | anymatch@~3.1.2: 259 | version "3.1.3" 260 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 261 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 262 | dependencies: 263 | normalize-path "^3.0.0" 264 | picomatch "^2.0.4" 265 | 266 | asynclist@latest: 267 | version "0.0.3" 268 | resolved "https://registry.yarnpkg.com/asynclist/-/asynclist-0.0.3.tgz#81ea6353c80ea2270ce660f6279368848f99f695" 269 | integrity sha512-JhVUyueBeejaLYkrOVdSkcTLK0Lt/LvzLMQ/S/q5tIjiyvJQHbPdUr+chPsRuP4waleB4/53na28kZCHTHeURw== 270 | dependencies: 271 | eventproxy latest 272 | 273 | binary-extensions@^2.0.0: 274 | version "2.2.0" 275 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 276 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 277 | 278 | bootstrap@^5.3.2: 279 | version "5.3.3" 280 | resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" 281 | integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== 282 | 283 | braces@~3.0.2: 284 | version "3.0.2" 285 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 286 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 287 | dependencies: 288 | fill-range "^7.0.1" 289 | 290 | "chokidar@>=3.0.0 <4.0.0": 291 | version "3.5.3" 292 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 293 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 294 | dependencies: 295 | anymatch "~3.1.2" 296 | braces "~3.0.2" 297 | glob-parent "~5.1.2" 298 | is-binary-path "~2.1.0" 299 | is-glob "~4.0.1" 300 | normalize-path "~3.0.0" 301 | readdirp "~3.6.0" 302 | optionalDependencies: 303 | fsevents "~2.3.2" 304 | 305 | clarinet@^0.12.5: 306 | version "0.12.5" 307 | resolved "https://registry.yarnpkg.com/clarinet/-/clarinet-0.12.5.tgz#7ee9c3984620592e370063022d3d2982fc527228" 308 | integrity sha512-4833ySquSUW91fnPaYI94LX3OdnyfwD8/NrMi6a4Kt6EmOsphLWmEzx9bZPqO9+DtQzSv2s3WSYNLsrXt59FKg== 309 | 310 | clipboard@^2.0.6: 311 | version "2.0.11" 312 | resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" 313 | integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== 314 | dependencies: 315 | good-listener "^1.2.2" 316 | select "^1.1.2" 317 | tiny-emitter "^2.0.0" 318 | 319 | commander@7: 320 | version "7.2.0" 321 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 322 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 323 | 324 | csstype@^2.6.8: 325 | version "2.6.21" 326 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" 327 | integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== 328 | 329 | "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: 330 | version "3.2.2" 331 | resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e" 332 | integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== 333 | dependencies: 334 | internmap "1 - 2" 335 | 336 | d3-axis@3: 337 | version "3.0.0" 338 | resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" 339 | integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== 340 | 341 | d3-brush@3: 342 | version "3.0.0" 343 | resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" 344 | integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== 345 | dependencies: 346 | d3-dispatch "1 - 3" 347 | d3-drag "2 - 3" 348 | d3-interpolate "1 - 3" 349 | d3-selection "3" 350 | d3-transition "3" 351 | 352 | d3-chord@3: 353 | version "3.0.1" 354 | resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" 355 | integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== 356 | dependencies: 357 | d3-path "1 - 3" 358 | 359 | "d3-color@1 - 3", d3-color@3: 360 | version "3.1.0" 361 | resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" 362 | integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== 363 | 364 | d3-contour@4: 365 | version "4.0.2" 366 | resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" 367 | integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== 368 | dependencies: 369 | d3-array "^3.2.0" 370 | 371 | d3-delaunay@6: 372 | version "6.0.2" 373 | resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" 374 | integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== 375 | dependencies: 376 | delaunator "5" 377 | 378 | "d3-dispatch@1 - 3", d3-dispatch@3: 379 | version "3.0.1" 380 | resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" 381 | integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== 382 | 383 | "d3-drag@2 - 3", d3-drag@3: 384 | version "3.0.0" 385 | resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" 386 | integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== 387 | dependencies: 388 | d3-dispatch "1 - 3" 389 | d3-selection "3" 390 | 391 | "d3-dsv@1 - 3", d3-dsv@3: 392 | version "3.0.1" 393 | resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" 394 | integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== 395 | dependencies: 396 | commander "7" 397 | iconv-lite "0.6" 398 | rw "1" 399 | 400 | "d3-ease@1 - 3", d3-ease@3: 401 | version "3.0.1" 402 | resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" 403 | integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== 404 | 405 | d3-fetch@3: 406 | version "3.0.1" 407 | resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" 408 | integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== 409 | dependencies: 410 | d3-dsv "1 - 3" 411 | 412 | d3-flextree@^2.1.2: 413 | version "2.1.2" 414 | resolved "https://registry.yarnpkg.com/d3-flextree/-/d3-flextree-2.1.2.tgz#1f0419f4e6c972e096dd884627a87b6b38e7ba73" 415 | integrity sha512-gJiHrx5uTTHq44bjyIb3xpbmmdZcWLYPKeO9EPVOq8EylMFOiH2+9sWqKAiQ4DcFuOZTAxPOQyv0Rnmji/g15A== 416 | dependencies: 417 | d3-hierarchy "^1.1.5" 418 | 419 | d3-force@3: 420 | version "3.0.0" 421 | resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" 422 | integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== 423 | dependencies: 424 | d3-dispatch "1 - 3" 425 | d3-quadtree "1 - 3" 426 | d3-timer "1 - 3" 427 | 428 | "d3-format@1 - 3", d3-format@3: 429 | version "3.1.0" 430 | resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" 431 | integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== 432 | 433 | d3-geo@3: 434 | version "3.1.0" 435 | resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" 436 | integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== 437 | dependencies: 438 | d3-array "2.5.0 - 3" 439 | 440 | d3-hierarchy@3: 441 | version "3.1.2" 442 | resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" 443 | integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== 444 | 445 | d3-hierarchy@^1.1.5: 446 | version "1.1.9" 447 | resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" 448 | integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== 449 | 450 | "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: 451 | version "3.0.1" 452 | resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" 453 | integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== 454 | dependencies: 455 | d3-color "1 - 3" 456 | 457 | "d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: 458 | version "3.1.0" 459 | resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" 460 | integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== 461 | 462 | d3-polygon@3: 463 | version "3.0.1" 464 | resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" 465 | integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== 466 | 467 | "d3-quadtree@1 - 3", d3-quadtree@3: 468 | version "3.0.1" 469 | resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" 470 | integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== 471 | 472 | d3-random@3: 473 | version "3.0.1" 474 | resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" 475 | integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== 476 | 477 | d3-scale-chromatic@3: 478 | version "3.0.0" 479 | resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" 480 | integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== 481 | dependencies: 482 | d3-color "1 - 3" 483 | d3-interpolate "1 - 3" 484 | 485 | d3-scale@4: 486 | version "4.0.2" 487 | resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" 488 | integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== 489 | dependencies: 490 | d3-array "2.10.0 - 3" 491 | d3-format "1 - 3" 492 | d3-interpolate "1.2.0 - 3" 493 | d3-time "2.1.1 - 3" 494 | d3-time-format "2 - 4" 495 | 496 | "d3-selection@2 - 3", d3-selection@3: 497 | version "3.0.0" 498 | resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" 499 | integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== 500 | 501 | d3-shape@3: 502 | version "3.2.0" 503 | resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" 504 | integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== 505 | dependencies: 506 | d3-path "^3.1.0" 507 | 508 | "d3-time-format@2 - 4", d3-time-format@4: 509 | version "4.1.0" 510 | resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" 511 | integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== 512 | dependencies: 513 | d3-time "1 - 3" 514 | 515 | "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: 516 | version "3.1.0" 517 | resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" 518 | integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== 519 | dependencies: 520 | d3-array "2 - 3" 521 | 522 | "d3-timer@1 - 3", d3-timer@3: 523 | version "3.0.1" 524 | resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" 525 | integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== 526 | 527 | "d3-transition@2 - 3", d3-transition@3: 528 | version "3.0.1" 529 | resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" 530 | integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== 531 | dependencies: 532 | d3-color "1 - 3" 533 | d3-dispatch "1 - 3" 534 | d3-ease "1 - 3" 535 | d3-interpolate "1 - 3" 536 | d3-timer "1 - 3" 537 | 538 | d3-zoom@3: 539 | version "3.0.0" 540 | resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" 541 | integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== 542 | dependencies: 543 | d3-dispatch "1 - 3" 544 | d3-drag "2 - 3" 545 | d3-interpolate "1 - 3" 546 | d3-selection "2 - 3" 547 | d3-transition "2 - 3" 548 | 549 | d3@^7.8.2: 550 | version "7.8.5" 551 | resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c" 552 | integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== 553 | dependencies: 554 | d3-array "3" 555 | d3-axis "3" 556 | d3-brush "3" 557 | d3-chord "3" 558 | d3-color "3" 559 | d3-contour "4" 560 | d3-delaunay "6" 561 | d3-dispatch "3" 562 | d3-drag "3" 563 | d3-dsv "3" 564 | d3-ease "3" 565 | d3-fetch "3" 566 | d3-force "3" 567 | d3-format "3" 568 | d3-geo "3" 569 | d3-hierarchy "3" 570 | d3-interpolate "3" 571 | d3-path "3" 572 | d3-polygon "3" 573 | d3-quadtree "3" 574 | d3-random "3" 575 | d3-scale "4" 576 | d3-scale-chromatic "3" 577 | d3-selection "3" 578 | d3-shape "3" 579 | d3-time "3" 580 | d3-time-format "4" 581 | d3-timer "3" 582 | d3-transition "3" 583 | d3-zoom "3" 584 | 585 | debug@^2.6.8: 586 | version "2.6.9" 587 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 588 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 589 | dependencies: 590 | ms "2.0.0" 591 | 592 | delaunator@5: 593 | version "5.0.0" 594 | resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" 595 | integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== 596 | dependencies: 597 | robust-predicates "^3.0.0" 598 | 599 | delegate@^3.1.2: 600 | version "3.2.0" 601 | resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" 602 | integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== 603 | 604 | emitter@^0.0.2: 605 | version "0.0.2" 606 | resolved "https://registry.yarnpkg.com/emitter/-/emitter-0.0.2.tgz#676c82c97b7f8238771213f254947be6e4ea29a4" 607 | integrity sha512-L1gFY5hZlUaJ0VXsFLPO6KJIJlnu6rOBzbSXxx2f6B7zOShTxxpO+nqH0idbdOoqI2JnWyfn97RPnPgRl7Dz4Q== 608 | dependencies: 609 | asynclist latest 610 | 611 | esbuild@^0.16.14: 612 | version "0.16.17" 613 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" 614 | integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== 615 | optionalDependencies: 616 | "@esbuild/android-arm" "0.16.17" 617 | "@esbuild/android-arm64" "0.16.17" 618 | "@esbuild/android-x64" "0.16.17" 619 | "@esbuild/darwin-arm64" "0.16.17" 620 | "@esbuild/darwin-x64" "0.16.17" 621 | "@esbuild/freebsd-arm64" "0.16.17" 622 | "@esbuild/freebsd-x64" "0.16.17" 623 | "@esbuild/linux-arm" "0.16.17" 624 | "@esbuild/linux-arm64" "0.16.17" 625 | "@esbuild/linux-ia32" "0.16.17" 626 | "@esbuild/linux-loong64" "0.16.17" 627 | "@esbuild/linux-mips64el" "0.16.17" 628 | "@esbuild/linux-ppc64" "0.16.17" 629 | "@esbuild/linux-riscv64" "0.16.17" 630 | "@esbuild/linux-s390x" "0.16.17" 631 | "@esbuild/linux-x64" "0.16.17" 632 | "@esbuild/netbsd-x64" "0.16.17" 633 | "@esbuild/openbsd-x64" "0.16.17" 634 | "@esbuild/sunos-x64" "0.16.17" 635 | "@esbuild/win32-arm64" "0.16.17" 636 | "@esbuild/win32-ia32" "0.16.17" 637 | "@esbuild/win32-x64" "0.16.17" 638 | 639 | estree-walker@^2.0.2: 640 | version "2.0.2" 641 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 642 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 643 | 644 | eventproxy@latest: 645 | version "1.0.0" 646 | resolved "https://registry.yarnpkg.com/eventproxy/-/eventproxy-1.0.0.tgz#8f384890824e0c06c40dc3f59ce2444793821d99" 647 | integrity sha512-GKeEWUQxGNGtSiX6cLI6cWcTYPIsq3JoxNgnTTJXH1gSMLxLU/IuUH2OzxmhFoXVQl1eYh0ukrqL32ygnpJnpQ== 648 | dependencies: 649 | debug "^2.6.8" 650 | 651 | fill-range@^7.0.1: 652 | version "7.0.1" 653 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 654 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 655 | dependencies: 656 | to-regex-range "^5.0.1" 657 | 658 | fsevents@~2.3.2: 659 | version "2.3.2" 660 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 661 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 662 | 663 | function-bind@^1.1.1: 664 | version "1.1.1" 665 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 666 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 667 | 668 | glob-parent@~5.1.2: 669 | version "5.1.2" 670 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 671 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 672 | dependencies: 673 | is-glob "^4.0.1" 674 | 675 | good-listener@^1.2.2: 676 | version "1.2.2" 677 | resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" 678 | integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== 679 | dependencies: 680 | delegate "^3.1.2" 681 | 682 | has@^1.0.3: 683 | version "1.0.3" 684 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 685 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 686 | dependencies: 687 | function-bind "^1.1.1" 688 | 689 | highlight.js@^11.7.0: 690 | version "11.7.0" 691 | resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" 692 | integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== 693 | 694 | humanize-duration@^3.28.0: 695 | version "3.31.0" 696 | resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.31.0.tgz#a0384d22555024cd17e6e9f8561540d37756bf4c" 697 | integrity sha512-fRrehgBG26NNZysRlTq1S+HPtDpp3u+Jzdc/d5A4cEzOD86YLAkDaJyJg8krSdCi7CJ+s7ht3fwRj8Dl+Btd0w== 698 | 699 | iconv-lite@0.6: 700 | version "0.6.3" 701 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 702 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 703 | dependencies: 704 | safer-buffer ">= 2.1.2 < 3.0.0" 705 | 706 | immutable@^4.0.0: 707 | version "4.2.4" 708 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" 709 | integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== 710 | 711 | "internmap@1 - 2": 712 | version "2.0.3" 713 | resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" 714 | integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== 715 | 716 | is-binary-path@~2.1.0: 717 | version "2.1.0" 718 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 719 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 720 | dependencies: 721 | binary-extensions "^2.0.0" 722 | 723 | is-core-module@^2.9.0: 724 | version "2.11.0" 725 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 726 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 727 | dependencies: 728 | has "^1.0.3" 729 | 730 | is-extglob@^2.1.1: 731 | version "2.1.1" 732 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 733 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 734 | 735 | is-glob@^4.0.1, is-glob@~4.0.1: 736 | version "4.0.3" 737 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 738 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 739 | dependencies: 740 | is-extglob "^2.1.1" 741 | 742 | is-number@^7.0.0: 743 | version "7.0.0" 744 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 745 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 746 | 747 | lodash@^4.17.21: 748 | version "4.17.21" 749 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 750 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 751 | 752 | magic-string@^0.25.7: 753 | version "0.25.9" 754 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 755 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 756 | dependencies: 757 | sourcemap-codec "^1.4.8" 758 | 759 | ms@2.0.0: 760 | version "2.0.0" 761 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 762 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 763 | 764 | nanoid@^3.3.4: 765 | version "3.3.4" 766 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 767 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 768 | 769 | normalize-path@^3.0.0, normalize-path@~3.0.0: 770 | version "3.0.0" 771 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 772 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 773 | 774 | path-parse@^1.0.7: 775 | version "1.0.7" 776 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 777 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 778 | 779 | pev2@^1.10.0: 780 | version "1.10.0" 781 | resolved "https://registry.yarnpkg.com/pev2/-/pev2-1.10.0.tgz#dd3f3e5b2fbb7bb067127af90632336ec5206102" 782 | integrity sha512-3ua2zrJ5qsCkP/wSmuR2jofJxf6jWAh24Z7uYkfOrCGDxb3aDClXlZ5PoUTwkHyzvTUi4EsMJMtvyHnppQ4NUg== 783 | dependencies: 784 | "@fortawesome/fontawesome-svg-core" "^6.2.0" 785 | "@fortawesome/free-brands-svg-icons" "^6.2.0" 786 | "@fortawesome/free-regular-svg-icons" "^6.2.0" 787 | "@fortawesome/free-solid-svg-icons" "^6.2.0" 788 | "@fortawesome/vue-fontawesome" "^3.0.3" 789 | bootstrap "^5.3.2" 790 | clarinet "^0.12.5" 791 | d3 "^7.8.2" 792 | d3-flextree "^2.1.2" 793 | emitter "^0.0.2" 794 | highlight.js "^11.7.0" 795 | humanize-duration "^3.28.0" 796 | lodash "^4.17.21" 797 | sass "^1.58.0" 798 | splitpanes "^3.1.5" 799 | vue "^3.2.45" 800 | vue-clipboard3 "^2.0.0" 801 | vue-tippy "^6.0.0" 802 | 803 | picocolors@^1.0.0: 804 | version "1.0.0" 805 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 806 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 807 | 808 | picomatch@^2.0.4, picomatch@^2.2.1: 809 | version "2.3.1" 810 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 811 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 812 | 813 | postcss@^8.1.10, postcss@^8.4.21: 814 | version "8.4.21" 815 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" 816 | integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== 817 | dependencies: 818 | nanoid "^3.3.4" 819 | picocolors "^1.0.0" 820 | source-map-js "^1.0.2" 821 | 822 | readdirp@~3.6.0: 823 | version "3.6.0" 824 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 825 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 826 | dependencies: 827 | picomatch "^2.2.1" 828 | 829 | resolve@^1.22.1: 830 | version "1.22.1" 831 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 832 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 833 | dependencies: 834 | is-core-module "^2.9.0" 835 | path-parse "^1.0.7" 836 | supports-preserve-symlinks-flag "^1.0.0" 837 | 838 | robust-predicates@^3.0.0: 839 | version "3.0.1" 840 | resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" 841 | integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== 842 | 843 | rollup@^3.10.0: 844 | version "3.14.0" 845 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.14.0.tgz#f5925255f3b6e8de1dba3916d7619c7da5708d95" 846 | integrity sha512-o23sdgCLcLSe3zIplT9nQ1+r97okuaiR+vmAPZPTDYB7/f3tgWIYNyiQveMsZwshBT0is4eGax/HH83Q7CG+/Q== 847 | optionalDependencies: 848 | fsevents "~2.3.2" 849 | 850 | rw@1: 851 | version "1.3.3" 852 | resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" 853 | integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== 854 | 855 | "safer-buffer@>= 2.1.2 < 3.0.0": 856 | version "2.1.2" 857 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 858 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 859 | 860 | sass@^1.58.0: 861 | version "1.71.1" 862 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" 863 | integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== 864 | dependencies: 865 | chokidar ">=3.0.0 <4.0.0" 866 | immutable "^4.0.0" 867 | source-map-js ">=0.6.2 <2.0.0" 868 | 869 | select@^1.1.2: 870 | version "1.1.2" 871 | resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" 872 | integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== 873 | 874 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: 875 | version "1.0.2" 876 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 877 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 878 | 879 | source-map@^0.6.1: 880 | version "0.6.1" 881 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 882 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 883 | 884 | sourcemap-codec@^1.4.8: 885 | version "1.4.8" 886 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 887 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 888 | 889 | splitpanes@^3.1.5: 890 | version "3.1.5" 891 | resolved "https://registry.yarnpkg.com/splitpanes/-/splitpanes-3.1.5.tgz#de81da25681c252d131747a9cb48a17156e2b210" 892 | integrity sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw== 893 | 894 | supports-preserve-symlinks-flag@^1.0.0: 895 | version "1.0.0" 896 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 897 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 898 | 899 | tiny-emitter@^2.0.0: 900 | version "2.1.0" 901 | resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" 902 | integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== 903 | 904 | tippy.js@^6.3.7: 905 | version "6.3.7" 906 | resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" 907 | integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== 908 | dependencies: 909 | "@popperjs/core" "^2.9.0" 910 | 911 | to-regex-range@^5.0.1: 912 | version "5.0.1" 913 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 914 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 915 | dependencies: 916 | is-number "^7.0.0" 917 | 918 | vite@^4.1.0: 919 | version "4.1.1" 920 | resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.1.tgz#3b18b81a4e85ce3df5cbdbf4c687d93ebf402e6b" 921 | integrity sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg== 922 | dependencies: 923 | esbuild "^0.16.14" 924 | postcss "^8.4.21" 925 | resolve "^1.22.1" 926 | rollup "^3.10.0" 927 | optionalDependencies: 928 | fsevents "~2.3.2" 929 | 930 | vue-clipboard3@^2.0.0: 931 | version "2.0.0" 932 | resolved "https://registry.yarnpkg.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz#79b026c765c0f6a5cde18a477c2dbfc7d3b9f178" 933 | integrity sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A== 934 | dependencies: 935 | clipboard "^2.0.6" 936 | 937 | vue-tippy@^6.0.0: 938 | version "6.0.0" 939 | resolved "https://registry.yarnpkg.com/vue-tippy/-/vue-tippy-6.0.0.tgz#9501b21caf564b0bba1954c6ece25c5f8ddf58fa" 940 | integrity sha512-a37/ETYbE1QdAM7PUzc++kUyyoPMpCRSaLC7F2WgMUxjhl4oWNvp9w1ybcIix+oeg3wS57wboatWXEjX9mnYEw== 941 | dependencies: 942 | tippy.js "^6.3.7" 943 | 944 | vue@^3.2.45: 945 | version "3.2.47" 946 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" 947 | integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== 948 | dependencies: 949 | "@vue/compiler-dom" "3.2.47" 950 | "@vue/compiler-sfc" "3.2.47" 951 | "@vue/runtime-dom" "3.2.47" 952 | "@vue/server-renderer" "3.2.47" 953 | "@vue/shared" "3.2.47" 954 | --------------------------------------------------------------------------------