diff --git a/.env b/.env index 953e10f..63c703b 100644 --- a/.env +++ b/.env @@ -37,3 +37,6 @@ MCP_SERVER_VERSION=0.1.0 # Logging LOG_LEVEL=INFO + +# ── API ─────────────────────────────────────── +OPENCRAB_API_KEY=test-key-12345 diff --git a/apps/api/main.py b/apps/api/main.py index 17fe5dd..6c7f167 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -3,6 +3,7 @@ import logging import json import os +import sqlite3 from contextlib import asynccontextmanager from dataclasses import dataclass from pathlib import Path @@ -366,6 +367,11 @@ def require_auth( credentials: HTTPAuthorizationCredentials | None = Depends(security), x_user_id: str | None = Header(default=None, alias="X-User-Id"), ) -> AuthContext: + require_auth_env = os.getenv("OPENCRAB_REQUIRE_AUTH", "true").strip().lower() + require_auth_enabled = require_auth_env not in {"0", "false", "no", "off"} + if not require_auth_enabled: + return AuthContext(user_id=x_user_id or "anonymous", tier=_tier()) + expected_api_key = os.getenv("OPENCRAB_API_KEY", "").strip() if not expected_api_key: raise HTTPException( @@ -756,19 +762,57 @@ def list_nodes( ) -> dict[str, Any]: """Return all nodes for graph visualization.""" try: - raw = ctx.graph.run_query( - "MATCH (n) OPTIONAL MATCH (n)-[r]-() " - "RETURN n.id AS id, n.space AS space, n.node_type AS node_type, " - "properties(n) AS props, count(r) AS degree " - "LIMIT 500" - ) + raw: list[dict[str, Any]] = [] + local_data_dir = Path(os.getenv("LOCAL_DATA_DIR", "./opencrab_data")) + if not local_data_dir.is_absolute(): + local_data_dir = (REPO_ROOT / local_data_dir).resolve() + local_graph_db = local_data_dir / "graph.db" + + if local_graph_db.exists(): + with sqlite3.connect(str(local_graph_db)) as conn: + conn.row_factory = sqlite3.Row + cur = conn.cursor() + cur.execute( + """ + SELECT + n.node_id AS id, + COALESCE(n.space_id, 'concept') AS space, + n.node_type AS node_type, + n.properties AS props, + ( + SELECT COUNT(*) + FROM graph_edges e + WHERE e.from_id = n.node_id OR e.to_id = n.node_id + ) AS degree + FROM graph_nodes n + LIMIT 500 + """ + ) + raw = [dict(row) for row in cur.fetchall()] + elif hasattr(ctx.graph, "run_query"): + raw = ctx.graph.run_query( + "MATCH (n) OPTIONAL MATCH (n)-[r]-() " + "RETURN n.id AS id, n.space AS space, n.node_type AS node_type, " + "properties(n) AS props, count(r) AS degree " + "LIMIT 500" + ) + nodes = [] for row in (raw or []): nid = row.get("id") if not nid: continue - props = {k: v for k, v in (row.get("props") or {}).items() - if k not in ("id", "space", "node_type")} + props_raw = row.get("props") or {} + if isinstance(props_raw, str): + try: + props_raw = json.loads(props_raw) + except Exception: + props_raw = {} + props = { + k: v + for k, v in (props_raw or {}).items() + if k not in ("id", "space", "node_type") + } nodes.append({ "id": nid, "space": row.get("space", "concept"), @@ -789,12 +833,41 @@ def list_edges( ) -> dict[str, Any]: """Return all edges for graph visualization.""" try: - raw = ctx.graph.run_query( - "MATCH (a)-[r]->(b) " - "RETURN a.id AS from_id, b.id AS to_id, type(r) AS relation, " - "a.space AS from_space, b.space AS to_space " - "LIMIT 2000" - ) + raw: list[dict[str, Any]] = [] + local_data_dir = Path(os.getenv("LOCAL_DATA_DIR", "./opencrab_data")) + if not local_data_dir.is_absolute(): + local_data_dir = (REPO_ROOT / local_data_dir).resolve() + local_graph_db = local_data_dir / "graph.db" + + if local_graph_db.exists(): + with sqlite3.connect(str(local_graph_db)) as conn: + conn.row_factory = sqlite3.Row + cur = conn.cursor() + cur.execute( + """ + SELECT + e.from_id AS from_id, + e.to_id AS to_id, + e.relation AS relation, + COALESCE(fn.space_id, 'concept') AS from_space, + COALESCE(tn.space_id, 'concept') AS to_space + FROM graph_edges e + LEFT JOIN graph_nodes fn + ON fn.node_type = e.from_type AND fn.node_id = e.from_id + LEFT JOIN graph_nodes tn + ON tn.node_type = e.to_type AND tn.node_id = e.to_id + LIMIT 2000 + """ + ) + raw = [dict(row) for row in cur.fetchall()] + elif hasattr(ctx.graph, "run_query"): + raw = ctx.graph.run_query( + "MATCH (a)-[r]->(b) " + "RETURN a.id AS from_id, b.id AS to_id, type(r) AS relation, " + "a.space AS from_space, b.space AS to_space " + "LIMIT 2000" + ) + edges = [] for row in (raw or []): if not row.get("from_id") or not row.get("to_id"): diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/apps/web/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/apps/web/app/dashboard/page.tsx b/apps/web/app/dashboard/page.tsx index b9d3bfc..c905986 100644 --- a/apps/web/app/dashboard/page.tsx +++ b/apps/web/app/dashboard/page.tsx @@ -4,8 +4,11 @@ import { useState, useEffect, useCallback, useRef } from 'react' import dynamic from 'next/dynamic' import FileExplorer from '../../components/FileExplorer' import RightPanel from '../../components/RightPanel' -import type { OcNode, OcEdge } from '../../lib/api' -import { getNodes, getEdges, getStatus } from '../../lib/api' +import LayerPanel from '../../components/LayerPanel' +import QueryInput from '../../components/QueryInput' +import type { OcNode, OcEdge, LayerMetadata, LayerData, LayerNode, LayerEdge } from '../../lib/api' +import { getNodes, getEdges, getStatus, getQueryLayers, getLayerData } from '../../lib/api' +import { searchLocalSubgraph } from '../../lib/queryLayerSearch' const GraphView = dynamic(() => import('../../components/GraphView'), { ssr: false }) @@ -35,6 +38,13 @@ export default function DashboardPage() { const [showIngest, setShowIngest] = useState(false) const refreshTimer = useRef | null>(null) + // Query layer state + const [layers, setLayers] = useState([]) + const [enabledLayerIds, setEnabledLayerIds] = useState([]) + const [layerDataMap, setLayerDataMap] = useState>(new Map()) + const [queryLayerNodes, setQueryLayerNodes] = useState([]) + const [queryLayerEdges, setQueryLayerEdges] = useState([]) + // Load API key from localStorage useEffect(() => { const saved = localStorage.getItem('oc_api_key') || '' @@ -49,17 +59,22 @@ export default function DashboardPage() { const fetchData = useCallback(async () => { const ok = await getStatus() setConnected(ok.ok) - if (!apiKey) return const [n, e] = await Promise.all([getNodes(apiKey), getEdges(apiKey)]) setNodes(n.filter(node => !controls.hiddenSpaces.includes(node.space))) setEdges(e) }, [apiKey, controls.hiddenSpaces]) + const fetchLayers = useCallback(async () => { + const index = await getQueryLayers() + setLayers(index.layers) + }, []) + useEffect(() => { fetchData() + fetchLayers() refreshTimer.current = setInterval(fetchData, 30000) return () => { if (refreshTimer.current) clearInterval(refreshTimer.current) } - }, [fetchData]) + }, [fetchData, fetchLayers]) const selectedNode = nodes.find(n => n.id === selectedId) ?? null @@ -71,6 +86,73 @@ export default function DashboardPage() { setControls(p => ({ ...p, ...partial })) } + async function handleLayerToggle(layerId: string) { + if (enabledLayerIds.includes(layerId)) { + // Disable layer + setEnabledLayerIds(ids => ids.filter(id => id !== layerId)) + setLayerDataMap(map => { + const newMap = new Map(map) + newMap.delete(layerId) + return newMap + }) + } else { + // Enable layer - fetch data + setEnabledLayerIds(ids => [...ids, layerId]) + const data = await getLayerData(layerId) + if (data) { + setLayerDataMap(map => new Map(map).set(layerId, data)) + } + } + } + + function handleQueryRun(query: string) { + // Collect all nodes and edges from enabled layers + const allLayerNodes: LayerNode[] = [] + const allLayerEdges: LayerEdge[] = [] + + for (const layerId of enabledLayerIds) { + const data = layerDataMap.get(layerId) + if (data) { + allLayerNodes.push(...data.nodes) + allLayerEdges.push(...data.edges) + } + } + + // Run local subgraph search + const result = searchLocalSubgraph(allLayerNodes, allLayerEdges, query, 2) + + // Convert LayerNode to OcNode and LayerEdge to OcEdge for rendering + // Collect all node IDs referenced by result edges plus seeds + const overlayNodeIds = new Set(result.seeds.map(n => n.id)) + for (const edge of result.edges) { + overlayNodeIds.add(edge.from) + overlayNodeIds.add(edge.to) + } + // Map allLayerNodes by id for fast lookup + const nodeMap = new Map(allLayerNodes.map(n => [n.id, n])) + const ocNodes: OcNode[] = Array.from(overlayNodeIds) + .map(id => nodeMap.get(id)) + .filter((ln): ln is LayerNode => Boolean(ln)) + .map(ln => ({ + id: ln.id, + space: 'query_layer', + node_type: 'layer_node', + properties: { name: ln.label, ...ln.metadata }, + degree: 0, + })) + + const ocEdges: OcEdge[] = result.edges.map(le => ({ + from_id: le.from, + to_id: le.to, + relation: le.relation || 'related', + from_space: 'query_layer', + to_space: 'query_layer', + })) + + setQueryLayerNodes(ocNodes) + setQueryLayerEdges(ocEdges) + } + return (
| {nodes.length} nodes · {edges.length} edges + {queryLayerNodes.length > 0 && ` · ${queryLayerNodes.length} layer nodes`}
@@ -152,13 +237,24 @@ export default function DashboardPage() {
{/* Right — Controls & Detail */} - +
+
+ + +
+ +
{/* Ingest Modal */} {showIngest && ( diff --git a/apps/web/components/GraphView.tsx b/apps/web/components/GraphView.tsx index 5cd70e0..d828557 100644 --- a/apps/web/components/GraphView.tsx +++ b/apps/web/components/GraphView.tsx @@ -148,6 +148,8 @@ interface Props { centerForce: number repelForce: number onNodeClick: (node: OcNode) => void + layerNodes?: OcNode[] + layerEdges?: OcEdge[] } export default function GraphView({ @@ -160,6 +162,8 @@ export default function GraphView({ centerForce, repelForce, onNodeClick, + layerNodes = [], + layerEdges = [], }: Props) { const svgRef = useRef(null) const tooltipRef = useRef(null) @@ -184,15 +188,27 @@ export default function GraphView({ .on('zoom', (event) => g.attr('transform', event.transform)), ) - if (nodes.length === 0) return + // Merge base nodes with layer nodes + const mergedNodes = [...nodes] + const baseNodeIds = new Set(nodes.map(n => n.id)) + for (const layerNode of layerNodes) { + if (!baseNodeIds.has(layerNode.id)) { + mergedNodes.push(layerNode) + } + } + + // Merge base edges with layer edges + const mergedEdges = [...edges, ...layerEdges] + + if (mergedNodes.length === 0) return - const idMap = new Map(nodes.map((node, index) => [node.id, index])) + const idMap = new Map(mergedNodes.map((node, index) => [node.id, index])) type SimNode = OcNode & d3.SimulationNodeDatum type SimLink = { source: SimNode; target: SimNode; relation: string } - const simNodes: SimNode[] = nodes.map((node) => ({ ...node })) - const simLinks: SimLink[] = edges + const simNodes: SimNode[] = mergedNodes.map((node) => ({ ...node })) + const simLinks: SimLink[] = mergedEdges .filter((edge) => idMap.has(edge.from_id) && idMap.has(edge.to_id)) .map((edge) => ({ source: simNodes[idMap.get(edge.from_id)!], @@ -313,7 +329,7 @@ export default function GraphView({ node.attr('cx', (d) => d.x!).attr('cy', (d) => d.y!) label.attr('x', (d) => d.x!).attr('y', (d) => d.y!) }) - }, [nodes, edges, selectedId, searchTerm, nodeSize, linkStrength, centerForce, repelForce, onNodeClick]) + }, [nodes, edges, selectedId, searchTerm, nodeSize, linkStrength, centerForce, repelForce, onNodeClick, layerNodes, layerEdges]) useEffect(() => { draw() diff --git a/apps/web/components/LayerPanel.tsx b/apps/web/components/LayerPanel.tsx new file mode 100644 index 0000000..eea2706 --- /dev/null +++ b/apps/web/components/LayerPanel.tsx @@ -0,0 +1,76 @@ +'use client' + +import type { LayerMetadata } from '../lib/api' + +interface Props { + layers: LayerMetadata[] + enabledLayerIds: string[] + onToggle: (layerId: string) => void + onRefresh: () => void +} + +export default function LayerPanel({ layers, enabledLayerIds, onToggle, onRefresh }: Props) { + return ( +
+
+
Query Layers
+ +
+ + {layers.length === 0 && ( +
No layers available
+ )} + + {layers.map((layer) => { + const isEnabled = enabledLayerIds.includes(layer.id) + return ( +
+ onToggle(layer.id)} + style={{ marginTop: 2, cursor: 'pointer' }} + /> +
+
{layer.name}
+ {layer.description && ( +
{layer.description}
+ )} +
+
+ ) + })} +
+ ) +} diff --git a/apps/web/components/QueryInput.tsx b/apps/web/components/QueryInput.tsx new file mode 100644 index 0000000..9123d5e --- /dev/null +++ b/apps/web/components/QueryInput.tsx @@ -0,0 +1,49 @@ +'use client' + +import { useState } from 'react' + +interface Props { + onRun: (query: string) => void +} + +export default function QueryInput({ onRun }: Props) { + const [query, setQuery] = useState('') + + function handleSubmit(e: React.FormEvent) { + e.preventDefault() + if (query.trim()) { + onRun(query.trim()) + } + } + + return ( +
+ setQuery(e.target.value)} + placeholder="Enter query to filter graph..." + style={{ flex: 1, fontSize: 11, padding: '6px 10px' }} + /> + +
+ ) +} diff --git a/apps/web/lib/api.ts b/apps/web/lib/api.ts index dda7bd2..771af74 100644 --- a/apps/web/lib/api.ts +++ b/apps/web/lib/api.ts @@ -31,6 +31,35 @@ export interface QueryResult { export type SourceType = 'obsidian' | 'notion' | 'gdrive' | 'github' +/* ── Query Layers ────────────────────────────────────────────── */ +export interface LayerMetadata { + id: string + name: string + description?: string +} + +export interface LayerIndex { + layers: LayerMetadata[] +} + +export interface LayerNode { + id: string + label: string + metadata?: Record +} + +export interface LayerEdge { + from: string + to: string + relation?: string +} + +export interface LayerData { + layerId: string + nodes: LayerNode[] + edges: LayerEdge[] +} + /* ── Status ──────────────────────────────────────────────── */ export async function getStatus(): Promise<{ ok: boolean; version?: string; vectorCount?: number }> { try { @@ -97,6 +126,14 @@ export async function ingestSource( /* ── Graph nodes/edges (new API — available after redeploy) ─ */ export async function getNodes(apiKey: string): Promise { try { + // Try local static file first + const localResponse = await fetch('/nodes.json', { cache: 'no-store' }) + if (localResponse.ok) { + const nodes = await localResponse.json() + return nodes + } + + // Fallback to API server const r = await fetch(`${BASE}/api/nodes`, { headers: headers(apiKey), cache: 'no-store' }) if (!r.ok) return [] const d = await r.json() @@ -106,9 +143,38 @@ export async function getNodes(apiKey: string): Promise { export async function getEdges(apiKey: string): Promise { try { + // Try local static file first + const localResponse = await fetch('/edges.json', { cache: 'no-store' }) + if (localResponse.ok) { + const edges = await localResponse.json() + return edges + } + + // Fallback to API server const r = await fetch(`${BASE}/api/edges`, { headers: headers(apiKey), cache: 'no-store' }) if (!r.ok) return [] const d = await r.json() return d.edges ?? [] } catch { return [] } } + +/* ── Query Layers API ────────────────────────────────────────── */ +export async function getQueryLayers(): Promise { + try { + const r = await fetch('/query-layers/layers-index.json', { cache: 'no-store' }) + if (!r.ok) return { layers: [] } + return r.json() + } catch { + return { layers: [] } + } +} + +export async function getLayerData(layerId: string): Promise { + try { + const r = await fetch(`/query-layers/${layerId}.json`, { cache: 'no-store' }) + if (!r.ok) return null + return r.json() + } catch { + return null + } +} diff --git a/apps/web/lib/queryLayerSearch.ts b/apps/web/lib/queryLayerSearch.ts new file mode 100644 index 0000000..f5608cb --- /dev/null +++ b/apps/web/lib/queryLayerSearch.ts @@ -0,0 +1,61 @@ +import type { LayerNode, LayerEdge } from './api' + +export interface SubgraphResult { + seeds: LayerNode[] + edges: LayerEdge[] +} + +/** + * Lightweight local subgraph search. + * Finds nodes matching query string, then expands by maxHops. + * Returns seeds and connected edges deterministically. + */ +export function searchLocalSubgraph( + nodes: LayerNode[], + edges: LayerEdge[], + query: string, + maxHops = 2 +): SubgraphResult { + const lowerQuery = query.toLowerCase().trim() + + // Find seed nodes matching query + const seeds = nodes.filter(node => { + const label = node.label?.toLowerCase() || '' + const id = node.id?.toLowerCase() || '' + return label.includes(lowerQuery) || id.includes(lowerQuery) + }) + + if (seeds.length === 0) { + return { seeds: [], edges: [] } + } + + // Collect reachable node IDs via BFS + const seedIds = new Set(seeds.map(n => n.id)) + const reachable = new Set(seedIds) + + let frontier = Array.from(seedIds) + for (let hop = 0; hop < maxHops; hop++) { + const nextFrontier: string[] = [] + for (const nodeId of frontier) { + for (const edge of edges) { + if (edge.from === nodeId && !reachable.has(edge.to)) { + reachable.add(edge.to) + nextFrontier.push(edge.to) + } + if (edge.to === nodeId && !reachable.has(edge.from)) { + reachable.add(edge.from) + nextFrontier.push(edge.from) + } + } + } + frontier = nextFrontier + if (frontier.length === 0) break + } + + // Filter edges connecting reachable nodes + const connectedEdges = edges.filter( + e => reachable.has(e.from) && reachable.has(e.to) + ) + + return { seeds, edges: connectedEdges } +} diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index 24f8ced..9817901 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -19,6 +19,8 @@ "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "autoprefixer": "^10.4.20", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.35", "postcss": "^8.4.49", "tailwindcss": "^3.4.17", "typescript": "^5.7.3" @@ -37,6 +39,188 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -76,12 +260,41 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, "node_modules/@next/env": { "version": "14.2.32", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.32.tgz", "integrity": "sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==", "license": "MIT" }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.32", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.32.tgz", @@ -264,6 +477,41 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -280,6 +528,17 @@ "tslib": "^2.4.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/d3": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", @@ -571,6 +830,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.39", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", @@ -594,7 +860,6 @@ "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -610,1421 +875,5351 @@ "@types/react": "^18.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/autoprefixer": { - "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.1.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz", - "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/browserslist": { - "version": "4.28.2", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz", + "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001785", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz", + "integrity": "sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.331", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", + "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, "bin": { - "browserslist": "cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" }, "engines": { - "node": ">=10.16.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "14.2.32", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.32.tgz", + "integrity": "sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", "license": "MIT", + "dependencies": { + "@next/env": "14.2.32", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, "engines": { - "node": ">= 6" + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.32", + "@next/swc-darwin-x64": "14.2.32", + "@next/swc-linux-arm64-gnu": "14.2.32", + "@next/swc-linux-arm64-musl": "14.2.32", + "@next/swc-linux-x64-gnu": "14.2.32", + "@next/swc-linux-x64-musl": "14.2.32", + "@next/swc-win32-arm64-msvc": "14.2.32", + "@next/swc-win32-ia32-msvc": "14.2.32", + "@next/swc-win32-x64-msvc": "14.2.32" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001785", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz", - "integrity": "sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==", + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cssesc": { + "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/d3-axis": { + "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" + "node": ">= 0.4" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", "dependencies": { - "delaunator": "5" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" + "wrappy": "1" } }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-array": "2.5.0 - 3" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-color": "1 - 3" + "callsites": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "peer": true, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "d3-path": "^3.1.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || >=14" } }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-array": "2 - 3" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": ">=12" + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/d3-time-format": { + "node_modules/postcss-js": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "d3-time": "1 - 3" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">=12" + "node": ">= 18" }, "peerDependencies": { - "d3-selection": "2 - 3" + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": ">=12" + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", "dependencies": { - "robust-predicates": "^3.0.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, - "license": "Apache-2.0" + "license": "MIT" }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/electron-to-chromium": { - "version": "1.5.331", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", - "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "dependencies": { + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=0.10.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "pify": "^2.3.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "binary-extensions": "^2.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "hasown": "^2.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "jiti": "bin/jiti.js" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "loose-envify": "^1.1.0" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "dev": true, - "license": "MIT", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4" } }, - "node_modules/next": { - "version": "14.2.32", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.32.tgz", - "integrity": "sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==", - "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, "license": "MIT", "dependencies": { - "@next/env": "14.2.32", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.32", - "@next/swc-darwin-x64": "14.2.32", - "@next/swc-linux-arm64-gnu": "14.2.32", - "@next/swc-linux-arm64-musl": "14.2.32", - "@next/swc-linux-x64-gnu": "14.2.32", - "@next/swc-linux-x64-musl": "14.2.32", - "@next/swc-win32-arm64-msvc": "14.2.32", - "@next/swc-win32-ia32-msvc": "14.2.32", - "@next/swc-win32-x64-msvc": "14.2.32" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=8" } }, - "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { + "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "peer": true, "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "camelcase-css": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "node": ">=8" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "node": ">=12" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=12.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.2.14" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "node": ">= 0.4" }, - "peerDependencies": { - "react": "^18.3.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-cache": { + "node_modules/string.prototype.repeat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { - "pify": "^2.3.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2033,83 +6228,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/styled-jsx": { @@ -2168,6 +6352,19 @@ "node": ">= 6" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2219,6 +6416,13 @@ "node": ">=14.0.0" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -2283,7 +6487,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -2304,6 +6507,19 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -2311,12 +6527,129 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -2331,6 +6664,25 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -2338,6 +6690,44 @@ "dev": true, "license": "MIT" }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -2369,12 +6759,258 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/apps/web/package.json b/apps/web/package.json index f8798fa..d38cce1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,6 +20,8 @@ "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "autoprefixer": "^10.4.20", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.35", "postcss": "^8.4.49", "tailwindcss": "^3.4.17", "typescript": "^5.7.3" diff --git a/apps/web/public/GUIDE.md b/apps/web/public/GUIDE.md new file mode 100644 index 0000000..c3d0d7c --- /dev/null +++ b/apps/web/public/GUIDE.md @@ -0,0 +1,213 @@ +# OpenCrab 웹 UI 사용 가이드 + +## 🌐 웹 UI 화면 구성 + +``` +┌────────────────────────────────────────────────────────────┐ +│ [파일 탐색기] │ [그래프 뷰] │ [상세/컨트롤] │ +│ │ │ │ +│ - 노드 목록 │ - 시각화 그래프 │ - 선택 노드 │ +│ - 카테고리 │ - 검색 바 │ - 그래프 설정 │ +│ - API 키 │ - 줌/드래그 │ - 인제스트 │ +└────────────────────────────────────────────────────────────┘ +``` + +--- + +## 🔍 검색 기능 사용법 + +### 1. **그래프 뷰 검색** +상단 검색창에 키워드 입력: +- **노드 ID** 검색: `acli_jira_workitem` +- **이름** 검색: `ELERA`, `GitLab`, `RPA` +- **카테고리** 검색: `automation`, `security` + +👉 **결과**: 일치하는 노드는 밝게, 나머지는 희미하게 표시 + +### 2. **왼쪽 패널 필터** +- 노드 목록을 스크롤하며 탐색 +- 클릭하면 그래프에서 강조 표시 + +--- + +## 🎯 그래프 탐색 방법 + +### 기본 조작 +- **줌**: 마우스 휠 +- **이동**: 드래그 (빈 공간) +- **노드 이동**: 노드를 드래그 +- **노드 클릭**: 상세 정보 표시 + +### 노드 색상 의미 +- 🟡 **Landscape** (#5ea85b) - 조경, 정원 관련 +- 🟠 **AI** (#e38b2c) - AI, 자동화 관련 +- 🟣 **Alex** (#d97ab5) - OpenCrab, CrabHarness 등 +- ⚪ **Fallback** (#7c6f64) - 기타 + +--- + +## 📊 실제 활용 예시 + +### 예시 1: "ELERA POS는 어떤 OS 위에서 돌아가?" + +1. 검색창에 `ELERA` 입력 +2. `elera_platform` 노드 클릭 +3. 연결된 노드들 확인: + - `toshiba_tgcs_org` (소유 조직) + - `toshiba_offerings_page_text` (관련 문서) + +### 예시 2: "acli로 work item 만드는 명령은?" + +1. 검색창에 `acli` 또는 `workitem` 입력 +2. `acli_jira_workitem_link_create` 노드 찾기 +3. 오른쪽 패널에서 상세 정보 확인: + - URL: 명령어 문서 링크 + - 설명: Create links between work items + +### 예시 3: "GitLab 파이프라인 구조는?" + +1. 검색창에 `pipeline` 입력 +2. `parent_pipeline`, `child_pipeline` 노드 찾기 +3. 관계 확인: + - parent → child (triggers) + - stages: build, test, deploy + +### 예시 4: "RPA 관련 문서는?" + +1. 검색창에 `RPA` 또는 `automation` 입력 +2. `concept_automation` 노드 찾기 +3. 연결된 문서들 확인: + - `doc_sw_RPA_Workflow_...` (3개 문서) + +--- + +## 🎛️ 그래프 컨트롤 (오른쪽 패널) + +### 시각화 설정 +- **Node Size**: 노드 크기 조절 +- **Link Strength**: 연결선 강도 +- **Center Force**: 중심 끌어당기는 힘 +- **Repel Force**: 노드 간 밀어내는 힘 + +### Hidden Spaces +체크박스로 특정 공간(space) 숨기기: +- ☐ subject (주체) +- ☐ resource (자원) +- ☐ concept (개념) +- ☐ evidence (증거) +- ☐ outcome (결과) +- ☐ lever (레버) + +--- + +## 💡 고급 활용법 + +### 1. **관계 추적** +노드 클릭 → 오른쪽 패널 → 연결된 노드 목록 확인 + +### 2. **카테고리별 탐색** +- 왼쪽 패널에서 space별 필터링 +- 색상으로 테마별 그룹 파악 + +### 3. **영향 범위 분석** +특정 노드에서 시작해서 연결된 모든 노드 추적 +- 예: ELERA → 관련 조직 → 제품 → 문서 + +--- + +## 🔧 데이터 업데이트 + +새로운 팩을 설치하거나 데이터가 변경되면: + +```bash +"그래프 데이터를 다시 export 해줘" +``` + +자동으로 `nodes.json`, `edges.json` 재생성 후 새로고침 + +--- + +## 📦 현재 설치된 팩 + +### 1. **toshiba-day5-dev-pack** (510 노드, 593 엣지) +- Atlassian acli 명령어 +- GitLab CI/CD 파이프라인 +- ELERA 플랫폼 정보 +- Jira/Confluence 워크플로우 + +**샘플 검색어:** +- `acli jira` +- `GitLab pipeline` +- `ELERA` +- `merge train` + +### 2. **my-downloads-pack** (8 노드, 7 엣지) +- Downloads 폴더 문서 +- 카테고리: Automation, Security, Development + +**샘플 검색어:** +- `RPA` +- `automation` +- `security` +- `github recovery` + +--- + +## 🚀 Quick Start + +1. **http://localhost:3000** 열기 +2. 상단 검색창에 관심 키워드 입력 +3. 노드 클릭해서 상세 정보 확인 +4. 연결된 노드들을 따라가며 탐색 +5. 오른쪽 설정으로 시각화 조정 + +--- + +## ❓ FAQ + +**Q: 그래프가 너무 복잡해요** +A: Hidden Spaces에서 불필요한 space 체크 또는 검색창으로 필터링 + +**Q: 노드가 겹쳐 보여요** +A: Repel Force 값을 높이면 노드들이 더 멀리 배치됩니다 + +**Q: 특정 문서의 원본을 보고 싶어요** +A: 노드 클릭 → 오른쪽 패널에서 `path` 또는 `url` 속성 확인 + +**Q: 새로운 문서를 추가하려면?** +A: "내 Downloads 폴더를 다시 팩으로 만들어줘" 요청 + +--- + +## 📚 더 알아보기 + +- OpenCrab Pack v1 포맷: `C:\Users\amore\OpenCrab\docs\opencrab-pack-v1.md` +- MetaOntology 9-Space: `concept`, `resource`, `subject`, `evidence`, `claim`, `outcome`, `lever`, `policy`, `community` + +--- + +## 🗂️ Query Layer 사용법 + +### 1. CLI로 관계 시각화 + +```bash +opencrab query-viz "ELERA와 acli의 관계는?" --max-hops 3 --limit 20 +``` +- 관계 그래프를 CLI에서 바로 확인 +- `--max-hops`, `--limit` 등 옵션으로 탐색 범위 조절 + +### 2. 대시보드에서 활용 + +1. 웹 UI에서 "Query Layer" 메뉴 클릭 +2. 관계 질의 입력 (예: "ELERA와 acli의 관계는?") +3. 시각화 결과 확인 및 그래프 내 노드/엣지 탐색 +4. 필요시 결과를 PNG/SVG로 내보내기 + +### 3. layers-index.json 구조 + +- 경로: `apps/web/public/query-layers/layers-index.json` +- 예시: + ```json + {"layers": [], "version": "1.0", "last_updated": null} + ``` +- 추후 관계 레이어가 추가되면 `layers` 배열에 정보가 저장됨 diff --git a/apps/web/public/edges.json b/apps/web/public/edges.json new file mode 100644 index 0000000..738c1ca --- /dev/null +++ b/apps/web/public/edges.json @@ -0,0 +1,4671 @@ +[ + { + "from_id": "comm-perf-cluster", + "to_id": "con-error-rate", + "relation": "clusters", + "from_space": "community", + "to_space": "concept" + }, + { + "from_id": "comm-perf-cluster", + "to_id": "top-performance", + "relation": "clusters", + "from_space": "community", + "to_space": "concept" + }, + { + "from_id": "report-perf", + "to_id": "top-performance", + "relation": "summarizes", + "from_space": "community", + "to_space": "concept" + }, + { + "from_id": "top_retailers_community", + "to_id": "retail_technology", + "relation": "clusters", + "from_space": "community", + "to_space": "concept" + }, + { + "from_id": "top_retailers_community", + "to_id": "marketplace_platform", + "relation": "summarizes", + "from_space": "community", + "to_space": "concept" + }, + { + "from_id": "api_token_auth", + "to_id": "sse_endpoint_deprecation_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "atlassian_cloud_cli", + "to_id": "jira_project_management", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "atlassian_document_format", + "to_id": "jira_work_item", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "atlassian_jira", + "to_id": "cli_authentication", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "atlassian_jira", + "to_id": "cli_authentication", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "attachment_management_concept", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "auto_merge", + "to_id": "merge_train", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "auto_merge", + "to_id": "merge_train", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "auto_merge", + "to_id": "merge_train", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "automatic_pipeline_cancellation", + "to_id": "pipeline_resource_waste", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "automatic_pipeline_cancellation", + "to_id": "redundant_pipeline", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "automatic_pipeline_cancellation", + "to_id": "ci_pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "automatic_pipeline_cancellation", + "to_id": "merge_train_pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "build_job", + "to_id": "pipeline_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "business_partner_type", + "to_id": "retail_segment", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "captcha_verification", + "to_id": "bot_access_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "captcha_verification", + "to_id": "bot_access_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "child_pipeline", + "to_id": "parent_pipeline", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "child_pipeline", + "to_id": "deployment_pipeline", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "ci_job", + "to_id": "ci_pipeline", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "ci_job", + "to_id": "pipeline", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "ci_pipeline", + "to_id": "merge_train", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "ci_pipeline", + "to_id": "merge_train", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "ci_pipeline_configuration", + "to_id": "resource_group", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "cli_automation_topic", + "to_id": "workitem_linking_concept", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "cli_commands_topic", + "to_id": "jira_field_concept", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "cloud_native_api_first", + "to_id": "faster_retail_solution_deployment", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "cloud_native_api_first", + "to_id": "pos_software", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "cloud_native_architecture_concept", + "to_id": "outcome_retail_innovation", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "cloud_native_architecture_concept", + "to_id": "pos_software_concept", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "code_diff_concept", + "to_id": "diff_load_time_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "code_diff_concept", + "to_id": "merge_request_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "code_explanation", + "to_id": "improved_code_comprehension", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "code_quality_findings", + "to_id": "code_security_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "code_quality_findings", + "to_id": "static_analysis_findings", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "code_review_topic", + "to_id": "collapse_generated_diff", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "code_review_workflow", + "to_id": "review_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "code_review_workflow", + "to_id": "reviewer_collaboration", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "code_review_workflow", + "to_id": "merge_request_diff", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "collapse_generated_diff", + "to_id": "reviewer_focus_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "company_managed_project_concept", + "to_id": "jira_project_concept", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "con-error-rate", + "to_id": "out-reliability", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "con-error-rate", + "to_id": "out-reliability", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "con-error-rate", + "to_id": "kpi-p95-latency", + "relation": "degrades", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "con-error-rate", + "to_id": "top-performance", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "con-error-rate", + "to_id": "cls-kpi", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "concurrent_execution", + "to_id": "concurrent_deployment_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "contact_form_submission", + "to_id": "customer_contact_followup", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "continuous_deployment", + "to_id": "process_mode", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "convenience_fuel_retail", + "to_id": "transaction_acceleration", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "convenience_fuel_retail", + "to_id": "transaction_acceleration", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "convenience_fuel_retail", + "to_id": "grocery_general_merchandise_retail", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "convenience_fuel_retail", + "to_id": "retail_industry_solutions", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "custom_field_searcher", + "to_id": "jira_custom_field", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "custom_field_type", + "to_id": "jira_custom_field", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "customer_contact_request", + "to_id": "customer_followup_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "deferred_module_loading", + "to_id": "contact_form_submission", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "deployment_job", + "to_id": "concurrent_deployment_corruption", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "deployment_job", + "to_id": "ci_job", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "diff_gutter", + "to_id": "diff_view", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "diff_version_comparison", + "to_id": "merge_request_diff_comment", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "diff_view", + "to_id": "merge_request", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "diff_view", + "to_id": "syntax_highlighting", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "draft_merge_request", + "to_id": "risk_mr_dropped_from_train", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "edge_computing_concept", + "to_id": "outcome_retail_operational_stability", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "edge_computing_concept", + "to_id": "retail_technology_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "edge_computing_concept", + "to_id": "cloud_native_architecture_concept", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "edge_computing_retail", + "to_id": "faster_retail_solution_deployment", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "edge_computing_retail", + "to_id": "operational_stability_retail", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "edge_computing_retail", + "to_id": "cloud_native_api_first", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "edge_computing_retail", + "to_id": "cloud_native_api_first", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "email_marketing_consent", + "to_id": "future_of_retail", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "epos_installations", + "to_id": "epos_market_share_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "epos_installations", + "to_id": "epos_market_share_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "epos_installations", + "to_id": "worldwide_epos_share_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "epos_installations", + "to_id": "worldwide_epos_share_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "epos_installations", + "to_id": "pos_self_checkout", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "epos_installations", + "to_id": "pos_self_checkout", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "epos_installations", + "to_id": "pos_self_checkout", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "epos_installations", + "to_id": "pos_self_checkout", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "experiment_beta_features", + "to_id": "code_explanation", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "explain_code_concept", + "to_id": "merge_request_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "failed_pipeline", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "failed_pipeline", + "to_id": "ci_pipeline", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "fast_forward_merge", + "to_id": "merge_train", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "feature_flag_concept", + "to_id": "code_diff_concept", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "file_browser", + "to_id": "review_performance", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "file_browser", + "to_id": "one_file_at_a_time", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "file_browser", + "to_id": "merge_request_diff", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "file_collapse_performance", + "to_id": "review_performance", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "file_collapse_performance", + "to_id": "merge_request_diff", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "file_collapse_performance", + "to_id": "file_browser", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "file_viewed_marker", + "to_id": "diff_view", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "future_of_retail", + "to_id": "retail_industry_engagement", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "generated_file_concept", + "to_id": "collapse_generated_diff", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "gitlab_cicd_pipeline", + "to_id": "build_job", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "gitlab_cicd_pipeline", + "to_id": "deployment_job", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "gitlab_generated_attribute", + "to_id": "collapse_generated_diff", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "grocery_general_merchandise_retail", + "to_id": "frictionless_customer_experience", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "grocery_general_merchandise_retail", + "to_id": "operational_agility", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "grocery_general_merchandise_retail", + "to_id": "operational_agility", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "grocery_general_merchandise_retail", + "to_id": "retail_industry_solutions", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "hospitality_entertainment_retail", + "to_id": "specialty_retail", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "hospitality_entertainment_retail", + "to_id": "retail_industry_solutions", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "idempotency", + "to_id": "process_mode_newest_first", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "idempotency", + "to_id": "process_mode_newest_ready_first", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "inline_comment", + "to_id": "diff_view", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "inline_comment_expansion", + "to_id": "merge_request_diff", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "inline_comment_management", + "to_id": "code_explanation", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "inline_diff_mode", + "to_id": "improved_code_review_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "inline_diff_mode", + "to_id": "side_by_side_diff_mode", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_attachment", + "to_id": "jira_workitem", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_auth", + "to_id": "jira_project", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_board", + "to_id": "jira_sprint", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_field_concept", + "to_id": "cli_commands_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_filter", + "to_id": "jira_dashboard", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_project", + "to_id": "jira_board", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_project_concept", + "to_id": "jira_project_created_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "jira_project_management", + "to_id": "atlassian_cloud_cli", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_project_management", + "to_id": "cli_authentication", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_project_management", + "to_id": "cli_authentication", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_sprint", + "to_id": "jira_workitem", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_work_item", + "to_id": "json_output", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_work_item_concept", + "to_id": "jira_project_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_work_item_concept", + "to_id": "cli_command_reference_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem", + "to_id": "jira_project", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem", + "to_id": "jira_sprint", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_attachment", + "to_id": "jira_workitem", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_attachment", + "to_id": "acli_reference_commands", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_attachment_management", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_comment_management", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_concept", + "to_id": "atlassian_cli_reference", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_concept", + "to_id": "cli_command_reference_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_link", + "to_id": "jira_workitem", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "jql_query", + "to_id": "work_item_filter", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "json_output_concept", + "to_id": "jira_project", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "keyboard_shortcuts", + "to_id": "one_file_at_a_time", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "large_language_model", + "to_id": "llm_accuracy_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "large_language_model", + "to_id": "improved_code_comprehension", + "relation": "degrades", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "large_language_model", + "to_id": "code_explanation", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "loss_prevention", + "to_id": "retail_loss_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "loss_prevention", + "to_id": "serviceability", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "marketplace_platform", + "to_id": "retailer_growth_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "marketplace_platform", + "to_id": "retail_technology", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "mcp_client", + "to_id": "mcp_client_security_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "mcp_client", + "to_id": "mcp_server", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "mcp_protocol", + "to_id": "successful_mcp_client_connection", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_conflict", + "to_id": "risk_mr_dropped_from_train", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_method", + "to_id": "merge_train_queue", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request", + "to_id": "source_branch", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request", + "to_id": "target_branch", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request", + "to_id": "merge_train", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request_changes", + "to_id": "code_quality_findings", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request_changes", + "to_id": "static_analysis_findings", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request_conflicts", + "to_id": "missed_conflict_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_request_diff", + "to_id": "code_review_workflow", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request_diff", + "to_id": "merge_request", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_request_diff_comment", + "to_id": "persistent_code_review_comments", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_request_image_comment", + "to_id": "merge_request_diff_comment", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train", + "to_id": "default_branch_stability", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train", + "to_id": "devops_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train", + "to_id": "merge_conflict_reduction", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train", + "to_id": "default_branch", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train", + "to_id": "merge_train_pipeline", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train", + "to_id": "merge_request", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train", + "to_id": "merge_train_pipeline", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "faster_merge_throughput", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "risk_mr_dropped_from_train", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "merge_request", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "target_branch", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "automatic_pipeline_cancellation", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "merge_train", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline", + "to_id": "merged_results_pipeline", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_pipeline_limit", + "to_id": "merge_train_queue_outcome", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train_pipeline_limit", + "to_id": "ci_pipeline", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merge_train_queue", + "to_id": "merge_train_started_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "merge_train_queue", + "to_id": "merge_method", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "merged_results_pipeline", + "to_id": "merge_train_pipeline", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modularity_concept", + "to_id": "customer_trust_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "modularity_concept", + "to_id": "retail_scalability_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "modularity_concept", + "to_id": "unified_retail_future_concept", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modularity_concept", + "to_id": "retail_technology_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modularity_concept", + "to_id": "unified_retail_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "oauth_21_authentication", + "to_id": "successful_mcp_client_connection", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "oauth_21_authentication", + "to_id": "mcp_protocol", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "oauth_2_1", + "to_id": "api_token_auth", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "oldest_first_mode", + "to_id": "pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "oldest_first_process_mode", + "to_id": "pipeline_deadlock", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "oldest_first_process_mode", + "to_id": "resource_group", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "one_file_at_a_time", + "to_id": "improved_code_review_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "one_file_at_a_time", + "to_id": "merge_request_review", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "operational_excellence", + "to_id": "business_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "operational_excellence", + "to_id": "retail_business_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pagination_concept", + "to_id": "jira_project", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "parallel_execution", + "to_id": "default_branch_stability", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "parent_pipeline", + "to_id": "child_pipeline", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pinned_file_feature", + "to_id": "reviewer_collaboration", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pinned_file_feature", + "to_id": "code_review_workflow", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pinned_file_feature", + "to_id": "file_browser", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pipeline", + "to_id": "race_condition_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pipeline_concurrency", + "to_id": "concurrent_deployment_corruption", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pipeline_concurrency", + "to_id": "pipeline_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pipeline_deadlock", + "to_id": "deadlock_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pipeline_failure", + "to_id": "merge_train", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pipeline_failure", + "to_id": "redundant_pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pipeline_level_concurrency_control", + "to_id": "resource_group", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pipeline_level_concurrency_control", + "to_id": "resource_group_keyword", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pipeline_level_concurrency_control", + "to_id": "stuck_job_risk", + "relation": "predicts", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pipelines_must_succeed_setting", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pos_self_checkout", + "to_id": "pos_units_deployed_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pos_self_checkout", + "to_id": "pos_units_deployed_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pos_self_checkout", + "to_id": "pos_units_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pos_self_checkout", + "to_id": "pos_units_kpi", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "pos_self_checkout", + "to_id": "epos_installations", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pos_self_checkout", + "to_id": "epos_installations", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pos_self_checkout", + "to_id": "epos_installations", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pos_self_checkout", + "to_id": "epos_installations", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pos_software", + "to_id": "retail_innovation", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "pos_software_concept", + "to_id": "retail_technology_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode", + "to_id": "upcoming_jobs", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode", + "to_id": "resource_group", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode", + "to_id": "newest_first_mode", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode", + "to_id": "oldest_first_mode", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_newest_first", + "to_id": "deployment_safety", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "process_mode_newest_first", + "to_id": "resource_group_keyword", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_newest_first", + "to_id": "process_mode", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_newest_ready_first", + "to_id": "process_mode_newest_first", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_newest_ready_first", + "to_id": "process_mode", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_oldest_first", + "to_id": "deployment_safety", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "process_mode_oldest_first", + "to_id": "resource_group_keyword", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_oldest_first", + "to_id": "process_mode", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_unordered", + "to_id": "deployment_safety", + "relation": "degrades", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "process_mode_unordered", + "to_id": "resource_group_keyword", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "process_mode_unordered", + "to_id": "process_mode", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "production_resource_group", + "to_id": "resource_group", + "relation": "subclass_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "race_condition", + "to_id": "race_condition_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "race_condition", + "to_id": "resource_group_malfunction_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "recaptcha_challenge", + "to_id": "bot_abuse_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "recaptcha_challenge", + "to_id": "bot_abuse_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "recaptcha_verification", + "to_id": "customer_contact_followup", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "redundant_pipeline", + "to_id": "pipeline_resource_waste", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "concurrent_deployment_corruption", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "outdated_deployment_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "stuck_job_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "deployment_safety", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "pipeline_serialization", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group", + "to_id": "resource_group_keyword", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "resource_group", + "to_id": "pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "resource_group", + "to_id": "pipeline_concurrency", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "resource_group", + "to_id": "continuous_deployment", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "resource_group_keyword", + "to_id": "concurrent_deployment_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "resource_group_keyword", + "to_id": "controlled_deployment_order", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_advisory_services", + "to_id": "retail_solutions", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_industry_solutions", + "to_id": "operational_agility", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_industry_solutions", + "to_id": "operational_agility", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_industry_trends", + "to_id": "retail_marketplace", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_innovation", + "to_id": "operational_stability_retail", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_journey_excellence", + "to_id": "retail_solutions", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_marketplace", + "to_id": "retail_growth_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_security", + "to_id": "retail_business_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_security", + "to_id": "operational_excellence", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_segment", + "to_id": "future_of_retail", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_segments", + "to_id": "future_of_retail", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_solutions", + "to_id": "customer_shopping_experience", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_solutions", + "to_id": "customer_shopping_experience", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_solutions", + "to_id": "business_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_solutions", + "to_id": "retail_business_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_solutions", + "to_id": "customer_shopping_experience", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "retail_solutions", + "to_id": "customer_shopping_experience", + "relation": "influences", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retail_technology", + "to_id": "retailer_growth_success", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "retry_keyword", + "to_id": "ci_pipeline", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "security_concept", + "to_id": "evolving_threats_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "security_concept", + "to_id": "customer_trust_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "security_concept", + "to_id": "regulatory_compliance_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "security_concept", + "to_id": "unified_retail_future_concept", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "security_concept", + "to_id": "retail_technology_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "security_concept", + "to_id": "unified_retail_topic", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "semi_linear_merge", + "to_id": "merge_train", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "semi_linear_merge_method", + "to_id": "faster_merge_throughput", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "serviceability", + "to_id": "retail_loss_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "serviceability", + "to_id": "system_uptime_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "side_by_side_diff_mode", + "to_id": "improved_code_review_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "source_branch", + "to_id": "target_branch", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "static_analysis_findings", + "to_id": "code_security_outcome", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "strategy_mirror", + "to_id": "pipeline_deadlock", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "top-performance", + "to_id": "ent-user-behaviour", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "top-performance", + "to_id": "kpi-p95-latency", + "relation": "predicts", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "trigger_job", + "to_id": "ci_pipeline", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "trigger_job", + "to_id": "pipeline_level_concurrency_control", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "trigger_keyword", + "to_id": "resource_group_keyword", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "trigger_strategy_keyword", + "to_id": "trigger_keyword", + "relation": "depends_on", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "trigger_strategy_keyword", + "to_id": "resource_group_keyword", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "unresolved_thread", + "to_id": "risk_mr_dropped_from_train", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "upcoming_jobs", + "to_id": "resource_group_malfunction_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "viewed_file_tracking", + "to_id": "review_efficiency", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "waiting_for_resource_state", + "to_id": "deadlock_risk", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "whitespace_changes", + "to_id": "review_efficiency", + "relation": "degrades", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "whitespace_changes", + "to_id": "merge_request_diff", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "work_item_assignee", + "to_id": "jira_work_item", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "work_item_fields", + "to_id": "jira_work_item", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "workflow_automation", + "to_id": "successful_mcp_client_connection", + "relation": "contributes_to", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "workitem_link_type", + "to_id": "jira_workitem_link", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "workitem_linking_concept", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "workitem_linking_concept", + "to_id": "jira_workitem_concept", + "relation": "related_to", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "workitem_linking_topic", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "advisory_services_lever", + "to_id": "retail_journey_excellence", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "advisory_services_lever", + "to_id": "business_success", + "relation": "optimizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "advisory_services_lever", + "to_id": "customer_shopping_experience", + "relation": "raises", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "advisory_services_lever", + "to_id": "customer_shopping_experience", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "built_in_security_lever", + "to_id": "security_concept", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "built_in_security_lever", + "to_id": "evolving_threats_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "built_in_security_lever", + "to_id": "customer_trust_outcome", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "cancel_old_pipeline_lever", + "to_id": "upcoming_jobs", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "cancel_old_pipeline_lever", + "to_id": "resource_group_malfunction_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "collapse_behavior_lever", + "to_id": "gitlab_generated_attribute", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "collapse_behavior_lever", + "to_id": "reviewer_focus_outcome", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "contact_form_lever", + "to_id": "future_of_retail", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "contact_form_lever", + "to_id": "retail_industry_engagement", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "diff_view_preference_setting", + "to_id": "inline_diff_mode", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "diff_view_preference_setting", + "to_id": "one_file_at_a_time", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "diff_view_preference_setting", + "to_id": "side_by_side_diff_mode", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "diff_view_preference_setting", + "to_id": "improved_code_review_efficiency", + "relation": "optimizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever-cache-ttl", + "to_id": "top-performance", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "lever-cache-ttl", + "to_id": "kpi-p95-latency", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever-cache-ttl", + "to_id": "out-reliability", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever-query-limit", + "to_id": "con-error-rate", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "lever-query-limit", + "to_id": "risk-data-loss", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever-query-limit", + "to_id": "kpi-p95-latency", + "relation": "stabilizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever_cloud_native_adoption", + "to_id": "pos_software_concept", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "lever_cloud_native_adoption", + "to_id": "outcome_retail_innovation", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever_edge_computing_deployment", + "to_id": "edge_computing_concept", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "lever_edge_computing_deployment", + "to_id": "outcome_retail_innovation", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "lever_edge_computing_deployment", + "to_id": "outcome_retail_operational_stability", + "relation": "stabilizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "merge_queue", + "to_id": "merge_train", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "merge_queue", + "to_id": "merge_conflict_reduction", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "merge_queue", + "to_id": "devops_efficiency", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "operational_excellence", + "relation": "affects", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "operational_excellence", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "retail_security", + "relation": "affects", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "retail_security", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "security_risk", + "relation": "constrains", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "security_risk", + "relation": "constrains", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "operational_excellence", + "relation": "influences", + "from_space": "concept", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "operational_excellence", + "relation": "influences", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "labor_challenges", + "relation": "lowers", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "labor_challenges", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "retail_business_success", + "relation": "raises", + "from_space": "concept", + "to_space": "outcome" + }, + { + "from_id": "modular_adaptable_solutions", + "to_id": "retail_business_success", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "modular_architecture_lever", + "to_id": "modularity_concept", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "modular_architecture_lever", + "to_id": "customer_trust_outcome", + "relation": "optimizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "modular_architecture_lever", + "to_id": "retail_scalability_outcome", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "parallel_pipeline_limit_lever", + "to_id": "merge_train_pipeline_limit", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "parallel_pipeline_limit_lever", + "to_id": "merge_train_queue_outcome", + "relation": "optimizes", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "process_mode_selection", + "to_id": "process_mode", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "process_mode_selection", + "to_id": "outdated_deployment_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "process_mode_selection", + "to_id": "deployment_safety", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "push_new_commit_lever", + "to_id": "ci_pipeline", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "push_new_commit_lever", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "rapid_diffs_lever", + "to_id": "code_diff_concept", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "rapid_diffs_lever", + "to_id": "diff_load_time_kpi", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "remove_mr_from_train", + "to_id": "merge_train", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "remove_mr_from_train", + "to_id": "pipeline_resource_waste", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "rerun_pipeline_lever", + "to_id": "ci_pipeline", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "rerun_pipeline_lever", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_in_parent_pipeline", + "to_id": "pipeline_deadlock", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "resource_group_in_parent_pipeline", + "to_id": "deadlock_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_in_parent_pipeline", + "to_id": "pipeline_serialization", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_lever", + "to_id": "concurrent_execution", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "resource_group_lever", + "to_id": "deployment_job", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "resource_group_lever", + "to_id": "pipeline_concurrency", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "resource_group_lever", + "to_id": "concurrent_deployment_corruption", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_lever", + "to_id": "concurrent_deployment_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_lever", + "to_id": "controlled_deployment_order", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "resource_group_lever", + "to_id": "deployment_safety", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "retry_failed_job_lever", + "to_id": "failed_pipeline", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "retry_failed_job_lever", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "skip_merge_train", + "to_id": "merge_train", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "skip_merge_train", + "to_id": "merge_train", + "relation": "influences", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "skip_merge_train", + "to_id": "pipeline_resource_waste", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "start_new_pipeline_lever", + "to_id": "race_condition_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "viewed_checkbox_lever", + "to_id": "viewed_file_tracking", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "viewed_checkbox_lever", + "to_id": "review_efficiency", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "whitespace_toggle_lever", + "to_id": "whitespace_changes", + "relation": "affects", + "from_space": "lever", + "to_space": "concept" + }, + { + "from_id": "whitespace_toggle_lever", + "to_id": "missed_conflict_risk", + "relation": "lowers", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "whitespace_toggle_lever", + "to_id": "review_efficiency", + "relation": "raises", + "from_space": "lever", + "to_space": "outcome" + }, + { + "from_id": "beta_features_group_requirement", + "to_id": "gitlab_duo_chat_tool", + "relation": "restricts", + "from_space": "policy", + "to_space": "resource" + }, + { + "from_id": "pol-data-access", + "to_id": "user-alice", + "relation": "permits", + "from_space": "concept", + "to_space": "subject" + }, + { + "from_id": "pol-data-access", + "to_id": "ds-events", + "relation": "protects", + "from_space": "concept", + "to_space": "resource" + }, + { + "from_id": "pol-data-access", + "to_id": "agent-rag", + "relation": "requires_approval", + "from_space": "concept", + "to_space": "subject" + }, + { + "from_id": "resource_group_access_policy", + "to_id": "gitlab_ci_yml", + "relation": "restricts", + "from_space": "policy", + "to_space": "resource" + }, + { + "from_id": "rule-prod-deploy", + "to_id": "api-query", + "relation": "restricts", + "from_space": "policy", + "to_space": "resource" + }, + { + "from_id": "sens-pii", + "to_id": "ds-events", + "relation": "classifies", + "from_space": "policy", + "to_space": "resource" + }, + { + "from_id": "acli_jira_cli", + "to_id": "acli_workitem_link_reference_page", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_date_field", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_select_field", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_text_field", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_date_field", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_select_field", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_field_create", + "to_id": "example_text_field", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_project_create_cmd", + "to_id": "acli_project_create_examples_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_project_create_cmd", + "to_id": "acli_project_create_flags_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_edit", + "to_id": "acli_edit_options_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_edit", + "to_id": "acli_edit_options_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_link_create", + "to_id": "acli_workitem_link_reference_page", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_link_delete", + "to_id": "acli_workitem_link_reference_page", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_link_list", + "to_id": "acli_workitem_link_reference_page", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_link_type", + "to_id": "acli_workitem_link_reference_page", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_jira_workitem_tool", + "to_id": "acli_rovodev_tool", + "relation": "contains", + "from_space": "resource", + "to_space": "resource" + }, + { + "from_id": "acli_jira_workitem_view", + "to_id": "acli_view_command_doc", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_tool", + "to_id": "example_text_field", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_tool", + "to_id": "jira_project_list_doc", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_tool", + "to_id": "jira_workitem_link_doc", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "api-query", + "to_id": "log-001", + "relation": "logged_as", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "atlassian_mcp_server", + "to_id": "mcp_setup_guide", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "doc-spec", + "to_id": "text-001", + "relation": "contains", + "from_space": "concept", + "to_space": "evidence" + }, + { + "from_id": "doc_github_recovery_codes", + "to_id": "concept_security", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.074_GMT+9", + "to_id": "concept_automation", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.074_GMT+9", + "to_id": "concept_development", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.620_GMT+9", + "to_id": "concept_automation", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.620_GMT+9", + "to_id": "concept_development", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_59_27.794_GMT+9", + "to_id": "concept_automation", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "doc_sw_RPA_Workflow_2026_02_10_19_59_27.794_GMT+9", + "to_id": "concept_development", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "ds-events", + "to_id": "ev-001", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "ds-events", + "to_id": "log-001", + "relation": "logged_as", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "elera_loss_prevention", + "to_id": "toshiba_marketing_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "elera_platform", + "to_id": "toshiba_offerings_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "fast_forward_merge_method", + "to_id": "faster_merge_throughput", + "relation": "constrains", + "from_space": "resource", + "to_space": "outcome" + }, + { + "from_id": "fast_forward_merge_method", + "to_id": "semi_linear_merge_method", + "relation": "related_to", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "gitlab_ci", + "to_id": "pipeline_concurrency_example", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_ci", + "to_id": "process_mode_explanation", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_ci_cd", + "to_id": "automatic_cancellation_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_ci_cd", + "to_id": "merge_train_example_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_ci_yml", + "to_id": "deploy_resource_group_example", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_ci_yml", + "to_id": "process_mode_example", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_duo_pro_tool", + "to_id": "issue_590833_evidence", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_graphql_api", + "to_id": "graphql_job_query_example", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_graphql_api", + "to_id": "graphql_pipeline_query_example", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_org_gitlab_project", + "to_id": "epic_19380_evidence", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_org_gitlab_project", + "to_id": "issue_539581_evidence", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_org_gitlab_project", + "to_id": "issue_590833_evidence", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_org_gitlab_project", + "to_id": "issue_596236_evidence", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_project", + "to_id": "code_explain_walkthrough", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_project", + "to_id": "merge_trains_doc_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_resource_group", + "to_id": "gitlab_issue_436988", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "gitlab_rest_api_resource_groups", + "to_id": "gitlab_issue_436988", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "iot_suite", + "to_id": "toshiba_marketing_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "jira_project_list_command", + "to_id": "jira_project_list_doc", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "jira_project_list_command", + "to_id": "jira_project_list_doc", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "jira_workitem_api", + "to_id": "jira_workitem_link_doc", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "jira_workitem_link_api", + "to_id": "jira_workitem_link_doc", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "jira_workitem_view_command", + "to_id": "jira_workitem_concept", + "relation": "part_of", + "from_space": "resource", + "to_space": "concept" + }, + { + "from_id": "merge_request_file", + "to_id": "code_explain_walkthrough", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "merge_request_pipelines_tool", + "to_id": "merge_trains_doc_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "merge_requests_merge_api", + "to_id": "textunit_merge_train_settings", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "merged_results_pipelines_tool", + "to_id": "merge_trains_doc_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "mxp_hardware", + "to_id": "toshiba_offerings_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "project_json_file", + "to_id": "acli_project_create_flags_text", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "rapid_diffs_tool", + "to_id": "issue_590833_evidence", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "retail_transformation_services", + "to_id": "toshiba_marketing_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "rovodev_api", + "to_id": "jira_workitem_link_doc", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "rovodev_auth_command", + "to_id": "jira_project_list_doc", + "relation": "derived_from", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "toshiba_commerce_portal", + "to_id": "toshiba_homepage_content", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "toshiba_commerce_portal", + "to_id": "toshiba_industry_page_content", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "toshiba_commerce_portal", + "to_id": "toshiba_marketing_page_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "toshiba_marketplace_platform", + "to_id": "marketplace_description_text", + "relation": "contains", + "from_space": "resource", + "to_space": "evidence" + }, + { + "from_id": "acli_edit_options_text", + "to_id": "atlassian_document_format", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_edit_options_text", + "to_id": "jira_work_item", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_edit_options_text", + "to_id": "jql_query", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_edit_options_text", + "to_id": "work_item_assignee", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_edit_options_text", + "to_id": "work_item_filter", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_project_create_examples_text", + "to_id": "jira_project_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_project_create_examples_text", + "to_id": "company_managed_project_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_project_create_flags_text", + "to_id": "jira_project_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_project_create_flags_text", + "to_id": "company_managed_project_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_view_command_doc", + "to_id": "jira_work_item", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_view_command_doc", + "to_id": "json_output", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_view_command_doc", + "to_id": "work_item_fields", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_workitem_link_reference_page", + "to_id": "jira_workitem_link", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_workitem_link_reference_page", + "to_id": "jira_workitem", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "acli_workitem_link_reference_page", + "to_id": "workitem_link_type", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "auto_merge_history_text", + "to_id": "auto_merge", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "auto_merge_history_text", + "to_id": "merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "automatic_cancellation_text", + "to_id": "automatic_pipeline_cancellation", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "automatic_cancellation_text", + "to_id": "redundant_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "bad_config_example", + "to_id": "oldest_first_process_mode", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "bad_config_example", + "to_id": "pipeline_deadlock", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "bad_config_example", + "to_id": "production_resource_group", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "cannot_add_mr_textunit", + "to_id": "failed_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "cannot_add_mr_textunit", + "to_id": "merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "cannot_add_mr_textunit", + "to_id": "pipelines_must_succeed_setting", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "cannot_add_mr_textunit", + "to_id": "retry_keyword", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "cannot_add_mr_textunit", + "to_id": "cannot_add_mr_to_train_risk", + "relation": "supports", + "from_space": "evidence", + "to_space": "outcome" + }, + { + "from_id": "code_explain_walkthrough", + "to_id": "code_explanation", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "code_explain_walkthrough", + "to_id": "inline_comment_management", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "code_explain_walkthrough", + "to_id": "experiment_beta_features", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "code_explain_walkthrough", + "to_id": "large_language_model", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "collapse_types_textunit", + "to_id": "collapse_generated_diff", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "collapse_types_textunit", + "to_id": "generated_file_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "concurrent_pipeline_problem_description", + "to_id": "deployment_job", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "concurrent_pipeline_problem_description", + "to_id": "pipeline_concurrency", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "contact_success_message", + "to_id": "customer_contact_request", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "deploy_resource_group_example", + "to_id": "resource_group", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "deploy_resource_group_example", + "to_id": "resource_group_keyword", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "epic_19380_evidence", + "to_id": "code_diff_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "ev-001", + "to_id": "con-error-rate", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "ev-001", + "to_id": "claim-perf-deg", + "relation": "supports", + "from_space": "evidence", + "to_space": "claim" + }, + { + "from_id": "example_date_field", + "to_id": "jira_custom_field", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "example_select_field", + "to_id": "custom_field_searcher", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "example_text_field", + "to_id": "custom_field_type", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "example_text_field", + "to_id": "jira_custom_field", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "gitattributes_config_example", + "to_id": "gitlab_generated_attribute", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "gitlab_issue_436988", + "to_id": "race_condition", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "good_config_example", + "to_id": "resource_group_in_parent_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "lever" + }, + { + "from_id": "good_config_example", + "to_id": "production_resource_group", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "google_edge_blog_textunit", + "to_id": "edge_computing_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "google_edge_blog_textunit", + "to_id": "retail_innovation", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "graphql_job_query_example", + "to_id": "ci_job", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "graphql_job_query_example", + "to_id": "resource_group", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "graphql_pipeline_query_example", + "to_id": "ci_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "idc_report_textunit", + "to_id": "cloud_native_api_first", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "idc_report_textunit", + "to_id": "pos_software", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "issue_590833_evidence", + "to_id": "feature_flag_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "issue_596236_evidence", + "to_id": "code_diff_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "jira_project_list_doc", + "to_id": "jira_project", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "jira_project_list_doc", + "to_id": "json_output_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "jira_project_list_doc", + "to_id": "pagination_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_link_doc", + "to_id": "jira_workitem_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "jira_workitem_link_doc", + "to_id": "workitem_linking_topic", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "log-001", + "to_id": "top-performance", + "relation": "exemplifies", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "log-001", + "to_id": "claim-perf-deg", + "relation": "supports", + "from_space": "evidence", + "to_space": "claim" + }, + { + "from_id": "marketplace_description_text", + "to_id": "retail_marketplace", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mcp_setup_guide", + "to_id": "mcp_protocol", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mcp_setup_guide", + "to_id": "oauth_21_authentication", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mcp_setup_guide", + "to_id": "workflow_automation", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_train_example_text", + "to_id": "merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_train_example_text", + "to_id": "merge_train_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_train_example_text", + "to_id": "parallel_execution", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_train_example_text", + "to_id": "pipeline_failure", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_doc_text", + "to_id": "merge_method", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_doc_text", + "to_id": "merge_train_queue", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_doc_text", + "to_id": "merge_train_visualization", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_doc_text", + "to_id": "stuck_merge_request_risk", + "relation": "supports", + "from_space": "evidence", + "to_space": "outcome" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "merge_train_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "auto_merge", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "fast_forward_merge", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "merged_results_pipeline", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "merge_trains_intro_text", + "to_id": "semi_linear_merge", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "modularity_description_text", + "to_id": "modularity_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "modularity_description_text", + "to_id": "retail_technology_topic", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "modularity_description_text", + "to_id": "unified_retail_future_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_download_instructions", + "to_id": "diff_version_comparison", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_example_text", + "to_id": "diff_gutter", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_example_text", + "to_id": "diff_view", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_example_text", + "to_id": "file_viewed_marker", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_example_text", + "to_id": "inline_comment", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_diff_example_text", + "to_id": "merge_request", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_file_comment_instructions", + "to_id": "merge_request_diff_comment", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "mr_file_comment_instructions", + "to_id": "merge_request_image_comment", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "news_section_text", + "to_id": "retail_industry_trends", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "pinned_file_history_note", + "to_id": "pinned_file_feature", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "pinned_file_history_note", + "to_id": "merge_request_diff", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "pipeline_concurrency_example", + "to_id": "pipeline_level_concurrency_control", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "pipeline_concurrency_example", + "to_id": "resource_group_keyword", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_example", + "to_id": "resource_group", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_example", + "to_id": "deployment_job", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_explanation", + "to_id": "process_mode_newest_first", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_explanation", + "to_id": "process_mode_oldest_first", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_explanation", + "to_id": "process_mode_unordered", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_table", + "to_id": "process_mode", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_table", + "to_id": "process_mode_newest_first", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_table", + "to_id": "process_mode_newest_ready_first", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_table", + "to_id": "process_mode_oldest_first", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "process_mode_table", + "to_id": "process_mode_unordered", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "security_description_text", + "to_id": "security_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "success_message_text", + "to_id": "contact_form_submission", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "success_message_text", + "to_id": "contact_form_submission", + "relation": "supports", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "text-001", + "to_id": "ent-user-behaviour", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "text-001", + "to_id": "claim-perf-deg", + "relation": "timestamps", + "from_space": "evidence", + "to_space": "claim" + }, + { + "from_id": "textunit_merge_train_settings", + "to_id": "merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "textunit_merge_train_settings", + "to_id": "merged_results_pipeline", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "textunit_merge_train_settings", + "to_id": "skip_merge_train", + "relation": "describes", + "from_space": "evidence", + "to_space": "lever" + }, + { + "from_id": "textunit_troubleshooting", + "to_id": "auto_merge", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "textunit_troubleshooting", + "to_id": "draft_merge_request", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "textunit_troubleshooting", + "to_id": "merge_conflict", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "textunit_troubleshooting", + "to_id": "unresolved_thread", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "customer_shopping_experience", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "customer_shopping_experience", + "relation": "mentions", + "from_space": "evidence", + "to_space": "outcome" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "operational_excellence", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "retail_advisory_services", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "retail_security", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_homepage_content", + "to_id": "retail_solutions", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_content", + "to_id": "convenience_fuel_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_content", + "to_id": "grocery_general_merchandise_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_content", + "to_id": "hospitality_entertainment_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_text", + "to_id": "convenience_fuel_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_text", + "to_id": "grocery_general_merchandise_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_text", + "to_id": "hospitality_entertainment_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_industry_page_text", + "to_id": "specialty_retail", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "epos_installations", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "epos_installations", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "loss_prevention", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "operational_excellence", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "pos_self_checkout", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "pos_self_checkout", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "retail_journey_excellence", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "retail_solutions", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "serviceability", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "modular_adaptable_solutions", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_marketing_page_text", + "to_id": "modular_adaptable_solutions", + "relation": "mentions", + "from_space": "evidence", + "to_space": "lever" + }, + { + "from_id": "toshiba_offerings_page_text", + "to_id": "modularity_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_offerings_page_text", + "to_id": "security_concept", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "toshiba_offerings_page_text", + "to_id": "unified_retail_topic", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_conflicts_in_diff_section", + "to_id": "merge_request_conflicts", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_conflicts_in_diff_section", + "to_id": "merge_request_diff", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_edge_strategy_discussion", + "to_id": "cloud_native_architecture_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_edge_strategy_discussion", + "to_id": "edge_computing_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_idc_leader_claim", + "to_id": "cloud_native_architecture_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_idc_leader_claim", + "to_id": "pos_software_concept", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_mark_files_viewed_section", + "to_id": "viewed_file_tracking", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_mark_files_viewed_section", + "to_id": "merge_request", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_whitespace_changes_section", + "to_id": "whitespace_changes", + "relation": "describes", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "tu_whitespace_changes_section", + "to_id": "merge_request_diff", + "relation": "mentions", + "from_space": "evidence", + "to_space": "concept" + }, + { + "from_id": "agent-rag", + "to_id": "api-query", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "agent-rag", + "to_id": "ds-events", + "relation": "can_view", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "amazon_quick_suite_client", + "to_id": "atlassian_rovo_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "atlassian", + "to_id": "atlassian_remote_mcp_server", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "atlassian_org", + "to_id": "acli_tool", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "atlassian_org", + "to_id": "atlassian_remote_mcp_server", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "claude_client", + "to_id": "atlassian_rovo_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "docker_client", + "to_id": "atlassian_rovo_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "gitlab_dev_team", + "to_id": "gitlab_merge_requests_ui", + "relation": "can_view", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "gitlab_duo_agent", + "to_id": "gitlab_duo_chat_tool", + "relation": "manages", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "google_gemini_client", + "to_id": "atlassian_rovo_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "google_org", + "to_id": "google_distributed_cloud", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "google_org", + "to_id": "google_recaptcha_api", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "mcp_compatible_client", + "to_id": "atlassian_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "mcp_compatible_client", + "to_id": "confluence", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "mcp_compatible_client", + "to_id": "jira", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "openai_chatgpt_client", + "to_id": "atlassian_rovo_mcp_server", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "team-data", + "to_id": "proj-analytics", + "relation": "member_of", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce", + "to_id": "toshiba_commerce_portal", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce", + "to_id": "toshiba_enterprise_login", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce", + "to_id": "toshiba_forgot_password", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce", + "to_id": "toshiba_marketplace", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce", + "to_id": "toshiba_portal_api", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce_org", + "to_id": "google_recaptcha_api", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce_org", + "to_id": "elera_commerce_platform", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce_org", + "to_id": "toshiba_commerce_portal", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce_org", + "to_id": "toshiba_enterprise_login_api", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_commerce_org", + "to_id": "toshiba_marketplace_platform", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_global_commerce", + "to_id": "elera_commerce_platform", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_tgcs", + "to_id": "elera_loss_prevention", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_tgcs", + "to_id": "iot_suite", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_tgcs", + "to_id": "retail_transformation_services", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_tgcs_org", + "to_id": "elera_platform", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "toshiba_tgcs_org", + "to_id": "mxp_hardware", + "relation": "owns", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "user-alice", + "to_id": "tool-dbt", + "relation": "can_execute", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "user-alice", + "to_id": "ds-events", + "relation": "can_view", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "user-alice", + "to_id": "doc-spec", + "relation": "owns", + "from_space": "subject", + "to_space": "concept" + }, + { + "from_id": "user-bob", + "to_id": "api-query", + "relation": "can_edit", + "from_space": "subject", + "to_space": "resource" + }, + { + "from_id": "user-bob", + "to_id": "proj-analytics", + "relation": "manages", + "from_space": "subject", + "to_space": "resource" + } +] \ No newline at end of file diff --git a/apps/web/public/nodes.json b/apps/web/public/nodes.json new file mode 100644 index 0000000..b51ea4d --- /dev/null +++ b/apps/web/public/nodes.json @@ -0,0 +1,5746 @@ +[ + { + "id": "user-alice", + "space": "subject", + "node_type": "User", + "properties": { + "name": "Alice Chen", + "email": "alice@example.com", + "role": "analyst" + }, + "degree": 4 + }, + { + "id": "user-bob", + "space": "subject", + "node_type": "User", + "properties": { + "name": "Bob Kim", + "email": "bob@example.com", + "role": "engineer" + }, + "degree": 2 + }, + { + "id": "team-data", + "space": "subject", + "node_type": "Team", + "properties": { + "name": "Data Team", + "size": 5 + }, + "degree": 1 + }, + { + "id": "org-acme", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "ACME Corp", + "industry": "technology" + }, + "degree": 0 + }, + { + "id": "agent-rag", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "RAG Agent", + "model": "claude-3-5-sonnet" + }, + "degree": 3 + }, + { + "id": "proj-analytics", + "space": "resource", + "node_type": "Project", + "properties": { + "name": "Analytics Platform", + "status": "active" + }, + "degree": 2 + }, + { + "id": "ds-events", + "space": "resource", + "node_type": "Dataset", + "properties": { + "name": "User Events Dataset", + "rows": 1000000 + }, + "degree": 6 + }, + { + "id": "tool-dbt", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "dbt", + "version": "1.7" + }, + "degree": 1 + }, + { + "id": "api-query", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Query API", + "endpoint": "/v2/query" + }, + "degree": 4 + }, + { + "id": "text-001", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "text": "Alice reviewed the Q4 analytics dashboard and flagged a spike in error rates.", + "source": "slack" + }, + "degree": 3 + }, + { + "id": "log-001", + "space": "evidence", + "node_type": "LogEntry", + "properties": { + "message": "ERROR: query timeout after 30s", + "timestamp": "2026-01-15T09:23:00Z", + "severity": "ERROR" + }, + "degree": 4 + }, + { + "id": "ev-001", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "summary": "Error rate increased 40% in January 2026", + "confidence": 0.92 + }, + "degree": 3 + }, + { + "id": "con-error-rate", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Error Rate", + "unit": "percentage" + }, + "degree": 8 + }, + { + "id": "top-performance", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "System Performance", + "category": "reliability" + }, + "degree": 7 + }, + { + "id": "cls-kpi", + "space": "concept", + "node_type": "Class", + "properties": { + "name": "KPI Class", + "definition": "Measurable business indicator" + }, + "degree": 1 + }, + { + "id": "claim-perf-deg", + "space": "claim", + "node_type": "Claim", + "properties": { + "statement": "System performance degraded in Q4 2025", + "confidence": 0.87 + }, + "degree": 3 + }, + { + "id": "cov-query-vol", + "space": "claim", + "node_type": "Covariate", + "properties": { + "variable": "query_volume", + "coefficient": 0.73, + "p_value": 0.001 + }, + "degree": 0 + }, + { + "id": "comm-perf-cluster", + "space": "community", + "node_type": "Community", + "properties": { + "label": "Performance Cluster", + "algorithm": "leiden", + "size": 12 + }, + "degree": 2 + }, + { + "id": "report-perf", + "space": "community", + "node_type": "CommunityReport", + "properties": { + "title": "Performance Issues Report", + "generated_at": "2026-01-20" + }, + "degree": 1 + }, + { + "id": "out-reliability", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "System Reliability", + "target": 0.999, + "current": 0.987 + }, + "degree": 3 + }, + { + "id": "kpi-p95-latency", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "P95 Query Latency", + "target_ms": 100, + "current_ms": 145 + }, + "degree": 4 + }, + { + "id": "risk-data-loss", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Data Loss Risk", + "severity": "high", + "probability": 0.05 + }, + "degree": 1 + }, + { + "id": "lever-cache-ttl", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Cache TTL", + "unit": "seconds", + "current": 300, + "min": 60, + "max": 3600 + }, + "degree": 3 + }, + { + "id": "lever-query-limit", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Query Result Limit", + "unit": "rows", + "current": 10000, + "min": 1000, + "max": 100000 + }, + "degree": 3 + }, + { + "id": "sens-pii", + "space": "policy", + "node_type": "Sensitivity", + "properties": { + "name": "PII Sensitivity", + "level": "restricted" + }, + "degree": 1 + }, + { + "id": "rule-prod-deploy", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Production Deployment", + "approvers_required": 2 + }, + "degree": 1 + }, + { + "id": "acli_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "ACLI", + "description": "Atlassian Command Line Interface (ACLI) - a CLI tool for interacting with Atlassian Cloud products", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/" + }, + "degree": 4 + }, + { + "id": "jira_workitem_link_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira workitem link", + "description": "ACLI command for linking Jira work items", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link" + }, + "degree": 0 + }, + { + "id": "jira_command_group", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira", + "description": "ACLI command group for Jira operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira/" + }, + "degree": 0 + }, + { + "id": "admin_command_group", + "space": "resource", + "node_type": "API", + "properties": { + "name": "admin", + "description": "ACLI command group for admin operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/admin/" + }, + "degree": 0 + }, + { + "id": "jira_workitem_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item", + "description": "A unit of work tracked in Jira, viewable and manageable via ACLI" + }, + "degree": 10 + }, + { + "id": "workitem_linking_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Work Item Linking", + "description": "The concept of creating associations or relationships between Jira work items" + }, + "degree": 3 + }, + { + "id": "cli_automation_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "CLI Automation", + "description": "Use of command-line interfaces to automate interactions with Atlassian Cloud products" + }, + "degree": 1 + }, + { + "id": "atlassian_org", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Atlassian", + "description": "Atlassian - the company that develops ACLI, Jira, and related developer tools", + "url": "https://www.atlassian.com/" + }, + "degree": 2 + }, + { + "id": "jira_workitem_link_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem link", + "description": "Link work items commands in Jira via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link/", + "last_updated": "2024-10-03" + }, + "degree": 1 + }, + { + "id": "jira_workitem_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Jira Work Item Commands", + "description": "Set of CLI commands for managing Jira work items via acli", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-view/" + }, + "degree": 1 + }, + { + "id": "rovodev_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "rovodev", + "description": "Rovo Dev command group within ACLI, including auth subcommand", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 1 + }, + { + "id": "workitem_linking_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Work Item Linking", + "description": "The concept of creating relationships/links between Jira work items using the ACLI link command" + }, + "degree": 2 + }, + { + "id": "jira_workitem_link_doc", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "jira-workitem-link reference page", + "description": "Documentation page listing ACLI jira workitem subcommands and the link command reference", + "source": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link/", + "last_updated": "2024-10-03" + }, + "degree": 6 + }, + { + "id": "acli_jira_workitem", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem", + "description": "Parent CLI command group for Jira work item operations.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_link_create", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem link create", + "description": "Create links between work items", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link-create" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_link_delete", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem link delete", + "description": "Delete links between work items", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link-delete" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_link_list", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem link list", + "description": "List all the links of a work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link-list" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_link_type", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem link type", + "description": "Get available work item link types", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link-type" + }, + "degree": 1 + }, + { + "id": "acli_jira_cli", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Atlassian CLI (acli) - Jira", + "description": "Atlassian CLI toolset providing command-line access to Jira work item operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/" + }, + "degree": 1 + }, + { + "id": "jira_workitem_link", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item Link", + "description": "A relationship between two Jira work items, with typed link categories" + }, + "degree": 3 + }, + { + "id": "jira_workitem", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item", + "description": "A work item (issue, task, story, bug, etc.) in Jira that can be created, viewed, and edited" + }, + "degree": 7 + }, + { + "id": "workitem_link_type", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Work Item Link Type", + "description": "A classification of the relationship between two Jira work items (e.g. blocks, relates to, duplicates)" + }, + "degree": 2 + }, + { + "id": "acli_workitem_link_reference_page", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli jira workitem link reference page", + "description": "Documentation listing the acli jira workitem link sub-commands", + "source": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-link" + }, + "degree": 8 + }, + { + "id": "toshiba_commerce_org", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Global Commerce Solutions", + "description": "Toshiba's commerce division providing retail technology solutions across multiple industries", + "website": "https://commerce.toshiba.com" + }, + "degree": 5 + }, + { + "id": "toshiba_commerce_portal", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Toshiba Commerce Portal", + "description": "Web portal for Toshiba Commerce account sign-in and management", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home" + }, + "degree": 5 + }, + { + "id": "toshiba_enterprise_login_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Enterprise Login API", + "description": "IBM Security-based external IDP login endpoint for enterprise users", + "url": "https://www.toshibacommerce.com/mga/sps/authsvc" + }, + "degree": 1 + }, + { + "id": "retail_solutions", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Innovative Retail Solutions", + "description": "Modular and adaptable retail technology solutions for in-store, online, and mobile shopping experiences" + }, + "degree": 8 + }, + { + "id": "operational_excellence", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Operational Excellence", + "description": "Adapting to market needs and ensuring efficient, agile, and secure retail operations" + }, + "degree": 7 + }, + { + "id": "modular_adaptable_solutions", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Modular Adaptable Solutions", + "description": "Technology approach that allows experimentation, addresses labor challenges, and enhances security through modularity" + }, + "degree": 7 + }, + { + "id": "retail_journey_excellence", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Journey to Excellence", + "description": "Framework leveraging deep retail expertise, advisory services, and cutting-edge technologies to design customer retail journeys" + }, + "degree": 3 + }, + { + "id": "customer_shopping_experience", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Customer Shopping Experience", + "description": "Memorable and unique shopping experiences for customers across online, in-store, and mobile channels" + }, + "degree": 4 + }, + { + "id": "business_success", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Business Success", + "description": "Sustained business success driven by intentional solutions and efficient operations" + }, + "degree": 3 + }, + { + "id": "security_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Security Risk", + "description": "Security challenges in retail technology addressed through modular and adaptable solutions" + }, + "degree": 1 + }, + { + "id": "advisory_services_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Advisory Services", + "description": "Toshiba advisory services that help retailers design and optimize their retail journeys" + }, + "degree": 3 + }, + { + "id": "toshiba_marketing_page_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Toshiba Commerce Marketing Page", + "description": "Marketing page content describing Toshiba's retail solutions vision: Craft Unique Journeys, Innovate with Confidence, Be Agile & Secure, Sustain Your Success", + "source": "https://commerce.toshiba.com/wps/portal/marketing" + }, + "degree": 12 + }, + { + "id": "toshiba_global_commerce_solutions", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Global Commerce Solutions", + "description": "A division of Toshiba focused on retail commerce technology solutions, including POS systems and retail industry innovations.", + "website": "https://commerce.toshiba.com" + }, + "degree": 0 + }, + { + "id": "convenience_fuel_retail", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Convenience & Fuel Retail", + "description": "High-velocity retail segment focused on accelerating transactions and maximizing efficiency for convenience stores and fuel stations" + }, + "degree": 5 + }, + { + "id": "grocery_general_merchandise_retail", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Grocery & General Merchandise Retail", + "description": "Modern grocery retail solutions focused on frictionless experiences and operational agility" + }, + "degree": 6 + }, + { + "id": "hospitality_entertainment_retail", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Hospitality & Entertainment Retail", + "description": "Retail solutions for hospitality and entertainment venues including check-in, concessions, and show experiences" + }, + "degree": 4 + }, + { + "id": "specialty_retail", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Specialty Retail", + "description": "Retail solutions tailored for specialty retail segments" + }, + "degree": 2 + }, + { + "id": "transaction_acceleration", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Transaction Acceleration", + "description": "KPI measuring speed and throughput of retail transactions in high-velocity environments" + }, + "degree": 1 + }, + { + "id": "operational_agility", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Operational Agility", + "description": "KPI measuring flexibility and responsiveness of retail operations" + }, + "degree": 2 + }, + { + "id": "frictionless_customer_experience", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Frictionless Customer Experience", + "description": "Outcome of removing barriers and streamlining the customer journey in retail settings" + }, + "degree": 1 + }, + { + "id": "toshiba_industry_page_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Toshiba Industry Solutions Page Content", + "description": "Marketing text describing Toshiba's retail solutions across convenience/fuel, grocery, hospitality/entertainment, and specialty retail industries", + "source_url": "https://commerce.toshiba.com/wps/portal/marketing" + }, + "degree": 4 + }, + { + "id": "toshiba_tgcs_org", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Global Commerce Solutions", + "description": "Provider of retail commerce technology solutions including hardware and software platforms", + "website": "https://commerce.toshiba.com" + }, + "degree": 2 + }, + { + "id": "mxp_hardware", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "MxP", + "description": "Toshiba modular hardware product supporting retail point-of-sale and commerce operations", + "url": "https://commerce.toshiba.com/.../hardware/mxp", + "category": "hardware" + }, + "degree": 2 + }, + { + "id": "elera_platform", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "ELERA", + "description": "Toshiba software solutions platform supporting unified retail commerce", + "url": "https://commerce.toshiba.com/.../software/solutions-platform/elera", + "category": "software" + }, + "degree": 2 + }, + { + "id": "modularity_description_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Modularity Section Text", + "description": "Adaptable solutions designed to grow with your business. Modular hardware and software allow configuration, upgrade, and expansion without disruption.", + "source": "toshiba_marketing_page" + }, + "degree": 3 + }, + { + "id": "security_description_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Security Section Text", + "description": "Built-in protection safeguarding data, transactions, and devices against evolving threats while maintaining customer trust and compliance.", + "source": "toshiba_marketing_page" + }, + "degree": 1 + }, + { + "id": "modularity_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Modularity", + "description": "Adaptable, configurable, and expandable system design allowing upgrades without disruption; technology that evolves alongside retail needs" + }, + "degree": 8 + }, + { + "id": "security_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Security", + "description": "Built-in protection for data, transactions, and devices against evolving threats; supports customer trust and regulatory compliance" + }, + "degree": 9 + }, + { + "id": "retail_technology_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Technology", + "description": "The domain of hardware and software solutions designed to support and modernize retail operations." + }, + "degree": 3 + }, + { + "id": "unified_retail_future_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Unified Retail Future", + "description": "A strategic vision for smarter, more integrated retail operations enabled by adaptable and secure technology platforms." + }, + "degree": 3 + }, + { + "id": "retail_scalability_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retail Scalability", + "description": "The ability of retail businesses to grow and adapt their technology infrastructure without disruption." + }, + "degree": 2 + }, + { + "id": "customer_trust_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Customer Trust", + "description": "Maintaining and strengthening customer trust through secure and compliant retail transactions" + }, + "degree": 4 + }, + { + "id": "modular_architecture_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Modular Architecture", + "description": "Configurable, upgradeable hardware and software systems that allow retailers to expand without disruption" + }, + "degree": 3 + }, + { + "id": "built_in_security_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Built-in Security", + "description": "Integrated security features protecting data, transactions, and devices in retail commerce systems" + }, + "degree": 3 + }, + { + "id": "toshiba_tgcs", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Global Commerce Solutions", + "description": "Trusted partner for retail commerce experiences, #1 worldwide share of EPOS installations, 205k+ POS and self-checkout units", + "url": "https://commerce.toshiba.com" + }, + "degree": 3 + }, + { + "id": "iot_suite", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "IoT Suite", + "description": "IoT suite software solution offered by Toshiba TGCS", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/.../?1dmy&urile=wcm%3apath%3a%2Fen-us%2Fhome%2Fsoftware%2Fiot-suite" + }, + "degree": 2 + }, + { + "id": "elera_loss_prevention", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "ELERA® Loss Prevention", + "description": "Loss prevention software solution under the ELERA brand and IoT Suite offering by Toshiba TGCS", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/.../?1dmy&urile=wcm%3apath%3a%2Fen-us%2Fhome%2Fsoftware%2Fiot-suite%2Floss-prevention" + }, + "degree": 2 + }, + { + "id": "retail_transformation_services", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Retail Transformation Services", + "description": "Implementation and transformation services for retail operations offered by Toshiba TGCS", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/.../?1dmy&urile=wcm%3apath%3a%2Fen-us%2Fhome%2Fservices%2Fimplement%2Fretail-services" + }, + "degree": 2 + }, + { + "id": "serviceability", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Serviceability", + "description": "Maximizing uptime and minimizing effort through easy maintenance, quick repairs, and hassle-free updates to keep systems running smoothly" + }, + "degree": 4 + }, + { + "id": "loss_prevention", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Loss Prevention", + "description": "Retail loss prevention capability addressing shrinkage and theft in commerce environments" + }, + "degree": 3 + }, + { + "id": "epos_installations", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "EPOS Installations", + "description": "Electronic Point of Sale installations; Toshiba holds #1 worldwide market share" + }, + "degree": 5 + }, + { + "id": "pos_self_checkout", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "POS and Self-Checkout", + "description": "Point of Sale and self-checkout units; 205k+ units deployed globally" + }, + "degree": 5 + }, + { + "id": "epos_market_share_kpi", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "EPOS Market Share", + "description": "#1 worldwide share of EPOS installations", + "value": "#1 worldwide" + }, + "degree": 1 + }, + { + "id": "pos_units_kpi", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "POS and Self-Checkout Units", + "description": "205,000+ POS and self-checkout units deployed", + "value": "205k+" + }, + "degree": 1 + }, + { + "id": "retail_loss_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Retail Loss Risk", + "description": "Risk of inventory shrinkage and theft in retail commerce environments" + }, + "degree": 2 + }, + { + "id": "system_uptime_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Maximized System Uptime", + "description": "Outcome of serviceability: systems running smoothly and business remaining productive" + }, + "degree": 1 + }, + { + "id": "toshiba_commerce", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Commerce", + "description": "Toshiba's retail commerce division offering innovative retail solutions", + "url": "https://commerce.toshiba.com" + }, + "degree": 5 + }, + { + "id": "toshiba_marketplace", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Toshiba Commerce Marketplace", + "description": "A platform connecting retailers and solution providers, offering tools and partnerships to foster growth and success", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/" + }, + "degree": 1 + }, + { + "id": "retail_technology", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Technology", + "description": "The domain of technology solutions and platforms serving the retail industry" + }, + "degree": 3 + }, + { + "id": "marketplace_platform", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Marketplace Platform", + "description": "A robust platform concept connecting retailers with solution providers and enabling partnerships" + }, + "degree": 3 + }, + { + "id": "retailer_growth_success", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retailer Growth and Success", + "description": "The intended outcome of fostering growth and success for retailers using the Toshiba Commerce Marketplace" + }, + "degree": 2 + }, + { + "id": "top_retailers_community", + "space": "community", + "node_type": "Community", + "properties": { + "name": "Top Retailers Community", + "description": "The community of top retailers connected through the Toshiba Commerce Marketplace" + }, + "degree": 2 + }, + { + "id": "idc_org", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "IDC (International Data Corporation)", + "description": "Research and analysis firm that publishes MarketScape vendor assessments" + }, + "degree": 0 + }, + { + "id": "google_org", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Google", + "description": "Technology company providing Google Distributed Cloud and edge computing solutions for retail" + }, + "degree": 2 + }, + { + "id": "keswani_agent", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Keswani", + "description": "Speaker/participant in the NRF Video Spotlight discussion on modern edge strategy" + }, + "degree": 0 + }, + { + "id": "lakoski_agent", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Lakoski", + "description": "Speaker/participant in the NRF Video Spotlight discussion on modern edge strategy" + }, + "degree": 0 + }, + { + "id": "elera_commerce_platform", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "ELERA® Commerce Platform", + "description": "Toshiba's cloud-native commerce platform that extends cloud capabilities into physical retail stores", + "owner": "Toshiba Global Commerce Solutions" + }, + "degree": 2 + }, + { + "id": "google_distributed_cloud", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Google Distributed Cloud", + "description": "Google's distributed cloud infrastructure enabling edge computing in retail store environments" + }, + "degree": 1 + }, + { + "id": "tu_idc_leader_claim", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Toshiba IDC Leader Recognition", + "description": "IDC covers the evolution of POS systems from transaction terminals to comprehensive commerce hubs, along with cloud-native, API-first, microservices architectures; Toshiba named a Leader", + "source_doc": "idc_marketscape_pos_2026_article" + }, + "degree": 2 + }, + { + "id": "tu_edge_strategy_discussion", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Edge Strategy Discussion Text", + "description": "Keswani and Lakoski explore how retailers can build a modern edge strategy supporting operational stability and long-term innovation via edge computing and cloud integration", + "source_doc": "nrf_video_spotlight_google_edge" + }, + "degree": 2 + }, + { + "id": "tu_nrf_2026_event_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "NRF 2026 Event Description", + "description": "Retail's rapid revolution is here; journey, challenges, and growth badges described in NRF 2026 event context", + "source_doc": "nrf_2026_event_article" + }, + "degree": 0 + }, + { + "id": "pos_software_concept", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Point-of-Sale (POS) Software", + "description": "Software systems used in retail for transaction processing and commerce management, evolving into comprehensive commerce hubs" + }, + "degree": 4 + }, + { + "id": "edge_computing_concept", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Edge Computing", + "description": "Computing paradigm allowing retailers to process critical information directly within store environments while maintaining cloud integration" + }, + "degree": 5 + }, + { + "id": "cloud_native_architecture_concept", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Cloud-Native, API-First, Microservices Architecture", + "description": "Modern software architecture supporting retailer extension, configuration, and self-enablement in commerce platforms" + }, + "degree": 5 + }, + { + "id": "retail_technology_concept", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Technology", + "description": "Broad domain covering POS systems, commerce platforms, edge computing, and digital transformation in retail" + }, + "degree": 2 + }, + { + "id": "outcome_retail_operational_stability", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retail Operational Stability", + "description": "Sustained and reliable retail operations enabled through modern edge and cloud-native strategies" + }, + "degree": 2 + }, + { + "id": "outcome_retail_innovation", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Long-Term Retail Innovation", + "description": "Ability for retailers to deploy new solutions more quickly and achieve long-term innovation through flexible commerce platforms" + }, + "degree": 3 + }, + { + "id": "lever_cloud_native_adoption", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Adoption of Cloud-Native, API-First Architecture", + "description": "Adopting cloud-native, API-first, microservices architectures to enable retailer self-enablement and faster innovation" + }, + "degree": 2 + }, + { + "id": "lever_edge_computing_deployment", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Edge Computing Deployment in Stores", + "description": "Deploying edge computing within physical store environments to process critical information locally" + }, + "degree": 3 + }, + { + "id": "future_of_retail", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Future of Retail", + "description": "Overarching theme covering company announcements, industry trends, and Toshiba's strategic role in shaping retail innovation." + }, + "degree": 5 + }, + { + "id": "retail_segments", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Segments", + "description": "Categories of retail including Fashion & Apparel, Food Service, Gas & Convenience, Grocery, Mass Merchandise, Pharmacy/Drug Store, and Specialty" + }, + "degree": 1 + }, + { + "id": "email_marketing_consent", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Email Marketing Consent", + "description": "User opt-in for Toshiba Global Commerce Solutions email marketing communications" + }, + "degree": 1 + }, + { + "id": "retail_industry_engagement", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retail Industry Engagement", + "description": "Desired outcome of connecting with retailers, partners, suppliers, and analysts to drive commerce solution adoption." + }, + "degree": 2 + }, + { + "id": "toshiba_team_members", + "space": "subject", + "node_type": "Team", + "properties": { + "name": "Toshiba Support Team", + "description": "Team members who follow up on customer contact form submissions" + }, + "degree": 0 + }, + { + "id": "recaptcha_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "reCAPTCHA", + "description": "Google reCAPTCHA bot-detection tool used on the contact form page" + }, + "degree": 0 + }, + { + "id": "contact_success_message", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Contact Form Success Message", + "description": "Confirmation message displayed after a user successfully submits a contact form: 'Thank you for reaching out. One of our team members will be in contact soon.'", + "source_url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/" + }, + "degree": 1 + }, + { + "id": "customer_contact_request", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Customer Contact Request", + "description": "The act of a user reaching out to Toshiba via the marketing portal contact form" + }, + "degree": 2 + }, + { + "id": "customer_followup_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Customer Follow-Up", + "description": "A Toshiba team member contacts the user following a successful form submission" + }, + "degree": 1 + }, + { + "id": "google_recaptcha_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Google reCAPTCHA API", + "description": "Google reCAPTCHA v2 image challenge API used for bot verification on the Toshiba Commerce site", + "endpoint": "https://www.google.com/recaptcha/api2/payload", + "site_key": "6LfEPr0ZAAAAAKeWnaDdJplumzeVbvrxPPSSSQ92" + }, + "degree": 2 + }, + { + "id": "recaptcha_challenge", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "reCAPTCHA Challenge", + "description": "A CAPTCHA mechanism using image-based challenges served by Google to distinguish humans from bots" + }, + "degree": 2 + }, + { + "id": "bot_abuse_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Bot Abuse Risk", + "description": "Risk of automated bots accessing or abusing the commerce marketing portal without CAPTCHA protection" + }, + "degree": 2 + }, + { + "id": "merge_train", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Train", + "description": "A queue mechanism for merge requests to ensure all changes work together before merging to the default branch" + }, + "degree": 26 + }, + { + "id": "merge_train_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Train Pipeline", + "description": "A CI pipeline that verifies changes can merge into the default branch as part of a merge train" + }, + "degree": 13 + }, + { + "id": "merged_results_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merged Results Pipeline", + "description": "A pipeline that runs on the combined changes of source and target branches; the first merge train pipeline is equivalent to this" + }, + "degree": 4 + }, + { + "id": "merge_request", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request", + "description": "A GitLab mechanism to propose, review, and merge code changes into a branch" + }, + "degree": 9 + }, + { + "id": "auto_merge", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Auto-Merge (Set to auto-merge)", + "description": "Feature introduced in GitLab 16.0 replacing 'Start merge train' and 'Start merge train when pipeline succeeds' buttons" + }, + "degree": 6 + }, + { + "id": "fast_forward_merge", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Fast-Forward Merge", + "description": "A merge method in GitLab; revert of fast-forwarded commits is supported from GitLab 16.9 under specific conditions" + }, + "degree": 2 + }, + { + "id": "semi_linear_merge", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Semi-Linear Merge", + "description": "A merge commit with semi-linear history method supported by merge trains since GitLab 16.5" + }, + "degree": 2 + }, + { + "id": "default_branch", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Default Branch", + "description": "The primary branch in a GitLab project where merge requests are merged into" + }, + "degree": 1 + }, + { + "id": "merge_conflict_reduction", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Reduced Merge Conflicts", + "description": "Reduction of conflicts between merge requests when merging frequently to the default branch" + }, + "degree": 2 + }, + { + "id": "devops_efficiency", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "DevOps Efficiency", + "description": "Improved efficiency for DevOps teams through the use of merge trains" + }, + "degree": 2 + }, + { + "id": "merge_queue", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Merge Queue", + "description": "Queuing mechanism provided by merge trains to serialize and validate merge requests" + }, + "degree": 3 + }, + { + "id": "merge_trains_intro_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Merge Trains Introduction", + "description": "Introductory text describing merge trains, their purpose, and workflow from the GitLab documentation" + }, + "degree": 6 + }, + { + "id": "gitlab_ci_cd", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab CI/CD", + "description": "GitLab's continuous integration and delivery system that manages pipelines and merge trains" + }, + "degree": 2 + }, + { + "id": "target_branch", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Target Branch", + "description": "The branch that the merge request proposes to merge changes into; used as the comparison baseline in the diff" + }, + "degree": 3 + }, + { + "id": "automatic_pipeline_cancellation", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Automatic Pipeline Cancellation", + "description": "GitLab CI/CD feature that detects and cancels redundant pipelines to conserve resources" + }, + "degree": 6 + }, + { + "id": "redundant_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Redundant Pipeline", + "description": "A merge train pipeline that is no longer valid because the combined changes it was comparing against have changed" + }, + "degree": 4 + }, + { + "id": "pipeline_failure", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipeline Failure", + "description": "A condition where a merge train pipeline does not complete successfully, causing removal of its merge request from the train" + }, + "degree": 3 + }, + { + "id": "parallel_execution", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Parallel Execution", + "description": "The simultaneous running of multiple merge train pipelines to speed up validation and prevent commits from breaking the default branch" + }, + "degree": 2 + }, + { + "id": "default_branch_stability", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Default Branch Stability", + "description": "The goal of preventing broken commits from entering the default branch" + }, + "degree": 2 + }, + { + "id": "pipeline_resource_waste", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Pipeline Resource Waste", + "description": "Unnecessary consumption of CI/CD compute resources by redundant pipelines" + }, + "degree": 4 + }, + { + "id": "skip_merge_train", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Skip Merge Train and Merge Immediately", + "description": "An action that bypasses the merge train queue and merges directly, triggering cancellation of related redundant pipelines" + }, + "degree": 4 + }, + { + "id": "remove_mr_from_train", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Remove Merge Request from Merge Train", + "description": "An action that removes a merge request from the queue, causing downstream pipelines to be canceled and recreated" + }, + "degree": 2 + }, + { + "id": "merge_train_example_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Merge Train ABC Example", + "description": "Textual example describing three merge requests A, B, C on a merge train and the behavior when pipeline B fails" + }, + "degree": 5 + }, + { + "id": "automatic_cancellation_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Automatic Pipeline Cancellation Description", + "description": "Documentation section describing when and why GitLab cancels redundant merge train pipelines" + }, + "degree": 3 + }, + { + "id": "gitlab_project", + "space": "resource", + "node_type": "Project", + "properties": { + "name": "GitLab Project", + "description": "A GitLab project containing merge requests, commits, and a repository" + }, + "degree": 2 + }, + { + "id": "merge_trains_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merge Trains", + "description": "GitLab CI feature that queues merge requests and runs pipelines for combined changes before merging" + }, + "degree": 0 + }, + { + "id": "merge_request_pipelines_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merge Request Pipelines", + "description": "Pipelines configured to run on merge requests, prerequisite for merge trains" + }, + "degree": 1 + }, + { + "id": "merged_results_pipelines_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merged Results Pipelines", + "description": "Pipelines that run on the merged result of the source and target branch, must be enabled for merge trains" + }, + "degree": 1 + }, + { + "id": "auto_merge_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Auto-Merge (Set to auto-merge)", + "description": "Feature to automatically merge a merge request when its pipeline succeeds, used when a pipeline is already running on a merge train" + }, + "degree": 0 + }, + { + "id": "merge_train_queue", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Train Queue", + "description": "The ordered queue of merge requests waiting to be merged via the merge train" + }, + "degree": 4 + }, + { + "id": "merge_method", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Method", + "description": "The method used to merge commits; in GitLab 16.4 and earlier must be 'Merge commit'; from 16.5 any method is supported" + }, + "degree": 3 + }, + { + "id": "merge_train_visualization", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Merge Train Visualization", + "description": "Visual representation of the merge train queue introduced in GitLab 17.3" + }, + "degree": 1 + }, + { + "id": "maintainer_role_requirement", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Maintainer Role Requirement", + "description": "User must have the Maintainer role to enable merge trains" + }, + "degree": 0 + }, + { + "id": "stuck_merge_request_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Stuck Merge Request Risk", + "description": "Merge requests may become stuck in an unresolved state or pipelines dropped if merge request pipelines are not configured correctly" + }, + "degree": 1 + }, + { + "id": "merge_train_started_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Merge Train Started", + "description": "A new merge train is started and the merge request becomes the first in the queue" + }, + "degree": 1 + }, + { + "id": "merge_trains_doc_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Merge Trains Documentation Text", + "description": "Source documentation text from docs.gitlab.com describing how to enable, start, and view merge trains", + "source": "https://docs.gitlab.com/ci/pipelines/merge_trains" + }, + "degree": 7 + }, + { + "id": "ci_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "CI Pipeline", + "description": "A GitLab CI pipeline containing jobs, accessible via pipeline details page and pipeline path" + }, + "degree": 11 + }, + { + "id": "merge_train_pipeline_limit", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Train Parallel Pipeline Limit", + "description": "Instance-level limit on the number of pipelines a merge train can run in parallel; default is 20, configurable via administration settings" + }, + "degree": 3 + }, + { + "id": "merge_train_queue_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Merge Train Queue Management", + "description": "Merge requests beyond the parallel pipeline limit are queued indefinitely until a pipeline slot becomes available" + }, + "degree": 2 + }, + { + "id": "parallel_pipeline_limit_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Parallel Pipeline Limit Setting", + "description": "Administrative control to adjust the maximum number of merge train pipelines that run in parallel; default is 20" + }, + "degree": 2 + }, + { + "id": "auto_merge_history_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Auto-Merge Feature History", + "description": "Version history entries for auto-merge on merge trains: introduced GitLab 17.2 behind flag, enabled on GitLab.com 17.2, default 17.4, GA 17.7 with flag removed" + }, + "degree": 2 + }, + { + "id": "merge_immediately_option", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merge Immediately Option", + "description": "Option to merge a merge request immediately, bypassing the merge train queue, which cancels existing train pipelines and restarts the train" + }, + "degree": 0 + }, + { + "id": "merge_trains_skip_train_feature", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merge Immediately Without Restarting Merge Train Pipelines", + "description": "Experimental feature (flag: merge_trains_skip_train) introduced in GitLab 16.5, enabled in 16.10, allowing merge requests to skip the merge train without restarting running pipelines", + "status": "Experiment", + "feature_flag": "merge_trains_skip_train", + "introduced_version": "GitLab 16.5", + "enabled_version": "GitLab 16.10", + "default_state": "available on Self-Managed and GitLab.com and GitLab Dedicated" + }, + "degree": 0 + }, + { + "id": "fast_forward_merge_method", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Fast-Forward Merge Method", + "description": "A Git merge method that requires the source branch to be up to date with the target branch; incompatible with merge immediately and skip train features" + }, + "degree": 2 + }, + { + "id": "semi_linear_merge_method", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Semi-Linear Merge Method", + "description": "A Git merge method incompatible with the skip-train feature" + }, + "degree": 2 + }, + { + "id": "faster_merge_throughput", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Faster Merge Throughput", + "description": "The desired outcome of quickly merging security fixes, bug fixes, or minor documentation updates without waiting for the full merge train to complete" + }, + "degree": 3 + }, + { + "id": "gitlab_administrator", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "GitLab Administrator", + "description": "Administrator of a GitLab Self-Managed instance who can enable or disable the merge_trains_skip_train feature flag" + }, + "degree": 0 + }, + { + "id": "merge_requests_merge_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Merge Requests Merge API Endpoint", + "description": "GitLab API endpoint to merge a merge request, supports skip_merge_train attribute", + "url": "https://docs.gitlab.com/api/merge_requests/#merge-a-merge-request" + }, + "degree": 1 + }, + { + "id": "draft_merge_request", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Draft Merge Request", + "description": "A merge request marked as draft, which causes it to be dropped from the merge train" + }, + "degree": 2 + }, + { + "id": "merge_conflict", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Conflict", + "description": "A conflict between branches that causes a merge request to be dropped from the merge train" + }, + "degree": 2 + }, + { + "id": "unresolved_thread", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Unresolved Conversation Thread", + "description": "An open discussion thread on a merge request that, when all-threads-must-be-resolved is enabled, causes the MR to be dropped from the merge train" + }, + "degree": 2 + }, + { + "id": "risk_mr_dropped_from_train", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Merge Request Dropped from Merge Train", + "description": "Risk that a merge request is automatically dropped from the merge train if it becomes unmergeable during pipeline execution" + }, + "degree": 4 + }, + { + "id": "policy_all_threads_resolved", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "All Threads Must Be Resolved", + "description": "A merge request setting that requires all conversation threads to be resolved before merging; unresolved threads cause MR to be dropped from merge train", + "url": "https://docs.gitlab.com/user/project/merge_requests/#prevent-merge-unless-all-threads-are-resolved" + }, + "degree": 0 + }, + { + "id": "textunit_merge_train_settings", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Merge Train Settings Instructions", + "description": "Step-by-step instructions to enable merged results pipelines and merge trains in GitLab project settings" + }, + "degree": 4 + }, + { + "id": "textunit_troubleshooting", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Merge Train Troubleshooting Section", + "description": "Documentation section covering common issues: MR dropped from train, cannot use auto-merge, cannot retry pipeline" + }, + "degree": 4 + }, + { + "id": "retry_keyword", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "retry keyword", + "description": "A GitLab CI YAML keyword that allows a job to be retried automatically if it fails", + "url": "https://docs.gitlab.com/ci/yaml/#retry" + }, + "degree": 2 + }, + { + "id": "pipelines_must_succeed_setting", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipelines must succeed", + "description": "A GitLab project setting that requires a successful pipeline before a merge request can be merged", + "url": "https://docs.gitlab.com/user/project/merge_requests/auto_merge/#require-a-successful-pipeline-for-merge" + }, + "degree": 2 + }, + { + "id": "failed_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Failed Pipeline", + "description": "A CI pipeline that did not complete successfully, blocking merge train re-entry" + }, + "degree": 4 + }, + { + "id": "cannot_add_mr_to_train_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Cannot Add Merge Request to Merge Train", + "description": "Risk condition where a merge request cannot be added to a merge train because the latest pipeline failed and Pipelines must succeed is enabled", + "related_issue": "https://gitlab.com/gitlab-org/gitlab/-/issues/35135" + }, + "degree": 6 + }, + { + "id": "retry_failed_job_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Retry Failed Job", + "description": "Action of retrying a failed CI job to attempt pipeline success without pushing new code" + }, + "degree": 2 + }, + { + "id": "rerun_pipeline_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Rerun Whole Pipeline", + "description": "Action of re-triggering the entire CI pipeline from the Pipelines tab" + }, + "degree": 2 + }, + { + "id": "push_new_commit_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Push New Commit", + "description": "Action of pushing a new commit that fixes the issue, which also triggers a new pipeline" + }, + "degree": 2 + }, + { + "id": "cannot_add_mr_textunit", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Cannot Add MR to Merge Train Text", + "description": "Documentation section describing the error condition and remediation steps when a merge request cannot be added to a merge train", + "source": "merge_trains_doc" + }, + "degree": 5 + }, + { + "id": "jira_workitem_attachment_delete_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira workitem attachment delete", + "description": "ACLI command to delete attachments from a Jira work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-attachment-delete" + }, + "degree": 0 + }, + { + "id": "jira_workitem_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem", + "description": "CLI command group for Jira work item operations", + "source_url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem/" + }, + "degree": 0 + }, + { + "id": "jira_attachment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Attachment", + "description": "A file or media object attached to a Jira work item" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem", + "description": "Jira work item commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_attachment_delete_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem attachment-delete", + "description": "CLI command to delete an attachment from a Jira work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-attachment-delete/", + "last_updated": "2024-10-03" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_attachment_list_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem attachment-list", + "description": "CLI command to list attachments on a Jira work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-attachment-list/" + }, + "degree": 0 + }, + { + "id": "acli_rovodev_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli rovodev", + "description": "Rovo Dev command group in the Atlassian CLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 0 + }, + { + "id": "acli_rovodev_auth_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli rovodev auth", + "description": "Authentication command for the Rovo Dev CLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev-auth/" + }, + "degree": 0 + }, + { + "id": "attachment_management_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Attachment Management", + "description": "The ability to add, list, and delete file attachments associated with Jira work items" + }, + "degree": 1 + }, + { + "id": "cli_command_reference_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "CLI Command Reference", + "description": "Reference documentation topic covering available ACLI commands for interacting with Atlassian products such as Jira." + }, + "degree": 2 + }, + { + "id": "jira_workitem_attachment_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem attachment", + "description": "Work item attachments commands for Jira via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-attachment" + }, + "degree": 0 + }, + { + "id": "jira_workitem_attachment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item Attachment", + "description": "Attachments associated with Jira work items (issues)" + }, + "degree": 2 + }, + { + "id": "acli_reference_commands", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "ACLI Reference Commands", + "description": "Reference documentation for ACLI command-line interface commands" + }, + "degree": 1 + }, + { + "id": "atlassian_rovo_mcp_server", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Atlassian Rovo MCP Server", + "description": "Remote MCP server provided by Atlassian for connecting AI clients to Jira, Confluence, and Compass", + "endpoint_legacy": "https://mcp.atlassian.com/v1/sse", + "endpoint_current": "https://mcp.atlassian.com/v1/mcp/authv2", + "deprecation_date": "2026-06-30" + }, + "degree": 5 + }, + { + "id": "atlassian_api_token", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Atlassian API Token", + "description": "API token used for authenticating MCP clients against the Atlassian Rovo MCP Server", + "url": "https://id.atlassian.com/manage-profile/security/api-tokens" + }, + "degree": 0 + }, + { + "id": "oauth_2_1", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "OAuth 2.1", + "description": "Authorization protocol used as the primary authentication flow for MCP clients connecting to Atlassian Rovo MCP Server" + }, + "degree": 1 + }, + { + "id": "api_token_auth", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "API Token Authentication", + "description": "Authentication method via API tokens for MCP clients; can be enabled or disabled by organization admins" + }, + "degree": 2 + }, + { + "id": "openai_chatgpt_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "OpenAI ChatGPT", + "description": "Supported MCP client from OpenAI", + "url": "https://platform.openai.com/docs/overview" + }, + "degree": 1 + }, + { + "id": "claude_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Claude", + "description": "Supported MCP client from Anthropic", + "url": "https://www.anthropic.com/claude" + }, + "degree": 1 + }, + { + "id": "docker_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Docker", + "description": "Supported MCP client from Docker", + "url": "http://mcp.docker.com" + }, + "degree": 1 + }, + { + "id": "google_gemini_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Google Gemini", + "description": "Supported MCP client from Google", + "url": "https://github.com/google-gemini/gemini-cli" + }, + "degree": 1 + }, + { + "id": "amazon_quick_suite_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "Amazon Quick Suite", + "description": "Supported MCP client from Amazon AWS", + "url": "https://docs.aws.amazon.com/quicksuite/latest/userguide/mcp-integration.html" + }, + "degree": 1 + }, + { + "id": "atlassian_cloud_site", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Atlassian Cloud Site", + "description": "Cloud-hosted Atlassian environment with Jira, Compass, and/or Confluence required as a prerequisite" + }, + "degree": 0 + }, + { + "id": "sse_endpoint_deprecation_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "SSE Endpoint Deprecation Risk", + "description": "After 30th June 2026, usage of https://mcp.atlassian.com/v1/sse as server endpoint will no longer be supported, risking broken integrations for clients that have not migrated" + }, + "degree": 1 + }, + { + "id": "atlassian_remote_mcp_server", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Atlassian Remote MCP Server", + "description": "Atlassian's remote Model Context Protocol server product" + }, + "degree": 2 + }, + { + "id": "mcp_client_security_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "MCP Client Security Risk", + "description": "Potential security risks introduced by MCP clients when connecting to MCP servers." + }, + "degree": 1 + }, + { + "id": "mcp_client", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "MCP Client", + "description": "A client application that communicates with MCP (Model Context Protocol) servers." + }, + "degree": 2 + }, + { + "id": "mcp_server", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "MCP Server", + "description": "A Model Context Protocol server that exposes tools and data to MCP clients." + }, + "degree": 1 + }, + { + "id": "jira_field_create_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira field create", + "description": "ACLI command to create a Jira field", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field-create/" + }, + "degree": 0 + }, + { + "id": "jira_field_delete_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira field delete", + "description": "ACLI command to delete a Jira field", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field-delete/" + }, + "degree": 0 + }, + { + "id": "jira_field_cancel_delete_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira field cancel-delete", + "description": "ACLI command to cancel deletion of a Jira field", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field-cancel-delete/" + }, + "degree": 0 + }, + { + "id": "jira_field_group", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira field", + "description": "ACLI command group for managing Jira fields", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field/" + }, + "degree": 0 + }, + { + "id": "jira_auth_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira auth", + "description": "ACLI command for Jira authentication", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-auth/" + }, + "degree": 0 + }, + { + "id": "jira_board_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira board", + "description": "ACLI command for Jira board operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-board/" + }, + "degree": 0 + }, + { + "id": "jira_dashboard_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira dashboard", + "description": "ACLI command for Jira dashboard operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-dashboard/" + }, + "degree": 0 + }, + { + "id": "jira_field_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Field", + "description": "A configurable data field within Jira used to capture issue attributes" + }, + "degree": 2 + }, + { + "id": "cli_commands_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "CLI Commands", + "description": "Command-line interface commands used to automate and manage Atlassian cloud resources" + }, + "degree": 2 + }, + { + "id": "acli_jira_field_create", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira field create", + "description": "CLI command to create a custom field in Jira", + "syntax": "acli jira field create [flags]", + "last_updated": "2024-10-03" + }, + "degree": 6 + }, + { + "id": "acli_jira_field", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira field", + "description": "Parent CLI command group for Jira field commands" + }, + "degree": 0 + }, + { + "id": "jira_custom_field_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Jira Custom Field API", + "description": "Atlassian Jira API endpoint for creating and managing custom fields" + }, + "degree": 0 + }, + { + "id": "jira_custom_field", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Custom Field", + "description": "A user-defined field in Jira that extends default issue fields, configurable with a name, type, description, and searcher key" + }, + "degree": 4 + }, + { + "id": "custom_field_type", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Custom Field Type", + "description": "The type identifier for a Jira custom field, e.g. textfield, select, datepicker, using com.atlassian.jira.plugin.system.customfieldtypes namespace" + }, + "degree": 2 + }, + { + "id": "custom_field_searcher", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Custom Field Searcher Key", + "description": "Optional searcher key that enables searching on a custom field, e.g. multiselectsearcher" + }, + "degree": 2 + }, + { + "id": "example_text_field", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Example: Create a text field", + "content": "acli jira field create --name \"Customer Name\" --type \"com.atlassian.jira.plugin.system.customfieldtypes:textfield\"" + }, + "degree": 5 + }, + { + "id": "example_select_field", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Example: Create a select field with searcher", + "content": "acli jira field create --name \"Priority Level\" --type \"com.atlassian.jira.plugin.system.customfieldtypes:select\" --searcherKey \"com.atlassian.jira.plugin.system.customfieldtypes:multiselectsearcher\"" + }, + "degree": 3 + }, + { + "id": "example_date_field", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Example: Create a field with description", + "content": "acli jira field create --name \"Release Date\" --type \"com.atlassian.jira.plugin.system.customfieldtypes:datepicker\" --description \"The planned release date for this feature\"" + }, + "degree": 3 + }, + { + "id": "jira_workitem_view_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira workitem view", + "description": "ACLI command to view a Jira work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-view" + }, + "degree": 1 + }, + { + "id": "atlassian_cli_reference", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Atlassian CLI Reference", + "description": "Reference documentation for all ACLI commands including admin, jira, feedback subcommands" + }, + "degree": 1 + }, + { + "id": "rovodev_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "rovodev", + "description": "Rovo Dev CLI tool available via acli, including authentication support", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 0 + }, + { + "id": "jira_workitem_comment_management", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Jira Work Item Comment Management", + "description": "Set of CLI operations for managing comments on Jira work items: comment-create, comment-delete, comment-list, comment-update, comment-visibility" + }, + "degree": 1 + }, + { + "id": "jira_workitem_attachment_management", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Jira Work Item Attachment Management", + "description": "Set of CLI operations for managing attachments on Jira work items: attachment-delete, attachment-list" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_view", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem view", + "description": "CLI command to view a Jira work item by key, with options to display in web browser or return specific fields as JSON.", + "example_usage": "acli jira workitem view KEY-123 --web" + }, + "degree": 1 + }, + { + "id": "jira_work_item", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item", + "description": "A unit of work in Jira (e.g. issue, task, story) that can be created, edited, and queried." + }, + "degree": 6 + }, + { + "id": "work_item_fields", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Work Item Fields", + "description": "Fields associated with a Jira work item. Supports '*all', '*navigable', specific field names, or exclusion via minus prefix. Default: key,issuetype,summary,status,assignee,description." + }, + "degree": 2 + }, + { + "id": "json_output", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "JSON Output", + "description": "Output format option for CLI commands that generates machine-readable JSON instead of default text output." + }, + "degree": 2 + }, + { + "id": "acli_view_command_doc", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli jira workitem view documentation", + "description": "Reference documentation for the 'acli jira workitem view' command including options --fields, --help, --json, and --web.", + "source": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-view" + }, + "degree": 4 + }, + { + "id": "jira_cli_commands", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Jira CLI Commands", + "description": "ACLI reference commands for Jira, including auth, board, dashboard, field, filter, project, sprint, and workitem subcommands", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira/" + }, + "degree": 0 + }, + { + "id": "admin_cli_commands", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Admin CLI Commands", + "description": "ACLI reference commands for admin operations, including auth and user subcommands", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/admin/" + }, + "degree": 0 + }, + { + "id": "jira_board", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Board", + "description": "CLI subcommand for managing Jira boards via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-board/" + }, + "degree": 2 + }, + { + "id": "jira_sprint", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Sprint", + "description": "A time-boxed iteration in Jira used in agile project management" + }, + "degree": 3 + }, + { + "id": "jira_project", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Project", + "description": "A Jira project container for work items and boards" + }, + "degree": 6 + }, + { + "id": "jira_auth", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Auth", + "description": "CLI subcommand for handling Jira authentication via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-auth/" + }, + "degree": 1 + }, + { + "id": "jira_dashboard", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Dashboard", + "description": "CLI subcommand for managing Jira dashboards via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-dashboard/" + }, + "degree": 1 + }, + { + "id": "jira_filter", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Filter", + "description": "CLI subcommand for managing Jira filters via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-filter/" + }, + "degree": 1 + }, + { + "id": "jira_field", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Field", + "description": "CLI subcommand for managing Jira fields via ACLI", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field/" + }, + "degree": 0 + }, + { + "id": "acli_jira_auth_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira auth", + "description": "Authenticate to use Atlassian CLI.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-auth" + }, + "degree": 0 + }, + { + "id": "acli_jira_board_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira board", + "description": "Jira board commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-board" + }, + "degree": 0 + }, + { + "id": "acli_jira_dashboard_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira dashboard", + "description": "Jira dashboard commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-dashboard" + }, + "degree": 0 + }, + { + "id": "acli_jira_field_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira field", + "description": "Jira field commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-field" + }, + "degree": 0 + }, + { + "id": "acli_jira_filter_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira filter", + "description": "Jira filter commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-filter" + }, + "degree": 0 + }, + { + "id": "acli_jira_project_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira project", + "description": "Jira project commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project" + }, + "degree": 0 + }, + { + "id": "acli_jira_sprint_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira sprint", + "description": "Jira sprint commands.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-sprint" + }, + "degree": 0 + }, + { + "id": "atlassian_jira", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Atlassian Jira", + "description": "Atlassian's project tracking and issue management platform accessible via CLI." + }, + "degree": 1 + }, + { + "id": "cli_authentication", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "CLI Authentication", + "description": "The process of authenticating a user or agent to use the Atlassian CLI." + }, + "degree": 2 + }, + { + "id": "resource_group", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Resource Group", + "description": "A GitLab CI/CD mechanism to strategically control the concurrency of jobs, ensuring deployment jobs run one at a time" + }, + "degree": 17 + }, + { + "id": "pipeline_concurrency", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipeline Concurrency", + "description": "The default behavior of GitLab CI/CD where pipelines run simultaneously; improves feedback loop in merge requests" + }, + "degree": 5 + }, + { + "id": "deployment_job", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Deployment Job", + "description": "A CI/CD job (e.g., 'deploy') that pushes changes to a target environment such as production" + }, + "degree": 6 + }, + { + "id": "build_job", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Build Job", + "description": "A CI/CD job (e.g., 'build') that compiles or packages code; can run concurrently without risk" + }, + "degree": 2 + }, + { + "id": "gitlab_cicd_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "GitLab CI/CD Pipeline", + "description": "Automated sequence of stages and jobs triggered by commits; multiple pipelines can run simultaneously by default" + }, + "degree": 2 + }, + { + "id": "resource_group_keyword", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "resource_group keyword", + "description": "A YAML keyword in .gitlab-ci.yml used to assign a job to a named resource group, limiting its concurrency", + "reference": "https://docs.gitlab.com/ci/yaml/#resource_group" + }, + "degree": 11 + }, + { + "id": "gitlab_ci_yml", + "space": "resource", + "node_type": "File", + "properties": { + "name": ".gitlab-ci.yml", + "description": "GitLab CI/CD pipeline configuration file stored in the repository root" + }, + "degree": 3 + }, + { + "id": "concurrent_deployment_corruption", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Concurrent Deployment Corruption", + "description": "Risk of infrastructure being left in a corrupted or confused state when multiple deployment scripts run simultaneously to the same environment" + }, + "degree": 4 + }, + { + "id": "pipeline_efficiency", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Pipeline Efficiency", + "description": "The degree to which pipelines maximize throughput by running non-conflicting jobs concurrently" + }, + "degree": 2 + }, + { + "id": "deployment_safety", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Deployment Safety", + "description": "Assurance that deployment jobs to production run one at a time, preventing race conditions and corruption" + }, + "degree": 6 + }, + { + "id": "resource_group_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Resource Group Configuration", + "description": "Assigning the resource_group keyword to concurrency-sensitive jobs to serialize their execution" + }, + "degree": 7 + }, + { + "id": "deploy_resource_group_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Deploy Resource Group YAML Example", + "description": "YAML snippet showing resource_group: production applied to the deploy job to prevent concurrent deployments", + "content": "deploy:\n # ...\n resource_group: production" + }, + "degree": 3 + }, + { + "id": "concurrent_pipeline_problem_description", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Concurrent Pipeline Problem Description", + "description": "Text explaining that multiple pipelines starting simultaneously can cause concurrent deploy jobs to harm the production environment" + }, + "degree": 2 + }, + { + "id": "resource_group_access_policy", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Resource Group Configuration Access Policy", + "description": "Requires the Developer, Maintainer, or Owner role to configure CI/CD pipelines and resource groups" + }, + "degree": 1 + }, + { + "id": "process_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Process Mode", + "description": "A setting on a resource group that determines the order in which waiting jobs are picked for execution when a resource becomes free." + }, + "degree": 11 + }, + { + "id": "process_mode_unordered", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Unordered Process Mode", + "description": "Default process mode. Processes jobs whenever a job is ready to run, without regard to pipeline order." + }, + "degree": 5 + }, + { + "id": "process_mode_oldest_first", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Oldest First Process Mode", + "description": "When a resource is free, picks the first job from upcoming jobs sorted by pipeline ID in ascending order. Safer for continuous deployments." + }, + "degree": 5 + }, + { + "id": "process_mode_newest_first", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Newest First Process Mode", + "description": "When a resource is free, picks the first job from upcoming jobs sorted by pipeline ID in descending order. Prevents outdated deployment jobs. Jobs must be idempotent." + }, + "degree": 7 + }, + { + "id": "process_mode_newest_ready_first", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Newest Ready First Process Mode", + "description": "When a resource is free, picks the first job from upcoming jobs waiting on the resource, sorted by pipeline ID in descending order. Faster than newest_first. Jobs must be idempotent." + }, + "degree": 4 + }, + { + "id": "pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipeline", + "description": "A GitLab CI/CD pipeline consisting of stages and jobs, identified by a pipeline ID." + }, + "degree": 4 + }, + { + "id": "ci_job", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "CI Job", + "description": "A unit of work in a GitLab CI/CD pipeline, such as a build or deploy job." + }, + "degree": 4 + }, + { + "id": "idempotency", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Idempotency", + "description": "Property required of jobs used with newest_first or newest_ready_first modes, ensuring repeated execution produces the same result." + }, + "degree": 2 + }, + { + "id": "continuous_deployment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Continuous Deployment", + "description": "A practice of automatically deploying every change that passes CI, where deployment order and safety are important." + }, + "degree": 2 + }, + { + "id": "gitlab_resource_group_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "GitLab Resource Group API", + "description": "API endpoint for editing an existing resource group, including updating its process_mode.", + "url": "https://docs.gitlab.com/api/resource_groups/#update-a-resource-group" + }, + "degree": 0 + }, + { + "id": "outdated_deployment_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Outdated Deployment Risk", + "description": "Risk of deploying an older pipeline's artifacts after a newer one, causing regression or inconsistency in production." + }, + "degree": 2 + }, + { + "id": "process_mode_selection", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Process Mode Selection", + "description": "Choosing the appropriate resource group process mode to balance deployment speed, order, and safety." + }, + "degree": 3 + }, + { + "id": "process_mode_table", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Process Mode Comparison Table", + "description": "Table describing unordered, oldest_first, newest_first, and newest_ready_first process modes with use cases.", + "source": "https://docs.gitlab.com/ci/resource_groups/" + }, + "degree": 5 + }, + { + "id": "process_mode_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Process Mode Example", + "description": "Example .gitlab-ci.yml with build and deploy jobs, and three concurrent pipelines demonstrating process mode differences.", + "source": "https://docs.gitlab.com/ci/resource_groups/" + }, + "degree": 3 + }, + { + "id": "trigger_keyword", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "trigger Keyword", + "description": "GitLab CI/CD keyword used to trigger downstream pipelines including cross-project and parent-child pipelines" + }, + "degree": 2 + }, + { + "id": "trigger_strategy_keyword", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "trigger:strategy Keyword", + "description": "GitLab CI/CD keyword that ensures the resource group lock is not released until the downstream pipeline finishes" + }, + "degree": 2 + }, + { + "id": "pipeline_level_concurrency_control", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipeline-Level Concurrency Control", + "description": "Mechanism to control concurrent execution of deployment pipelines across cross-project and parent-child pipeline configurations" + }, + "degree": 5 + }, + { + "id": "parent_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Parent Pipeline", + "description": "The top-level GitLab CI pipeline (.gitlab-ci.yml) that triggers child/downstream pipelines; contains build, test, and deploy stages" + }, + "degree": 2 + }, + { + "id": "child_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Child Pipeline (Deployment)", + "description": "Downstream pipeline triggered by the parent pipeline (deploy.gitlab-ci.yml); contains provision and deploy stages targeting production environment" + }, + "degree": 3 + }, + { + "id": "deployment_pipeline", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Deployment Pipeline", + "description": "A pipeline responsible for deploying to environments such as AWS-production; controlled by resource_group to prevent concurrent deployments" + }, + "degree": 1 + }, + { + "id": "concurrent_execution", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Concurrent Execution", + "description": "The simultaneous running of multiple jobs or pipelines, which resource_group is designed to prevent for sensitive deployment scenarios" + }, + "degree": 2 + }, + { + "id": "gitlab_ci", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab CI/CD", + "description": "GitLab's continuous integration and deployment platform that provides resource_group, trigger, and related concurrency control features" + }, + "degree": 2 + }, + { + "id": "concurrent_deployment_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Concurrent Deployment Risk", + "description": "Risk of multiple deployment pipelines running simultaneously, potentially causing conflicts or instability in target environments" + }, + "degree": 3 + }, + { + "id": "controlled_deployment_order", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Controlled Deployment Order", + "description": "Ensuring deployments execute sequentially in a defined order, preventing race conditions and environment conflicts" + }, + "degree": 2 + }, + { + "id": "process_mode_explanation", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Process Mode Behavior Description", + "description": "Text describing the behavior of unordered, oldest_first, and newest_first process modes for resource groups" + }, + "degree": 4 + }, + { + "id": "pipeline_concurrency_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Pipeline-Level Concurrency Control Example", + "description": "YAML example and explanation showing how resource_group and trigger keywords work together to control cross-project/parent-child pipeline concurrency" + }, + "degree": 3 + }, + { + "id": "oldest_first_process_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "oldest_first Process Mode", + "description": "A resource group process mode that enforces jobs to be executed in pipeline order, starting from the oldest pipeline" + }, + "degree": 3 + }, + { + "id": "pipeline_deadlock", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pipeline Deadlock", + "description": "A situation where a parent and child pipeline mutually wait for each other to release a shared resource group, causing neither to complete" + }, + "degree": 5 + }, + { + "id": "strategy_mirror", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "strategy: mirror", + "description": "A trigger strategy option that makes the triggering job wait until the downstream pipeline has finished" + }, + "degree": 1 + }, + { + "id": "production_resource_group", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Production Resource Group", + "description": "A named resource group called 'production' used to serialize access to production deployment jobs" + }, + "degree": 3 + }, + { + "id": "waiting_for_resource_state", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Waiting for Resource State", + "description": "A job state where a CI job is stuck waiting to acquire a resource group lock, indicated by 'Waiting for resource: '" + }, + "degree": 1 + }, + { + "id": "ci_pipeline_configuration", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "CI Pipeline Configuration", + "description": "The YAML-based configuration that defines stages, jobs, triggers, and resource groups in GitLab CI" + }, + "degree": 1 + }, + { + "id": "deadlock_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Deadlock Risk in Pipelines", + "description": "Risk of parent and child pipelines deadlocking when both require the same resource group under oldest_first process mode" + }, + "degree": 3 + }, + { + "id": "pipeline_serialization", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Pipeline Serialization", + "description": "Controlled sequential execution of pipeline jobs accessing a shared resource group to prevent race conditions" + }, + "degree": 2 + }, + { + "id": "resource_group_in_parent_pipeline", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Specify resource_group in Parent Pipeline", + "description": "Best practice lever: assigning the resource_group keyword to the triggering job in the parent pipeline instead of only in the child pipeline to avoid deadlocks" + }, + "degree": 4 + }, + { + "id": "bad_config_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Bad Pipeline Configuration Example", + "description": "YAML example showing a deadlock-prone setup where resource_group is only specified on deploy job in parent pipeline while child pipeline also requires the same resource group", + "content_summary": "Parent pipeline test job triggers child pipeline with strategy:mirror; deploy job uses resource_group:production; child also requires production resource group causing deadlock" + }, + "degree": 3 + }, + { + "id": "good_config_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Good Pipeline Configuration Example", + "description": "YAML example showing the recommended fix: specifying resource_group on the test trigger job in the parent pipeline to prevent deadlock", + "content_summary": "Parent pipeline test job has resource_group:production alongside trigger, preventing child pipeline from independently competing for the resource" + }, + "degree": 2 + }, + { + "id": "resource_group_acquisition_rule", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Resource Group Acquisition Rule", + "description": "Implicit rule enforced by GitLab CI: only one job at a time may hold a resource group lock; others wait in queue according to process mode" + }, + "degree": 0 + }, + { + "id": "gitlab_resource_group", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Resource Group", + "description": "A GitLab CI/CD feature that controls pipeline job concurrency and resource access" + }, + "degree": 1 + }, + { + "id": "oldest_first_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Oldest First", + "description": "A process mode where the oldest pipeline job in the queue is assigned the resource first" + }, + "degree": 2 + }, + { + "id": "newest_first_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Newest First", + "description": "A process mode where the newest pipeline job in the queue is assigned the resource first" + }, + "degree": 1 + }, + { + "id": "race_condition", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Race Condition", + "description": "A known issue in complex or busy pipelines where resource group concurrency control may not work correctly" + }, + "degree": 3 + }, + { + "id": "upcoming_jobs", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Upcoming Jobs", + "description": "Jobs queued to use a resource group but not yet assigned or running" + }, + "degree": 3 + }, + { + "id": "gitlab_rest_api_resource_groups", + "space": "resource", + "node_type": "API", + "properties": { + "name": "GitLab REST API - Resource Groups", + "description": "REST API endpoint to list upcoming jobs for a specific resource group", + "url": "https://docs.gitlab.com/api/resource_groups/#list-upcoming-jobs-for-a-specific-resource-group" + }, + "degree": 1 + }, + { + "id": "gitlab_graphql_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "GitLab GraphQL API", + "description": "GraphQL interface used to retrieve detailed job information within a resource group context", + "url": "https://docs.gitlab.com/ci/resource_groups/#get-job-details-through-graphql" + }, + "degree": 2 + }, + { + "id": "resource_group_malfunction_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Resource Group Malfunction Risk", + "description": "Risk that the resource group feature is not working correctly, causing jobs to be blocked or resources not properly assigned" + }, + "degree": 3 + }, + { + "id": "race_condition_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Race Condition Risk", + "description": "Risk of encountering a race condition in complex or busy pipelines with multiple child pipelines or simultaneous pipeline runs" + }, + "degree": 3 + }, + { + "id": "gitlab_issue_436988", + "space": "evidence", + "node_type": "LogEntry", + "properties": { + "name": "GitLab Issue 436988", + "description": "Tracked GitLab issue documenting the known race condition in complex or busy pipelines", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/436988" + }, + "degree": 3 + }, + { + "id": "cancel_old_pipeline_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Cancel Old Pipeline or Job", + "description": "Action to cancel an older pipeline or its job to unblock the resource group queue" + }, + "degree": 2 + }, + { + "id": "start_new_pipeline_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Start New Pipeline", + "description": "Workaround action of starting a fresh pipeline to recover from a race condition or stuck resource group" + }, + "degree": 1 + }, + { + "id": "interactive_graphql_explorer", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Interactive GraphQL Explorer", + "description": "Interactive tool for running GraphQL queries against the GitLab API", + "url": "https://docs.gitlab.com/api/graphql/#interactive-graphql-explorer" + }, + "degree": 0 + }, + { + "id": "trigger_job", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Trigger Job", + "description": "A CI job that triggers downstream pipelines; not accessible from the GitLab UI in pipeline-level concurrency control scenarios" + }, + "degree": 2 + }, + { + "id": "stuck_job_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Stuck Job Risk", + "description": "Risk of CI jobs becoming stuck, requiring identification via GraphQL API and issue reporting to resolve" + }, + "degree": 2 + }, + { + "id": "graphql_job_query_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "GraphQL Job Query Example", + "description": "GraphQL query example showing how to retrieve job name, status, detailedStatus action path and buttonTitle for a given project and job ID" + }, + "degree": 3 + }, + { + "id": "graphql_pipeline_query_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "GraphQL Pipeline Query Example", + "description": "GraphQL query example showing how to retrieve job status and pipeline path for a job currently using a resource group" + }, + "degree": 2 + }, + { + "id": "gitlab_issue_tracker", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Issue Tracker", + "description": "GitLab issue tracker for reporting problems with resource groups and stuck jobs", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/new" + }, + "degree": 0 + }, + { + "id": "diff_view", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Diff View", + "description": "A display showing the difference between the current state of files and the proposed changes, with removed lines in red (minus sign) and added lines in green (plus sign)" + }, + "degree": 6 + }, + { + "id": "source_branch", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Source Branch", + "description": "The branch containing proposed changes in a merge request, used as the base for the diff comparison" + }, + "degree": 2 + }, + { + "id": "file_viewed_marker", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "File Viewed Marker", + "description": "A checkbox in the diff file header that allows users to mark a file as viewed until it changes again" + }, + "degree": 2 + }, + { + "id": "inline_comment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Inline Comment", + "description": "A comment added to a specific line or file within a merge request diff, accessible by hovering over line numbers in the gutter" + }, + "degree": 2 + }, + { + "id": "diff_gutter", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Diff Gutter", + "description": "The left-side area of a diff view containing line numbers, navigation aids (expand context), and comment interaction controls" + }, + "degree": 2 + }, + { + "id": "syntax_highlighting", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Syntax Highlighting", + "description": "Color-coded display theme used in diffs to visually distinguish added and removed lines of code" + }, + "degree": 1 + }, + { + "id": "mr_diff_example_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "MR Diff Example Description", + "description": "Textual explanation and screenshot reference showing a merge request diff with added and removed lines of code, including file header elements and gutter navigation", + "source_url": "https://docs.gitlab.com/user/project/merge_requests/changes" + }, + "degree": 5 + }, + { + "id": "gitlab_merge_request_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Merge Request Tool", + "description": "GitLab feature for proposing, reviewing, and merging code changes via a diff-based interface" + }, + "degree": 0 + }, + { + "id": "gitlab_merge_requests_ui", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Merge Requests UI", + "description": "GitLab interface for viewing and managing merge requests, including file changes and diffs", + "url": "https://docs.gitlab.com/user/project/merge_requests/changes/" + }, + "degree": 1 + }, + { + "id": "merge_request_diff", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request Diff", + "description": "The set of file-level changes introduced by a merge request, viewable as a diff" + }, + "degree": 10 + }, + { + "id": "file_browser", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "File Browser", + "description": "A UI component in GitLab merge requests that shows changed files in tree or list view, toggled via button or F key" + }, + "degree": 5 + }, + { + "id": "pinned_file_feature", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pinned File (Linked File First)", + "description": "GitLab feature allowing a specific file to be shown first in a merge request changes list via a shareable link; introduced in GitLab 16.9, GA in 17.4", + "feature_flag": "pinned_file", + "introduced_version": "16.9", + "ga_version": "17.4", + "tiers": [ + "Free", + "Premium", + "Ultimate" + ], + "offering": "GitLab.com" + }, + "degree": 4 + }, + { + "id": "file_collapse_performance", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "File Collapse for Performance", + "description": "GitLab automatically collapses files with many changes to improve performance, showing 'Some changes are not shown' message" + }, + "degree": 3 + }, + { + "id": "code_review_workflow", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Code Review Workflow", + "description": "The process of reviewing code changes in merge requests, including navigating file diffs and sharing specific file views" + }, + "degree": 5 + }, + { + "id": "review_performance", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Merge Request Review Performance", + "description": "The efficiency and speed of reviewing large merge requests with many changed files" + }, + "degree": 2 + }, + { + "id": "reviewer_collaboration", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Reviewer Collaboration", + "description": "The ability for team members to share and focus on specific files within a merge request" + }, + "degree": 2 + }, + { + "id": "gitlab_dev_team", + "space": "subject", + "node_type": "Team", + "properties": { + "name": "Development Team", + "description": "Team members sharing and reviewing merge request links and file changes" + }, + "degree": 1 + }, + { + "id": "pinned_file_history_note", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Pinned File Feature History", + "description": "Text noting the introduction of pinned_file flag in GitLab 16.9 and its general availability in GitLab 17.4", + "source_issue": "https://gitlab.com/gitlab-org/gitlab/-/issues/387246", + "source_mr": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/162503" + }, + "degree": 2 + }, + { + "id": "gitattributes_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": ".gitattributes", + "description": "Git attributes file used to mark files or paths as generated, controlling collapse behavior in merge request diffs", + "path": "root directory of project" + }, + "degree": 0 + }, + { + "id": "gitlab_platform", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab", + "description": "DevOps platform providing merge request diff viewing, collapse of generated files, and code review tooling" + }, + "degree": 0 + }, + { + "id": "generated_file_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Generated File", + "description": "Files automatically produced by tooling or compilers (e.g. package-lock.json, minified JS/CSS, Go protobuf outputs) that rarely require code review" + }, + "degree": 2 + }, + { + "id": "collapse_generated_diff", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Collapse Generated Diff Files", + "description": "Feature introduced in GitLab 16.8 (GA in 16.11) that collapses generated files in merge request diffs by default to help reviewers focus on relevant changes", + "feature_flag": "collapse_generated_diff_files", + "introduced_version": "GitLab 16.8", + "generally_available_version": "GitLab 16.11" + }, + "degree": 5 + }, + { + "id": "gitlab_generated_attribute", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "gitlab-generated attribute", + "description": "A .gitattributes attribute used to mark files or paths as generated, controlling whether they are collapsed in merge request diffs" + }, + "degree": 3 + }, + { + "id": "code_review_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Code Review", + "description": "The process of reviewing code changes in merge requests, facilitated by GitLab diff views" + }, + "degree": 1 + }, + { + "id": "collapse_types_textunit", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Collapsed File Types List", + "description": "Enumeration of file types GitLab collapses by default: .nib/.xcworkspacedata/.xcurserstate, package-lock.json/Gopkg.lock, node_modules, minified JS/CSS, source maps, generated Go/protobuf files", + "source": "gitlab_mr_changes_doc" + }, + "degree": 2 + }, + { + "id": "gitattributes_config_example", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "gitattributes Configuration Example", + "description": "Example .gitattributes configuration showing how to collapse *.txt files, docs/** directory, and prevent package-lock.json from collapsing using gitlab-generated attribute", + "source": "gitlab_mr_changes_doc" + }, + "degree": 1 + }, + { + "id": "collapse_behavior_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Configure Collapse Behavior", + "description": "Mechanism allowing users to set the gitlab-generated attribute in .gitattributes to control which files are collapsed or expanded in merge request diffs" + }, + "degree": 2 + }, + { + "id": "reviewer_focus_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Reviewer Focus Improvement", + "description": "Reviewers can focus on files actually needed for code review by collapsing auto-generated files in merge request diffs" + }, + "degree": 2 + }, + { + "id": "gitlab_merge_request_changes_tab", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Merge Request Changes Tab", + "description": "GitLab UI tab showing file diffs and changes in a merge request", + "url": "https://docs.gitlab.com/user/project/merge_requests/changes/" + }, + "degree": 0 + }, + { + "id": "gitlab_user_preferences", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab User Preferences", + "description": "User settings panel in GitLab allowing configuration of UI behaviors including merge request display" + }, + "degree": 0 + }, + { + "id": "one_file_at_a_time", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "One File at a Time", + "description": "A review setting that shows only a single file diff at a time during merge request review" + }, + "degree": 5 + }, + { + "id": "inline_diff_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Inline Diff Mode", + "description": "A diff viewing mode that shows old and new versions of changed lines vertically; best for single-line changes" + }, + "degree": 3 + }, + { + "id": "side_by_side_diff_mode", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Side-by-Side Diff Mode", + "description": "A diff viewing mode that shows old and new versions in separate columns; best for large sequential line changes" + }, + "degree": 3 + }, + { + "id": "keyboard_shortcuts", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Keyboard Shortcuts", + "description": "GitLab keyboard shortcut feature enabling navigation between files in merge request review using keys like [, ], k, j" + }, + "degree": 1 + }, + { + "id": "merge_request_review", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Merge Request Review", + "description": "The process of reviewing code changes submitted in a merge request on GitLab" + }, + "degree": 1 + }, + { + "id": "improved_code_review_efficiency", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Improved Code Review Efficiency", + "description": "Better focus and reduced cognitive load during merge request review by controlling how diffs are displayed" + }, + "degree": 4 + }, + { + "id": "diff_view_preference_setting", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Diff View Preference Setting", + "description": "User-controlled setting to switch between inline and side-by-side diff modes and one-file-at-a-time navigation" + }, + "degree": 4 + }, + { + "id": "rapid_diffs_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Rapid Diffs", + "description": "A faster way to load and interact with code changes in merge requests, reducing time before the first file is visible when reviewing a diff.", + "status": "beta", + "introduced_in": "GitLab 18.0", + "enabled_in": "GitLab 19.0", + "feature_flag": "rapid_diffs_on_mr_show", + "default": "disabled in 18.0, enabled in 19.0" + }, + "degree": 1 + }, + { + "id": "classic_diff_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Classic Diff", + "description": "The classic diff loading experience for merge requests in GitLab, predating Rapid Diffs." + }, + "degree": 0 + }, + { + "id": "gitlab_duo_pro_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Duo Pro", + "description": "GitLab add-on providing AI features including code explanation in merge requests.", + "tier": "Premium, Ultimate", + "offering": "GitLab.com, GitLab Self-Managed, GitLab Dedicated" + }, + "degree": 1 + }, + { + "id": "gitlab_duo_amazon_q_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Duo with Amazon Q", + "description": "GitLab add-on integrating Amazon Q Developer as the LLM for code explanation features.", + "llm": "Amazon Q Developer" + }, + "degree": 0 + }, + { + "id": "gitlab_org_gitlab_project", + "space": "resource", + "node_type": "Project", + "properties": { + "name": "gitlab-org/gitlab", + "description": "Main GitLab open-source project on GitLab.com where feature issues and epics are tracked.", + "url": "https://gitlab.com/gitlab-org/gitlab" + }, + "degree": 4 + }, + { + "id": "issue_590833_evidence", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "Issue 590833", + "description": "GitLab issue introducing Rapid Diffs feature flag rapid_diffs_on_mr_show in GitLab 18.0.", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/590833", + "version": "GitLab 18.0" + }, + "degree": 4 + }, + { + "id": "issue_539581_evidence", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "Issue 539581", + "description": "GitLab issue tracking enablement of Rapid Diffs on GitLab.com and Self-Managed in GitLab 19.0.", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/539581", + "version": "GitLab 19.0" + }, + "degree": 1 + }, + { + "id": "issue_596236_evidence", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "Feedback Issue 596236", + "description": "GitLab issue listing known limitations and collecting feedback for Rapid Diffs beta.", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/596236" + }, + "degree": 2 + }, + { + "id": "epic_19380_evidence", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "Epic 19380", + "description": "GitLab epic tracking the feature parity roadmap for Rapid Diffs vs classic diff experience.", + "url": "https://gitlab.com/groups/gitlab-org/-/epics/19380" + }, + "degree": 2 + }, + { + "id": "merge_request_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request", + "description": "A GitLab workflow mechanism for proposing, reviewing, and merging code changes into a target branch." + }, + "degree": 2 + }, + { + "id": "code_diff_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Code Diff", + "description": "The visual representation of changes between two versions of code files in a merge request." + }, + "degree": 6 + }, + { + "id": "feature_flag_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Feature Flag", + "description": "A configuration mechanism in GitLab to enable or disable features for specific environments or users.", + "flag_name": "rapid_diffs_on_mr_show" + }, + "degree": 2 + }, + { + "id": "explain_code_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Explain Code", + "description": "AI-powered feature in GitLab merge requests that explains code changes using an LLM (default or Amazon Q Developer).", + "tiers": "Premium, Ultimate", + "add_ons": "GitLab Duo Pro, GitLab Duo Enterprise, GitLab Duo with Amazon Q" + }, + "degree": 1 + }, + { + "id": "diff_load_time_kpi", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "Diff Load Time", + "description": "Time before the reviewer sees the first file when reviewing a diff. Rapid Diffs aims to reduce this." + }, + "degree": 2 + }, + { + "id": "rapid_diffs_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Enable Rapid Diffs", + "description": "User-controlled preference to switch between Rapid Diffs and classic diff loading experience in merge requests." + }, + "degree": 2 + }, + { + "id": "gitlab_duo_agent", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "GitLab Duo", + "description": "AI assistant powered by a large language model that explains code and provides chat-based support within GitLab" + }, + "degree": 1 + }, + { + "id": "gitlab_duo_chat_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Duo Chat", + "description": "AI chat tool integrated into GitLab that explains selected code snippets and answers developer questions" + }, + "degree": 2 + }, + { + "id": "gitlab_ide_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab IDE Integration", + "description": "IDE integration for GitLab Duo Chat that allows code explanation within the developer's IDE" + }, + "degree": 0 + }, + { + "id": "merge_request_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": "Merge Request File", + "description": "A file within a merge request diff, viewable at a specific SHA, whose selected lines can be explained by GitLab Duo" + }, + "degree": 1 + }, + { + "id": "code_explanation", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Code Explanation", + "description": "The process of using GitLab Duo to generate natural-language explanations of selected code snippets in merge requests, files, or the IDE" + }, + "degree": 5 + }, + { + "id": "inline_comment_management", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Inline Comment Management", + "description": "The ability to expand or collapse inline comments on code lines within a merge request diff to reduce visual noise during review" + }, + "degree": 2 + }, + { + "id": "experiment_beta_features", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Experiment and Beta Features", + "description": "A GitLab group-level setting that must be enabled for users to access experimental and beta AI features such as code explanation" + }, + "degree": 2 + }, + { + "id": "large_language_model", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Large Language Model (LLM)", + "description": "The underlying AI model used by GitLab Duo to generate code explanations; results may not always be correct and should be used with caution" + }, + "degree": 4 + }, + { + "id": "llm_accuracy_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "LLM Accuracy Risk", + "description": "Risk that the large language model produces incorrect or misleading code explanations; GitLab cannot guarantee correctness" + }, + "degree": 1 + }, + { + "id": "improved_code_comprehension", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Improved Code Comprehension", + "description": "The desired outcome of using GitLab Duo code explanation: developers better understand unfamiliar code more quickly" + }, + "degree": 2 + }, + { + "id": "beta_features_group_requirement", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Beta Features Group Membership Requirement", + "description": "Users must belong to at least one group with experiment and beta features enabled to use GitLab Duo code explanation" + }, + "degree": 1 + }, + { + "id": "code_explain_walkthrough", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "Code Explain Walkthrough", + "description": "Step-by-step instructions and screenshot evidence documenting how to invoke GitLab Duo code explanation within a merge request" + }, + "degree": 6 + }, + { + "id": "whitespace_changes", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Whitespace Changes", + "description": "Changes in a diff that consist only of whitespace (spaces, tabs, newlines) and can obscure substantive code changes." + }, + "degree": 4 + }, + { + "id": "merge_request_conflicts", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request Conflicts", + "description": "Conflicts that arise when the source branch and target branch have incompatible changes, shown as alerts per conflicted file in the diff." + }, + "degree": 2 + }, + { + "id": "viewed_file_tracking", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Viewed File Tracking", + "description": "A GitLab feature allowing reviewers to mark files as viewed during a merge request review so they are hidden on subsequent reviews unless changed." + }, + "degree": 3 + }, + { + "id": "inline_comment_expansion", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Inline Comment Expansion", + "description": "The ability to expand collapsed comments attached to specific lines in a merge request diff by selecting the user avatar in the gutter margin." + }, + "degree": 1 + }, + { + "id": "tu_whitespace_changes_section", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Ignore Whitespace Changes Section", + "description": "Documentation section explaining how to hide or show whitespace changes in a merge request diff using the Preferences menu.", + "source": "gitlab_merge_request_changes_doc" + }, + "degree": 2 + }, + { + "id": "tu_mark_files_viewed_section", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Mark Files as Viewed Section", + "description": "Documentation section explaining how to mark files as viewed to streamline repeated reviews of large merge requests.", + "source": "gitlab_merge_request_changes_doc" + }, + "degree": 2 + }, + { + "id": "tu_conflicts_in_diff_section", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Show Merge Request Conflicts in Diff Section", + "description": "Documentation section explaining how GitLab compares source and target branches and displays conflict alerts in the diff.", + "source": "gitlab_merge_request_changes_doc" + }, + "degree": 2 + }, + { + "id": "review_efficiency", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Code Review Efficiency", + "description": "The speed and accuracy with which reviewers can assess merge request changes, influenced by diff clarity and tooling." + }, + "degree": 5 + }, + { + "id": "missed_conflict_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Missed Merge Conflict Risk", + "description": "The risk that a reviewer fails to notice conflicting changes between source and target branches, leading to broken merges." + }, + "degree": 2 + }, + { + "id": "whitespace_toggle_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Show/Hide Whitespace Changes Toggle", + "description": "A user-controlled preference that hides or shows whitespace-only changes in the merge request diff." + }, + "degree": 3 + }, + { + "id": "viewed_checkbox_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Viewed Checkbox", + "description": "A per-file checkbox that marks a file as reviewed, hiding it from subsequent diff views until the file changes again." + }, + "degree": 2 + }, + { + "id": "gitlab_merge_requests", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Merge Requests", + "description": "GitLab feature for managing and reviewing code changes via merge requests", + "url": "https://docs.gitlab.com/user/project/merge_requests/changes/" + }, + "degree": 0 + }, + { + "id": "gitlab_code_quality", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Code Quality", + "description": "Code quality findings shown in the merge request changes view", + "url": "https://docs.gitlab.com/ci/testing/code_quality/#merge-request-changes-view" + }, + "degree": 0 + }, + { + "id": "gitlab_sast", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab SAST", + "description": "Static Application Security Testing findings shown in the merge request changes view", + "url": "https://docs.gitlab.com/user/application_security/sast/#merge-request-changes-view" + }, + "degree": 0 + }, + { + "id": "merge_request_diff_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": "Merge Request Diff", + "description": "A downloadable diff file representing the changes in a merge request, accessible by appending .diff to the merge request URL", + "format": "diff", + "example_url": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/000000.diff" + }, + "degree": 0 + }, + { + "id": "merge_request_patch_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": "Merge Request Patch File", + "description": "A downloadable patch file representing the changes in a merge request, accessible by appending .patch to the merge request URL", + "format": "patch", + "example_url": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/000000.patch" + }, + "degree": 0 + }, + { + "id": "git_apply_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "git apply", + "description": "Git CLI command used to apply a diff or patch file to a repository" + }, + "degree": 0 + }, + { + "id": "git_am_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "git am", + "description": "Git CLI command used to apply patch files from mailbox format, uses -p1 option by default", + "reference_url": "https://git-scm.com/docs/git-am" + }, + "degree": 0 + }, + { + "id": "curl_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "curl", + "description": "Command-line tool used to download merge request diffs and patches from GitLab URLs" + }, + "degree": 0 + }, + { + "id": "merge_request_changes", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request Changes", + "description": "The set of code modifications included in a GitLab merge request, which can be reviewed, analyzed for quality/security, and downloaded as diff or patch files" + }, + "degree": 2 + }, + { + "id": "code_quality_findings", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Code Quality Findings", + "description": "Results from static code quality analysis surfaced in the merge request changes view" + }, + "degree": 3 + }, + { + "id": "static_analysis_findings", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Static Analysis Findings", + "description": "Security-related findings from SAST surfaced in the merge request changes view" + }, + "degree": 3 + }, + { + "id": "code_security_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Code Security and Quality Assurance", + "description": "The outcome of identifying and resolving code quality and security issues before merging" + }, + "degree": 2 + }, + { + "id": "gitlab_merge_request_diff_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Merge Request Diff/Patch Download", + "description": "Tool for downloading merge request diffs or patches by appending .diff or .patch to the merge request URL" + }, + "degree": 0 + }, + { + "id": "gitlab_merge_request_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "GitLab Merge Request API", + "description": "API endpoint for accessing merge request diffs with parameters diff_id and start_sha", + "example_url": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123456/diffs.diff?diff_id=525410&start_sha=a1b2c3d4" + }, + "degree": 0 + }, + { + "id": "merge_request_diff_comment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request File Comment", + "description": "Comments added to a merge request diff file that persist across rebases and file changes, introduced in GitLab 16.1" + }, + "degree": 4 + }, + { + "id": "merge_request_image_comment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Request Image Comment", + "description": "Comments or threads added to images within merge requests and commit detail views" + }, + "degree": 2 + }, + { + "id": "diff_version_comparison", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Diff Version Comparison", + "description": "Capability to compare different diff versions of a merge request before downloading as .diff or .patch files" + }, + "degree": 2 + }, + { + "id": "mr_diff_download_instructions", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "MR Diff Download Instructions", + "description": "Step-by-step instructions for downloading merge request diffs by appending .diff or .patch to the URL" + }, + "degree": 1 + }, + { + "id": "mr_file_comment_instructions", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "MR File Comment Instructions", + "description": "Step-by-step instructions for adding a comment to a merge request diff file via the GitLab UI" + }, + "degree": 2 + }, + { + "id": "persistent_code_review_comments", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Persistent Code Review Comments", + "description": "Comments on merge request files that persist across rebases and file changes, improving code review continuity" + }, + "degree": 1 + }, + { + "id": "jira_project_create_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira project create", + "description": "ACLI command to create a new Jira project", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project-create" + }, + "degree": 0 + }, + { + "id": "jira_project_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira project", + "description": "ACLI command group for Jira project operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project/" + }, + "degree": 0 + }, + { + "id": "jira_project_management", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Project Management", + "description": "Concept of managing Jira projects via CLI, including listing, creating, and archiving" + }, + "degree": 3 + }, + { + "id": "atlassian_cloud_cli", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Atlassian Cloud CLI", + "description": "Command-line tooling for interacting with Atlassian Cloud services" + }, + "degree": 2 + }, + { + "id": "acli_jira_project_create_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira project create", + "description": "CLI command to create a Jira project – a collection of work items (stories, bugs, tasks, etc)", + "synopsis": "acli jira project create [flags]", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project-create/" + }, + "degree": 2 + }, + { + "id": "acli_jira_project_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira project", + "description": "Parent command grouping all Jira project-related CLI commands", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project" + }, + "degree": 0 + }, + { + "id": "acli_jira_sprint_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira sprint", + "description": "CLI command for managing Jira sprints", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-sprint/" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem", + "description": "CLI command for managing Jira work items", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem/" + }, + "degree": 0 + }, + { + "id": "acli_rovodev_cmd", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli rovodev", + "description": "CLI command group for Rovo Dev operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 0 + }, + { + "id": "project_json_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": "project.json", + "description": "JSON file containing project details used for project creation via the --from-json flag; can be generated using --generate-json flag" + }, + "degree": 1 + }, + { + "id": "jira_project_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Project", + "description": "A collection of work items (stories, bugs, tasks) typically used to represent development work for a product, project, or service in Jira" + }, + "degree": 5 + }, + { + "id": "jira_work_item_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Jira Work Item", + "description": "A unit of work tracked in Jira, which can be created, edited, assigned, archived, commented on, searched, transitioned, and managed via the ACLI tool." + }, + "degree": 2 + }, + { + "id": "company_managed_project_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Company Managed Project", + "description": "A type of Jira project that can be cloned/used as a source for creating new projects via the --from-project flag" + }, + "degree": 3 + }, + { + "id": "acli_project_create_flags_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli jira project create flags documentation", + "description": "Documentation of all flags available for acli jira project create: --description, --from-json, --from-project, --generate-json, --help, --key, --lead-email, --name, --url", + "source": "Options section of acli jira project create reference page" + }, + "degree": 4 + }, + { + "id": "acli_project_create_examples_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli jira project create usage examples", + "description": "Example commands: create from existing project, provide optional fields, generate JSON, create from JSON file", + "source": "Examples section of acli jira project create reference page" + }, + "degree": 3 + }, + { + "id": "jira_project_created_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Jira Project Created", + "description": "Successful creation of a new Jira project with specified key, name, description, and other attributes" + }, + "degree": 1 + }, + { + "id": "toshiba_enterprise_login", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Toshiba Enterprise Login", + "description": "IBM Security-based enterprise identity provider login endpoint", + "url": "https://www.toshibacommerce.com/mga/sps/authsvc?PolicyId=urn:ibm:security:authentication:asf:externalIDPLogin" + }, + "degree": 1 + }, + { + "id": "toshiba_forgot_password", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Toshiba Forgot Password Service", + "description": "Password recovery service for Toshiba Commerce accounts", + "url": "https://www.toshibacommerce.com/tgcs109/tsim/forgotpassword.do" + }, + "degree": 1 + }, + { + "id": "customer_shopping_experience", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Customer Shopping Experience", + "description": "Personalized and memorable shopping journeys for customers across online, in-store, and mobile channels" + }, + "degree": 4 + }, + { + "id": "retail_security", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Security", + "description": "Enhancing security in retail environments through modular, adaptable technology solutions" + }, + "degree": 4 + }, + { + "id": "retail_advisory_services", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Advisory Services", + "description": "Deep retail expertise and advisory services to design personalized and flexible retail journeys" + }, + "degree": 2 + }, + { + "id": "retail_business_success", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retail Business Success", + "description": "Driving business success through intentional solutions and efficient operations" + }, + "degree": 4 + }, + { + "id": "labor_challenges", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Labor Challenges", + "description": "Workforce and staffing challenges in retail environments addressed through technology innovation" + }, + "degree": 1 + }, + { + "id": "modular_adaptable_solutions", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Modular Adaptable Solutions", + "description": "Flexible, modular retail technology solutions that allow experimentation and adaptation to market changes" + }, + "degree": 7 + }, + { + "id": "toshiba_homepage_content", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Toshiba Commerce Homepage Content", + "description": "Marketing content from Toshiba Commerce homepage describing retail solution pillars: Craft Unique Journeys, Innovate with Confidence, Be Agile & Secure, Sustain Your Success", + "source": "https://commerce.toshiba.com" + }, + "degree": 6 + }, + { + "id": "retail_industry_solutions", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Retail Industry Solutions", + "description": "Broad category of commerce technology solutions tailored to specific retail verticals" + }, + "degree": 4 + }, + { + "id": "transaction_acceleration", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Transaction Acceleration", + "description": "Outcome of speeding up point-of-sale and commerce transactions in high-velocity retail environments" + }, + "degree": 1 + }, + { + "id": "operational_agility", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Operational Agility", + "description": "Outcome of maximizing flexibility and responsiveness in retail operations" + }, + "degree": 2 + }, + { + "id": "toshiba_industry_page_content", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Toshiba Commerce Industry Page Content", + "description": "Web content from commerce.toshiba.com describing industry verticals: Convenience & Fuel, Grocery & General Merchandise, Hospitality & Entertainment", + "source": "https://commerce.toshiba.com" + }, + "degree": 4 + }, + { + "id": "unified_retail_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Unified Retail", + "description": "Vision of a smarter, more unified retail future enabled by integrated commerce technology" + }, + "degree": 3 + }, + { + "id": "regulatory_compliance_outcome", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Regulatory Compliance", + "description": "Adherence to compliance requirements enabled by built-in security in Toshiba offerings" + }, + "degree": 1 + }, + { + "id": "evolving_threats_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Evolving Security Threats", + "description": "Risk of data breaches, transaction fraud, and device compromise from evolving cyber threats in retail environments" + }, + "degree": 2 + }, + { + "id": "toshiba_offerings_page_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Understanding Toshiba's Offerings Page", + "description": "Web content describing Toshiba's modular and secure retail commerce solutions including MxP and ELERA products", + "source": "https://commerce.toshiba.com" + }, + "degree": 5 + }, + { + "id": "epos_installations", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "EPOS Installations", + "description": "Electronic Point of Sale installations; Toshiba holds #1 worldwide share" + }, + "degree": 5 + }, + { + "id": "pos_self_checkout", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "POS and Self-Checkout Units", + "description": "Point of sale and self-checkout hardware units; 205k+ deployed worldwide by Toshiba TGCS" + }, + "degree": 5 + }, + { + "id": "worldwide_epos_share_kpi", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "#1 Worldwide EPOS Share", + "description": "Toshiba TGCS holds the #1 worldwide share of EPOS installations", + "value": "#1", + "metric": "Worldwide share of EPOS installations" + }, + "degree": 1 + }, + { + "id": "pos_units_deployed_kpi", + "space": "outcome", + "node_type": "KPI", + "properties": { + "name": "205k+ POS and Self-Checkout Units", + "description": "Over 205,000 POS and self-checkout units deployed", + "value": "205000+", + "metric": "POS and self-checkout units deployed" + }, + "degree": 1 + }, + { + "id": "toshiba_marketplace_platform", + "space": "resource", + "node_type": "Project", + "properties": { + "name": "Toshiba Commerce Marketplace", + "description": "A robust platform connecting retailers with solutions providers, tools, and partnerships to foster growth and success", + "url": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/" + }, + "degree": 2 + }, + { + "id": "retail_marketplace", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Retail Marketplace", + "description": "A digital or physical marketplace concept connecting retailers and solution providers" + }, + "degree": 3 + }, + { + "id": "retail_industry_trends", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Industry Trends", + "description": "Latest developments and trends shaping the future of the retail sector" + }, + "degree": 2 + }, + { + "id": "retail_growth_success", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Retail Growth and Success", + "description": "Fostering growth and success for retailers and solution providers through marketplace partnerships" + }, + "degree": 1 + }, + { + "id": "marketplace_description_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Marketplace Description", + "description": "Toshiba Commerce's Marketplace connects you with top retailers, providing a robust platform to present your solutions. It equips you with the necessary tools and partnerships to foster growth and success.", + "source": "https://commerce.toshiba.com" + }, + "degree": 2 + }, + { + "id": "news_section_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "News Section Description", + "description": "Latest company announcements, industry trends, and Toshiba's role in shaping the future of retail.", + "source": "https://commerce.toshiba.com" + }, + "degree": 1 + }, + { + "id": "toshiba_global_commerce", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Toshiba Global Commerce Solutions", + "description": "Provider of retail commerce technology solutions including POS software and the ELERA Commerce Platform", + "website": "https://commerce.toshiba.com" + }, + "degree": 1 + }, + { + "id": "pos_software", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Point-of-Sale (POS) Software", + "description": "Software systems evolving from transaction terminals to comprehensive commerce hubs, used in grocery and food store retail" + }, + "degree": 3 + }, + { + "id": "edge_computing_retail", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Edge Computing in Retail", + "description": "Processing critical information directly within store environments while maintaining integration with cloud infrastructure" + }, + "degree": 5 + }, + { + "id": "cloud_native_api_first", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Cloud-Native API-First Microservices Architecture", + "description": "Modern architecture paradigm supporting retailer extension, configuration, and self-enablement for POS and commerce platforms" + }, + "degree": 5 + }, + { + "id": "retail_innovation", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Retail Innovation", + "description": "Rapid revolution in retail technology, operational stability, and long-term innovation strategies" + }, + "degree": 3 + }, + { + "id": "faster_retail_solution_deployment", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Faster Retail Solution Deployment", + "description": "Retailers can deploy new solutions more quickly through the combination of Google Distributed Cloud and ELERA Commerce Platform" + }, + "degree": 2 + }, + { + "id": "operational_stability_retail", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Operational Stability in Retail", + "description": "Modern edge strategy supports both operational stability and long-term innovation for retailers" + }, + "degree": 2 + }, + { + "id": "idc_report_textunit", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "IDC MarketScape POS Report Excerpt", + "description": "IDC covers the evolution of POS systems from transaction terminals to comprehensive commerce hubs and movement toward cloud-native, API-first, microservices architectures" + }, + "degree": 2 + }, + { + "id": "google_edge_blog_textunit", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Google Edge Strategy Blog Text", + "description": "Keswani and Lakoski explore how retailers can build a modern edge strategy; edge computing allows retailers to process critical information directly within store environments" + }, + "degree": 2 + }, + { + "id": "retail_segment", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Retail Segment", + "description": "Categorization of retail industry verticals including Fashion & Apparel, Food Service, Gas & Convenience, Grocery, Mass Merchandise, Pharmacy/Drug Store, and Specialty." + }, + "degree": 2 + }, + { + "id": "business_partner_type", + "space": "concept", + "node_type": "Class", + "properties": { + "name": "Business Partner Type", + "description": "Classification of individuals interacting with Toshiba: Business Partner, Retailer, Supplier, Press/Analyst, Toshiba Employee, Other." + }, + "degree": 1 + }, + { + "id": "contact_form_lever", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Contact / Lead Generation Form", + "description": "Web form enabling prospective partners, retailers, and other stakeholders to start a conversation with Toshiba Global Commerce Solutions." + }, + "degree": 2 + }, + { + "id": "toshiba_support_team", + "space": "subject", + "node_type": "Team", + "properties": { + "name": "Toshiba Support Team", + "description": "Team members who follow up on customer contact form submissions" + }, + "degree": 0 + }, + { + "id": "toshiba_portal_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Toshiba WPS Portal API", + "description": "IBM WebSphere Portal (WPS) content handler API serving deferred JavaScript and markup modules for the Toshiba commerce portal", + "url": "https://commerce.toshiba.com/wps/contenthandler/marketing/" + }, + "degree": 1 + }, + { + "id": "contact_form_submission", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Contact Form Submission", + "description": "The act of a user reaching out via a web contact form, resulting in a success confirmation and follow-up by a team member" + }, + "degree": 4 + }, + { + "id": "recaptcha_verification", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "reCAPTCHA Verification", + "description": "Google reCAPTCHA challenge (crosswalk image selection) used to verify human users on the portal" + }, + "degree": 1 + }, + { + "id": "deferred_module_loading", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Deferred Module Loading", + "description": "Portal UI pattern where JavaScript and markup modules (skin, context menu, drag-and-drop, toolbar, content targeting) are loaded asynchronously via mashup collection endpoints" + }, + "degree": 1 + }, + { + "id": "success_message_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Success Message", + "description": "Text confirming contact form submission: 'Thank you for reaching out. One of our team members will be in contact soon.'", + "source": "https://commerce.toshiba.com/wps/portal/marketing/Home/tgcs/home/" + }, + "degree": 2 + }, + { + "id": "customer_contact_followup", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Customer Contact Follow-Up", + "description": "A Toshiba team member contacts the customer who submitted the contact form" + }, + "degree": 2 + }, + { + "id": "captcha_verification", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "CAPTCHA Verification", + "description": "A challenge-response mechanism used to verify that a user is human rather than an automated bot" + }, + "degree": 2 + }, + { + "id": "bot_access_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "Bot Access Risk", + "description": "Risk of automated bots accessing or scraping the Toshiba Commerce platform without human verification" + }, + "degree": 2 + }, + { + "id": "jira_project_list_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira project list", + "description": "ACLI command to list Jira projects", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project-list" + }, + "degree": 2 + }, + { + "id": "admin_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "admin", + "description": "ACLI command group for admin operations", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/admin/" + }, + "degree": 0 + }, + { + "id": "cli_authentication", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "CLI Authentication", + "description": "Authentication mechanisms for ACLI with Atlassian cloud services" + }, + "degree": 2 + }, + { + "id": "jira_sprint_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira sprint", + "description": "CLI command group for Jira sprint operations", + "source_url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-sprint/" + }, + "degree": 0 + }, + { + "id": "rovodev_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "rovodev", + "description": "CLI command group for Rovo Dev operations", + "source_url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 0 + }, + { + "id": "rovodev_auth_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "rovodev auth", + "description": "CLI command for Rovo Dev authentication", + "source_url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev-auth/" + }, + "degree": 1 + }, + { + "id": "jira_project_list_doc", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli jira project list reference documentation", + "description": "Official reference documentation for the acli jira project list command, including options and examples", + "last_updated": "2024-10-03", + "source_url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-project-list/" + }, + "degree": 7 + }, + { + "id": "pagination_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Pagination", + "description": "Mechanism for fetching all pages of results via HTTP requests, used in acli list commands via --paginate flag" + }, + "degree": 2 + }, + { + "id": "json_output_concept", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "JSON Output", + "description": "Structured JSON format output option for acli commands, enabled via --json flag" + }, + "degree": 2 + }, + { + "id": "atlassian_mcp_server", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Atlassian Rovo MCP Server", + "description": "Remote MCP server hosted at mcp.atlassian.com that supports automation and workflow integrations with Atlassian products", + "url": "https://mcp.atlassian.com/v1/mcp/authv2" + }, + "degree": 2 + }, + { + "id": "atlassian_mcp_sse_endpoint", + "space": "resource", + "node_type": "API", + "properties": { + "name": "Atlassian MCP SSE Endpoint (deprecated)", + "description": "Legacy SSE endpoint https://mcp.atlassian.com/v1/sse, deprecated after 30th June 2026", + "url": "https://mcp.atlassian.com/v1/sse", + "deprecation_date": "2026-06-30" + }, + "degree": 0 + }, + { + "id": "atlassian_mcp_app", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Atlassian MCP App", + "description": "Marketplace app that site admins may need to install to enable MCP access when User Installed Apps is blocked" + }, + "degree": 0 + }, + { + "id": "jira", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Jira", + "description": "Atlassian project and issue tracking tool accessible via MCP server" + }, + "degree": 1 + }, + { + "id": "confluence", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "Confluence", + "description": "Atlassian wiki and collaboration tool accessible via MCP server" + }, + "degree": 1 + }, + { + "id": "mcp_compatible_client", + "space": "subject", + "node_type": "Agent", + "properties": { + "name": "MCP-Compatible Client", + "description": "Third-party MCP client tools (CRM platforms, automation services, custom-built tools) that implement the MCP protocol and support OAuth 2.1 authentication" + }, + "degree": 3 + }, + { + "id": "oauth_21_authentication", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "OAuth 2.1 Authentication", + "description": "Authentication protocol required for MCP client connections to the Atlassian MCP server" + }, + "degree": 3 + }, + { + "id": "mcp_protocol", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "MCP Protocol", + "description": "Model Context Protocol standard that clients must implement to connect to the Atlassian Rovo MCP Server" + }, + "degree": 3 + }, + { + "id": "workflow_automation", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Workflow Automation", + "description": "Automation and workflow integration capabilities enabled by connecting MCP-compatible tools to the Atlassian MCP server" + }, + "degree": 2 + }, + { + "id": "site_admin_app_install_rule", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Site Admin App Installation Requirement", + "description": "Rule requiring site admins to install the Atlassian MCP App if User Installed Apps is blocked in the organization" + }, + "degree": 0 + }, + { + "id": "mcp_setup_guide", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "MCP Client Setup Guide", + "description": "Documentation page from Atlassian support describing configuration steps, prerequisites, and tips for connecting MCP-compatible clients to the Atlassian Rovo MCP Server", + "source": "https://support.atlassian.com/atlassian-rovo-mcp-server/docs/using-with-other-supported-mcp-clients" + }, + "degree": 4 + }, + { + "id": "successful_mcp_client_connection", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Successful MCP Client Connection", + "description": "Outcome where third-party MCP clients are successfully connected to Atlassian Rovo MCP Server and can perform actions on Jira and Confluence" + }, + "degree": 3 + }, + { + "id": "atlassian", + "space": "subject", + "node_type": "Org", + "properties": { + "name": "Atlassian", + "description": "Company providing the Rovo MCP Server and related support resources" + }, + "degree": 1 + }, + { + "id": "atlassian_rovo_mcp_server_topic", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "atlassian-rovo-mcp-server", + "description": "Topic tag used in the Atlassian Community for Rovo MCP Server discussions" + }, + "degree": 0 + }, + { + "id": "jira_workitem_edit_command", + "space": "resource", + "node_type": "API", + "properties": { + "name": "jira workitem edit", + "description": "ACLI command to edit a Jira work item", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-edit" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_edit_api", + "space": "resource", + "node_type": "API", + "properties": { + "name": "acli jira workitem edit", + "description": "Edit a Jira work item or multiple work items.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-edit/", + "last_updated": "2024-10-03" + }, + "degree": 0 + }, + { + "id": "acli_jira_workitem_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "ACLI Jira Workitem", + "description": "Atlassian CLI tool for managing Jira work items with subcommands including archive, assign, create, edit, delete, search, transition, and more.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/" + }, + "degree": 1 + }, + { + "id": "acli_rovodev_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "rovodev", + "description": "Atlassian CLI rovodev command group, including rovodev auth.", + "url": "https://developer.atlassian.com/cloud/acli/reference/commands/rovodev/" + }, + "degree": 1 + }, + { + "id": "acli_jira_workitem_edit", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "acli jira workitem edit", + "description": "CLI command to edit Jira work items, supporting JSON input/output, JQL queries, filter IDs, and direct field editing." + }, + "degree": 2 + }, + { + "id": "workitem_json_file", + "space": "resource", + "node_type": "File", + "properties": { + "name": "workitem.json", + "description": "JSON file containing work item definition used as input for the workitem edit command via --from-json flag." + }, + "degree": 0 + }, + { + "id": "atlassian_document_format", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Atlassian Document Format (ADF)", + "description": "A structured JSON-based format used by Atlassian products to represent rich text content such as descriptions." + }, + "degree": 2 + }, + { + "id": "jql_query", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "JQL Query", + "description": "Jira Query Language expression used to filter and select work items for bulk editing." + }, + "degree": 2 + }, + { + "id": "work_item_assignee", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Work Item Assignee", + "description": "The user assigned to a Jira work item; can be set by email, account ID, '@me', or 'default'." + }, + "degree": 2 + }, + { + "id": "work_item_filter", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Work Item Filter", + "description": "A saved Jira filter identified by Filter ID, used to select a set of work items for editing." + }, + "degree": 2 + }, + { + "id": "acli_edit_options_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "acli workitem edit options reference", + "description": "Documentation block listing all CLI flags for the acli jira workitem edit command including --assignee, --description, --jql, --from-json, --generate-json, --key, --labels, --summary, --type, and others.", + "source": "https://developer.atlassian.com/cloud/acli/reference/commands/jira-workitem-edit" + }, + "degree": 7 + }, + { + "id": "revert_commit", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Revert Commit", + "description": "A new commit that reverses the changes of a previous bad commit, preserving audit trail rather than erasing history" + }, + "degree": 0 + }, + { + "id": "merge_commit_method", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Merge Commit Method", + "description": "A project merge method in GitLab that creates a merge commit, required for reverting a merge request via UI" + }, + "degree": 0 + }, + { + "id": "audit_trail", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Audit Trail", + "description": "A clear, traceable history of changes in a version control system, preserved by revert commits" + }, + "degree": 0 + }, + { + "id": "version_control", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Version Control", + "description": "System that tracks and manages changes to code, enabling fixes and reversions of mistakes" + }, + "degree": 0 + }, + { + "id": "squashed_commits", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Squashed Commits", + "description": "Commits combined into a single commit; enables revert of fast-forwarded commits from GitLab UI in 16.9+" + }, + "degree": 0 + }, + { + "id": "access_control", + "space": "concept", + "node_type": "Concept", + "properties": { + "name": "Access Control", + "description": "Project access controls and processes that revert commits must follow" + }, + "degree": 0 + }, + { + "id": "code_mistake_remediation", + "space": "outcome", + "node_type": "Outcome", + "properties": { + "name": "Code Mistake Remediation", + "description": "The outcome of successfully reverting bad code changes to restore correct project state" + }, + "degree": 0 + }, + { + "id": "history_gap_risk", + "space": "outcome", + "node_type": "Risk", + "properties": { + "name": "History Gap Risk", + "description": "Risk of losing traceability if changes are erased from history rather than reverted cleanly" + }, + "degree": 0 + }, + { + "id": "revert_merge_request_action", + "space": "lever", + "node_type": "Lever", + "properties": { + "name": "Revert Merge Request Action", + "description": "The GitLab UI action to revert all changes introduced by a merged merge request" + }, + "degree": 0 + }, + { + "id": "merge_commit_method_requirement", + "space": "policy", + "node_type": "ApprovalRule", + "properties": { + "name": "Merge Commit Method Requirement", + "description": "Project must use Merge Commit merge method (set in Settings > Merge requests) to revert a merge request via UI" + }, + "degree": 0 + }, + { + "id": "revert_mr_steps_text", + "space": "evidence", + "node_type": "TextUnit", + "properties": { + "name": "Revert Merge Request Steps", + "description": "Step-by-step instructions for reverting a merge request in GitLab UI, including branch selection and immediate revert option" + }, + "degree": 0 + }, + { + "id": "gitlab_issue_22236", + "space": "evidence", + "node_type": "Evidence", + "properties": { + "name": "GitLab Issue 22236", + "description": "Issue tracking fast-forward revert support in GitLab UI, resolved in GitLab 16.9", + "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/22236" + }, + "degree": 0 + }, + { + "id": "gitlab_revert_tool", + "space": "resource", + "node_type": "Tool", + "properties": { + "name": "GitLab Revert Feature", + "description": "The GitLab UI Options > Revert functionality that allows reverting a commit to a branch or via a new merge request" + }, + "degree": 0 + }, + { + "id": "concept_automation", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Automation", + "description": "Documents related to automation" + }, + "degree": 3 + }, + { + "id": "concept_security", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Security", + "description": "Documents related to security" + }, + "degree": 1 + }, + { + "id": "concept_development", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Development", + "description": "Documents related to development" + }, + "degree": 3 + }, + { + "id": "concept_documentation", + "space": "concept", + "node_type": "Topic", + "properties": { + "name": "Documentation", + "description": "Documents related to documentation" + }, + "degree": 0 + }, + { + "id": "doc_github_recovery_codes", + "space": "resource", + "node_type": "Document", + "properties": { + "name": "github-recovery-codes.txt", + "title": "github-recovery-codes", + "path": "C:\\Users\\amore\\Downloads\\github-recovery-codes.txt", + "size_bytes": 206, + "modified": "2026-05-14T23:43:33.392382+00:00" + }, + "degree": 1 + }, + { + "id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.074_GMT+9", + "space": "resource", + "node_type": "Document", + "properties": { + "name": "sw-RPA Workflow-2026-02-10 19_55_45.074 GMT+9.txt", + "title": "sw-RPA Workflow-2026-02-10 19_55_45.074 GMT+9", + "path": "C:\\Users\\amore\\Downloads\\sw-RPA Workflow-2026-02-10 19_55_45.074 GMT+9.txt", + "size_bytes": 1036, + "modified": "2026-02-10T10:55:45.653278+00:00" + }, + "degree": 2 + }, + { + "id": "doc_sw_RPA_Workflow_2026_02_10_19_55_45.620_GMT+9", + "space": "resource", + "node_type": "Document", + "properties": { + "name": "sw-RPA Workflow-2026-02-10 19_55_45.620 GMT+9.txt", + "title": "sw-RPA Workflow-2026-02-10 19_55_45.620 GMT+9", + "path": "C:\\Users\\amore\\Downloads\\sw-RPA Workflow-2026-02-10 19_55_45.620 GMT+9.txt", + "size_bytes": 1109, + "modified": "2026-02-10T10:55:55.789595+00:00" + }, + "degree": 2 + }, + { + "id": "doc_sw_RPA_Workflow_2026_02_10_19_59_27.794_GMT+9", + "space": "resource", + "node_type": "Document", + "properties": { + "name": "sw-RPA Workflow-2026-02-10 19_59_27.794 GMT+9.txt", + "title": "sw-RPA Workflow-2026-02-10 19_59_27.794 GMT+9", + "path": "C:\\Users\\amore\\Downloads\\sw-RPA Workflow-2026-02-10 19_59_27.794 GMT+9.txt", + "size_bytes": 1004, + "modified": "2026-02-10T10:59:52.174478+00:00" + }, + "degree": 2 + } +] \ No newline at end of file diff --git a/apps/web/public/query-layers/layers-index.json b/apps/web/public/query-layers/layers-index.json new file mode 100644 index 0000000..69aa0c8 --- /dev/null +++ b/apps/web/public/query-layers/layers-index.json @@ -0,0 +1 @@ +{"layers": [], "version": "1.0", "last_updated": null} \ No newline at end of file diff --git a/apps/web/tsconfig.tsbuildinfo b/apps/web/tsconfig.tsbuildinfo new file mode 100644 index 0000000..968bb97 --- /dev/null +++ b/apps/web/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage-instance.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage-instance.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage-instance.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/search-params.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/lib/builtin-request-context.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/future/normalizers/request/action.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/client/components/draft-mode.d.ts","./node_modules/next/dist/client/components/headers.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/tailwindcss/types/generated/corepluginlist.d.ts","./node_modules/tailwindcss/types/generated/colors.d.ts","./node_modules/tailwindcss/types/config.d.ts","./node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","./lib/api.ts","./lib/querylayersearch.ts","./app/layout.tsx","./app/page.tsx","./components/fileexplorer.tsx","./components/rightpanel.tsx","./node_modules/@types/d3-array/index.d.ts","./node_modules/@types/d3-selection/index.d.ts","./node_modules/@types/d3-axis/index.d.ts","./node_modules/@types/d3-brush/index.d.ts","./node_modules/@types/d3-chord/index.d.ts","./node_modules/@types/d3-color/index.d.ts","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/d3-contour/index.d.ts","./node_modules/@types/d3-delaunay/index.d.ts","./node_modules/@types/d3-dispatch/index.d.ts","./node_modules/@types/d3-drag/index.d.ts","./node_modules/@types/d3-dsv/index.d.ts","./node_modules/@types/d3-ease/index.d.ts","./node_modules/@types/d3-fetch/index.d.ts","./node_modules/@types/d3-force/index.d.ts","./node_modules/@types/d3-format/index.d.ts","./node_modules/@types/d3-geo/index.d.ts","./node_modules/@types/d3-hierarchy/index.d.ts","./node_modules/@types/d3-interpolate/index.d.ts","./node_modules/@types/d3-path/index.d.ts","./node_modules/@types/d3-polygon/index.d.ts","./node_modules/@types/d3-quadtree/index.d.ts","./node_modules/@types/d3-random/index.d.ts","./node_modules/@types/d3-time/index.d.ts","./node_modules/@types/d3-scale/index.d.ts","./node_modules/@types/d3-scale-chromatic/index.d.ts","./node_modules/@types/d3-shape/index.d.ts","./node_modules/@types/d3-time-format/index.d.ts","./node_modules/@types/d3-timer/index.d.ts","./node_modules/@types/d3-transition/index.d.ts","./node_modules/@types/d3-zoom/index.d.ts","./node_modules/@types/d3/index.d.ts","./components/graphview.tsx","./app/dashboard/page.tsx","./.next/types/app/layout.ts","./.next/types/app/page.ts","./.next/types/app/dashboard/page.ts"],"fileIdsList":[[99,145,360,475],[99,145,360,438],[99,145,360,439],[87,99,145,376,436,440,441,474],[99,145,408],[99,145,395],[87,99,145,436],[87,99,145,436,473],[99,145],[99,145,436],[99,145,408,409],[99,145,443,471],[99,145,442,448],[99,145,453],[99,145,448],[99,145,447],[99,145,465],[99,145,461],[99,145,443,460,471],[99,145,442,443,444,445,446,447,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472],[99,142,145],[99,144,145],[145],[99,145,150,178],[99,145,146,151,156,164,175,186],[99,145,146,147,156,164],[94,95,96,99,145],[99,145,148,187],[99,145,149,150,157,165],[99,145,150,175,183],[99,145,151,153,156,164],[99,144,145,152],[99,145,153,154],[99,145,155,156],[99,144,145,156],[99,145,156,157,158,175,186],[99,145,156,157,158,171,175,178],[99,145,153,156,159,164,175,186],[99,145,156,157,159,160,164,175,183,186],[99,145,159,161,175,183,186],[97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,156,162],[99,145,163,186,191],[99,145,153,156,164,175],[99,145,165],[99,145,166],[99,144,145,167],[99,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,169],[99,145,170],[99,145,156,171,172],[99,145,171,173,187,189],[99,145,156,175,176,178],[99,145,177,178],[99,145,175,176],[99,145,178],[99,145,179],[99,142,145,175,180],[99,145,156,181,182],[99,145,181,182],[99,145,150,164,175,183],[99,145,184],[99,145,164,185],[99,145,159,170,186],[99,145,150,187],[99,145,175,188],[99,145,163,189],[99,145,190],[99,140,145],[99,140,145,156,158,167,175,178,186,189,191],[99,145,175,192],[87,99,145,197,198,199],[87,99,145,197,198],[87,99,145],[87,91,99,145,196,361,404],[87,91,99,145,195,361,404],[84,85,86,99,145],[92,99,145],[99,145,365],[99,145,367,368,369],[99,145,371],[99,145,202,212,218,220,361],[99,145,202,209,211,214,232],[99,145,212],[99,145,212,214,339],[99,145,267,285,300,407],[99,145,309],[99,145,202,212,219,253,263,336,337,407],[99,145,219,407],[99,145,212,263,264,265,407],[99,145,212,219,253,407],[99,145,407],[99,145,202,219,220,407],[99,145,293],[99,144,145,193,292],[87,99,145,286,287,288,306,307],[87,99,145,286],[99,145,276],[99,145,275,277,381],[87,99,145,286,287,304],[99,145,282,307,393],[99,145,391,392],[99,145,226,390],[99,145,279],[99,144,145,193,226,242,275,276,277,278],[87,99,145,304,306,307],[99,145,304,306],[99,145,304,305,307],[99,145,170,193],[99,145,274],[99,144,145,193,211,213,270,271,272,273],[87,99,145,203,384],[87,99,145,186,193],[87,99,145,219,251],[87,99,145,219],[99,145,249,254],[87,99,145,250,364],[87,91,99,145,159,193,195,196,361,402,403],[99,145,361],[99,145,201],[99,145,354,355,356,357,358,359],[99,145,356],[87,99,145,250,286,364],[87,99,145,286,362,364],[87,99,145,286,364],[99,145,159,193,213,364],[99,145,159,193,210,211,222,240,242,274,279,280,302,304],[99,145,271,274,279,287,289,290,291,293,294,295,296,297,298,299,407],[99,145,272],[87,99,145,170,193,211,212,240,242,243,245,270,302,303,307,361,407],[99,145,159,193,213,214,226,227,275],[99,145,159,193,212,214],[99,145,159,175,193,210,213,214],[99,145,159,170,186,193,210,211,212,213,214,219,222,223,233,234,236,239,240,242,243,244,245,269,270,303,304,312,314,317,319,322,324,325,326,327],[99,145,159,175,193],[99,145,202,203,204,210,211,361,364,407],[99,145,159,175,186,193,207,338,340,341,407],[99,145,170,186,193,207,210,213,230,234,236,237,238,243,270,317,328,330,336,350,351],[99,145,212,216,270],[99,145,210,212],[99,145,223,318],[99,145,320,321],[99,145,320],[99,145,318],[99,145,320,323],[99,145,206,207],[99,145,206,246],[99,145,206],[99,145,208,223,316],[99,145,315],[99,145,207,208],[99,145,208,313],[99,145,207],[99,145,302],[99,145,159,193,210,222,241,261,267,281,284,301,304],[99,145,255,256,257,258,259,260,282,283,307,362],[99,145,311],[99,145,159,193,210,222,241,247,308,310,312,361,364],[99,145,159,186,193,203,210,212,269],[99,145,266],[99,145,159,193,344,349],[99,145,233,242,269,364],[99,145,332,336,350,353],[99,145,159,216,336,344,345,353],[99,145,202,212,233,244,347],[99,145,159,193,212,219,244,331,332,342,343,346,348],[99,145,194,240,241,242,361,364],[99,145,159,170,186,193,208,210,211,213,216,221,222,230,233,234,236,237,238,239,243,245,269,270,314,328,329,364],[99,145,159,193,210,212,216,330,352],[99,145,159,193,211,213],[87,99,145,159,170,193,201,203,210,211,214,222,239,240,242,243,245,311,361,364],[99,145,159,170,186,193,205,208,209,213],[99,145,206,268],[99,145,159,193,206,211,222],[99,145,159,193,212,223],[99,145,159,193],[99,145,226],[99,145,225],[99,145,227],[99,145,212,224,226,230],[99,145,212,224,226],[99,145,159,193,205,212,213,219,227,228,229],[87,99,145,304,305,306],[99,145,262],[87,99,145,203],[87,99,145,236],[87,99,145,194,239,242,245,361,364],[99,145,203,384,385],[87,99,145,254],[87,99,145,170,186,193,201,248,250,252,253,364],[99,145,213,219,236],[99,145,235],[87,99,145,157,159,170,193,201,254,263,361,362,363],[83,87,88,89,90,99,145,195,196,361,404],[99,145,150],[99,145,333,334,335],[99,145,333],[99,145,373],[99,145,375],[99,145,377],[99,145,379],[99,145,382],[99,145,386],[91,93,99,145,361,366,370,372,374,376,378,380,383,387,389,395,396,398,405,406,407],[99,145,388],[99,145,394],[99,145,250],[99,145,397],[99,144,145,227,228,229,230,399,400,401,404],[99,145,193],[87,91,99,145,159,161,170,193,195,196,197,199,201,214,353,360,364,404],[99,145,426],[99,145,424,426],[99,145,415,423,424,425,427,429],[99,145,413],[99,145,416,421,426,429],[99,145,412,429],[99,145,416,417,420,421,422,429],[99,145,416,417,418,420,421,429],[99,145,413,414,415,416,417,421,422,423,425,426,427,429],[99,145,429],[99,145,411,413,414,415,416,417,418,420,421,422,423,424,425,426,427,428],[99,145,411,429],[99,145,416,418,419,421,422,429],[99,145,420,429],[99,145,421,422,426,429],[99,145,414,424],[99,145,431,432],[99,145,430,433],[99,112,116,145,186],[99,112,145,175,186],[99,107,145],[99,109,112,145,183,186],[99,145,164,183],[99,107,145,193],[99,109,112,145,164,186],[99,104,105,108,111,145,156,175,186],[99,112,119,145],[99,104,110,145],[99,112,133,134,145],[99,108,112,145,178,186,193],[99,133,145,193],[99,106,107,145,193],[99,112,145],[99,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,145],[99,112,127,145],[99,112,119,120,145],[99,110,112,120,121,145],[99,111,145],[99,104,107,112,145],[99,112,116,120,121,145],[99,116,145],[99,110,112,115,145,186],[99,104,109,112,119,145],[99,145,175],[99,107,112,133,145,191,193],[99,145,434]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"f9fd93190acb1ffe0bc0fb395df979452f8d625071e9ffc8636e4dfb86ab2508","impliedFormat":1},{"version":"5f41fd8732a89e940c58ce22206e3df85745feb8983e2b4c6257fb8cbb118493","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3a8bddb66b659f6bd2ff641fc71df8a8165bafe0f4b799cc298be5cd3755bb20","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"196c960b12253fde69b204aa4fbf69470b26daf7a430855d7f94107a16495ab0","impliedFormat":1},{"version":"ee15ea5dd7a9fc9f5013832e5843031817a880bf0f24f37a29fd8337981aae07","impliedFormat":1},{"version":"bf24f6d35f7318e246010ffe9924395893c4e96d34324cde77151a73f078b9ad","impliedFormat":1},{"version":"ea53732769832d0f127ae16620bd5345991d26bf0b74e85e41b61b27d74ea90f","impliedFormat":1},{"version":"10595c7ff5094dd5b6a959ccb1c00e6a06441b4e10a87bc09c15f23755d34439","impliedFormat":1},{"version":"9620c1ff645afb4a9ab4044c85c26676f0a93e8c0e4b593aea03a89ccb47b6d0","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"08ed0b3f0166787f84a6606f80aa3b1388c7518d78912571b203817406e471da","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","impliedFormat":1},{"version":"b0decf4b6da3ebc52ea0c96095bdfaa8503acc4ac8e9081c5f2b0824835dd3bd","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"fc3e1c87b39e5ba1142f27ec089d1966da168c04a859a4f6aab64dceae162c2b","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"61888522cec948102eba94d831c873200aa97d00d8989fdfd2a3e0ee75ec65a2","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"59bf32919de37809e101acffc120596a9e45fdbab1a99de5087f31fdc36e2f11","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"faa03dffb64286e8304a2ca96dd1317a77db6bfc7b3fb385163648f67e535d77","impliedFormat":1},{"version":"c40c848daad198266370c1c72a7a8c3d18d2f50727c7859fcfefd3ff69a7f288","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"6428e6edd944ce6789afdf43f9376c1f2e4957eea34166177625aaff4c0da1a0","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"8dba67056cbb27628e9b9a1cba8e57036d359dceded0725c72a3abe4b6c79cd4","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"154dd2e22e1e94d5bc4ff7726706bc0483760bae40506bdce780734f11f7ec47","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"0131e203d8560edb39678abe10db42564a068f98c4ebd1ed9ffe7279c78b3c81","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"8b8f00491431fe82f060dfe8c7f2180a9fb239f3d851527db909b83230e75882","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"aeab39e8e0b1a3b250434c3b2bb8f4d17bbec2a9dbce5f77e8a83569d3d2cbc2","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"d729408dfde75b451530bcae944cf89ee8277e2a9df04d1f62f2abfd8b03c1e1","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"5f58e28cd22e8fc1ac1b3bc6b431869f1e7d0b39e2c21fbf79b9fa5195a85980","impliedFormat":1},{"version":"e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","impliedFormat":1},{"version":"63533978dcda286422670f6e184ac516805a365fb37a086eeff4309e812f1402","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"31fb49ef3aa3d76f0beb644984e01eab0ea222372ea9b49bb6533be5722d756c","impliedFormat":1},{"version":"33cd131e1461157e3e06b06916b5176e7a8ec3fce15a5cfe145e56de744e07d2","impliedFormat":1},{"version":"889ef863f90f4917221703781d9723278db4122d75596b01c429f7c363562b86","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"d11308de5a36c7015bb73adb5ad1c1bdaac2baede4cc831a05cf85efa3cc7f2f","impliedFormat":1},{"version":"38e4684c22ed9319beda6765bab332c724103d3a966c2e5e1c5a49cf7007845f","impliedFormat":1},{"version":"f9812cfc220ecf7557183379531fa409acd249b9e5b9a145d0d52b76c20862de","affectsGlobalScope":true,"impliedFormat":1},{"version":"e650298721abc4f6ae851e60ae93ee8199791ceec4b544c3379862f81f43178c","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"913ddbba170240070bd5921b8f33ea780021bdf42fbdfcd4fcb2691b1884ddde","impliedFormat":1},{"version":"b4e6d416466999ff40d3fe5ceb95f7a8bfb7ac2262580287ac1a8391e5362431","impliedFormat":1},{"version":"5fe23bd829e6be57d41929ac374ee9551ccc3c44cee893167b7b5b77be708014","impliedFormat":1},{"version":"0a626484617019fcfbfc3c1bc1f9e84e2913f1adb73692aa9075817404fb41a1","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"cf185cc4a9a6d397f416dd28cca95c227b29f0f27b160060a95c0e5e36cda865","impliedFormat":1},{"version":"0086f3e4ad898fd7ca56bb223098acfacf3fa065595182aaf0f6c4a6a95e6fbd","impliedFormat":1},{"version":"efaa078e392f9abda3ee8ade3f3762ab77f9c50b184e6883063a911742a4c96a","impliedFormat":1},{"version":"54a8bb487e1dc04591a280e7a673cdfb272c83f61e28d8a64cf1ac2e63c35c51","impliedFormat":1},{"version":"021a9498000497497fd693dd315325484c58a71b5929e2bbb91f419b04b24cea","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"84124384abae2f6f66b7fbfc03862d0c2c0b71b826f7dbf42c8085d31f1d3f95","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"58b49e5c1def740360b5ae22ae2405cfac295fee74abd88d74ac4ea42502dc03","impliedFormat":1},{"version":"512fc15cca3a35b8dbbf6e23fe9d07e6f87ad03c895acffd3087ce09f352aad0","impliedFormat":1},{"version":"9a0946d15a005832e432ea0cd4da71b57797efb25b755cc07f32274296d62355","impliedFormat":1},{"version":"a52ff6c0a149e9f370372fc3c715d7f2beee1f3bab7980e271a7ab7d313ec677","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"f95180f03d827525ca4f990f49e17ec67198c316dd000afbe564655141f725cd","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","impliedFormat":1},{"version":"97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","impliedFormat":1},{"version":"c99a3a5f2215d5b9d735aa04cec6e61ed079d8c0263248e298ffe4604d4d0624","impliedFormat":1},{"version":"49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"847e160d709c74cc714fbe1f99c41d3425b74cd47b1be133df1623cd87014089","impliedFormat":1},{"version":"9fee04f1e1afa50524862289b9f0b0fdc3735b80e2a0d684cec3b9ff3d94cecc","impliedFormat":1},{"version":"5cdc27fbc5c166fc5c763a30ac21cbac9859dc5ba795d3230db6d4e52a1965bb","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"14e5cdec6f8ae82dfd0694e64903a0a54abdfe37e1d966de3d4128362acbf35f","impliedFormat":1},{"version":"bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","impliedFormat":1},{"version":"4e06330a84dec7287f7ebdd64978f41a9f70a668d3b5edc69d5d4a50b9b376bb","impliedFormat":1},{"version":"65bfa72967fbe9fc33353e1ac03f0480aa2e2ea346d61ff3ea997dfd850f641a","impliedFormat":1},{"version":"c06f0bb92d1a1a5a6c6e4b5389a5664d96d09c31673296cb7da5fe945d54d786","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"872caaa31423f4345983d643e4649fb30f548e9883a334d6d1c5fff68ede22d4","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"09dfc64fcd6a2785867f2368419859a6cc5a8d4e73cbe2538f205b1642eb0f51","impliedFormat":1},{"version":"bcf6f0a323653e72199105a9316d91463ad4744c546d1271310818b8cef7c608","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"351475f9c874c62f9b45b1f0dc7e2704e80dfd5f1af83a3a9f841f9dfe5b2912","impliedFormat":1},{"version":"ac457ad39e531b7649e7b40ee5847606eac64e236efd76c5d12db95bf4eacd17","impliedFormat":1},{"version":"187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","impliedFormat":1},{"version":"d4c3250105a612202289b3a266bb7e323db144f6b9414f9dea85c531c098b811","impliedFormat":1},{"version":"95b444b8c311f2084f0fb51c616163f950fb2e35f4eaa07878f313a2d36c98a4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"f8acecec1114f11690956e007d920044799aefeb3cece9e7f4b1f8a1d542b2c9","impliedFormat":1},{"version":"178071ccd043967a58c5d1a032db0ddf9bd139e7920766b537d9783e88eb615e","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"5cad4158616d7793296dd41e22e1257440910ea8d01c7b75045d4dfb20c5a41a","impliedFormat":1},{"version":"04d3aad777b6af5bd000bfc409907a159fe77e190b9d368da4ba649cdc28d39e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74efc1d6523bd57eb159c18d805db4ead810626bc5bc7002a2c7f483044b2e0f","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"3b0b1d352b8d2e47f1c4df4fb0678702aee071155b12ef0185fce9eb4fa4af1e","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"a344403e7a7384e0e7093942533d309194ad0a53eca2a3100c0b0ab4d3932773","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb18bf4a61a17b4a6199eb3938ecfa4a59eb7c40843ad4a82b975ab6f7e3d925","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"e9b6fc05f536dfddcdc65dbcf04e09391b1c968ab967382e48924f5cb90d88e1","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"2b664c3cc544d0e35276e1fb2d4989f7d4b4027ffc64da34ec83a6ccf2e5c528","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"3cd8f0464e0939b47bfccbb9bb474a6d87d57210e304029cd8eb59c63a81935d","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","impliedFormat":1},{"version":"8b140b398a6afbd17cc97c38aea5274b2f7f39b1ae5b62952cfe65bf493e3e75","impliedFormat":1},{"version":"7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","impliedFormat":1},{"version":"5cce3b975cdb72b57ae7de745b3c5de5790781ee88bcb41ba142f07c0fa02e97","impliedFormat":1},{"version":"00bd6ebe607246b45296aa2b805bd6a58c859acecda154bfa91f5334d7c175c6","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"0d28b974a7605c4eda20c943b3fa9ae16cb452c1666fc9b8c341b879992c7612","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"87ac2fb61e629e777f4d161dff534c2023ee15afd9cb3b1589b9b1f014e75c58","impliedFormat":1},{"version":"13c8b4348db91e2f7d694adc17e7438e6776bc506d5c8f5de9ad9989707fa3fe","impliedFormat":1},{"version":"3c1051617aa50b38e9efaabce25e10a5dd9b1f42e372ef0e8a674076a68742ed","impliedFormat":1},{"version":"07a3e20cdcb0f1182f452c0410606711fbea922ca76929a41aacb01104bc0d27","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"4cd4b6b1279e9d744a3825cbd7757bbefe7f0708f3f1069179ad535f19e8ed2c","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"b97cb5616d2ab82a98ec9ada7b9e9cabb1f5da880ec50ea2b8dc5baa4cbf3c16","impliedFormat":99},{"version":"d23df9ff06ae8bf1dcb7cc933e97ae7da418ac77749fecee758bb43a8d69f840","affectsGlobalScope":true,"impliedFormat":1},{"version":"040c71dde2c406f869ad2f41e8d4ce579cc60c8dbe5aa0dd8962ac943b846572","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"a6df929821e62f4719551f7955b9f42c0cd53c1370aec2dd322e24196a7dfe33","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"e462a655754db9df18b4a657454a7b6a88717ffded4e89403b2b3a47c6603fc3",{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},"52cd23ce7f6f0e915b25d24a85aef943b4944d01ed1484497b3d36ef2ff200e0","5ab9089f1771f64f38cf2eae2254b0e7e91e6994c35eba306d428b1e64c9d991","7df0a02087d5ed9de6978b423c4a748114cc3d070559ed52fb1c954cb3f4030e","b75ed17c8828467df3baf7f705c4f1d319c485efd6356f87776a79f9edfcb66a","0fa96008f21ce1ee00d3c275b22dc6c9be03fc8b45b09f484d67a61edbb5d3cd","3e7bd980959fca78cc0d670a742b17642cbddbf796b77b8becaa2d2d89d1d1c2","3fb0914e7714dc3ef63876e7c08c1a127f8561a5d363941db92dffb5b4f27300",{"version":"b1538a92b9bae8d230267210c5db38c2eb6bdb352128a3ce3aa8c6acf9fc9622","impliedFormat":1},{"version":"469532350a366536390c6eb3bde6839ec5c81fe1227a6b7b6a70202954d70c40","impliedFormat":1},{"version":"17c9f569be89b4c3c17dc17a9fb7909b6bab34f73da5a9a02d160f502624e2e8","impliedFormat":1},{"version":"003df7b9a77eaeb7a524b795caeeb0576e624e78dea5e362b053cb96ae89132a","impliedFormat":1},{"version":"7ba17571f91993b87c12b5e4ecafe66b1a1e2467ac26fcb5b8cee900f6cf8ff4","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"8b219399c6a743b7c526d4267800bd7c84cf8e27f51884c86ad032d662218a9d","impliedFormat":1},{"version":"bad6d83a581dbd97677b96ee3270a5e7d91b692d220b87aab53d63649e47b9ad","impliedFormat":1},{"version":"324726a1827e34c0c45c43c32ecf73d235b01e76ef6d0f44c2c0270628df746a","impliedFormat":1},{"version":"54e79224429e911b5d6aeb3cf9097ec9fd0f140d5a1461bbdece3066b17c232c","impliedFormat":1},{"version":"e1b666b145865bc8d0d843134b21cf589c13beba05d333c7568e7c30309d933a","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"c836b5d8d84d990419548574fc037c923284df05803b098fe5ddaa49f88b898a","impliedFormat":1},{"version":"3a2b8ed9d6b687ab3e1eac3350c40b1624632f9e837afe8a4b5da295acf491cb","impliedFormat":1},{"version":"189266dd5f90a981910c70d7dfa05e2bca901a4f8a2680d7030c3abbfb5b1e23","impliedFormat":1},{"version":"5ec8dcf94c99d8f1ed7bb042cdfa4ef6a9810ca2f61d959be33bcaf3f309debe","impliedFormat":1},{"version":"a80e02af710bdac31f2d8308890ac4de4b6a221aafcbce808123bfc2903c5dc2","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"0f345151cece7be8d10df068b58983ea8bcbfead1b216f0734037a6c63d8af87","impliedFormat":1},{"version":"37fd7bde9c88aa142756d15aeba872498f45ad149e0d1e56f3bccc1af405c520","impliedFormat":1},{"version":"2a920fd01157f819cf0213edfb801c3fb970549228c316ce0a4b1885020bad35","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"a67774ceb500c681e1129b50a631fa210872bd4438fae55e5e8698bac7036b19","impliedFormat":1},{"version":"9b048390bcffe88c023a4cd742a720b41d4cd7df83bc9270e6f2339bf38de278","affectsGlobalScope":true,"impliedFormat":1},{"version":"dd8936160e41420264a9d5fade0ff95cc92cab56032a84c74a46b4c38e43121e","impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"421c3f008f6ef4a5db2194d58a7b960ef6f33e94b033415649cd557be09ef619","impliedFormat":1},{"version":"57568ff84b8ba1a4f8c817141644b49252cc39ec7b899e4bfba0ec0557c910a0","impliedFormat":1},{"version":"e6f10f9a770dedf552ca0946eef3a3386b9bfb41509233a30fc8ca47c49db71c","impliedFormat":1},"7643d00cccbc034bb32cb522f46fdb231d3ac0d6d71da1eb0831390f3afb385f","08d729aac63fb5432659b7ea1ba4a4be75adacf4c926aedea3b8e74454c57c61","89df7ab3e2b3308cb616ea84ee43a59549a5817b4397641f7e4fc48935ca1550","6560aa509471497f9b80cbe1b6137b90e2ff74a355c6357e875273d1c7cab2f2","127ab00cf25485061cdbcd396112ed54066138ed0265e4aa338b482dad276457"],"root":[410,[435,441],[474,478]],"options":{"allowJs":false,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[478,1],[476,2],[477,3],[475,4],[438,5],[439,6],[440,7],[474,8],[441,7],[436,9],[437,10],[410,11],[363,9],[442,9],[444,12],[445,12],[446,9],[447,9],[449,13],[450,9],[451,9],[452,12],[453,9],[454,9],[455,14],[456,9],[457,9],[458,15],[459,9],[460,16],[461,9],[462,9],[463,9],[464,9],[467,9],[466,17],[443,9],[468,18],[469,9],[465,9],[470,9],[471,12],[472,19],[473,20],[448,9],[142,21],[143,21],[144,22],[99,23],[145,24],[146,25],[147,26],[94,9],[97,27],[95,9],[96,9],[148,28],[149,29],[150,30],[151,31],[152,32],[153,33],[154,33],[155,34],[156,35],[157,36],[158,37],[100,9],[98,9],[159,38],[160,39],[161,40],[193,41],[162,42],[163,43],[164,44],[165,45],[166,46],[167,47],[168,48],[169,49],[170,50],[171,51],[172,51],[173,52],[174,9],[175,53],[177,54],[176,55],[178,56],[179,57],[180,58],[181,59],[182,60],[183,61],[184,62],[185,63],[186,64],[187,65],[188,66],[189,67],[190,68],[101,9],[102,9],[103,9],[141,69],[191,70],[192,71],[86,9],[198,72],[199,73],[197,74],[195,75],[196,76],[84,9],[87,77],[286,74],[85,9],[93,78],[366,79],[370,80],[372,81],[219,82],[233,83],[337,84],[265,9],[340,85],[301,86],[310,87],[338,88],[220,89],[264,9],[266,90],[339,91],[240,92],[221,93],[245,92],[234,92],[204,92],[292,94],[293,95],[209,9],[289,96],[294,97],[381,98],[287,97],[382,99],[271,9],[290,100],[394,101],[393,102],[296,97],[392,9],[390,9],[391,103],[291,74],[278,104],[279,105],[288,106],[305,107],[306,108],[295,109],[273,110],[274,111],[385,112],[388,113],[252,114],[251,115],[250,116],[397,74],[249,117],[225,9],[400,9],[403,9],[402,74],[404,118],[200,9],[331,9],[232,119],[202,120],[354,9],[355,9],[357,9],[360,121],[356,9],[358,122],[359,122],[218,9],[231,9],[365,123],[373,124],[377,125],[214,126],[281,127],[280,9],[272,110],[300,128],[298,129],[297,9],[299,9],[304,130],[276,131],[213,132],[238,133],[328,134],[205,135],[212,136],[201,84],[342,137],[352,138],[341,9],[351,139],[239,9],[223,140],[319,141],[318,9],[325,142],[327,143],[320,144],[324,145],[326,142],[323,144],[322,142],[321,144],[261,146],[246,146],[313,147],[247,147],[207,148],[206,9],[317,149],[316,150],[315,151],[314,152],[208,153],[285,154],[302,155],[284,156],[309,157],[311,158],[308,156],[241,153],[194,9],[329,159],[267,160],[303,9],[350,161],[270,162],[345,163],[211,9],[346,164],[348,165],[349,166],[332,9],[344,135],[243,167],[330,168],[353,169],[215,9],[217,9],[222,170],[312,171],[210,172],[216,9],[269,173],[268,174],[224,175],[277,176],[275,177],[226,178],[228,179],[401,9],[227,180],[229,181],[368,9],[367,9],[369,9],[399,9],[230,182],[283,74],[92,9],[307,183],[253,9],[263,184],[242,9],[375,74],[384,185],[260,74],[379,97],[259,186],[362,187],[258,185],[203,9],[386,188],[256,74],[257,74],[248,9],[262,9],[255,189],[254,190],[244,191],[237,109],[347,9],[236,192],[235,9],[371,9],[282,74],[364,193],[83,9],[91,194],[88,74],[89,9],[90,9],[343,195],[336,196],[335,9],[334,197],[333,9],[374,198],[376,199],[378,200],[380,201],[383,202],[409,203],[387,203],[408,204],[389,205],[395,206],[396,207],[398,208],[405,209],[407,9],[406,210],[361,211],[427,212],[425,213],[426,214],[414,215],[415,213],[422,216],[413,217],[418,218],[428,9],[419,219],[424,220],[430,221],[429,222],[412,223],[420,224],[421,225],[416,226],[423,212],[417,227],[411,9],[433,228],[432,9],[431,9],[434,229],[81,9],[82,9],[13,9],[14,9],[16,9],[15,9],[2,9],[17,9],[18,9],[19,9],[20,9],[21,9],[22,9],[23,9],[24,9],[3,9],[25,9],[26,9],[4,9],[27,9],[31,9],[28,9],[29,9],[30,9],[32,9],[33,9],[34,9],[5,9],[35,9],[36,9],[37,9],[38,9],[6,9],[42,9],[39,9],[40,9],[41,9],[43,9],[7,9],[44,9],[49,9],[50,9],[45,9],[46,9],[47,9],[48,9],[8,9],[54,9],[51,9],[52,9],[53,9],[55,9],[9,9],[56,9],[57,9],[58,9],[60,9],[59,9],[61,9],[62,9],[10,9],[63,9],[64,9],[65,9],[11,9],[66,9],[67,9],[68,9],[69,9],[70,9],[1,9],[71,9],[72,9],[12,9],[76,9],[74,9],[79,9],[78,9],[73,9],[77,9],[75,9],[80,9],[119,230],[129,231],[118,230],[139,232],[110,233],[109,234],[138,210],[132,235],[137,236],[112,237],[126,238],[111,239],[135,240],[107,241],[106,210],[136,242],[108,243],[113,244],[114,9],[117,244],[104,9],[140,245],[130,246],[121,247],[122,248],[124,249],[120,250],[123,251],[133,210],[115,252],[116,253],[125,254],[105,255],[128,246],[127,244],[131,9],[134,256],[435,257]],"affectedFilesPendingEmit":[478,476,477,475,438,439,440,474,441,436,437,435],"version":"5.9.3"} \ No newline at end of file diff --git a/docs/superpowers/plans/2026-05-21-query-visualization.md b/docs/superpowers/plans/2026-05-21-query-visualization.md new file mode 100644 index 0000000..4e078a7 --- /dev/null +++ b/docs/superpowers/plans/2026-05-21-query-visualization.md @@ -0,0 +1,435 @@ +# Query Visualization Layer Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add natural-language query-to-graph-layer flow so users can run a query from CLI or web and visualize toggleable multi-hop result layers in OpenCrab web UI. + +**Architecture:** Build a file-based query layer pipeline. Python CLI generates layer JSON files under `apps/web/public/query-layers` using existing `HybridQuery` and graph neighbor traversal. Web UI loads `layers-index.json`, toggles layers, and overlays layer nodes/edges on top of existing graph rendering. + +**Tech Stack:** Python 3.11, Click CLI, OpenCrab stores (LocalGraphStore/Neo4jStore), Next.js 14, React 18, TypeScript, D3. + +--- + +## File Structure (planned changes) + +- Create: `opencrab/ontology/query_layers.py` + Responsibility: layer file I/O, index update, pruning, and schema-safe persistence. +- Create: `opencrab/ontology/query_visualization.py` + Responsibility: query result normalization + multi-hop expansion + layer payload assembly. +- Modify: `opencrab/cli.py` + Responsibility: add `query-viz` command and wire command options to layer generation. +- Create: `tests/test_query_layers.py` + Responsibility: file/index behavior tests. +- Create: `tests/test_query_visualization.py` + Responsibility: subgraph expansion and score decay tests. +- Modify: `apps/web/lib/api.ts` + Responsibility: layer types + `getQueryLayers()` + `getLayerData()`. +- Create: `apps/web/lib/queryLayerSearch.ts` + Responsibility: browser-side lightweight query for optional web input. +- Create: `apps/web/components/LayerPanel.tsx` + Responsibility: layer list rendering + toggle callbacks + refresh. +- Create: `apps/web/components/QueryInput.tsx` + Responsibility: web-side query input and temporary layer trigger. +- Modify: `apps/web/components/GraphView.tsx` + Responsibility: layer node/edge overlay visualization and highlight styles. +- Modify: `apps/web/app/dashboard/page.tsx` + Responsibility: layer state wiring and component composition. +- Create: `apps/web/public/query-layers/layers-index.json` + Responsibility: initial empty layer index. + +--- + +### Task 1: Build layer persistence module (Python) + +**Files:** +- Create: `opencrab/ontology/query_layers.py` +- Test: `tests/test_query_layers.py` + +- [ ] **Step 1: Write the failing test** + +```python +# tests/test_query_layers.py +from pathlib import Path +from opencrab.ontology.query_layers import ensure_layer_store, write_layer, read_index + +def test_write_layer_creates_index_and_file(tmp_path: Path) -> None: + store_dir = tmp_path / "query-layers" + ensure_layer_store(store_dir) + + layer = { + "id": "layer-20260521-170000", + "query": "ELERA relation", + "timestamp": "2026-05-21T17:00:00+09:00", + "source": "cli", + "nodes": [], + "edges": [], + "metadata": {"total_nodes": 0, "total_edges": 0, "max_hops": 3, "query_time_ms": 1}, + } + write_layer(store_dir, layer) + + assert (store_dir / "layer-20260521-170000.json").exists() + idx = read_index(store_dir) + assert idx["layers"][0]["id"] == "layer-20260521-170000" +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `python -m pytest tests/test_query_layers.py::test_write_layer_creates_index_and_file -v` +Expected: FAIL with `ModuleNotFoundError` or missing function import. + +- [ ] **Step 3: Write minimal implementation** + +```python +# opencrab/ontology/query_layers.py +from __future__ import annotations +import json +from pathlib import Path +from typing import Any + +def ensure_layer_store(store_dir: Path) -> None: + store_dir.mkdir(parents=True, exist_ok=True) + index = store_dir / "layers-index.json" + if not index.exists(): + index.write_text(json.dumps({"layers": [], "version": "1.0"}, ensure_ascii=False, indent=2), encoding="utf-8") + +def read_index(store_dir: Path) -> dict[str, Any]: + ensure_layer_store(store_dir) + return json.loads((store_dir / "layers-index.json").read_text(encoding="utf-8")) + +def write_layer(store_dir: Path, layer: dict[str, Any]) -> None: + ensure_layer_store(store_dir) + (store_dir / f"{layer['id']}.json").write_text(json.dumps(layer, ensure_ascii=False, indent=2), encoding="utf-8") + idx = read_index(store_dir) + idx["layers"] = [x for x in idx["layers"] if x["id"] != layer["id"]] + idx["layers"].insert(0, { + "id": layer["id"], "query": layer["query"], "timestamp": layer["timestamp"], + "source": layer["source"], "node_count": len(layer["nodes"]), "edge_count": len(layer["edges"]), "enabled": True, + }) + (store_dir / "layers-index.json").write_text(json.dumps(idx, ensure_ascii=False, indent=2), encoding="utf-8") +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `python -m pytest tests/test_query_layers.py -v` +Expected: PASS (all tests in `test_query_layers.py`). + +- [ ] **Step 5: Commit** + +```bash +git add opencrab/ontology/query_layers.py tests/test_query_layers.py +git commit -m "feat: add query layer file persistence module" +``` + +--- + +### Task 2: Implement query visualization assembly (Python) + +**Files:** +- Create: `opencrab/ontology/query_visualization.py` +- Test: `tests/test_query_visualization.py` + +- [ ] **Step 1: Write the failing test** + +```python +# tests/test_query_visualization.py +from opencrab.ontology.query_visualization import build_layer_payload + +class FakeGraph: + available = True + def find_neighbors(self, node_id: str, direction: str = "both", depth: int = 1, limit: int = 50): + return [{"properties": {"id": "b", "title": "B"}, "labels": ["Claim"], "relation_type": "supports", "depth": 1}] + +def test_build_layer_payload_includes_seed_and_neighbors() -> None: + query_results = [{"node_id": "a", "score": 0.9, "text": "A", "metadata": {}}] + layer = build_layer_payload("q", query_results, FakeGraph(), max_hops=2, limit=30) + ids = {n["id"] for n in layer["nodes"]} + assert "a" in ids + assert "b" in ids + assert any(e["relation"] == "supports" for e in layer["edges"]) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `python -m pytest tests/test_query_visualization.py::test_build_layer_payload_includes_seed_and_neighbors -v` +Expected: FAIL with missing module/function. + +- [ ] **Step 3: Write minimal implementation** + +```python +# opencrab/ontology/query_visualization.py +from __future__ import annotations +from datetime import datetime, timezone +from typing import Any + +def _now_id() -> tuple[str, str]: + now = datetime.now(timezone.utc) + return f"layer-{now.strftime('%Y%m%d-%H%M%S')}", now.isoformat() + +def build_layer_payload(question: str, query_results: list[dict[str, Any]], graph: Any, max_hops: int, limit: int) -> dict[str, Any]: + layer_id, ts = _now_id() + nodes: list[dict[str, Any]] = [] + edges: list[dict[str, Any]] = [] + seed_ids = [r.get("node_id") for r in query_results if r.get("node_id")] + + for r in query_results: + nid = r.get("node_id") + if not nid: + continue + nodes.append({"id": nid, "space": "concept", "node_type": "Unknown", "properties": {}, "score": float(r.get("score", 0.0)), "highlight": True, "hop_distance": 0}) + + for seed in seed_ids: + for n in graph.find_neighbors(seed, direction="both", depth=max_hops, limit=limit): + nid = (n.get("properties") or {}).get("id") + if not nid: + continue + nodes.append({"id": nid, "space": "concept", "node_type": (n.get("labels") or ["Unknown"])[0], "properties": n.get("properties") or {}, "score": 0.6, "highlight": False, "hop_distance": int(n.get("depth", 1))}) + edges.append({"from_id": seed, "to_id": nid, "relation": n.get("relation_type", "related_to"), "from_space": "concept", "to_space": "concept", "path_rank": int(n.get("depth", 1))}) + + dedup_nodes = {n["id"]: n for n in nodes} + return { + "id": layer_id, "query": question, "timestamp": ts, "source": "cli", + "nodes": list(dedup_nodes.values()), "edges": edges, + "metadata": {"total_nodes": len(dedup_nodes), "total_edges": len(edges), "max_hops": max_hops, "query_time_ms": 0}, + } +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `python -m pytest tests/test_query_visualization.py -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add opencrab/ontology/query_visualization.py tests/test_query_visualization.py +git commit -m "feat: add query visualization payload builder" +``` + +--- + +### Task 3: Add `query-viz` CLI command + +**Files:** +- Modify: `opencrab/cli.py` +- Modify: `tests/test_query_visualization.py` (add command wiring test) + +- [ ] **Step 1: Write the failing CLI test** + +```python +# tests/test_query_visualization.py +from click.testing import CliRunner +from opencrab.cli import main + +def test_query_viz_command_registered() -> None: + runner = CliRunner() + result = runner.invoke(main, ["query-viz", "ELERA relation", "--limit", "5"]) + assert result.exit_code == 0 + assert "Layer saved" in result.output +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `python -m pytest tests/test_query_visualization.py::test_query_viz_command_registered -v` +Expected: FAIL with `No such command 'query-viz'`. + +- [ ] **Step 3: Implement command in `opencrab/cli.py`** + +```python +@main.command("query-viz") +@click.argument("question") +@click.option("--max-hops", default=3, show_default=True, type=int) +@click.option("--limit", default=20, show_default=True, type=int) +@click.option("--output-dir", default=None, type=str, help="Override web public directory") +def query_viz(question: str, max_hops: int, limit: int, output_dir: str | None) -> None: + from pathlib import Path + from opencrab.config import get_settings + from opencrab.ontology.query import HybridQuery + from opencrab.ontology.query_layers import write_layer + from opencrab.ontology.query_visualization import build_layer_payload + from opencrab.stores.factory import make_graph_store, make_vector_store + + cfg = get_settings() + hybrid = HybridQuery(make_vector_store(cfg), make_graph_store(cfg)) + results = [r.to_dict() for r in hybrid.query(question=question, limit=limit)] + layer = build_layer_payload(question, results, hybrid._graph, max_hops=max_hops, limit=limit) + target = Path(output_dir) if output_dir else Path("apps/web/public/query-layers") + write_layer(target, layer) + console.print(f"[green]Layer saved:[/green] {layer['id']}") +``` + +- [ ] **Step 4: Run tests** + +Run: `python -m pytest tests/test_query_layers.py tests/test_query_visualization.py -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add opencrab/cli.py tests/test_query_visualization.py +git commit -m "feat: add query-viz CLI command" +``` + +--- + +### Task 4: Add web layer data access and lightweight search helper + +**Files:** +- Modify: `apps/web/lib/api.ts` +- Create: `apps/web/lib/queryLayerSearch.ts` + +- [ ] **Step 1: Add type-first compile guard (failing by missing types/functions)** + +```ts +// apps/web/lib/api.ts (usage target for later integration) +export interface LayerMetadata { /* ... */ } +export interface LayerData { /* ... */ } +export async function getQueryLayers(): Promise<{ layers: LayerMetadata[]; version: string }> { /* ... */ } +export async function getLayerData(layerId: string): Promise { /* ... */ } +``` + +- [ ] **Step 2: Run build to verify failure** + +Run: `cd apps/web && npm run build` +Expected: FAIL from unresolved imports in next tasks (or currently no new usage yet if deferred). + +- [ ] **Step 3: Implement API helpers + search utility** + +```ts +// apps/web/lib/queryLayerSearch.ts +import type { OcEdge, OcNode } from './api' +export function searchLocalSubgraph(nodes: OcNode[], edges: OcEdge[], query: string, maxHops = 2) { + const tokens = query.toLowerCase().split(/\s+/).filter(Boolean) + const isHit = (n: OcNode) => JSON.stringify(n.properties).toLowerCase().includes(tokens[0] ?? '') + const seeds = nodes.filter(isHit).slice(0, 20) + return { seeds, edges: edges.filter(e => seeds.some(s => s.id === e.from_id || s.id === e.to_id)) } +} +``` + +- [ ] **Step 4: Run build to verify pass** + +Run: `cd apps/web && npm run build` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add apps/web/lib/api.ts apps/web/lib/queryLayerSearch.ts +git commit -m "feat(web): add query layer api client and local search helper" +``` + +--- + +### Task 5: Add LayerPanel/QueryInput and wire dashboard + graph overlay + +**Files:** +- Create: `apps/web/components/LayerPanel.tsx` +- Create: `apps/web/components/QueryInput.tsx` +- Modify: `apps/web/components/GraphView.tsx` +- Modify: `apps/web/app/dashboard/page.tsx` + +- [ ] **Step 1: Add failing integration compile target** + +```tsx +// apps/web/app/dashboard/page.tsx (planned usage) + + + +``` + +- [ ] **Step 2: Run build to verify it fails** + +Run: `cd apps/web && npm run build` +Expected: FAIL with missing component/prop errors. + +- [ ] **Step 3: Implement components and graph overlay** + +```tsx +// LayerPanel.tsx +export default function LayerPanel({ layers, enabledLayerIds, onToggle, onRefresh }: Props) { + return
{layers.map(l => )}
+} + +// QueryInput.tsx +export default function QueryInput({ onRun }: { onRun: (q: string) => void }) { + const [q, setQ] = useState('') + return
{ e.preventDefault(); onRun(q) }}> setQ(e.target.value)} />
+} + +// GraphView.tsx (new props) +interface Props { /* existing */ layerNodes?: OcNode[]; layerEdges?: OcEdge[] } +const mergedNodes = [...nodes, ...(layerNodes ?? [])] +const mergedEdges = [...edges, ...(layerEdges ?? [])] +``` + +- [ ] **Step 4: Run build/lint** + +Run: `cd apps/web && npm run build` +Expected: PASS. + +Run: `cd apps/web && npm run lint` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add apps/web/components/LayerPanel.tsx apps/web/components/QueryInput.tsx apps/web/components/GraphView.tsx apps/web/app/dashboard/page.tsx +git commit -m "feat(web): add query layer panel and graph overlay integration" +``` + +--- + +### Task 6: Seed index file, docs, and end-to-end verification + +**Files:** +- Create: `apps/web/public/query-layers/layers-index.json` +- Modify: `apps/web/public/GUIDE.md` + +- [ ] **Step 1: Add initial empty index file** + +```json +{ + "layers": [], + "version": "1.0", + "last_updated": null +} +``` + +- [ ] **Step 2: Document usage** + +```md +## Query Layers +1. CLI: `opencrab query-viz "ELERA와 acli의 관계는?" --max-hops 3 --limit 20` +2. Open http://localhost:3000/dashboard +3. Toggle layer in Layer Panel +``` + +- [ ] **Step 3: Run backend tests** + +Run: `python -m pytest tests/test_query_layers.py tests/test_query_visualization.py -v` +Expected: PASS. + +- [ ] **Step 4: Run web checks** + +Run: `cd apps/web && npm run build && npm run lint` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add apps/web/public/query-layers/layers-index.json apps/web/public/GUIDE.md +git commit -m "docs: add query layer usage and bootstrap index file" +``` + +--- + +## Self-Review Checklist (completed) + +1. **Spec coverage:** + - CLI natural-language query flow: Tasks 2-3 + - Multi-hop expansion: Task 2 + - Layer persistence/index: Tasks 1, 6 + - Web toggleable layers: Tasks 4-5 + - Optional web query input: Tasks 4-5 +2. **Placeholder scan:** No TBD/TODO placeholders remain. +3. **Type consistency:** `LayerMetadata`, `LayerData`, `layerNodes`, `layerEdges`, and `query-viz` naming is consistent across tasks. + diff --git a/docs/superpowers/specs/2026-05-21-query-visualization-design.md b/docs/superpowers/specs/2026-05-21-query-visualization-design.md new file mode 100644 index 0000000..2d67784 --- /dev/null +++ b/docs/superpowers/specs/2026-05-21-query-visualization-design.md @@ -0,0 +1,683 @@ +# OpenCrab Query Visualization Design + +**Date:** 2026-05-21 +**Author:** Copilot CLI +**Status:** Approved + +## Overview + +Enable users to query OpenCrab's knowledge graph using natural language from either the Copilot CLI or web UI, and visualize the results as interactive graph layers that can be toggled on/off independently. + +## Problem Statement + +Users currently interact with OpenCrab data in two ways: +1. Direct SQLite queries (technical, requires SQL knowledge) +2. Web UI search box (basic keyword filtering) + +Neither approach supports: +- Natural language queries with semantic understanding +- Multi-hop relationship exploration +- Persistent query results for comparison +- Visual exploration of query-specific subgraphs + +## Goals + +1. **Natural Language Querying**: Users can ask questions in natural language (Korean or English) +2. **Multi-hop Graph Exploration**: Find not just matching nodes, but relationships between them +3. **Layer-based Management**: Each query creates a toggleable layer for independent visualization +4. **Dual Interface**: Support queries from both CLI and web UI +5. **No API Dependency**: Maintain current static file architecture (no mandatory API server) + +## Non-Goals + +- Real-time collaborative querying +- Complex query language (keep it natural language only) +- Automatic query result caching/indexing +- Vector similarity search from web UI (CLI only) + +## Architecture + +### System Components + +``` +┌─────────────────────────────────────────────────────────┐ +│ Copilot CLI │ +│ - Natural language query input │ +│ - HybridQuery engine (vector + graph) │ +│ - Multi-hop graph traversal │ +│ - Layer file generation │ +└─────────────────────────────────────────────────────────┘ + ↓ JSON files +┌─────────────────────────────────────────────────────────┐ +│ File System (apps/web/public/query-layers/) │ +│ ├── layers-index.json (metadata) │ +│ ├── layer-{timestamp}.json (query results) │ +│ └── ... │ +└─────────────────────────────────────────────────────────┘ + ↑ HTTP fetch +┌─────────────────────────────────────────────────────────┐ +│ Web UI (Next.js) │ +│ - Layer panel (toggle layers on/off) │ +│ - Query input (optional client-side search) │ +│ - Graph visualization (D3.js with layer overlay) │ +└─────────────────────────────────────────────────────────┘ +``` + +### Data Flow + +**CLI Query Flow:** +1. User executes: `opencrab query-viz "ELERA와 acli의 관계는?"` +2. HybridQuery performs vector similarity search (ChromaDB/BM25) +3. Top-k results used as seed nodes for graph traversal +4. Multi-hop BFS/DFS explores relationships (up to 3 hops) +5. Results saved to `public/query-layers/layer-{timestamp}.json` +6. `layers-index.json` updated with new layer metadata + +**Web UI Display Flow:** +1. Page load → fetch `layers-index.json` +2. User toggles layer → fetch specific `layer-{id}.json` +3. Layer nodes/edges merged with main graph +4. Highlighted nodes rendered with special styling +5. User can toggle multiple layers simultaneously + +**Web UI Query Flow (Optional):** +1. User enters query in web UI input box +2. Client-side filtering on existing nodes.json/edges.json +3. Simple BFS (max 2 hops) to find paths +4. Results displayed as temporary layer (not saved) +5. Optional "Save as Layer" button to persist + +## Data Schema + +### Layer File Format + +**File:** `public/query-layers/layer-{timestamp}.json` + +```json +{ + "id": "layer-20260521-164500", + "query": "ELERA와 acli의 관계는?", + "timestamp": "2026-05-21T16:45:00+09:00", + "source": "cli", + "nodes": [ + { + "id": "concept_elera_platform", + "space": "concept", + "node_type": "platform", + "properties": { + "name": "ELERA POS", + "description": "..." + }, + "score": 0.95, + "highlight": true, + "hop_distance": 0 + }, + { + "id": "resource_acli_jira_workitem", + "space": "resource", + "node_type": "tool", + "properties": {}, + "score": 0.87, + "highlight": true, + "hop_distance": 0 + }, + { + "id": "intermediate_node_123", + "space": "evidence", + "node_type": "documentation", + "properties": {}, + "score": 0.65, + "highlight": false, + "hop_distance": 1 + } + ], + "edges": [ + { + "from_id": "concept_elera_platform", + "to_id": "intermediate_node_123", + "relation": "documented_by", + "from_space": "concept", + "to_space": "evidence", + "path_rank": 1 + }, + { + "from_id": "intermediate_node_123", + "to_id": "resource_acli_jira_workitem", + "relation": "mentions", + "from_space": "evidence", + "to_space": "resource", + "path_rank": 2 + } + ], + "metadata": { + "total_nodes": 15, + "total_edges": 23, + "max_hops": 3, + "query_time_ms": 234, + "vector_search_hits": 5, + "graph_expansion_nodes": 10 + } +} +``` + +**Field Descriptions:** +- `id`: Unique layer identifier (layer-{timestamp}) +- `query`: Original user query string +- `timestamp`: ISO 8601 timestamp with timezone +- `source`: "cli" or "web" +- `nodes[].score`: Relevance score (0-1, from vector search or decay by hop distance) +- `nodes[].highlight`: True for initial search results, false for path nodes +- `nodes[].hop_distance`: Graph distance from initial results (0 = seed node) +- `edges[].path_rank`: Importance rank in connecting query results (lower = more important) + +### Layers Index Format + +**File:** `public/query-layers/layers-index.json` + +```json +{ + "layers": [ + { + "id": "layer-20260521-164500", + "query": "ELERA와 acli의 관계는?", + "timestamp": "2026-05-21T16:45:00+09:00", + "source": "cli", + "node_count": 15, + "edge_count": 23, + "enabled": true + }, + { + "id": "layer-20260521-165200", + "query": "GitLab CI 파이프라인 구조", + "timestamp": "2026-05-21T16:52:00+09:00", + "source": "web", + "node_count": 8, + "edge_count": 12, + "enabled": false + } + ], + "version": "1.0", + "last_updated": "2026-05-21T16:52:00+09:00" +} +``` + +## Component Details + +### 1. CLI Implementation + +**File:** `opencrab/cli.py` (extend existing) + +**New Command:** +```python +@cli.command() +@click.argument("question") +@click.option("--max-hops", default=3, help="Maximum graph traversal depth") +@click.option("--limit", default=20, help="Maximum nodes to return") +@click.option("--output-dir", default=None, help="Custom output directory") +def query_viz(question: str, max_hops: int, limit: int, output_dir: str): + """ + Execute natural language query and generate visualization layer. + + Example: + opencrab query-viz "ELERA와 acli의 관계는?" --max-hops 3 + """ + # Implementation details below +``` + +**Implementation Steps:** + +1. **Vector Search (Phase 1)**: + - Use existing `HybridQuery` from `opencrab/ontology/query.py` + - Perform vector similarity search via ChromaDB or BM25 + - Get top-k nodes with relevance scores + +2. **Graph Expansion (Phase 2)**: + - Extract node IDs from search results + - Perform multi-hop BFS/DFS from seed nodes + - Apply edge weights and decay scores by hop distance + - Stop at max_hops or when no new nodes found + +3. **Path Ranking**: + - Score edges by: vector similarity × edge weight × hop decay + - Edge weight from existing `_EDGE_WEIGHTS` in query.py + - Hop decay: score × 0.7^hop_distance + +4. **Result Assembly**: + - Merge seed nodes + expansion nodes + - Mark seed nodes with `highlight: true` + - Include all connecting edges with path_rank + +5. **File Output**: + - Generate layer JSON with timestamp ID + - Save to `{output_dir}/query-layers/layer-{timestamp}.json` + - Default output_dir: `apps/web/public/` + - Update `layers-index.json` atomically + +**Helper Functions:** + +```python +def save_layer(layer_data: dict, output_dir: str) -> str: + """Save layer to file and update index.""" + +def update_layers_index(layer_metadata: dict, output_dir: str): + """Atomically update layers-index.json.""" + +def explore_subgraph( + graph_store, + seed_nodes: list[str], + max_hops: int +) -> tuple[list[dict], list[dict]]: + """Multi-hop graph traversal from seed nodes.""" +``` + +### 2. Web UI Components + +#### 2.1 Layer Panel Component + +**File:** `apps/web/components/LayerPanel.tsx` (new) + +**Features:** +- Display list of available layers from `layers-index.json` +- Checkbox to enable/disable each layer +- Show metadata: query text, timestamp, node count +- Delete button to remove layer (updates index file via API or manual) +- Refresh button to reload layers-index.json +- Keyboard shortcuts: `l` to toggle panel, arrow keys to navigate + +**Layout:** +``` +┌─────────────────────────────┐ +│ Query Layers [↻] │ ← Refresh +├─────────────────────────────┤ +│ ☑ ELERA와 acli 관계 │ +│ 2026-05-21 16:45 │ +│ 15 nodes, 23 edges [×] │ ← Delete +├─────────────────────────────┤ +│ ☐ GitLab CI 구조 │ +│ 2026-05-21 16:52 │ +│ 8 nodes, 12 edges [×] │ +└─────────────────────────────┘ +``` + +**State Management:** +- React state for enabled layers (boolean map) +- Fetch layers-index.json on mount and refresh +- Emit events when layers toggled (parent re-renders graph) + +#### 2.2 Query Input Component + +**File:** `apps/web/components/QueryInput.tsx` (new) + +**Features:** +- Text input for natural language query +- "Search" button to execute client-side query +- Loading indicator during search +- Results displayed as temporary layer +- "Save as Layer" button to persist (writes to filesystem via API or manual) + +**Client-Side Search Algorithm:** +1. Tokenize query (simple split on spaces) +2. Filter nodes where properties contain any token (case-insensitive) +3. Perform BFS up to 2 hops from matching nodes +4. Score by: token match count × hop decay (0.7^hop) +5. Return top 50 nodes with connecting edges + +**Limitations:** +- No vector similarity (no embeddings in browser) +- Simple keyword matching only +- Limited to 2 hops (performance) +- Results not as accurate as CLI HybridQuery + +**Layout:** +``` +┌───────────────────────────────────────────┐ +│ Ask a question about the graph... │ +│ [ELERA와 acli의 관계는? ] [Search]│ +└───────────────────────────────────────────┘ +``` + +#### 2.3 Graph Visualization Updates + +**File:** `apps/web/components/Graph.tsx` (modify existing) + +**Changes:** + +1. **Layer Data Loading**: + - Accept `enabledLayers: string[]` prop + - Fetch each enabled layer's JSON file + - Merge layer nodes/edges with base graph data + +2. **Visual Styling**: + - Highlighted nodes (highlight: true): + - Larger radius (×1.5) + - Thicker border (3px) + - Pulsing animation + - Layer edges: + - Dashed stroke + - Different colors per layer (max 5 colors, cycle) + - Layer color legend (top-right corner) + +3. **Tooltips**: + - Show layer info on node hover + - Display relevance score and hop distance + - List which layers include this node + +4. **Performance**: + - Limit total visible nodes to 1000 (merge + filter by score) + - Use canvas rendering if node count > 500 + - Debounce layer toggle events (300ms) + +**Color Scheme (Layers):** +- Layer 1: `#FF6B6B` (red) +- Layer 2: `#4ECDC4` (teal) +- Layer 3: `#FFE66D` (yellow) +- Layer 4: `#A8DADC` (blue) +- Layer 5: `#F1A7FE` (purple) + +#### 2.4 API Client Updates + +**File:** `apps/web/lib/api.ts` (extend existing) + +**New Functions:** + +```typescript +export async function getQueryLayers(): Promise { + const res = await fetch('/query-layers/layers-index.json', { + cache: 'no-store' + }) + if (!res.ok) return { layers: [], version: '1.0' } + return res.json() +} + +export async function getLayerData(layerId: string): Promise { + const res = await fetch(`/query-layers/${layerId}.json`, { + cache: 'no-store' + }) + if (!res.ok) return null + return res.json() +} + +export async function deleteLayer(layerId: string): Promise { + // Client-side only: Cannot delete files from browser + // User must manually delete or use CLI command + console.warn('Layer deletion requires CLI or API server') + return false +} +``` + +**Types:** + +```typescript +export interface LayerIndex { + layers: LayerMetadata[] + version: string + last_updated?: string +} + +export interface LayerMetadata { + id: string + query: string + timestamp: string + source: 'cli' | 'web' + node_count: number + edge_count: number + enabled: boolean +} + +export interface LayerData { + id: string + query: string + timestamp: string + source: string + nodes: LayerNode[] + edges: LayerEdge[] + metadata: { + total_nodes: number + total_edges: number + max_hops: number + query_time_ms: number + } +} + +export interface LayerNode extends OcNode { + score: number + highlight: boolean + hop_distance: number +} + +export interface LayerEdge extends OcEdge { + path_rank: number +} +``` + +### 3. Graph Traversal Algorithm + +**Multi-hop BFS Implementation:** + +```python +def explore_subgraph( + graph_store, + seed_nodes: list[str], + max_hops: int, + max_nodes: int = 500 +) -> tuple[list[dict], list[dict]]: + """ + Breadth-first traversal from seed nodes. + + Returns: + (nodes, edges) where nodes include score and hop_distance + """ + visited = set() + nodes_by_id = {} + edges = [] + queue = [(nid, 0) for nid in seed_nodes] # (node_id, hop) + + while queue and len(nodes_by_id) < max_nodes: + node_id, hop = queue.pop(0) + + if node_id in visited or hop > max_hops: + continue + + visited.add(node_id) + + # Fetch node data + node = graph_store.get_node(node_id) + nodes_by_id[node_id] = { + **node, + 'hop_distance': hop, + 'highlight': hop == 0 + } + + # Get neighbors + neighbors = graph_store.get_neighbors(node_id) + for neighbor_id, edge_data in neighbors: + edges.append({ + 'from_id': node_id, + 'to_id': neighbor_id, + 'relation': edge_data['relation'], + 'from_space': node['space'], + 'to_space': edge_data['to_space'], + 'path_rank': hop + 1 + }) + + if neighbor_id not in visited: + queue.append((neighbor_id, hop + 1)) + + return list(nodes_by_id.values()), edges +``` + +**Score Decay:** +```python +def apply_score_decay(nodes: list[dict], initial_scores: dict[str, float]): + """Apply hop-based decay to relevance scores.""" + for node in nodes: + base_score = initial_scores.get(node['id'], 0.5) + hop = node['hop_distance'] + node['score'] = base_score * (0.7 ** hop) +``` + +## Error Handling + +### File System Errors + +1. **Missing Directory**: + - Create `public/query-layers/` if not exists + - Set proper permissions (read/write) + +2. **JSON Parse Errors**: + - Skip corrupted layer files + - Log warning to console + - Continue loading other layers + +3. **Write Permission Denied**: + - CLI: Show clear error message with file path + - Suggest running with appropriate permissions + +### Query Errors + +1. **No Results Found**: + - Create empty layer with 0 nodes + - Show message: "No results found for query: {query}" + +2. **Graph Traversal Timeout**: + - Set 30-second timeout + - Return partial results found so far + - Log warning in metadata + +3. **Database Connection Failure**: + - CLI: Show error and exit with code 1 + - Web UI: Show error toast, disable query input + +### Web UI Errors + +1. **Layer File Not Found (404)**: + - Remove from layers-index + - Show notification: "Layer file missing, removed from list" + +2. **Invalid Layer Data**: + - Skip layer rendering + - Show warning in layer panel + +3. **Too Many Active Layers**: + - Limit to 5 active layers + - Show warning: "Maximum 5 layers, disable others first" + +## Constraints & Limitations + +### Performance Limits + +1. **Layer Size**: + - Max 500 nodes per layer (CLI enforced) + - Max 1000 edges per layer + - Layers exceeding limits truncated with warning + +2. **Active Layers**: + - Max 5 layers enabled simultaneously (Web UI enforced) + - Total visible nodes capped at 1000 + +3. **Query Complexity**: + - CLI: Max 3 hops (configurable via --max-hops) + - Web UI: Max 2 hops (hardcoded for performance) + +### Storage Limits + +1. **Layer Count**: + - Max 100 layer files (oldest auto-deleted) + - Each layer file ≈ 100KB - 1MB + +2. **Disk Space**: + - Total layers folder < 100MB + - CLI warns if approaching limit + +### Synchronization + +1. **File-Based Latency**: + - Web UI not real-time (file system polling) + - Auto-refresh every 30 seconds (configurable) + - Manual refresh button always available + +2. **Concurrent Access**: + - No file locking (last write wins) + - Race conditions possible if multiple users + - Document as single-user limitation + +## Testing Strategy + +### Unit Tests + +1. **CLI (`tests/test_query_viz.py`)**: + - Test vector search integration + - Test multi-hop graph traversal + - Test layer file generation + - Test index update logic + +2. **Web UI (`apps/web/__tests__/LayerPanel.test.tsx`)**: + - Test layer loading + - Test layer toggling + - Test layer deletion (UI only) + +### Integration Tests + +1. **End-to-End Flow**: + - CLI query → file creation → web UI display + - Multiple layers → visual rendering + - Layer deletion → index update + +2. **Performance Tests**: + - Large query results (500 nodes) + - Multiple active layers (5 layers) + - Graph rendering speed + +### Manual Testing Checklist + +- [ ] CLI query with Korean text +- [ ] CLI query with English text +- [ ] Web UI client-side search +- [ ] Toggle 5 layers simultaneously +- [ ] Delete layer from web UI +- [ ] Refresh layers list +- [ ] Graph highlights correct nodes +- [ ] Tooltips show layer info +- [ ] Layer colors distinct + +## Migration Path + +### Phase 1: MVP (Static Files) +- Current design (this document) +- File-based layer storage +- No API server required + +### Phase 2: API Enhancement (Future) +- Add REST API endpoints: + - `POST /api/query-layers` (create) + - `GET /api/query-layers` (list) + - `GET /api/query-layers/{id}` (get) + - `DELETE /api/query-layers/{id}` (delete) +- Real-time layer sync via WebSocket +- Collaborative features (share layers) + +### Phase 3: Advanced Features (Future) +- Layer merging (combine multiple queries) +- Layer filtering (by space, node type) +- Export to PNG/SVG +- Scheduled queries (daily snapshots) + +## Open Questions + +None - all questions resolved during brainstorming. + +## Success Criteria + +1. ✅ Users can query in natural language from CLI +2. ✅ Results visualized as graph layers in web UI +3. ✅ Multiple layers can be toggled independently +4. ✅ Multi-hop relationships explored correctly +5. ✅ Performance acceptable (< 5s query, < 1s render) +6. ✅ No API server dependency (static files only) + +## References + +- Existing HybridQuery: `opencrab/ontology/query.py` +- Graph stores: `opencrab/stores/neo4j_store.py`, SQLite +- Web UI: `apps/web/components/Graph.tsx` +- CLI: `opencrab/cli.py` diff --git a/opencrab/cli.py b/opencrab/cli.py index 6e3ec6b..ce0e81e 100644 --- a/opencrab/cli.py +++ b/opencrab/cli.py @@ -441,6 +441,71 @@ def manifest(json_output: bool) -> None: ) +# --------------------------------------------------------------------------- +# query-viz +# --------------------------------------------------------------------------- + + +@main.command("query-viz") +@click.argument("question") +@click.option("--max-hops", default=3, show_default=True, type=int, help="Max graph expansion depth.") +@click.option("--limit", "-n", default=20, show_default=True, type=int, help="Max results to retrieve.") +@click.option("--output-dir", default=None, type=click.Path(), help="Output directory for layer JSON.") +def query_viz(question: str, max_hops: int, limit: int, output_dir: str | None) -> None: + """Run a query and generate a visualization layer.""" + from pathlib import Path as PathLib + from opencrab.config import get_settings + from opencrab.ontology.query import HybridQuery + from opencrab.ontology.query_visualization import build_layer_payload + from opencrab.ontology.query_layers import write_layer, ensure_layer_store + from opencrab.stores.factory import make_graph_store, make_vector_store + + cfg = get_settings() + chroma = make_vector_store(cfg) + graph_store = make_graph_store(cfg) + hybrid = HybridQuery(chroma, graph_store) + + # Run the query + results = hybrid.query(question=question, limit=limit) + + # Convert results to dict format expected by build_layer_payload + results_dicts = [] + for r in results: + if r.node_id is None: + continue # Skip results without node_id + result_dict = { + "node_id": r.node_id, + "score": r.score, + "space": r.metadata.get("space"), + "node_type": r.metadata.get("node_type"), + "properties": r.metadata, + } + # If node_type not in metadata, try to get it from graph_context + if not result_dict["node_type"] and r.graph_context: + labels = r.graph_context.get("labels", []) + if labels: + result_dict["node_type"] = labels[0] + results_dicts.append(result_dict) + + # Build the visualization layer + layer = build_layer_payload(question, results_dicts, graph_store, max_hops, limit) + + # Set output directory + if output_dir is None: + output_dir = "apps/web/public/query-layers" + + target_dir = PathLib(output_dir) + target_dir.mkdir(parents=True, exist_ok=True) + + # Ensure the layer store is initialized + ensure_layer_store(str(target_dir)) + + # Write the layer + write_layer(str(target_dir), layer) + + console.print(f"[green]Layer saved: {layer['id']}[/green]") + + # --------------------------------------------------------------------------- # export-neo4j-pack # --------------------------------------------------------------------------- diff --git a/opencrab/grammar/manifest.py b/opencrab/grammar/manifest.py index f63f166..01c6a6d 100644 --- a/opencrab/grammar/manifest.py +++ b/opencrab/grammar/manifest.py @@ -79,7 +79,7 @@ { "from_space": "evidence", "to_space": "concept", - "relations": ["mentions", "describes", "exemplifies"], + "relations": ["mentions", "describes", "exemplifies", "supports"], "description": "Evidence surfaces conceptual knowledge.", }, { @@ -91,7 +91,7 @@ { "from_space": "concept", "to_space": "concept", - "relations": ["related_to", "subclass_of", "part_of", "influences", "depends_on"], + "relations": ["related_to", "subclass_of", "part_of", "influences", "depends_on", "contributes_to"], "description": "Inter-concept knowledge graph edges.", }, { @@ -103,13 +103,13 @@ { "from_space": "lever", "to_space": "outcome", - "relations": ["raises", "lowers", "stabilizes", "optimizes"], + "relations": ["raises", "lowers", "stabilizes", "optimizes", "constrains"], "description": "Levers directly control outcome values.", }, { "from_space": "lever", "to_space": "concept", - "relations": ["affects"], + "relations": ["affects", "influences", "raises"], "description": "Levers influence conceptual state.", }, { @@ -130,6 +130,36 @@ "relations": ["permits", "denies", "requires_approval"], "description": "Policies define what subjects are allowed to do.", }, + { + "from_space": "evidence", + "to_space": "lever", + "relations": ["mentions", "describes", "exemplifies"], + "description": "Evidence surfaces levers mentioned in source material.", + }, + { + "from_space": "evidence", + "to_space": "outcome", + "relations": ["mentions", "describes", "exemplifies", "supports"], + "description": "Evidence documents or supports outcomes and risks.", + }, + { + "from_space": "resource", + "to_space": "concept", + "relations": ["related_to", "implements", "part_of", "describes"], + "description": "Resources implement or relate to conceptual entities.", + }, + { + "from_space": "resource", + "to_space": "outcome", + "relations": ["affects", "contributes_to", "constrains"], + "description": "Resources influence or constrain outcomes.", + }, + { + "from_space": "resource", + "to_space": "resource", + "relations": ["contains", "depends_on", "part_of", "related_to"], + "description": "Resources have hierarchical and dependency relationships.", + }, ] # --------------------------------------------------------------------------- diff --git a/opencrab/ontology/query_layers.py b/opencrab/ontology/query_layers.py new file mode 100644 index 0000000..6d01dc9 --- /dev/null +++ b/opencrab/ontology/query_layers.py @@ -0,0 +1,87 @@ +# Query layer file persistence module + +import os +import json +import threading +import tempfile +import time +from contextlib import contextmanager +from typing import Any, Dict + +# Global lock for index updates +_index_lock = threading.Lock() + + +@contextmanager +def _index_file_lock(store_dir: str): + """Cross-process lock using a lockfile.""" + lock_path = os.path.join(store_dir, ".layers-index.lock") + lock_fd = None + deadline = time.time() + 5.0 + while True: + try: + lock_fd = os.open(lock_path, os.O_CREAT | os.O_EXCL | os.O_RDWR) + break + except FileExistsError: + if time.time() > deadline: + raise TimeoutError(f"Timeout acquiring index lock: {lock_path}") + time.sleep(0.01) + + try: + yield + finally: + if lock_fd is not None: + os.close(lock_fd) + try: + os.unlink(lock_path) + except FileNotFoundError: + pass + +def ensure_layer_store(store_dir: str) -> None: + os.makedirs(store_dir, exist_ok=True) + index_path = os.path.join(store_dir, "layers-index.json") + # Atomic file creation: use 'x' mode to fail if file exists + try: + with open(index_path, "x", encoding="utf-8") as f: + json.dump({"layers": [], "version": "1.0"}, f) + except FileExistsError: + # Index already exists, no action needed + pass + +def read_index(store_dir: str) -> Dict[str, Any]: + index_path = os.path.join(store_dir, "layers-index.json") + with _index_lock: + with _index_file_lock(store_dir): + with open(index_path, encoding="utf-8") as f: + return json.load(f) + +def write_layer(store_dir: str, layer: Dict[str, Any]) -> None: + # Synchronize both layer file write and index update in the same lock critical section + with _index_lock: + with _index_file_lock(store_dir): + layer_id = layer["id"] + layer_path = os.path.join(store_dir, f"{layer_id}.json") + with open(layer_path, "w", encoding="utf-8") as f: + json.dump(layer, f) + + index_path = os.path.join(store_dir, "layers-index.json") + with open(index_path, encoding="utf-8") as f: + index = json.load(f) + + # Ensure enabled is always present in index metadata + meta = {k: layer[k] for k in ["id", "query", "timestamp", "source", "node_count", "edge_count"] if k in layer} + meta["enabled"] = layer.get("enabled", True) + # Prepend to layers + index["layers"] = [meta] + [l for l in index["layers"] if l.get("id") != layer_id] + + fd, temp_path = tempfile.mkstemp(dir=store_dir, suffix=".json", text=True) + try: + with os.fdopen(fd, "w", encoding="utf-8") as f: + json.dump(index, f) + os.replace(temp_path, index_path) + except Exception: + try: + os.unlink(temp_path) + except FileNotFoundError: + pass + raise diff --git a/opencrab/ontology/query_visualization.py b/opencrab/ontology/query_visualization.py new file mode 100644 index 0000000..51dd3f5 --- /dev/null +++ b/opencrab/ontology/query_visualization.py @@ -0,0 +1,152 @@ +"""Query visualization layer builder.""" + +from __future__ import annotations + +import time +from datetime import datetime +from typing import Any + + +def _now_id() -> tuple[str, str]: + """ + Generate a layer ID and ISO timestamp. + + Returns + ------- + tuple[str, str] + (layer_id, iso_timestamp) where layer_id is like "layer-YYYYMMDD-HHMMSS" + """ + now = datetime.now() + layer_id = now.strftime("layer-%Y%m%d-%H%M%S") + iso_timestamp = now.isoformat() + return layer_id, iso_timestamp + + +def build_layer_payload( + question: str, + query_results: list[dict[str, Any]], + graph: Any, + max_hops: int, + limit: int, +) -> dict[str, Any]: + """ + Build a visualization layer payload from query results and graph neighbors. + + Parameters + ---------- + question : str + The user's query text + query_results : list[dict[str, Any]] + Seed nodes from query, each with 'node_id' key + graph : Any + Graph store with find_neighbors() method + max_hops : int + Maximum depth for neighbor expansion + limit : int + Maximum neighbors per seed node + + Returns + ------- + dict[str, Any] + Payload with id, query, timestamp (ISO), source, nodes, edges, metadata + """ + start_time = time.time() + layer_id, iso_timestamp = _now_id() + + nodes: dict[str, dict[str, Any]] = {} + edges: dict[tuple[str, str, str], dict[str, Any]] = {} + + # Process seed nodes from query_results + # Results use 'node_id' key, not 'id' + seed_ids = [] + for result in query_results: + node_id = result.get("node_id") + if not node_id: + continue # Defensive: skip seeds without id + seed_ids.append(node_id) + + # Seed nodes get all their fields plus highlight=True, hop_distance=0 + node = { + "id": node_id, + "space": result.get("space"), + "node_type": result.get("node_type"), + "properties": result.get("properties", {}), + "score": result.get("score"), + "highlight": True, + "hop_distance": 0, + } + nodes[node_id] = node + + # Expand neighbors for each seed + for seed_id in seed_ids: + neighbors = graph.find_neighbors( + seed_id, direction="both", depth=max_hops, limit=limit + ) + + # Neighbors are dicts with: properties, labels, relation_type, depth + for neighbor in neighbors: + neighbor_props = neighbor.get("properties", {}) + neighbor_id = neighbor_props.get("id") + if not neighbor_id: + continue + + # Add neighbor node if not already present + if neighbor_id not in nodes: + labels = neighbor.get("labels", []) + node_type = labels[0] if labels else None + nodes[neighbor_id] = { + "id": neighbor_id, + "space": neighbor_props.get("space"), + "node_type": node_type, + "properties": neighbor_props, + "score": None, + "highlight": False, + "hop_distance": neighbor.get("depth", 1), + } + + # Build edge + # For neighbors found via both-directional search, we need to infer edge direction + # The relation_type tells us the relationship + relation = neighbor.get("relation_type", "related") + + # Check if this is an outgoing or incoming edge from seed + # For simplicity, we'll create edges from seed to neighbor for outgoing + # and from neighbor to seed for incoming based on typical graph patterns + # Since we're using direction='both', we add edges as found + + # Add edge from seed to neighbor (outgoing from seed perspective) + edge_key = (seed_id, neighbor_id, relation) + if edge_key not in edges: + edges[edge_key] = { + "from_id": seed_id, + "to_id": neighbor_id, + "relation": relation, + "from_space": nodes[seed_id].get("space"), + "to_space": nodes[neighbor_id].get("space"), + "path_rank": 1, + } + + # Build final lists + node_list = list(nodes.values()) + edge_list = list(edges.values()) + + query_time_ms = int((time.time() - start_time) * 1000) + + payload = { + "id": layer_id, + "query": question, + "timestamp": iso_timestamp, + "source": "cli", + "nodes": node_list, + "edges": edge_list, + "node_count": len(node_list), + "edge_count": len(edge_list), + "metadata": { + "total_nodes": len(node_list), + "total_edges": len(edge_list), + "max_hops": max_hops, + "query_time_ms": query_time_ms, + }, + } + + return payload diff --git a/query_test.json b/query_test.json new file mode 100644 index 0000000..2813218 --- /dev/null +++ b/query_test.json @@ -0,0 +1,3 @@ +{ + "question": "customer churn retention behavior" +} diff --git a/sample_data/customer_churn.txt b/sample_data/customer_churn.txt new file mode 100644 index 0000000..c0e59a3 --- /dev/null +++ b/sample_data/customer_churn.txt @@ -0,0 +1,61 @@ +Customer Churn Analysis + +Customer churn is a critical business metric that measures the rate at which customers stop doing business with a company. High churn rates indicate customer dissatisfaction and can significantly impact revenue and growth. + +Key Concepts: +- Churn Rate: Percentage of customers who discontinue service during a given period +- Customer Lifetime Value (CLV): Total revenue expected from a customer over their relationship +- Retention Rate: Percentage of customers who continue using the service +- At-Risk Customers: Users showing signs of decreased engagement or dissatisfaction + +Common Causes of Churn: +1. Poor Customer Service: Slow response times, unhelpful support, unresolved issues +2. Lack of Product Value: Product doesn't meet expectations or solve customer problems +3. Pricing Issues: Too expensive compared to perceived value or competitors +4. Competitive Alternatives: Better options available in the market +5. Onboarding Failures: Customers don't understand how to use the product effectively +6. Feature Gaps: Missing functionality that customers need +7. Technical Issues: Bugs, downtime, performance problems + +Churn Prediction Indicators: +- Decreased login frequency +- Reduced feature usage +- Support ticket volume increase +- Payment failures or delays +- Negative feedback or survey responses +- Social media complaints + +Churn Reduction Strategies: +1. Improve Customer Onboarding: Clear tutorials, guided tours, early engagement +2. Proactive Customer Success: Regular check-ins, usage monitoring, intervention +3. Enhanced Support: Faster response times, multiple channels, self-service resources +4. Product Improvements: Address pain points, add requested features, fix bugs +5. Personalization: Tailor experience based on customer behavior and preferences +6. Loyalty Programs: Rewards, discounts, exclusive features for long-term customers +7. Win-Back Campaigns: Re-engage churned customers with special offers + +Churn Metrics and KPIs: +- Monthly Churn Rate (MCR): Customers lost / Total customers at start of month +- Revenue Churn: Lost MRR / Total MRR at start of period +- Net Revenue Retention (NRR): (Starting MRR + Expansion - Churn) / Starting MRR +- Customer Acquisition Cost (CAC) to LTV Ratio: Measures efficiency of customer acquisition + +Impact on Business: +- Revenue Loss: Direct impact from lost subscriptions or purchases +- Growth Slowdown: Higher acquisition needed to offset churn +- Reduced Referrals: Churned customers don't recommend the product +- Negative Word-of-Mouth: Can damage brand reputation and future acquisition +- Investor Concerns: High churn signals product-market fit issues + +Industry Benchmarks: +- SaaS B2B: 5-7% annual churn is considered good +- SaaS B2C: 5-7% monthly churn is typical +- E-commerce: 20-30% annual churn +- Subscription Services: 3-8% monthly churn + +Data-Driven Churn Prevention: +- Machine Learning Models: Predict churn probability for each customer +- Cohort Analysis: Track retention patterns by customer segment +- A/B Testing: Experiment with retention tactics +- Customer Segmentation: Identify high-value, at-risk groups +- Real-Time Alerts: Trigger interventions when risk signals detected diff --git a/tests/test_query_layers.py b/tests/test_query_layers.py new file mode 100644 index 0000000..d0fc997 --- /dev/null +++ b/tests/test_query_layers.py @@ -0,0 +1,202 @@ +import os +import json +import pytest +import threading +from opencrab.ontology import query_layers + + +def test_ensure_layer_store_creates_dir_and_index(tmp_path): + store_dir = tmp_path / "store" + query_layers.ensure_layer_store(str(store_dir)) + assert store_dir.exists() + index_path = store_dir / "layers-index.json" + assert index_path.exists() + with open(index_path, encoding="utf-8") as f: + data = json.load(f) + assert data == {"layers": [], "version": "1.0"} + + +def test_read_index_returns_index(tmp_path): + store_dir = tmp_path / "store" + store_dir.mkdir() + index_path = store_dir / "layers-index.json" + with open(index_path, "w", encoding="utf-8") as f: + json.dump({"layers": [1, 2], "version": "1.0"}, f) + result = query_layers.read_index(str(store_dir)) + assert result == {"layers": [1, 2], "version": "1.0"} + +def test_write_layer_enabled_defaults_true(tmp_path): + store_dir = tmp_path / "store" + query_layers.ensure_layer_store(str(store_dir)) + layer = { + "id": "def456", + "query": "MATCH (m)", + "timestamp": "2024-01-02T00:00:00Z", + "source": "test2", + "node_count": 3, + "edge_count": 1 + # no 'enabled' field + } + query_layers.write_layer(str(store_dir), layer) + # Index + index_path = store_dir / "layers-index.json" + with open(index_path, encoding="utf-8") as f: + index = json.load(f) + meta = index["layers"][0] + assert meta["id"] == "def456" + assert meta["enabled"] is True + +def test_write_layer_persists_layer_and_updates_index(tmp_path): + store_dir = tmp_path / "store" + query_layers.ensure_layer_store(str(store_dir)) + layer = { + "id": "abc123", + "query": "MATCH (n)", + "timestamp": "2024-01-01T00:00:00Z", + "source": "test", + "node_count": 5, + "edge_count": 2, + "enabled": True, + "extra": "should be persisted" + } + query_layers.write_layer(str(store_dir), layer) + # Layer file + layer_path = store_dir / "abc123.json" + assert layer_path.exists() + with open(layer_path, encoding="utf-8") as f: + saved = json.load(f) + assert saved == layer + # Index + index_path = store_dir / "layers-index.json" + with open(index_path, encoding="utf-8") as f: + index = json.load(f) + assert index["version"] == "1.0" + meta = index["layers"][0] + assert meta["id"] == "abc123" + assert meta["query"] == "MATCH (n)" + assert meta["timestamp"] == "2024-01-01T00:00:00Z" + assert meta["source"] == "test" + assert meta["node_count"] == 5 + assert meta["edge_count"] == 2 + assert meta["enabled"] is True + # Extra fields should NOT be in index metadata + assert "extra" not in meta + + +def test_ensure_layer_store_concurrent_creation(tmp_path): + """Test that concurrent calls to ensure_layer_store don't cause errors""" + store_dir = tmp_path / "store" + errors = [] + + def create_store(): + try: + query_layers.ensure_layer_store(str(store_dir)) + except Exception as e: + errors.append(e) + + # Create multiple threads that try to initialize concurrently + threads = [threading.Thread(target=create_store) for _ in range(5)] + for t in threads: + t.start() + for t in threads: + t.join() + + # No errors should have occurred + assert errors == [] + # Index should exist and be valid + index_path = store_dir / "layers-index.json" + assert index_path.exists() + with open(index_path, encoding="utf-8") as f: + data = json.load(f) + assert data == {"layers": [], "version": "1.0"} + + +def test_write_layer_concurrent_writes(tmp_path): + """Test that concurrent writes maintain index consistency""" + store_dir = tmp_path / "store" + query_layers.ensure_layer_store(str(store_dir)) + + def write_test_layer(layer_id): + layer = { + "id": layer_id, + "query": f"MATCH (n:{layer_id})", + "timestamp": "2024-01-01T00:00:00Z", + "source": "test", + "node_count": 1, + "edge_count": 0, + "enabled": True + } + query_layers.write_layer(str(store_dir), layer) + + # Write multiple layers concurrently + layer_ids = [f"layer{i}" for i in range(10)] + threads = [threading.Thread(target=write_test_layer, args=(lid,)) for lid in layer_ids] + for t in threads: + t.start() + for t in threads: + t.join() + + # Read final index - it should be valid JSON and contain all layers + index = query_layers.read_index(str(store_dir)) + assert index["version"] == "1.0" + assert len(index["layers"]) == 10 + # All layer IDs should be present + index_ids = {layer["id"] for layer in index["layers"]} + assert index_ids == set(layer_ids) + + +def test_concurrent_read_write_no_corruption(tmp_path): + """Test that concurrent reads and writes don't cause corruption or errors""" + store_dir = tmp_path / "store" + query_layers.ensure_layer_store(str(store_dir)) + + errors = [] + read_count = [0] + + def write_layers(): + try: + for i in range(20): + layer = { + "id": f"layer{i}", + "query": f"MATCH (n:{i})", + "timestamp": "2024-01-01T00:00:00Z", + "source": "test", + "node_count": i, + "edge_count": 0, + "enabled": True + } + query_layers.write_layer(str(store_dir), layer) + except Exception as e: + errors.append(("write", e)) + + def read_index_repeatedly(): + try: + for _ in range(50): + index = query_layers.read_index(str(store_dir)) + # Validate that the index is well-formed + assert "layers" in index + assert "version" in index + assert isinstance(index["layers"], list) + read_count[0] += 1 + except Exception as e: + errors.append(("read", e)) + + # Start writer and multiple readers concurrently + writer = threading.Thread(target=write_layers) + readers = [threading.Thread(target=read_index_repeatedly) for _ in range(3)] + + writer.start() + for r in readers: + r.start() + + writer.join() + for r in readers: + r.join() + + # No errors should have occurred + assert errors == [], f"Errors occurred: {errors}" + # Readers should have successfully read multiple times + assert read_count[0] > 0 + # Final index should be valid and contain all written layers + final_index = query_layers.read_index(str(store_dir)) + assert len(final_index["layers"]) == 20 diff --git a/tests/test_query_visualization.py b/tests/test_query_visualization.py new file mode 100644 index 0000000..ef4e4df --- /dev/null +++ b/tests/test_query_visualization.py @@ -0,0 +1,316 @@ +"""Tests for query visualization layer builder.""" + +from __future__ import annotations + +import pytest +from opencrab.ontology import query_visualization + + +class DummyGraph: + """Mock graph store that returns dict-based neighbor records.""" + + def __init__(self, neighbors: dict[str, list[dict]]) -> None: + self.neighbors = neighbors + self.last_direction: str | None = None + self.last_depth: int | None = None + + def find_neighbors( + self, node_id: str, direction: str = "both", depth: int = 1, limit: int = 50 + ) -> list[dict]: + """ + Returns neighbor records as dicts matching LocalGraphStore/Neo4jStore format. + Each record has: properties, labels, relation_type, depth + """ + self.last_direction = direction + self.last_depth = depth + return self.neighbors.get(node_id, [])[:limit] + + +def test_build_layer_payload_includes_seed_and_neighbors() -> None: + """Verify seed nodes and neighbors are included with correct fields.""" + question = "What is the capital of France?" + query_results = [ + { + "node_id": "paris", + "space": "geography", + "node_type": "City", + "properties": {"name": "Paris", "population": 2161000}, + "score": 0.95, + }, + { + "node_id": "france", + "space": "geography", + "node_type": "Country", + "properties": {"name": "France"}, + "score": 0.90, + }, + ] + + neighbors = { + "paris": [ + { + "properties": {"id": "eiffel-tower", "name": "Eiffel Tower"}, + "labels": ["Landmark"], + "relation_type": "has_landmark", + "depth": 1, + } + ], + "france": [ + { + "properties": {"id": "paris", "name": "Paris"}, + "labels": ["City"], + "relation_type": "has_capital", + "depth": 1, + } + ], + } + + graph = DummyGraph(neighbors) + payload = query_visualization.build_layer_payload( + question, query_results, graph, max_hops=2, limit=10 + ) + + # Verify basic payload structure + assert payload["id"].startswith("layer-") + assert payload["query"] == question + assert payload["source"] == "cli" + assert isinstance(payload["timestamp"], str) # ISO string, not float + assert "T" in payload["timestamp"] or " " in payload["timestamp"] # ISO format + + # Verify direction='both' and depth parameter were used + assert graph.last_direction == "both" + assert graph.last_depth == 2 + + # Verify seed nodes have required fields + node_dict = {n["id"]: n for n in payload["nodes"]} + assert "paris" in node_dict + assert "france" in node_dict + + paris = node_dict["paris"] + assert paris["highlight"] is True + assert paris["hop_distance"] == 0 + assert paris["space"] == "geography" + assert paris["node_type"] == "City" + assert paris["properties"]["name"] == "Paris" + assert paris["score"] == 0.95 + + # Verify neighbor node + assert "eiffel-tower" in node_dict + eiffel = node_dict["eiffel-tower"] + assert eiffel["highlight"] is False + assert eiffel["hop_distance"] == 1 + assert eiffel["node_type"] == "Landmark" + + # Verify edges have required fields + assert len(payload["edges"]) > 0 + for edge in payload["edges"]: + required_fields = { + "from_id", + "to_id", + "relation", + "from_space", + "to_space", + "path_rank", + } + assert required_fields.issubset(edge.keys()) + + # Verify top-level node_count and edge_count + assert payload["node_count"] == len(payload["nodes"]) + assert payload["edge_count"] == len(payload["edges"]) + # Verify metadata + assert payload["metadata"]["total_nodes"] == len(payload["nodes"]) + assert payload["metadata"]["total_edges"] == len(payload["edges"]) + assert payload["metadata"]["max_hops"] == 2 + assert payload["metadata"]["query_time_ms"] >= 0 + + +def test_build_layer_payload_deduplicates_nodes() -> None: + """Verify nodes are deduplicated by ID.""" + question = "Test deduplication" + query_results = [ + { + "node_id": "a", + "space": "test", + "node_type": "Node", + "properties": {"label": "A"}, + "score": 1.0, + }, + { + "node_id": "b", + "space": "test", + "node_type": "Node", + "properties": {"label": "B"}, + "score": 0.8, + }, + ] + + neighbors = { + "a": [ + { + "properties": {"id": "b", "label": "B"}, + "labels": ["Node"], + "relation_type": "relates_to", + "depth": 1, + } + ], + "b": [ + { + "properties": {"id": "a", "label": "A"}, + "labels": ["Node"], + "relation_type": "relates_to", + "depth": 1, + } + ], + } + + graph = DummyGraph(neighbors) + payload = query_visualization.build_layer_payload(question, query_results, graph, 1, 10) + + # Should only have 2 unique nodes (a and b), not 4 + node_ids = [n["id"] for n in payload["nodes"]] + assert len(node_ids) == 2 + assert len(set(node_ids)) == 2 + assert set(node_ids) == {"a", "b"} + + # Verify seed nodes keep highlight=True + node_dict = {n["id"]: n for n in payload["nodes"]} + assert node_dict["a"]["highlight"] is True + assert node_dict["b"]["highlight"] is True + + +def test_build_layer_payload_uses_direction_both_and_depth() -> None: + """Verify graph.find_neighbors is called with direction='both' and correct depth.""" + question = "Multi-hop test" + query_results = [ + { + "node_id": "start", + "space": "test", + "node_type": "Node", + "properties": {"label": "Start"}, + "score": 1.0, + } + ] + + neighbors = { + "start": [ + { + "properties": {"id": "hop1", "label": "Hop 1"}, + "labels": ["Node"], + "relation_type": "rel1", + "depth": 1, + }, + { + "properties": {"id": "hop2", "label": "Hop 2"}, + "labels": ["Node"], + "relation_type": "rel2", + "depth": 2, + }, + { + "properties": {"id": "hop3", "label": "Hop 3"}, + "labels": ["Node"], + "relation_type": "rel3", + "depth": 3, + }, + ] + } + + graph = DummyGraph(neighbors) + payload = query_visualization.build_layer_payload(question, query_results, graph, 3, 10) + + # Verify find_neighbors was called with correct parameters + assert graph.last_direction == "both" + assert graph.last_depth == 3 + + # Verify hop_distance is set from neighbor depth field + node_dict = {n["id"]: n for n in payload["nodes"]} + assert node_dict["start"]["hop_distance"] == 0 + assert node_dict["hop1"]["hop_distance"] == 1 + assert node_dict["hop2"]["hop_distance"] == 2 + assert node_dict["hop3"]["hop_distance"] == 3 + + +def test_query_viz_cli_command(monkeypatch, tmp_path) -> None: + """Test that query-viz CLI command exists and runs with mocked dependencies.""" + from click.testing import CliRunner + from opencrab.cli import main + from opencrab.ontology.query import QueryResult + + # Mock the factories and stores + class MockVectorStore: + available = True + + class MockGraphStore: + available = True + + def find_neighbors(self, node_id: str, direction: str = "both", depth: int = 1, limit: int = 50) -> list[dict]: + return [] + + class MockHybridQuery: + def __init__(self, chroma, graph): + pass + + def query(self, question: str, limit: int = 10, **kwargs) -> list[QueryResult]: + # Return mock results, including one with node_id=None + return [ + QueryResult( + source="vector", + node_id=None, + score=0.5, + text="Should be skipped", + metadata={"space": "test", "node_type": "TestNode", "name": "Test None"}, + ), + QueryResult( + source="vector", + node_id="test-node-1", + score=0.95, + text="Test result", + metadata={"space": "test", "node_type": "TestNode", "name": "Test 1"}, + ) + ] + + # Patch the factory functions and classes + import opencrab.stores.factory + import opencrab.ontology.query + + monkeypatch.setattr(opencrab.stores.factory, "make_vector_store", lambda cfg: MockVectorStore()) + monkeypatch.setattr(opencrab.stores.factory, "make_graph_store", lambda cfg: MockGraphStore()) + monkeypatch.setattr(opencrab.ontology.query, "HybridQuery", MockHybridQuery) + + # Run the CLI command + runner = CliRunner() + output_dir = str(tmp_path / "layers") + result = runner.invoke(main, ["query-viz", "test question", "--output-dir", output_dir]) + + # Check that the command ran successfully + assert result.exit_code == 0, f"CLI failed: {result.output}" + assert "Layer saved" in result.output + assert "layer-" in result.output + + # Verify layer file was created + import json + from pathlib import Path + + layer_dir = Path(output_dir) + assert layer_dir.exists() + + # Check that index was created + index_file = layer_dir / "layers-index.json" + assert index_file.exists() + + index_data = json.loads(index_file.read_text()) + assert "layers" in index_data + assert len(index_data["layers"]) == 1 + + # Check that layer file was created + layer_files = list(layer_dir.glob("layer-*.json")) + assert len(layer_files) == 1 + + layer_data = json.loads(layer_files[0].read_text()) + assert layer_data["query"] == "test question" + assert layer_data["source"] == "cli" + assert "nodes" in layer_data + assert "edges" in layer_data + # Ensure only the valid node_id is present + node_ids = [n["id"] for n in layer_data["nodes"]] + assert "test-node-1" in node_ids + assert None not in node_ids diff --git a/view_graph.py b/view_graph.py new file mode 100644 index 0000000..e7305f2 --- /dev/null +++ b/view_graph.py @@ -0,0 +1,44 @@ +import sqlite3 +import json + +# Connect to graph database +conn = sqlite3.connect('opencrab_data/graph.db') +cursor = conn.cursor() + +# List all tables +cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") +tables = [row[0] for row in cursor.fetchall()] +print("=== Database Tables ===") +for table in tables: + print(f" - {table}") + +print("\n=== Graph Nodes ===") +cursor.execute("SELECT * FROM graph_nodes LIMIT 20") +columns = [description[0] for description in cursor.description] +nodes = cursor.fetchall() +print(f"Found {len(nodes)} nodes") +for i, node in enumerate(nodes[:10], 1): + node_dict = dict(zip(columns, node)) + print(f"\n{i}. {node_dict.get('id', 'unknown')}") + print(f" Type: {node_dict.get('node_type', 'N/A')}") + print(f" Space: {node_dict.get('space', 'N/A')}") + if 'properties' in node_dict and node_dict['properties']: + try: + props = json.loads(node_dict['properties']) if isinstance(node_dict['properties'], str) else node_dict['properties'] + print(f" Name: {props.get('name', 'N/A')}") + if 'description' in props: + desc = props['description'][:100] + '...' if len(props['description']) > 100 else props['description'] + print(f" Desc: {desc}") + except: + pass + +print("\n=== Graph Edges ===") +cursor.execute("SELECT * FROM graph_edges LIMIT 20") +columns = [description[0] for description in cursor.description] +edges = cursor.fetchall() +print(f"Found {len(edges)} edges") +for i, edge in enumerate(edges[:10], 1): + edge_dict = dict(zip(columns, edge)) + print(f"\n{i}. {edge_dict.get('source_id', '?')} --[{edge_dict.get('relation', '?')}]--> {edge_dict.get('target_id', '?')}") + +conn.close() diff --git a/visualize_graph.py b/visualize_graph.py new file mode 100644 index 0000000..ad52f22 --- /dev/null +++ b/visualize_graph.py @@ -0,0 +1,140 @@ +import sqlite3 +import json +from collections import defaultdict + +# Connect to graph database +conn = sqlite3.connect('opencrab_data/graph.db') +cursor = conn.cursor() + +print("=" * 80) +print(" OPENCRAB ONTOLOGY GRAPH - Customer Churn Analysis") +print("=" * 80) + +# Get nodes by space +cursor.execute("SELECT node_id, node_type, space_id, properties FROM graph_nodes") +nodes_data = cursor.fetchall() + +nodes_by_space = defaultdict(list) +node_names = {} + +for node_id, node_type, space, props_json in nodes_data: + try: + props = json.loads(props_json) if props_json else {} + name = props.get('name', props.get('title', node_type)) + node_names[node_id] = f"{name} ({node_type})" + nodes_by_space[space or 'unknown'].append({ + 'id': node_id, + 'type': node_type, + 'name': name, + 'props': props + }) + except: + node_names[node_id] = f"{node_type}" + nodes_by_space[space or 'unknown'].append({ + 'id': node_id, + 'type': node_type, + 'name': node_type, + 'props': {} + }) + +print("\n📊 NODES BY SPACE:") +print("-" * 80) +for space, nodes in sorted(nodes_by_space.items()): + print(f"\n🔸 {space.upper()} ({len(nodes)} nodes)") + for node in nodes[:5]: # Show first 5 per space + print(f" • {node['name']} [{node['type']}]") + if 'description' in node['props']: + desc = node['props']['description'][:60] + '...' if len(node['props']['description']) > 60 else node['props']['description'] + print(f" └─ {desc}") + +# Get edges with meaningful labels +cursor.execute("SELECT from_id, to_id, relation, properties FROM graph_edges") +edges_data = cursor.fetchall() + +print("\n\n🔗 KEY RELATIONSHIPS:") +print("-" * 80) + +# Group edges by relation type +edges_by_relation = defaultdict(list) +for source_id, target_id, relation, props_json in edges_data: + source_name = node_names.get(source_id, source_id) + target_name = node_names.get(target_id, target_id) + edges_by_relation[relation].append((source_name, target_name)) + +for relation, edge_list in sorted(edges_by_relation.items())[:10]: # Show first 10 relation types + print(f"\n📌 Relation: {relation.upper()}") + for i, (source, target) in enumerate(edge_list[:3], 1): # Show first 3 edges per relation + print(f" {i}. {source}") + print(f" └─> {target}") + +# Create a visual graph representation for customer-related concepts +print("\n\n🎯 CUSTOMER CHURN ONTOLOGY GRAPH:") +print("-" * 80) +print(""" +┌─────────────────────────────────────────────────────────────────────┐ +│ CUSTOMER CHURN ONTOLOGY │ +└─────────────────────────────────────────────────────────────────────┘ + +[SUBJECT Space - Who] + └─> Users, Teams, Organizations + └─> Alice Chen (User) + └─> Bob Kim (User) + └─> Data Team (Team) + └─> ACME Corp (Org) + └─> RAG Agent (Agent) + +[RESOURCE Space - What] + └─> Projects, Datasets, Tools, APIs + └─> Analytics Platform (Project) + └─> User Events Dataset (Dataset) + └─> dbt (Tool) + └─> Query API (API) + +[EVIDENCE Space - Raw Data] + └─> Text Units, Log Entries + └─> Customer Churn Analysis Document + └─> Q4 2025 Incident Report + └─> Cache Analysis Report + +[CONCEPT Space - Ideas] + └─> Entities, Topics, Classes + └─> Customer Behavior (Entity) + └─> Churn Rate (Concept) + └─> Retention Strategy (Topic) + +[OUTCOME Space - Results] + └─> KPIs, Risks + └─> Revenue Impact (KPI) + └─> Customer Satisfaction (Outcome) + +[LEVER Space - Controls] + └─> Control Variables + └─> Cache TTL (Lever) + └─> Support Response Time (Lever) + +[POLICY Space - Rules] + └─> Access, Sensitivity, Approval + └─> Data Access Policy v1.3 (Policy) + +""") + +# Connection examples +print("\n🔀 SAMPLE CONNECTIONS:") +print("-" * 80) +cursor.execute(""" + SELECT from_id, to_id, relation + FROM graph_edges + LIMIT 10 +""") + +for i, (src, tgt, rel) in enumerate(cursor.fetchall(), 1): + src_name = node_names.get(src, src)[:40] + tgt_name = node_names.get(tgt, tgt)[:40] + print(f"{i}. {src_name}") + print(f" --[{rel}]--> {tgt_name}\n") + +print("\n" + "=" * 80) +print(" Total Nodes: %d | Total Edges: %d" % (len(nodes_data), len(edges_data))) +print("=" * 80) + +conn.close()