diff --git a/.changeset/good-garlics-act.md b/.changeset/good-garlics-act.md new file mode 100644 index 000000000..eae7fc1d1 --- /dev/null +++ b/.changeset/good-garlics-act.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat: Add Dagre layout component for directed acyclic graphs (DAGs) diff --git a/.changeset/shaggy-lions-guess.md b/.changeset/shaggy-lions-guess.md new file mode 100644 index 000000000..e94158aee --- /dev/null +++ b/.changeset/shaggy-lions-guess.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Spline): Improve initial data display / transition on non-cartesian charts (ex. hierarchy/graph) diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 772634096..7b52bdfd3 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -80,6 +80,7 @@ }, "type": "module", "dependencies": { + "@dagrejs/dagre": "^1.1.4", "@layerstack/svelte-actions": "^0.0.9", "@layerstack/svelte-stores": "^0.0.9", "@layerstack/tailwind": "^0.0.11", diff --git a/packages/layerchart/src/lib/components/Dagre.svelte b/packages/layerchart/src/lib/components/Dagre.svelte new file mode 100644 index 000000000..b9b2c2573 --- /dev/null +++ b/packages/layerchart/src/lib/components/Dagre.svelte @@ -0,0 +1,151 @@ +<script module> + export type DagreGraphData = { + nodes: Array<{ id: string; parent?: string; label?: string | dagre.Label }>; + edges: Array<{ source: string; target: string; label?: string }>; + }; + + export const RankDir = { + 'top-bottom': 'TB', + 'bottom-top': 'BT', + 'left-right': 'LR', + 'right-left': 'RL', + }; + + export const Align = { + none: undefined, + 'up-left': 'UL', + 'up-right': 'UR', + 'down-left': 'DL', + 'down-right': 'DR', + }; + + export const EdgeLabelPosition = { + left: 'l', + center: 'c', + right: 'r', + }; +</script> + +<script lang="ts"> + import dagre, { type Edge, type EdgeConfig, type GraphEdge } from '@dagrejs/dagre'; + + /** Data of nodes and edges to build graph */ + export let data: DagreGraphData; + + export let nodes = (d: any) => d.nodes; + export let nodeId = (d: any) => d.id; + export let edges = (d: any) => d.edges; + + /** Set graph as directed (true, default) or undirected (false), which does not treat the order of nodes in an edge as significant. */ + export let directed = true; + + /** Allow a graph to have multiple edges between the same pair of nodes */ + export let multigraph = false; + + /** Allow a graph to have compound nodes - nodes which can be the `parent` of other nodes */ + export let compound = false; + + /** Type of algorithm to assigns a rank to each node in the input graph */ + export let ranker: 'network-simplex' | 'tight-tree' | 'longest-path' = 'network-simplex'; + + /** Direction for rank nodes */ + export let direction: keyof typeof RankDir = 'top-bottom'; + + /** Alignment for rank nodes */ + export let align: keyof typeof Align | undefined = undefined; + + /** Number of pixels between each rank in the layout */ + export let rankSeparation = 50; + + /** Number of pixels that separate nodes horizontally in the layout */ + export let nodeSeparation = 50; + + /** Number of pixels that separate edges horizontally in the layout */ + export let edgeSeparation = 10; + + /** Default node width if not defined on node */ + export let nodeWidth = 100; + + /** Default node height if not defined on node */ + export let nodeHeight = 50; + + /** Default link label width if not defined on edge */ + export let edgeLabelWidth = 100; + + /** Default edge label height if not defined on edge */ + export let edgeLabelHeight = 20; + + /** Default edge label height if not defined on edge */ + export let edgeLabelPosition: keyof typeof EdgeLabelPosition = 'center'; + + /** Default pixels to move the label away from the edge if not defined on edge. Applies only when labelpos is l or r.*/ + export let edgeLabelOffset = 10; + + /** Filter nodes */ + export let filterNodes: (nodeId: string, graph: dagre.graphlib.Graph) => boolean = () => true; + + let graph: dagre.graphlib.Graph; + $: { + let g = new dagre.graphlib.Graph({ directed, multigraph, compound }); + + g.setGraph({ + ranker: ranker, + rankdir: RankDir[direction], + align: align ? Align[align] : undefined, + ranksep: rankSeparation, + nodesep: nodeSeparation, + edgesep: edgeSeparation, + }); + + g.setDefaultEdgeLabel(() => { + return {}; + }); + + nodes(data).forEach((n: any) => { + const id = nodeId(n); + + g.setNode(nodeId(n), { + id, + label: typeof n.label === 'string' ? n.label : id, + width: nodeWidth, + height: nodeHeight, + ...(typeof n.label === 'object' ? n.label : null), + }); + + if (n.parent) { + g.setParent(id, n.parent); + } + }); + + edges(data).forEach((e: any) => { + const { source, target, label, ...rest } = e; + g.setEdge( + e.source, + e.target, + label + ? { + label: label, + labelpos: EdgeLabelPosition[edgeLabelPosition], + labeloffset: edgeLabelOffset, + width: edgeLabelWidth, + height: edgeLabelHeight, + ...rest, + } + : {} + ); + }); + + g = filterNodes ? g.filterNodes((nodeId) => filterNodes(nodeId, graph)) : graph; + + dagre.layout(g); + + graph = g; + } + + $: graphNodes = graph.nodes().map((id) => graph.node(id)); + $: graphEdges = graph.edges().map((edge) => ({ ...edge, ...graph.edge(edge) })) as Array< + Edge & EdgeConfig & GraphEdge // `EdgeConfig` is excluded when inferred from usage + >; +</script> + +<slot nodes={graphNodes} edges={graphEdges} /> diff --git a/packages/layerchart/src/lib/components/Spline.svelte b/packages/layerchart/src/lib/components/Spline.svelte index c9f54e598..bd719d5c9 100644 --- a/packages/layerchart/src/lib/components/Spline.svelte +++ b/packages/layerchart/src/lib/components/Spline.svelte @@ -120,8 +120,6 @@ if (curve) path.curve(curve); return path(data ?? $contextData); - } else { - return ''; } } diff --git a/packages/layerchart/src/lib/components/TransformControls.svelte b/packages/layerchart/src/lib/components/TransformControls.svelte index c933f1121..05951d0d2 100644 --- a/packages/layerchart/src/lib/components/TransformControls.svelte +++ b/packages/layerchart/src/lib/components/TransformControls.svelte @@ -1,4 +1,5 @@ <script lang="ts"> + import { type ComponentProps } from 'svelte'; import { Button, Icon, MenuButton, Tooltip } from 'svelte-ux'; import { cls } from '@layerstack/tailwind'; @@ -28,6 +29,7 @@ export let placement: Placement = 'top-right'; export let orientation: 'horizontal' | 'vertical' = 'vertical'; + export let size: ComponentProps<Button>['size'] = 'md'; type Actions = 'zoomIn' | 'zoomOut' | 'center' | 'reset' | 'scrollMode'; export let show: Actions[] = ['zoomIn', 'zoomOut', 'center', 'reset', 'scrollMode']; @@ -64,7 +66,7 @@ <!-- svelte-ignore a11y-no-static-element-interactions --> <div class={cls( - 'bg-surface-300/50 rounded-full m-1 backdrop-blur z-10 flex', + 'bg-surface-300/50 border rounded-full m-1 backdrop-blur z-10 flex', orientation === 'vertical' && 'flex-col', { 'top-left': 'absolute top-0 left-0', @@ -89,6 +91,7 @@ <Button icon={mdiMagnifyPlusOutline} on:click={() => transform.zoomIn()} + {size} class="text-surface-content p-2" /> </Tooltip> @@ -99,6 +102,7 @@ <Button icon={mdiMagnifyMinusOutline} on:click={() => transform.zoomOut()} + {size} class="text-surface-content p-2" /> </Tooltip> @@ -109,6 +113,7 @@ <Button icon={mdiImageFilterCenterFocus} on:click={() => transform.translateCenter()} + {size} class="text-surface-content p-2" /> </Tooltip> @@ -119,6 +124,7 @@ <Button icon={mdiArrowULeftTop} on:click={() => transform.reset()} + {size} class="text-surface-content p-2" /> </Tooltip> @@ -135,6 +141,7 @@ ]} menuProps={{ placement: menuPlacementByOrientationAndPlacement[orientation][placement] }} menuIcon={null} + {size} value={$scrollMode} on:change={(e) => transform.setScrollMode(e.detail.value)} class="text-surface-content" diff --git a/packages/layerchart/src/lib/components/index.ts b/packages/layerchart/src/lib/components/index.ts index 3b86bf86f..9cc0ada9a 100644 --- a/packages/layerchart/src/lib/components/index.ts +++ b/packages/layerchart/src/lib/components/index.ts @@ -19,6 +19,7 @@ export { default as Circle } from './Circle.svelte'; export { default as CircleClipPath } from './CircleClipPath.svelte'; export { default as ClipPath } from './ClipPath.svelte'; export { default as ColorRamp } from './ColorRamp.svelte'; +export { default as Dagre } from './Dagre.svelte'; export { default as Frame } from './Frame.svelte'; export { default as ForceSimulation } from './ForceSimulation.svelte'; export { default as GeoCircle } from './GeoCircle.svelte'; diff --git a/packages/layerchart/src/lib/docs/CurveMenuField.svelte b/packages/layerchart/src/lib/docs/CurveMenuField.svelte index 10bf08ace..2c01e5e71 100644 --- a/packages/layerchart/src/lib/docs/CurveMenuField.svelte +++ b/packages/layerchart/src/lib/docs/CurveMenuField.svelte @@ -23,4 +23,11 @@ }); </script> -<MenuField label="Curve" {options} bind:value stepper classes={{ menuIcon: 'hidden' }} /> +<MenuField + label="Curve" + {options} + bind:value + stepper + classes={{ menuIcon: 'hidden' }} + {...$$restProps} +/> diff --git a/packages/layerchart/src/lib/utils/graph.test.ts b/packages/layerchart/src/lib/utils/graph.test.ts new file mode 100644 index 000000000..f91db9b71 --- /dev/null +++ b/packages/layerchart/src/lib/utils/graph.test.ts @@ -0,0 +1,98 @@ +import { describe, it, expect } from 'vitest'; +import dagre from '@dagrejs/dagre'; +import { ancestors, descendants } from './graph.js'; + +const exampleGraph = { + nodes: [ + { id: 'A' }, + { id: 'B' }, + { id: 'C' }, + { id: 'D' }, + { id: 'E' }, + { id: 'F' }, + { id: 'G' }, + { id: 'H' }, + { id: 'I' }, + ], + edges: [ + { source: 'A', target: 'B' }, + { source: 'C', target: 'B' }, + { source: 'B', target: 'E' }, + { source: 'B', target: 'F' }, + { source: 'D', target: 'E' }, + { source: 'D', target: 'F' }, + { source: 'E', target: 'H' }, + { source: 'G', target: 'H' }, + { source: 'H', target: 'I' }, + ], +}; + +function buildGraph(data: typeof exampleGraph) { + const g = new dagre.graphlib.Graph(); + + g.setGraph({}); + + data.nodes.forEach((n) => { + g.setNode(n.id, { + label: n.id, + }); + }); + + data.edges.forEach((e) => { + g.setEdge(e.source, e.target); + }); + + return g; +} + +describe('accessors', () => { + it('start of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = ancestors(graph, 'A'); + expect(actual).length(0); + }); + + it('middle of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = ancestors(graph, 'E'); + expect(actual).to.have.members(['A', 'B', 'C', 'D']); + }); + + it('end of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = ancestors(graph, 'I'); + expect(actual).to.have.members(['A', 'B', 'C', 'D', 'E', 'G', 'H']); + }); + + it('max depth', () => { + const graph = buildGraph(exampleGraph); + const actual = ancestors(graph, 'H', 2); + expect(actual).to.have.members(['B', 'D', 'E', 'G']); + }); +}); + +describe('descendants', () => { + it('start of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = descendants(graph, 'A'); + expect(actual).to.have.members(['B', 'E', 'F', 'H', 'I']); + }); + + it('middle of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = descendants(graph, 'E'); + expect(actual).to.have.members(['H', 'I']); + }); + + it('end of graph ', () => { + const graph = buildGraph(exampleGraph); + const actual = descendants(graph, 'I'); + expect(actual).length(0); + }); + + it('max depth', () => { + const graph = buildGraph(exampleGraph); + const actual = descendants(graph, 'B', 2); + expect(actual).to.have.members(['E', 'F', 'H']); + }); +}); diff --git a/packages/layerchart/src/lib/utils/graph.ts b/packages/layerchart/src/lib/utils/graph.ts index 6521ecd6d..0d42d3a6e 100644 --- a/packages/layerchart/src/lib/utils/graph.ts +++ b/packages/layerchart/src/lib/utils/graph.ts @@ -6,7 +6,8 @@ import type { SankeyNode, SankeyNodeMinimal, } from 'd3-sankey'; -import type { HierarchyLink, hierarchy as d3Hierarchy } from 'd3-hierarchy'; +import type { hierarchy as d3Hierarchy } from 'd3-hierarchy'; +import dagre from '@dagrejs/dagre'; /** * Convert CSV rows in format: 'source,target,value' to SankeyGraph @@ -86,3 +87,45 @@ export function nodesFromLinks<N extends SankeyExtraProperties, L extends Sankey } return Array.from(nodesByName.values()); } + +/** + * Get all upstream predecessors for dagre nodeId + */ +export function ancestors( + graph: dagre.graphlib.Graph, + nodeId: string, + maxDepth = Infinity, + currentDepth = 0 +): dagre.Node[] { + if (currentDepth === maxDepth) { + return []; + } + + const predecessors = graph.predecessors(nodeId) ?? []; + return [ + ...predecessors, + // @ts-expect-error: Types from dagre appear incorrect + ...predecessors.flatMap((pId) => ancestors(graph, pId, maxDepth, currentDepth + 1)), + ]; +} + +/** + * Get all downstream descendants for dagre nodeId + */ +export function descendants( + graph: dagre.graphlib.Graph, + nodeId: string, + maxDepth = Infinity, + currentDepth = 0 +): dagre.Node[] { + if (currentDepth === maxDepth) { + return []; + } + + const predecessors = graph.successors(nodeId) ?? []; + return [ + ...predecessors, + // @ts-expect-error: Types from dagre appear incorrect + ...predecessors.flatMap((pId) => descendants(graph, pId, maxDepth, currentDepth + 1)), + ]; +} diff --git a/packages/layerchart/src/routes/_NavMenu.svelte b/packages/layerchart/src/routes/_NavMenu.svelte index 736d8ca2b..449cd5539 100644 --- a/packages/layerchart/src/routes/_NavMenu.svelte +++ b/packages/layerchart/src/routes/_NavMenu.svelte @@ -30,7 +30,8 @@ 'Sparkline', 'Threshold', ], - 'Hierarchy & Graph': ['Pack', 'Partition', 'Sankey', 'Sunburst', 'Tree', 'Treemap'], + Hierarchy: ['Pack', 'Partition', 'Sunburst', 'Tree', 'Treemap'], + Graph: ['Dagre', 'Sankey'], Force: [ 'Beeswarm', 'CollisionDetection', diff --git a/packages/layerchart/src/routes/docs/examples/Dagre/+page.svelte b/packages/layerchart/src/routes/docs/examples/Dagre/+page.svelte new file mode 100644 index 000000000..15a5865e5 --- /dev/null +++ b/packages/layerchart/src/routes/docs/examples/Dagre/+page.svelte @@ -0,0 +1,441 @@ +<script lang="ts"> + import type { ComponentProps } from 'svelte'; + import { curveBasis, curveLinear } from 'd3-shape'; + import { cubicOut } from 'svelte/easing'; + import { slide } from 'svelte/transition'; + import { cls } from '@layerstack/tailwind'; + + import { Chart, Dagre, Group, Rect, Spline, Svg, Text, Tooltip } from 'layerchart'; + import { Field, MenuField, Switch, Toggle } from 'svelte-ux'; + + import Preview from '$lib/docs/Preview.svelte'; + import DagreControls from './DagreControls.svelte'; + import TransformControls from 'layerchart/components/TransformControls.svelte'; + + export let data; + + let selectedGraphValue: keyof typeof data = 'simple'; + $: selectedGraph = data[selectedGraphValue]; + + let settings = { + playground: { + ranker: 'network-simplex', + direction: 'left-right', + align: 'up-left', + nodeSeparation: 50, + rankSeparation: 50, + edgeSeparation: 10, + edgeLabelPosition: 'center', + edgeLabelOffset: 10, + curve: curveBasis, + arrow: 'arrow', + }, + simple: { + ranker: 'network-simplex', + direction: 'left-right', + align: 'up-left', + nodeSeparation: 50, + rankSeparation: 50, + edgeSeparation: 10, + edgeLabelPosition: 'center', + edgeLabelOffset: 10, + curve: curveBasis, + arrow: 'arrow', + }, + tcpState: { + ranker: 'network-simplex', + direction: 'top-bottom', + align: 'none', + nodeSeparation: 50, + rankSeparation: 50, + edgeSeparation: 10, + edgeLabelPosition: 'center', + edgeLabelOffset: 10, + curve: curveLinear, + arrow: 'triangle', + }, + cluster: { + ranker: 'network-simplex', + direction: 'top-bottom', + align: 'none', + nodeSeparation: 50, + rankSeparation: 50, + edgeSeparation: 10, + edgeLabelPosition: 'center', + edgeLabelOffset: 10, + curve: curveLinear, + arrow: 'arrow', + }, + } satisfies Record<string, ComponentProps<DagreControls>['settings']>; +</script> + +<h1>Examples</h1> + +<Toggle let:on={showSettings} let:toggle> + <div class="grid grid-cols-[1fr,256px,auto] gap-2 items-end mb-1"> + <h2>Playground</h2> + + <MenuField + label="Graph" + options={[ + { label: 'Simple', value: 'simple' }, + { label: 'Medium', value: 'medium' }, + { label: 'Large', value: 'large' }, + { label: 'Les Misérables', value: 'miserables' }, + { label: 'Generated (simple)', value: 'simpleGenerated' }, + { label: 'Generated (complex)', value: 'complexGenerated' }, + ]} + bind:value={selectedGraphValue} + menuIcon="" + dense + stepper + /> + + <Field label="Settings" labelPlacement="inset" let:id dense> + <Switch checked={showSettings} on:change={toggle} {id} size="md" /> + </Field> + </div> + + <Preview data={selectedGraph}> + <div class="flex gap-2"> + <div class="flex-1 h-[700px] p-4 border rounded overflow-hidden"> + <Chart + data={selectedGraph} + transform={{ + mode: 'canvas', + initialScrollMode: 'scale', + tweened: { duration: 800, easing: cubicOut }, + }} + > + <TransformControls /> + + <Svg> + <Dagre + data={selectedGraph} + edges={(d) => d.links} + {...settings.playground} + let:nodes + let:edges + > + <g class="edges"> + {#each edges as edge, i (edge.v + '-' + edge.w)} + <Spline + data={edge.points} + x="x" + y="y" + class="stroke-surface-content opacity-30" + tweened + curve={settings.playground.curve} + markerEnd={settings.playground.arrow} + /> + {/each} + </g> + + <g class="nodes"> + {#each nodes as node (node.label)} + <Group x={node.x - node.width / 2} y={node.y - node.height / 2} tweened> + <Rect + width={node.width} + height={node.height} + class="fill-surface-200 stroke-2 stroke-primary/50" + rx={10} + /> + + <Text + value={node.label} + x={node.width / 2} + y={node.height / 2} + dy={-2} + textAnchor="middle" + verticalAnchor="middle" + class={cls('text-xs pointer-events-none')} + /> + </Group> + {/each} + </g> + </Dagre> + </Svg> + </Chart> + </div> + + {#if showSettings} + <div transition:slide={{ axis: 'x' }}> + <DagreControls bind:settings={settings.playground} /> + </div> + {/if} + </div> + </Preview> +</Toggle> + +<Toggle let:on={showSettings} let:toggle> + <div class="grid grid-cols-[1fr,auto] gap-2 items-end"> + <h2>Basic</h2> + + <Field label="Settings" labelPlacement="left" class="mb-1" let:id> + <Switch checked={showSettings} on:change={toggle} {id} size="md" /> + </Field> + </div> + + <Preview data={data.basic}> + <div class="flex gap-2"> + <div class="flex-1 h-[500px] p-4 border rounded overflow-hidden"> + <Chart + data={data.basic} + transform={{ + mode: 'canvas', + initialScrollMode: 'scale', + tweened: { duration: 800, easing: cubicOut }, + }} + > + <TransformControls /> + + <Svg> + <Dagre + data={data.basic} + edges={(d) => d.links} + {...settings.simple} + let:nodes + let:edges + > + <g class="edges"> + {#each edges as edge, i (edge.v + '-' + edge.w)} + <Spline + data={edge.points} + x="x" + y="y" + class="stroke-surface-content opacity-30" + tweened + curve={settings.simple.curve} + markerEnd={settings.simple.arrow} + /> + {/each} + </g> + + <g class="nodes"> + {#each nodes as node (node.label)} + <Group x={node.x - node.width / 2} y={node.y - node.height / 2} tweened> + <Rect + width={node.width} + height={node.height} + class="fill-surface-200 stroke-2 stroke-primary/50" + rx={10} + /> + + <Text + value={node.label} + x={node.width / 2} + y={node.height / 2} + dy={-2} + textAnchor="middle" + verticalAnchor="middle" + class={cls('text-xs pointer-events-none')} + /> + </Group> + {/each} + </g> + </Dagre> + </Svg> + </Chart> + </div> + + {#if showSettings} + <div transition:slide={{ axis: 'x' }}> + <DagreControls bind:settings={settings.simple} /> + </div> + {/if} + </div> + </Preview> +</Toggle> + +<Toggle let:on={showSettings} let:toggle> + <div class="grid grid-cols-[1fr,auto] gap-2 items-end"> + <h2>TCP State Diagram</h2> + + <Field label="Settings" labelPlacement="left" class="mb-1" let:id> + <Switch checked={showSettings} on:change={toggle} {id} size="md" /> + </Field> + </div> + + <!-- https://dagrejs.github.io/project/dagre-d3/latest/demo/tcp-state-diagram.html --> + + <Preview data={data.tcpState}> + <div class="flex gap-2"> + <div class="flex-1 h-[700px] p-4 border rounded overflow-hidden"> + <Chart + data={data.tcpState} + transform={{ + mode: 'canvas', + initialScale: 0.75, + initialTranslate: { x: 0, y: -110 }, + initialScrollMode: 'scale', + tweened: { duration: 800, easing: cubicOut }, + }} + > + <TransformControls /> + + <Svg> + <Dagre + data={data.tcpState} + edges={(d) => d.links} + {...settings.tcpState} + let:nodes + let:edges + > + <g class="edges"> + {#each edges as edge, i (edge.v + '-' + edge.w)} + <Spline + data={edge.points} + x="x" + y="y" + class="stroke-surface-content opacity-30" + tweened + curve={settings.tcpState?.curve} + markerEnd={settings.tcpState.arrow} + /> + + <!-- Label background --> + <!-- <Rect + x={edge.x - edge.width / 2} + y={edge.y - edge.height / 2} + width={edge.width} + height={edge.height} + class="fill-surface-100" + /> --> + <Text + value={edge.label} + x={edge.x} + y={edge.y} + textAnchor="middle" + verticalAnchor="middle" + class="stroke-2 stroke-surface-100" + {...settings.simple} + tweened + /> + {/each} + </g> + + <g class="nodes"> + {#each nodes as node (node.label)} + <Group x={node.x - node.width / 2} y={node.y - node.height / 2} tweened> + <Rect + width={node.width} + height={node.height} + class={cls( + 'fill-surface-200 stroke-2 stroke-primary/50', + node.label === 'CLOSED' && 'fill-danger/10 stroke-danger/50', + node.label === 'ESTAB' && 'fill-success/10 stroke-success/50' + )} + rx={10} + /> + + <Text + value={node.label} + x={node.width / 2} + y={node.height / 2} + dy={-2} + textAnchor="middle" + verticalAnchor="middle" + class={cls('text-xs pointer-events-none')} + /> + </Group> + {/each} + </g> + </Dagre> + </Svg> + </Chart> + </div> + + {#if showSettings} + <div transition:slide={{ axis: 'x' }}> + <DagreControls bind:settings={settings.tcpState} /> + </div> + {/if} + </div> + </Preview> +</Toggle> + +<!-- TODO: Match dagre d3 example - https://dagrejs.github.io/project/dagre-d3/latest/demo/clusters.html --> +<!-- <Toggle let:on={showSettings} let:toggle> + <div class="grid grid-cols-[1fr,auto] gap-2 items-end"> + <h2>Cluster</h2> + + <Field label="Settings" labelPlacement="left" class="mb-1" let:id> + <Switch checked={showSettings} on:change={toggle} {id} size="md" /> + </Field> + </div> + + <Preview data={data.cluster}> + <div class="flex gap-2"> + <div class="flex-1 h-[500px] p-4 border rounded overflow-hidden"> + <Chart + data={data.cluster} + transform={{ + mode: 'canvas', + initialScrollMode: 'scale', + tweened: { duration: 800, easing: cubicOut }, + }} + let:tooltip + > + <TransformControls /> + + <Svg> + <Dagre + data={data.cluster} + edges={(d) => d.links} + compound + {...settings.cluster} + let:nodes + let:edges + > + <g class="edges"> + {#each edges as edge, i (edge.v + '-' + edge.w)} + <Spline + data={edge.points} + x="x" + y="y" + class="stroke-surface-content opacity-30" + tweened + curve={settings.cluster?.curve} + markerEnd={settings.cluster.arrow} + /> + {/each} + </g> + + <g class="nodes"> + {#each nodes as node (node.label)} + <Group x={node.x - node.width / 2} y={node.y - node.height / 2} tweened> + <Rect + width={node.width} + height={node.height} + class={cls( + 'fill-surface-200 stroke-2 stroke-primary/50 group-hover:fill-primary/10 group-hover:cursor-pointer', + 'fill-none' + )} + rx={10} + /> + + <Text + value={node.label} + x={node.width / 2} + y={node.height / 2} + dy={-2} + textAnchor="middle" + verticalAnchor="middle" + class={cls('text-xs pointer-events-none')} + /> + </Group> + {/each} + </g> + </Dagre> + </Svg> + </Chart> + </div> + + {#if showSettings} + <div transition:slide={{ axis: 'x' }}> + <DagreControls bind:settings={settings.cluster} /> + </div> + {/if} + </div> + </Preview> +</Toggle> --> diff --git a/packages/layerchart/src/routes/docs/examples/Dagre/+page.ts b/packages/layerchart/src/routes/docs/examples/Dagre/+page.ts new file mode 100644 index 000000000..75d386225 --- /dev/null +++ b/packages/layerchart/src/routes/docs/examples/Dagre/+page.ts @@ -0,0 +1,61 @@ +import { range } from 'd3-array'; +import { randomInteger } from '@layerstack/utils'; +import { unique } from '@layerstack/utils/array'; + +import pageSource from './+page.svelte?raw'; + +export async function load() { + const alpha = [...Array(26)].map((val, i) => String.fromCharCode(i + 65)); + + function getRandomDownstreamIds(index: number) { + return unique(range(randomInteger(1, 3)).map(() => randomInteger(index + 1, 25))); + } + + const simpleGenerated = { + nodes: alpha.map((a) => ({ + id: a, + })), + links: alpha.flatMap((a, i) => { + if (i === 25) { + return []; + } else { + const randomDownstreamId = randomInteger(i + 1, 25); + const edge = { source: a, target: alpha[randomDownstreamId] }; + return [edge]; + } + }), + }; + + const complexGenerated = { + nodes: alpha.map((a) => ({ + id: a, + })), + links: alpha.flatMap((a, i) => { + if (i === 25) { + return []; + } else { + return getRandomDownstreamIds(i).map((id) => { + return { source: a, target: alpha[id] }; + }); + } + }), + }; + + return { + basic: await fetch('/data/examples/graph/basic.json').then((r) => r.json()), + simple: await fetch('/data/examples/graph/simple.json').then((r) => r.json()), + complex: await fetch('/data/examples/graph/complex.json').then((r) => r.json()), + miserables: await fetch('/data/examples/graph/miserables.json').then((r) => r.json()), + tcpState: await fetch('/data/examples/graph/tcp-state.json').then((r) => r.json()), + cluster: await fetch('/data/examples/graph/cluster.json').then((r) => r.json()), + medium: await fetch('/data/examples/graph/dag-medium.json').then((r) => r.json()), + large: await fetch('/data/examples/graph/dag-large.json').then((r) => r.json()), + simpleGenerated, + complexGenerated, + + meta: { + pageSource, + related: ['components/Dagre', 'components/Link'], + }, + }; +} diff --git a/packages/layerchart/src/routes/docs/examples/Dagre/DagreControls.svelte b/packages/layerchart/src/routes/docs/examples/Dagre/DagreControls.svelte new file mode 100644 index 000000000..b8d17c661 --- /dev/null +++ b/packages/layerchart/src/routes/docs/examples/Dagre/DagreControls.svelte @@ -0,0 +1,151 @@ +<script lang="ts"> + import type { ComponentProps } from 'svelte'; + import { MenuField } from 'svelte-ux'; + import { curveLinear } from 'd3-shape'; + import { cls } from '@layerstack/tailwind'; + + import type Dagre from '$lib/components/Dagre.svelte'; + import type Spline from '$lib/components/Spline.svelte'; + import CurveMenuField from '$lib/docs/CurveMenuField.svelte'; + + type DagreProps = ComponentProps<Dagre>; + + export let settings = { + ranker: 'network-simplex' as DagreProps['ranker'], + direction: 'left-right' as DagreProps['direction'], + align: 'up-left' as DagreProps['align'], + rankSeparation: 50 as DagreProps['rankSeparation'], + nodeSeparation: 50 as DagreProps['nodeSeparation'], + edgeSeparation: 10 as DagreProps['rankSeparation'], + edgeLabelPosition: 'center' as DagreProps['edgeLabelPosition'], + edgeLabelOffset: 10 as DagreProps['edgeLabelOffset'], + curve: curveLinear as ComponentProps<CurveMenuField>['value'], + arrow: 'arrow' as ComponentProps<Spline>['marker'], + }; +</script> + +<div class={cls('grid gap-2', $$props.class)}> + <MenuField + label="Ranker" + options={[ + { label: 'Network-Simplex', value: 'network-simplex' }, + { label: 'Tight tree', value: 'tight-tree' }, + { label: 'Longest path', value: 'longest-path' }, + ]} + bind:value={settings.ranker} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Direction" + options={[ + { label: 'Top → Bottom', value: 'top-bottom' }, + { label: 'Bottom → Top', value: 'bottom-top' }, + { label: 'Left → Right', value: 'left-right' }, + { label: 'Right → Left', value: 'right-left' }, + ]} + bind:value={settings.direction} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Align" + options={[ + { label: 'None', value: 'none' }, + { label: 'Up / Left', value: 'up-left' }, + { label: 'Up / Right', value: 'up-right' }, + { label: 'Down / Left', value: 'down-left' }, + { label: 'Down / Right', value: 'down-right' }, + ]} + bind:value={settings.align} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Rank separation" + options={[ + { label: 'Compact', value: 10 }, + { label: 'Default', value: 50 }, + { label: 'Comfortable', value: 100 }, + ]} + bind:value={settings.rankSeparation} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Node separation" + options={[ + { label: 'Compact', value: 10 }, + { label: 'Default', value: 50 }, + { label: 'Comfortable', value: 100 }, + ]} + bind:value={settings.nodeSeparation} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Edge separation" + options={[ + { label: 'Compact', value: 5 }, + { label: 'Default', value: 10 }, + { label: 'Comfortable', value: 20 }, + ]} + bind:value={settings.edgeSeparation} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Edge label position" + options={[ + { label: 'Left', value: 'left' }, + { label: 'Center', value: 'center' }, + { label: 'Right', value: 'right' }, + ]} + bind:value={settings.edgeLabelPosition} + menuIcon="" + stepper + dense + /> + + <MenuField + label="Edge label offset" + options={[ + { label: 'Compact', value: 5 }, + { label: 'Default', value: 10 }, + { label: 'Comfortable', value: 20 }, + ]} + bind:value={settings.edgeLabelOffset} + menuIcon="" + stepper + dense + /> + + <CurveMenuField label="Curve style" bind:value={settings.curve} dense /> + <MenuField + label="Arrow / Marker" + options={[ + { label: 'arrow', value: 'arrow' }, + { label: 'triangle', value: 'triangle' }, + { label: 'circle', value: 'circle' }, + { label: 'circle-stroke', value: 'circle-stroke' }, + { label: 'dot', value: 'dot' }, + { label: 'line', value: 'line' }, + ]} + bind:value={settings.arrow} + menuIcon="" + stepper + dense + /> +</div> diff --git a/packages/layerchart/static/data/examples/graph/basic.json b/packages/layerchart/static/data/examples/graph/basic.json new file mode 100644 index 000000000..05f366664 --- /dev/null +++ b/packages/layerchart/static/data/examples/graph/basic.json @@ -0,0 +1,24 @@ +{ + "nodes": [ + { "id": "A" }, + { "id": "B" }, + { "id": "C" }, + { "id": "D" }, + { "id": "E" }, + { "id": "F" }, + { "id": "G" }, + { "id": "H" }, + { "id": "I" } + ], + "links": [ + { "source": "A", "target": "B" }, + { "source": "C", "target": "B" }, + { "source": "B", "target": "E" }, + { "source": "B", "target": "F" }, + { "source": "D", "target": "E" }, + { "source": "D", "target": "F" }, + { "source": "E", "target": "H" }, + { "source": "G", "target": "H" }, + { "source": "H", "target": "I" } + ] +} diff --git a/packages/layerchart/static/data/examples/graph/cluster.json b/packages/layerchart/static/data/examples/graph/cluster.json new file mode 100644 index 000000000..ea37e6b19 --- /dev/null +++ b/packages/layerchart/static/data/examples/graph/cluster.json @@ -0,0 +1,22 @@ +{ + "nodes": [ + { "id": "A" }, + { "id": "B", "parent": "top_group" }, + { "id": "C", "parent": "bottom_group" }, + { "id": "D", "parent": "bottom_group" }, + { "id": "E", "parent": "bottom_group" }, + { "id": "F", "parent": "bottom_group" }, + { "id": "G" }, + { "id": "group" }, + { "id": "top_group", "parent": "group" }, + { "id": "bottom_group", "parent": "group" } + ], + "links": [ + { "source": "A", "target": "B" }, + { "source": "B", "target": "C" }, + { "source": "B", "target": "D" }, + { "source": "B", "target": "E" }, + { "source": "B", "target": "F" }, + { "source": "B", "target": "G" } + ] +} diff --git a/packages/layerchart/static/data/examples/graph/dag-large.json b/packages/layerchart/static/data/examples/graph/dag-large.json new file mode 100644 index 000000000..2ebb3795e --- /dev/null +++ b/packages/layerchart/static/data/examples/graph/dag-large.json @@ -0,0 +1,1859 @@ +{ + "nodes": [ + { "id": "0", "name": "1c22f73f2cc93f164283d9e762bced68" }, + { "id": "1", "name": "03f76604756468de62f78e91c917bc9e" }, + { "id": "2", "name": "00ad68f5c7cc1e82827eecf7a336fffb" }, + { "id": "3", "name": "dbba63781f11ff411b3d5bae7ab58377" }, + { "id": "4", "name": "f9e08b1fbf80d89ba8717721976c4e6f" }, + { "id": "5", "name": "0e6ff806fc4a4399243522e116eb44ad" }, + { "id": "6", "name": "d22c79061b363f5d6d25f8f29043c048" }, + { "id": "7", "name": "ae131915396ed2f27752c043e123897e" }, + { "id": "8", "name": "4b5d6ab6e3f422da578fe8ff044e35dd" }, + { "id": "9", "name": "d9d5ee901fa0cbca611e8bfa490f5144" }, + { "id": "10", "name": "d73b517b730d0b13e78ee72155a1861b" }, + { "id": "11", "name": "a32a2af438ecdfdb7d89183bee1f1802" }, + { "id": "12", "name": "94349049cb07b76538eb3fb4c1bb84a6" }, + { "id": "13", "name": "44e21c5260ddb470e3854fc38403c45b" }, + { "id": "14", "name": "8d28ea2b1c25694ca35399cc5fe6c317" }, + { "id": "15", "name": "9533033056c4191d6d22979945246510" }, + { "id": "16", "name": "89d1f92186c667db753a4d64a86a2908" }, + { "id": "17", "name": "c5d0c5b6f82e286f1eb79bf0569e4614" }, + { "id": "18", "name": "e51dcd266a702305db0653b139ebfdc2" }, + { "id": "19", "name": "eceb5d51454334aa64f4ed5e560f9f7f" }, + { "id": "20", "name": "76de00119a2127df4faecd5be49b3fe7" }, + { "id": "21", "name": "46b9e6f0db1020302f6b52018023950a" }, + { "id": "22", "name": "d2996082c1057d8c2b5e8b33ba1940fa" }, + { "id": "23", "name": "41acf2dc58bd53bdd6258b5911077d6d" }, + { "id": "24", "name": "03a0d5e5646bfe60fce679a87ef4cd34" }, + { "id": "25", "name": "f8842d7dab501f9820d7f12c3bc00dd4" }, + { "id": "26", "name": "afd0a1c912401320948956d1a7f9ee14" }, + { "id": "27", "name": "d312ffbfb5b6d27da93722ef6f649e0a" }, + { "id": "28", "name": "a0f7ca2b7da51083c6a07492b53df54d" }, + { "id": "29", "name": "3718328db137d699c7b3425d20e96334" }, + { "id": "30", "name": "2852f697a9f8581725c6fc6a5472a2e5" }, + { "id": "31", "name": "aeda118711cca8b7c87b113f0bc29139" }, + { "id": "32", "name": "fefb65aa1a38b0e3c0d1053609ebff99" }, + { "id": "33", "name": "7f48ad52462c162afd1f9b7f4e94a2e1" }, + { "id": "34", "name": "1cba1a6455efb4392487836c65f3ac72" }, + { "id": "35", "name": "8dad532d0d1f8252845218fed998183c" }, + { "id": "36", "name": "0b78491fe5109a771bfb5a7383df9bd7" }, + { "id": "37", "name": "5dc3a1ffd9333b3ee9926d8ab3a9cf71" }, + { "id": "38", "name": "77960fc96162cf7b1d2aaa1e1dfd506b" }, + { "id": "39", "name": "dc51a7d438ed5e023a4aa7347e6de8dc" }, + { "id": "40", "name": "95a1446a7120e4af5c0c8878abb7e6d2" }, + { "id": "41", "name": "94052b0ee26fa4979fd25bf77b2ce611" }, + { "id": "42", "name": "554208e1618d0aedf37387eda5ff17b0" }, + { "id": "43", "name": "026bad66d0823629aeeb12abadda82aa" }, + { "id": "44", "name": "f6f44ae6ee95a1dd4580df8ec1bc9a76" }, + { "id": "45", "name": "e5638bdcd9ac7044e0b06883937b1373" }, + { "id": "46", "name": "73e6138d290996cf6d12cb654d5fb1f1" }, + { "id": "47", "name": "429c84849797c842062ecea402a8e4c4" }, + { "id": "48", "name": "a934dfb0a262a799bcb126c935800320" }, + { "id": "49", "name": "6bc3154245f5841ec399420bfa6af57a" }, + { "id": "50", "name": "9353587f1aff8606f2357d9f6fd007ff" }, + { "id": "51", "name": "32b9643eab750b5d9ecc50c71b14c3bf" }, + { "id": "52", "name": "3608ee2da8bf0ff27b124e7b9d68f32a" }, + { "id": "53", "name": "86baf53995d9f79f2e0dea8894252514" }, + { "id": "54", "name": "e89b99165131558af8e9447879c530ac" }, + { "id": "55", "name": "94425e46d9e82868322d09a66bdda3e4" }, + { "id": "56", "name": "b78af2afda8be0c0d56adbb913c1a2d2" }, + { "id": "57", "name": "a322566846461859c44229426fbdd8ba" }, + { "id": "58", "name": "b2e2e8486229e316fbe8a457710c288c" }, + { "id": "59", "name": "8bb7afb333d0e4b53560a856f5cda8ef" }, + { "id": "60", "name": "463b44b79fedae0025ece436695e407d" }, + { "id": "61", "name": "a315911defc5bcff13389f2c3ef834a1" }, + { "id": "62", "name": "25bc1c203366fcc40fbf2394d5154b50" }, + { "id": "63", "name": "5c6d383c57f46682cf9962704084ee03" }, + { "id": "64", "name": "062d5c614d8fc26746bd5e5e9b8ea9e7" }, + { "id": "65", "name": "fc14f1c2b399803e497827eed68d7779" }, + { "id": "66", "name": "b7da8201493a56053c800eb57299e796" }, + { "id": "67", "name": "338593eea9b5684639faaf8c500f0d2c" }, + { "id": "68", "name": "040c74e89644cd7ce27ca609652112d7" }, + { "id": "69", "name": "ea258e19d23517d4710950d7c94388af" }, + { "id": "70", "name": "d10f51b7d18f86b30403c449ad0c5d66" }, + { "id": "71", "name": "7a5d4244f2966079eb44df26b37b3ef9" }, + { "id": "72", "name": "eeae6b00aaba1b7788ee4a6383bbf227" }, + { "id": "73", "name": "56af64201081c0cf595ce03a38b20238" }, + { "id": "74", "name": "bc6fb262bbe122374136684aadcd6613" }, + { "id": "75", "name": "8aa4969b900749268b911edaf1d3e4ac" }, + { "id": "76", "name": "32d43b96aca27ed885f9cc9819b190f1" }, + { "id": "77", "name": "328c876e4c489aee32fddd7bd21b48ee" }, + { "id": "78", "name": "357b28f176fa44566cd2937494b4117d" }, + { "id": "79", "name": "0c5423ead9bc125eee75d900c59d2ebe" }, + { "id": "80", "name": "6a11e6045d5311a5856568346fca6ff9" }, + { "id": "81", "name": "8c3269c8b81f0a4cda1d42ef7e2b62f2" }, + { "id": "82", "name": "80b40d324e115de9d11f288af4794570" }, + { "id": "83", "name": "0ccb7b288c800cb57ad06595ee3efb48" }, + { "id": "84", "name": "17c740181296e2e2f4733a4a80f490c4" }, + { "id": "85", "name": "7fc7a596fc8078a2153253a522a27dea" }, + { "id": "86", "name": "f63db9d41f068fe47c175637cd089e89" }, + { "id": "87", "name": "f145eeb73f1d5e446508dbc2b2bbc8b6" }, + { "id": "88", "name": "68f802bd1a0df66548c52df8a2f8bd71" }, + { "id": "89", "name": "61201e1109b36ddced1901a89fdd83d5" }, + { "id": "90", "name": "7e0a00244e129a260c2d00efcb137ab7" }, + { "id": "91", "name": "7e0a00244e129a260c2d00efcb137ab7" }, + { "id": "92", "name": "30caac1b1c2d53830f27d4f0ea73c242" }, + { "id": "93", "name": "14511f2f5564650d129ca7cabc333278" }, + { "id": "94", "name": "8ec7ae8aa8f007f5e62751e924b07f56" }, + { "id": "95", "name": "aa78ff7a707836e35aca9cf37c400ac2" }, + { "id": "96", "name": "aa78ff7a707836e35aca9cf37c400ac2" }, + { "id": "97", "name": "e0d89d3b4f23d4f38e5f062b5a97651a" }, + { "id": "98", "name": "e0d89d3b4f23d4f38e5f062b5a97651a" }, + { "id": "99", "name": "14343966a1d7dce7526e57cf2206d19d" }, + { "id": "100", "name": "4cab53ffca49159385612f2870f0037d" }, + { "id": "101", "name": "acbde0c28966c2b4a8d77544bfea76d5" }, + { "id": "102", "name": "a8d19aa979ed9541cb199908fdd4afc0" }, + { "id": "103", "name": "593c2ce3452ed8df09e0435aefd18bd8" }, + { "id": "104", "name": "ce90135cb880ca5ef87c83a3ad4ac864" }, + { "id": "105", "name": "0f624d97c4b0ccb0ced16d55c95f40ad" }, + { "id": "106", "name": "257dd940fb92f09b8ae745ad92af84ae" }, + { "id": "107", "name": "4b3a6218bb3e3a7303e8a171a60fcf92" }, + { "id": "108", "name": "3f1090879b83df4c820e0f9ce45645de" }, + { "id": "109", "name": "e0323a9039add2978bf5b49550572c7c" }, + { "id": "110", "name": "159a360043681b5483450ff467a249c9" }, + { "id": "111", "name": "59141f4ba3d32e773065449dca08fb04" }, + { "id": "112", "name": "21b8735d8a7a218da89a7fb174c792f3" }, + { "id": "113", "name": "21b8735d8a7a218da89a7fb174c792f3" }, + { "id": "114", "name": "06e264d656e98937112856db5e7f7c3e" }, + { "id": "115", "name": "eb81adcc4edfeccb1ba0f16dfe1a737f" }, + { "id": "116", "name": "08a2d92fd3df9c4bc76df21fd53ed42e" }, + { "id": "117", "name": "fb7dba2eac65e3d65aad11cdd145aab0" }, + { "id": "118", "name": "35ea51baf1fe7f0142ad5f950855dde0" }, + { "id": "119", "name": "0a2ca52fb6c685c9c2db4fb22b012930" }, + { "id": "120", "name": "bb5b2ae1f13372e0f31c9c51c90e1537" }, + { "id": "121", "name": "f7ac7c3e53538c532d50fa9c41c59f5c" }, + { "id": "122", "name": "d649c565bb540fb2eefb6c0b539d6242" }, + { "id": "123", "name": "8bdba20fbf947deb51bb901d81013b4d" }, + { "id": "124", "name": "ce6fdef565eeecf14ab38d83643b922d" }, + { "id": "125", "name": "962a845876a1c5ae556cf3649effd23a" }, + { "id": "126", "name": "ce5606835af24a6204e9ede8aae878d3" }, + { "id": "127", "name": "c7b4fa30e4dc5d854bac9eca79e57e41" }, + { "id": "128", "name": "4d236d9a2d102c5fe6ad1c50da4bec50" }, + { "id": "129", "name": "b475bec99d5e6871eeec5f652c872e88" }, + { "id": "130", "name": "86bc8118f38fa23912328fb3bb0265fa" }, + { "id": "131", "name": "c3eef34d092ed60c3b2791814511903a" }, + { "id": "132", "name": "f4c1af088d430615af64e45e5398da90" }, + { "id": "133", "name": "59da411f99f66c223836cb98f7eba556" }, + { "id": "134", "name": "23a343167200d7d3699a974a824f8fe6" }, + { "id": "135", "name": "af6ebfc0beaf0e7988f875c7e67acd07" }, + { "id": "136", "name": "874e62633a94fd4fd401ac70b0aa20dd" }, + { "id": "137", "name": "88a889bccf8d6becb740554d8fdcb885" }, + { "id": "138", "name": "f263ce8e8a316f812e8fbb85b04162c2" }, + { "id": "139", "name": "ea3f11ede195849ca4168c815023f183" }, + { "id": "140", "name": "b62cd28a67f00cc7c6d1ac536c5416e1" }, + { "id": "141", "name": "fed7cb71238fdd8278862599f5cac297" }, + { "id": "142", "name": "02d1228ea357fa8b7e4ffbd1e23ad0f9" }, + { "id": "143", "name": "70074cb47ebd40410ea1458f81c2c0ce" }, + { "id": "144", "name": "b902eeec7fc207ee60c25e8ce968c464" }, + { "id": "145", "name": "7b240bccc0697deddc8fda79b8901039" }, + { "id": "146", "name": "95483d507cf81106d9fa2107d8358ea0" }, + { "id": "147", "name": "16c2d4b559ef09c6b0a7ee9bcd658de6" }, + { "id": "148", "name": "fac302505ffff6f9d267c3d8406baddc" }, + { "id": "149", "name": "51c3fbe0170e433dd010f9b8634f1c93" }, + { "id": "150", "name": "e41fad42ce43492fd3ec1aca019866d8" }, + { "id": "151", "name": "af15d11229bb0dee2b5d037bc92fb7ff" }, + { "id": "152", "name": "b54dbbc002e9e7cf4507b390989bfe86" }, + { "id": "153", "name": "1202259476e182258951edcbce2eaf5f" }, + { "id": "154", "name": "a0f298746c3f5760b6a2b5f128081c88" }, + { "id": "155", "name": "1dae544a125c8f47bb4cbf14447abd1f" }, + { "id": "156", "name": "5c24d388073108311911127c1109504f" }, + { "id": "157", "name": "7a311f9d6739d6d545a037372740a69e" }, + { "id": "158", "name": "f8360bc69b9fbdb5ab12a7c8b4c5065d" }, + { "id": "159", "name": "979d34e9a49eac62c0e8508d33fd715f" }, + { "id": "160", "name": "c10f77963a2b21079156a0e5c5a4bb3c" }, + { "id": "161", "name": "9dddf2a4f7d94594ec2ea98407a410e1" }, + { "id": "162", "name": "204151369b0775e8003dda9f100dccc8" }, + { "id": "163", "name": "c632fb3e90eb91a3b99db7e58c26a132" }, + { "id": "164", "name": "fe5fa5500fa143b49753d1b8085c8f88" }, + { "id": "165", "name": "4733f44d556ab0d67e7e14623d8ecf11" }, + { "id": "166", "name": "4534bbf61c6f0ce20b6aba2543a2b689" }, + { "id": "167", "name": "b4a4d45741c41ff5ba0f03738f97cb72" }, + { "id": "168", "name": "a219d952c828c6dfd3c9e7465f0d29c4" }, + { "id": "169", "name": "f5fdda08877f91406e8f144cda8337dc" }, + { "id": "170", "name": "70106d0d821513f45702b7d25664ab7c" }, + { "id": "171", "name": "07213a0161f52846ab198be103b5ab43" }, + { "id": "172", "name": "1928c4acf185a7213d452963d360cbb4" }, + { "id": "173", "name": "e673563d284ce1880ea3c79a1bf1d6e4" }, + { "id": "174", "name": "e673563d284ce1880ea3c79a1bf1d6e4" }, + { "id": "175", "name": "e673563d284ce1880ea3c79a1bf1d6e4" }, + { "id": "176", "name": "ba1c79ef089f797e5261e60712a68010" }, + { "id": "177", "name": "ba1c79ef089f797e5261e60712a68010" }, + { "id": "178", "name": "108bbd9ea6ff1df28819a51e1a1d9dd7" }, + { "id": "179", "name": "00f15f3ee321ac9bb6e87995f6661d48" }, + { "id": "180", "name": "188b02f3db7cf2cba6d4c266f6a9a9ef" }, + { "id": "181", "name": "cdf8e39ded05cc78f28c1ce7758920d8" }, + { "id": "182", "name": "3f5e26f2d3f0b8c5003610f03bc8eb5b" }, + { "id": "183", "name": "d5f51a6b3d05a2651e100f6a985ae930" }, + { "id": "184", "name": "86c5bf13ff5be3da17d5e0a2b094757b" }, + { "id": "185", "name": "86c5bf13ff5be3da17d5e0a2b094757b" }, + { "id": "186", "name": "954a1536256725886a2e665e96137788" }, + { "id": "187", "name": "35e5e04846d4be6087d27f52679f5515" }, + { "id": "188", "name": "35e5e04846d4be6087d27f52679f5515" }, + { "id": "189", "name": "be123bf97c6ee41cbab92c5c124eb17b" }, + { "id": "190", "name": "bb2c3c9445c43c117faa4c5ae67f9714" }, + { "id": "191", "name": "de3b4247b8a568ecfcd6619a568b6cea" }, + { "id": "192", "name": "d13478fdc8d0b9a9a8ca45b3d3bd4aab" }, + { "id": "193", "name": "c093d1adfc3901dc239444d45061f26a" }, + { "id": "194", "name": "82acbce6db58682ce016453c696d9636" }, + { "id": "195", "name": "c7739296d1cdb9748348bee070aa3d19" }, + { "id": "196", "name": "9a4b4a1dc92e0276d14d7dd0f145306a" }, + { "id": "197", "name": "faa17f9ec25ea6c7f6f963bd352808f5" }, + { "id": "198", "name": "1d928c319af039b8ce4303ae11e9d4d8" }, + { "id": "199", "name": "8684147451a6cc3b92142c6f4b78e61c" }, + { "id": "200", "name": "b53d991e7442c1bd1c3ab4d62f0e7519" }, + { "id": "201", "name": "889f73f4c8c315bc9d530967e82a57f4" }, + { "id": "202", "name": "85ed998c9203767af5ec409f07cdfcab" }, + { "id": "203", "name": "7494fe2c0f49924c0d543d1bb52225e2" }, + { "id": "204", "name": "8a5116ceba99299fa224c58377419a7a" }, + { "id": "205", "name": "76fddcb1a40d685e182bba8a3df83483" }, + { "id": "206", "name": "8af643b4958414c857523ab128a59034" }, + { "id": "207", "name": "7ed39e30114e9ee037784c176584456d" }, + { "id": "208", "name": "d4467da3853ebbe0254e476463e93a8f" }, + { "id": "209", "name": "f82084926fe3f17b1056520cf3144a76" }, + { "id": "210", "name": "12c44fd3a485931f4faf5ebd7e505ad3" }, + { "id": "211", "name": "0d303aafc28804ccc55f4ef8fc6ab7a4" }, + { "id": "212", "name": "b36ef85c549d172423e123f0b74adcaf" }, + { "id": "213", "name": "ff4a008470319a22d9cf3d14af485977" }, + { "id": "214", "name": "b11293f3f59eac4b1221704f203af369" }, + { "id": "215", "name": "9cc1df54052eb120644c29330aa18381" }, + { "id": "216", "name": "afc85ee276f33abe7d041853c634fc36" }, + { "id": "217", "name": "a6231c332ac8019b8246477bcccd79cc" }, + { "id": "218", "name": "985482f61241ee19a86448cc97c5f682" }, + { "id": "219", "name": "3ff47a2d7c0f78a49c8774990d82ccdd" }, + { "id": "220", "name": "3bfbba3a2055fb7e523bddaa86c910c3" }, + { "id": "221", "name": "e657fee496ec4d100164e0f4d2377d85" }, + { "id": "222", "name": "61a5a1e70d1d9ca58a9e0b3c5990f1c4" }, + { "id": "223", "name": "ec4d34fe3a6941380dc8c6949b16d42b" }, + { "id": "224", "name": "dbcc6c6cc854ec7c0a519668f1ed9841" }, + { "id": "225", "name": "e0cb68d453c7a8039a93564dc8248ea9" }, + { "id": "226", "name": "567bc1d268f135496de3d5b946b691f3" }, + { "id": "227", "name": "78805a221a988e79ef3f42d7c5bfd418" }, + { "id": "228", "name": "9cbb47c15bdee9d8f1ac2b6ffc96a39c" }, + { "id": "229", "name": "59b6d6f13869783e0734cd0bb01b5130" }, + { "id": "230", "name": "913c4cd2428ce8671839b1afb2699b25" }, + { "id": "231", "name": "d7119fcdb930b9aa3116335980570d82" }, + { "id": "232", "name": "045373230fa7d701137ce2f2bca54db8" }, + { "id": "233", "name": "c5b825e5c013d16600775fb568bd934c" }, + { "id": "234", "name": "9e50b36bb2497496c6398461a2082fcc" }, + { "id": "235", "name": "9e50b36bb2497496c6398461a2082fcc" }, + { "id": "236", "name": "9e50b36bb2497496c6398461a2082fcc" }, + { "id": "237", "name": "bd9a779d203f7c7e409f6139ac3691e4" }, + { "id": "238", "name": "013764cfe4d1f0c0bb74403295d0f208" }, + { "id": "239", "name": "e8a2f5fa37619881c42019504b770458" }, + { "id": "240", "name": "a36ba9275ce99973e406a4b30b00cf3f" }, + { "id": "241", "name": "8e43f40ef3c0cd3c0d20af30a589cf38" }, + { "id": "242", "name": "bf911b21d6cb2222f430658c4c281604" }, + { "id": "243", "name": "faaa5d5d9712d82df3d0b1f56acf1a8d" }, + { "id": "244", "name": "7014827aed98eeb8a61e4d888c75e24a" }, + { "id": "245", "name": "e5823ba08cf6f8acc6662017ec572078" }, + { "id": "246", "name": "47041eaaa4d22eb472c06d81ecdccde7" }, + { "id": "247", "name": "47041eaaa4d22eb472c06d81ecdccde7" }, + { "id": "248", "name": "47041eaaa4d22eb472c06d81ecdccde7" }, + { "id": "249", "name": "9521334fbf612112ba030c88fe882b06" }, + { "id": "250", "name": "1c452f266e90d2652da56cf257d558df" }, + { "id": "251", "name": "7877cd05a8932deaccf362f41e34be22" }, + { "id": "252", "name": "190ebe412ab179f20e7e3ee39cae82d4" }, + { "id": "253", "name": "dc1d71bbb5c4d2a5e936db79ef10c19f" }, + { "id": "254", "name": "7b571ec5a348ca760bf1ef0d9782572c" }, + { "id": "255", "name": "5272c4510cc7583284acd35c5283faaa" }, + { "id": "256", "name": "fab40977708f30364cc3963cd7ae412c" }, + { "id": "257", "name": "8034aa4e09965ae0beb0d375de3226c7" }, + { "id": "258", "name": "8861021ea041394f627e3a1b60c3e92c" }, + { "id": "259", "name": "86094b61cb9f63b77f982ceae03e95f0" }, + { "id": "260", "name": "663f9b65074738ff4adf1d288e40042e" }, + { "id": "261", "name": "def4021bc0cb91cd0bfe422d8044bc0b" }, + { "id": "262", "name": "29a4011ccb2898c8cb9e769a75a837c5" }, + { "id": "263", "name": "05edaca3adb3ec38bb87872faf340c80" }, + { "id": "264", "name": "05edaca3adb3ec38bb87872faf340c80" }, + { "id": "265", "name": "abe034562765464066b8cdf05fe90bf1" }, + { "id": "266", "name": "77f7bdcfc6e15379ae72bea0f61928be" }, + { "id": "267", "name": "77f7bdcfc6e15379ae72bea0f61928be" }, + { "id": "268", "name": "393b7e38038f12c5fb4c92e81a1b5a01" }, + { "id": "269", "name": "393b7e38038f12c5fb4c92e81a1b5a01" }, + { "id": "270", "name": "aee37c30f5d091a495526f636a3527bb" }, + { "id": "271", "name": "3ae474c6b56898d62527e923128c3e6f" }, + { "id": "272", "name": "17200a32de0894e33960d8e659aab081" }, + { "id": "273", "name": "1e89e5daef7cfc7487a9567c113f86e3" }, + { "id": "274", "name": "20b1d691b33ed6c94fbe7d629fb526e6" }, + { "id": "275", "name": "8345a34a65aa1a67f3e6f8852297c25b" }, + { "id": "276", "name": "7555e8810948d6d8d545b3aca61cf291" }, + { "id": "277", "name": "7555e8810948d6d8d545b3aca61cf291" }, + { "id": "278", "name": "559fe6fefe8ba2f96e5de683026f9adf" }, + { "id": "279", "name": "559fe6fefe8ba2f96e5de683026f9adf" }, + { "id": "280", "name": "f36d3843919d2c0a78da03aa83c23467" }, + { "id": "281", "name": "1e6cf868df5884c007e6117c00372aef" }, + { "id": "282", "name": "1e6cf868df5884c007e6117c00372aef" }, + { "id": "283", "name": "76010287fa91bee0542991280411c07b" }, + { "id": "284", "name": "76010287fa91bee0542991280411c07b" }, + { "id": "285", "name": "32348609a5980dbacdff1b41a4ccfa25" }, + { "id": "286", "name": "32348609a5980dbacdff1b41a4ccfa25" }, + { "id": "287", "name": "8d9e5d8716e6b0d97d40eae2f05d653c" }, + { "id": "288", "name": "c0de6b975080d84145a31c4430546b52" }, + { "id": "289", "name": "8754d87959e294f2f2b49721aac9d77c" }, + { "id": "290", "name": "34da450e959d17db92f6876051d0faac" }, + { "id": "291", "name": "f1ce1e003b7fcaa301e3e84a2a17caf3" }, + { "id": "292", "name": "73f0e3d3042a071a755ce04fe3b84eeb" }, + { "id": "293", "name": "1cf9f8be06cdce86bfde06213124c08b" }, + { "id": "294", "name": "559dc096a2b767ff9a5ba7a2b01dcb18" }, + { "id": "295", "name": "3ac156eead4ae6b40e9c498d532b4448" }, + { "id": "296", "name": "ee7077d4a5317d34123c82d5b49f2c6d" }, + { "id": "297", "name": "326d819779719261292c50b77e64c29b" }, + { "id": "298", "name": "3737b875474ceba31cab544b12ff662d" }, + { "id": "299", "name": "2f73afad7f2480e30b484a13d08c8c95" }, + { "id": "300", "name": "cdc3ae6882ab6133d9448100253b6da3" }, + { "id": "301", "name": "0b070ef33a2b45bda8d27d9ea0f4e4bb" }, + { "id": "302", "name": "a264d2bed092db847e7fe93f56278949" }, + { "id": "303", "name": "fc3a4fb327706ca2220500871d60b94b" }, + { "id": "304", "name": "06baef17304361bd79041c4be3a55f36" }, + { "id": "305", "name": "2d205dc0cb53af0d000627bf577a284d" }, + { "id": "306", "name": "0f755a9630404f51115799274a859e9d" }, + { "id": "307", "name": "1a04d3ce7d869169f32705efb43f2963" }, + { "id": "308", "name": "5f1f0a7ab27efe156310472f35f77650" }, + { "id": "309", "name": "2e541ebb6dcd2594b2b4a7f9e9331c84" }, + { "id": "310", "name": "80e19adebcddc28661cf6fb7e6a43707" }, + { "id": "311", "name": "eaa7963db60821bfdfcb40d425d48c2f" }, + { "id": "312", "name": "78310a5e43f5e02a3ccfb2c519ade2df" }, + { "id": "313", "name": "ca058f7ff8d77c9bfc0fc0aceb0d2d19" }, + { "id": "314", "name": "8f4e4e875f8521719dd560c40e5585d3" }, + { "id": "315", "name": "bff139fa05ac583f685a523ab3d110a0" }, + { "id": "316", "name": "f965cf52cab93e83eb6c998148cb1899" }, + { "id": "317", "name": "ae76ff49d7dc84738416af9f24790807" }, + { "id": "318", "name": "b28f7972f56245741d80ee383a2ad9b4" }, + { "id": "319", "name": "0a98ca1bc31668a67e5904c5448b0b1c" }, + { "id": "320", "name": "f4b405642b6f52ba4d7c10b4a2a7dc1b" }, + { "id": "321", "name": "35b22c9204e0f3e55bcd93371800d881" }, + { "id": "322", "name": "35b22c9204e0f3e55bcd93371800d881" }, + { "id": "323", "name": "d88b0dd70cc3da6c8f5e0e6c64aa3d2a" }, + { "id": "324", "name": "3cdda3e94e1b3dfd218a9d60b8139968" }, + { "id": "325", "name": "7a674c327bfa07f7c1204fb38ca6ef3b" }, + { "id": "326", "name": "97ee2353c626b94e407568c289df2235" }, + { "id": "327", "name": "34d1c35063280164066ecc517050da0b" }, + { "id": "328", "name": "205755123d5c692a9524a9b14622731b" }, + { "id": "329", "name": "df9a65089e5bad4f8dd5166321f6d1f3" }, + { "id": "330", "name": "39a84672bfd6b013b04afb9a62d7fd4f" }, + { "id": "331", "name": "81b1f8a72bc1d4d2076535f8fb7011f3" }, + { "id": "332", "name": "81b1f8a72bc1d4d2076535f8fb7011f3" }, + { "id": "333", "name": "e3842b8b466bc569864245c4ac47f4c7" }, + { "id": "334", "name": "cdff3889e92d00c8ee5c129be5bb9eb1" }, + { "id": "335", "name": "cdff3889e92d00c8ee5c129be5bb9eb1" }, + { "id": "336", "name": "44c5b763d21e9a3ed8cad56977bfd75c" }, + { "id": "337", "name": "4bf45f2a08cc7297bc0735294c46e455" }, + { "id": "338", "name": "4bf45f2a08cc7297bc0735294c46e455" }, + { "id": "339", "name": "9cd81e68982526e6d5f8e853d2d88149" }, + { "id": "340", "name": "9cd81e68982526e6d5f8e853d2d88149" }, + { "id": "341", "name": "09066f6946ebce2d3acdd534300250ee" }, + { "id": "342", "name": "efecdfae536bae52e683435e553ad2fc" }, + { "id": "343", "name": "d44c5e4afb0e037ebda34218d0ec906f" }, + { "id": "344", "name": "151f91e8c75b37f108388e9c48149c96" }, + { "id": "345", "name": "45798f269709550d6f6e1d2cf4b7d485" }, + { "id": "346", "name": "f5853506c90053c6b7d30f358948e8c6" }, + { "id": "347", "name": "ea07bab11665740dd69fcc1bfcb79218" }, + { "id": "348", "name": "c3cb36b5dfc26b873db8771ed1356900" }, + { "id": "349", "name": "f1ec5494313f41894c57f348578c7582" }, + { "id": "350", "name": "d4cfab1b518d245bc1fc8db52b6d8ddc" }, + { "id": "351", "name": "a1890b4c4f2b5e1944c40a9b0f84a1c9" }, + { "id": "352", "name": "61e4a0242b73a47ca5be012eec164602" }, + { "id": "353", "name": "9b4a1b957c67220d9000d92734279b4c" }, + { "id": "354", "name": "5fb4f826eb039e06dcd48602b6f47744" }, + { "id": "355", "name": "d780e58e7e113a4d9b3b8f7cb93e0d90" }, + { "id": "356", "name": "197a397c6699d48b4e3d0684e3d60409" }, + { "id": "357", "name": "a5c59a46b273ee720e88fd953668fc4c" }, + { "id": "358", "name": "0ff9653ee33be170692bf31ef4762049" }, + { "id": "359", "name": "8966f6bbb307dcc4a147c27e52f4e3c9" }, + { "id": "360", "name": "ad96132928e568d000afd7430976a47a" }, + { "id": "361", "name": "b794a3be43ae97af9272641e1439bb81" }, + { "id": "362", "name": "e469554f74eb45316bb1e888fd26d9a5" }, + { "id": "363", "name": "e52ce0141772cd5abea43f36ab85f387" }, + { "id": "364", "name": "30babd8bb8a21ab5d5f64aa26b1b146f" }, + { "id": "365", "name": "2dbcba41b9ac4c5d22886ba672463cb4" }, + { "id": "366", "name": "66fa7ed832617131ae1a7038202c8eb0" }, + { "id": "367", "name": "6937c747071d8ed25db6fd25c857c800" }, + { "id": "368", "name": "40d4a203bc881c2d59c6fa3f6ffe0848" }, + { "id": "369", "name": "281026d966626615768589fa301ae6af" }, + { "id": "370", "name": "9c5aef07f2be779a3c925b7dcbd7edc8" }, + { "id": "371", "name": "93237e284f0a749ffba472e449bfc25e" }, + { "id": "372", "name": "efdd6be310211dc9f99352a528639a69" }, + { "id": "373", "name": "437b674a7f6569110d1256eb80073f41" }, + { "id": "374", "name": "d726760b0467b77803d6d1f3585deb6e" }, + { "id": "375", "name": "d726760b0467b77803d6d1f3585deb6e" }, + { "id": "376", "name": "af6f76f73f7bbc78ac093ab17179d79c" }, + { "id": "377", "name": "6f6d894b6e7b0860a6bf5e7531362eb6" }, + { "id": "378", "name": "4536c5221a1bd765afac166e93e0178e" }, + { "id": "379", "name": "a8cbe673c91e4d81ec83c0cab9067500" }, + { "id": "380", "name": "6027bd3d50602d5c3c468f012ae9f1d8" }, + { "id": "381", "name": "3732301a0ea1396b1ba5d6fba5dfeef3" }, + { "id": "382", "name": "e32374835198c385c2d5b06104a7e392" }, + { "id": "383", "name": "519c922400f507afa4e229bd8ad70e57" }, + { "id": "384", "name": "4c740dc82c5e102c992e4e06254617f0" }, + { "id": "385", "name": "ef82bc84de1446be5cfb022f09a35779" }, + { "id": "386", "name": "ef82bc84de1446be5cfb022f09a35779" }, + { "id": "387", "name": "ef82bc84de1446be5cfb022f09a35779" }, + { "id": "388", "name": "4ab7d471b85d867f917bf1a97f4224ec" }, + { "id": "389", "name": "e6241403d71d11ca2cb2677975d92b7f" }, + { "id": "390", "name": "d027e4e8af27161ef4f0f956f9761745" }, + { "id": "391", "name": "d34ce0c192ca130e1501a539e2acc104" }, + { "id": "392", "name": "d34ce0c192ca130e1501a539e2acc104" }, + { "id": "393", "name": "e620c0045da1f9b6caf8af35e9ae2974" }, + { "id": "394", "name": "305bf877df3b92ddf55e4f2846fff2bb" }, + { "id": "395", "name": "166f8bf58312c261dbb7285929272029" }, + { "id": "396", "name": "19ade5aaa068959b5df7b61c70bbd076" }, + { "id": "397", "name": "091b300a1aeeb5d726503da4f553eda7" }, + { "id": "398", "name": "1a2fb33872ac623cd067925d158c6956" }, + { "id": "399", "name": "bb3a5ceb14b9916e7e2ed48d44c5c4b3" }, + { "id": "400", "name": "d1d88fa25cf5d33c474f514746583b8a" }, + { "id": "401", "name": "d1792b3856fcd0a9c4d37aed5060977d" }, + { "id": "402", "name": "e5df42e20907d1dd015404c25257655f" }, + { "id": "403", "name": "97c8316accbe1ad474be953f14a7e263" }, + { "id": "404", "name": "65a78966cebfa72352c2164af20adacf" }, + { "id": "405", "name": "109e84982280068d94d40ad3c8e5954a" }, + { "id": "406", "name": "fee9e500058a8269de4e0f3bedf94046" }, + { "id": "407", "name": "763122f293d1a3430b493172b1c586ab" }, + { "id": "408", "name": "8a86a2616d761cf214a9078aa386575c" }, + { "id": "409", "name": "80858b6eb2ac3ab296c316180b23487a" }, + { "id": "410", "name": "47aae6947e67687737e8c7dfadadb7ec" }, + { "id": "411", "name": "ef7c876f00f3acddd00fa671f52d0b1f" }, + { "id": "412", "name": "e666d102045d6c3dd1722cccba827925" }, + { "id": "413", "name": "04d94a9d91b116b0c7d8882d3173d31c" }, + { "id": "414", "name": "1f4eaf4419512c0e8b4c337a0f22e5dd" }, + { "id": "415", "name": "d1dbf933a5b6913a22927ac2fb763b3c" }, + { "id": "416", "name": "2165060bd8a37db2487ca466905846ce" }, + { "id": "417", "name": "c04b6fa7a56d0da7c952442232b4f0c4" }, + { "id": "418", "name": "1d6efdf2bbe004c7dc5483ad0a44ca30" }, + { "id": "419", "name": "41f88549976e3f853da38035c7aa0e9f" }, + { "id": "420", "name": "deb563564005ef6b03805fcc97a04cbe" }, + { "id": "421", "name": "558c8720b5b05214362ab84f0a215d27" }, + { "id": "422", "name": "b6acf90bdb44c2d3b804683b6525ec8d" }, + { "id": "423", "name": "d88c3e9efafa6c134c03fce74fcd6873" }, + { "id": "424", "name": "a14bdeb169af05183a60d266fe30e3d2" }, + { "id": "425", "name": "1ef05294d2c9e6c0d845a7d16dbd1cb2" }, + { "id": "426", "name": "400362c59aab7fc83e0f1c5771ab56ae" }, + { "id": "427", "name": "c68e6ab7a4d892817452d6a0f0e76ff6" }, + { "id": "428", "name": "74dd0ef2dece36cda5137fabc02677cf" }, + { "id": "429", "name": "b6c4c5c378eac3925d7f6543901f2dfe" }, + { "id": "430", "name": "866c37703f08cc4913e30314a8075467" }, + { "id": "431", "name": "2ae607ba615284096f49177a739fdf9a" }, + { "id": "432", "name": "b324540f4b8f0ba32c08d08f7d4bf4e0" }, + { "id": "433", "name": "ae70b95a170877b7638329348cc14b9a" }, + { "id": "434", "name": "0f4137ed1502b5045d6083aa258b5c42" }, + { "id": "435", "name": "0f4137ed1502b5045d6083aa258b5c42" }, + { "id": "436", "name": "0f4137ed1502b5045d6083aa258b5c42" }, + { "id": "437", "name": "187fe1f83bb6a149d28e9ac8a889e967" }, + { "id": "438", "name": "01cade94c73d9e13e79f02ccacb7c791" }, + { "id": "439", "name": "e145effa757d78568eab76356bf3b7fa" }, + { "id": "440", "name": "d855f09097164c5f3616116bf82c3584" }, + { "id": "441", "name": "d855f09097164c5f3616116bf82c3584" }, + { "id": "442", "name": "d855f09097164c5f3616116bf82c3584" }, + { "id": "443", "name": "efad9cd968c40cdbd0b7e33d69747d5d" }, + { "id": "444", "name": "efad9cd968c40cdbd0b7e33d69747d5d" }, + { "id": "445", "name": "efad9cd968c40cdbd0b7e33d69747d5d" }, + { "id": "446", "name": "6ba99e656fd870628272091e07f2a1be" }, + { "id": "447", "name": "6ba99e656fd870628272091e07f2a1be" }, + { "id": "448", "name": "6ba99e656fd870628272091e07f2a1be" }, + { "id": "449", "name": "4c6c07b6330b01004e7a3ef190465412" }, + { "id": "450", "name": "4c6c07b6330b01004e7a3ef190465412" }, + { "id": "451", "name": "4c6c07b6330b01004e7a3ef190465412" }, + { "id": "452", "name": "5e3681f555944d31edeb44e7194f6745" }, + { "id": "453", "name": "5e3681f555944d31edeb44e7194f6745" }, + { "id": "454", "name": "5e3681f555944d31edeb44e7194f6745" }, + { "id": "455", "name": "b948dcbfe194727798131ded082a6b85" }, + { "id": "456", "name": "b948dcbfe194727798131ded082a6b85" }, + { "id": "457", "name": "b948dcbfe194727798131ded082a6b85" }, + { "id": "458", "name": "958bb955638d12c73624633dc6b59471" }, + { "id": "459", "name": "958bb955638d12c73624633dc6b59471" }, + { "id": "460", "name": "958bb955638d12c73624633dc6b59471" }, + { "id": "461", "name": "82e897f1199c32f9098c861463e942c3" }, + { "id": "462", "name": "82e897f1199c32f9098c861463e942c3" }, + { "id": "463", "name": "82e897f1199c32f9098c861463e942c3" }, + { "id": "464", "name": "277604a738af4ff5dfefa5c766bd18e2" }, + { "id": "465", "name": "277604a738af4ff5dfefa5c766bd18e2" }, + { "id": "466", "name": "277604a738af4ff5dfefa5c766bd18e2" }, + { "id": "467", "name": "9e18a3311e807db18f7ec710e5e21f38" }, + { "id": "468", "name": "c7c683c01ab99e6c8d919d53167a9a76" }, + { "id": "469", "name": "c7c683c01ab99e6c8d919d53167a9a76" }, + { "id": "470", "name": "22d5a2eb8798eed3f2e3e036d05273b8" }, + { "id": "471", "name": "f43ad420f0470fdcc348bbad8cb1e5bb" }, + { "id": "472", "name": "355cc995e67e634df54cb95493e29816" }, + { "id": "473", "name": "efdce339cd6626e504236aefc611779b" }, + { "id": "474", "name": "4ea0dc2f092838cb635874fb4bc0e034" }, + { "id": "475", "name": "90705684f9e319161afda88268c99a81" }, + { "id": "476", "name": "4281f64ac0895cdef980b3b507a1a346" }, + { "id": "477", "name": "402cb3c53c75e2740892282d3f69c1a2" }, + { "id": "478", "name": "99c2cc82325cfe171cf137559e60a02b" }, + { "id": "479", "name": "e07174ed9c1f1e877dc38a0a5ec31375" }, + { "id": "480", "name": "d074c638b8aca858d5c1e4eac97e68b5" } + ], + "links": [ + { "source": "0", "target": "1" }, + { "source": "0", "target": "294" }, + { "source": "3", "target": "2" }, + { "source": "4", "target": "2" }, + { "source": "4", "target": "3" }, + { "source": "4", "target": "283" }, + { "source": "4", "target": "291" }, + { "source": "5", "target": "2" }, + { "source": "5", "target": "3" }, + { "source": "5", "target": "291" }, + { "source": "5", "target": "299" }, + { "source": "5", "target": "371" }, + { "source": "5", "target": "435" }, + { "source": "6", "target": "2" }, + { "source": "6", "target": "4" }, + { "source": "6", "target": "5" }, + { "source": "6", "target": "332" }, + { "source": "6", "target": "467" }, + { "source": "8", "target": "113" }, + { "source": "8", "target": "194" }, + { "source": "8", "target": "291" }, + { "source": "8", "target": "414" }, + { "source": "8", "target": "479" }, + { "source": "9", "target": "258" }, + { "source": "11", "target": "12" }, + { "source": "11", "target": "90" }, + { "source": "11", "target": "245" }, + { "source": "11", "target": "268" }, + { "source": "12", "target": "245" }, + { "source": "12", "target": "314" }, + { "source": "13", "target": "14" }, + { "source": "13", "target": "91" }, + { "source": "13", "target": "109" }, + { "source": "13", "target": "110" }, + { "source": "13", "target": "236" }, + { "source": "13", "target": "237" }, + { "source": "13", "target": "245" }, + { "source": "13", "target": "253" }, + { "source": "13", "target": "264" }, + { "source": "13", "target": "265" }, + { "source": "13", "target": "267" }, + { "source": "13", "target": "277" }, + { "source": "13", "target": "380" }, + { "source": "17", "target": "245" }, + { "source": "18", "target": "19" }, + { "source": "18", "target": "20" }, + { "source": "18", "target": "21" }, + { "source": "18", "target": "22" }, + { "source": "18", "target": "127" }, + { "source": "18", "target": "410" }, + { "source": "20", "target": "410" }, + { "source": "21", "target": "442" }, + { "source": "22", "target": "19" }, + { "source": "22", "target": "442" }, + { "source": "23", "target": "275" }, + { "source": "24", "target": "25" }, + { "source": "24", "target": "26" }, + { "source": "25", "target": "26" }, + { "source": "25", "target": "323" }, + { "source": "25", "target": "325" }, + { "source": "25", "target": "375" }, + { "source": "26", "target": "354" }, + { "source": "30", "target": "247" }, + { "source": "31", "target": "173" }, + { "source": "31", "target": "189" }, + { "source": "32", "target": "132" }, + { "source": "32", "target": "175" }, + { "source": "32", "target": "177" }, + { "source": "32", "target": "189" }, + { "source": "32", "target": "312" }, + { "source": "33", "target": "35" }, + { "source": "33", "target": "36" }, + { "source": "33", "target": "132" }, + { "source": "33", "target": "179" }, + { "source": "33", "target": "191" }, + { "source": "33", "target": "363" }, + { "source": "34", "target": "35" }, + { "source": "34", "target": "99" }, + { "source": "34", "target": "191" }, + { "source": "35", "target": "174" }, + { "source": "35", "target": "176" }, + { "source": "35", "target": "312" }, + { "source": "37", "target": "148" }, + { "source": "41", "target": "24" }, + { "source": "41", "target": "63" }, + { "source": "41", "target": "104" }, + { "source": "41", "target": "149" }, + { "source": "41", "target": "182" }, + { "source": "41", "target": "191" }, + { "source": "41", "target": "327" }, + { "source": "41", "target": "345" }, + { "source": "41", "target": "354" }, + { "source": "42", "target": "2" }, + { "source": "42", "target": "44" }, + { "source": "42", "target": "50" }, + { "source": "42", "target": "54" }, + { "source": "43", "target": "44" }, + { "source": "43", "target": "45" }, + { "source": "43", "target": "48" }, + { "source": "43", "target": "54" }, + { "source": "43", "target": "61" }, + { "source": "43", "target": "64" }, + { "source": "43", "target": "66" }, + { "source": "43", "target": "71" }, + { "source": "43", "target": "73" }, + { "source": "43", "target": "79" }, + { "source": "43", "target": "80" }, + { "source": "43", "target": "82" }, + { "source": "43", "target": "357" }, + { "source": "43", "target": "411" }, + { "source": "44", "target": "50" }, + { "source": "44", "target": "54" }, + { "source": "44", "target": "71" }, + { "source": "44", "target": "77" }, + { "source": "44", "target": "82" }, + { "source": "44", "target": "163" }, + { "source": "44", "target": "417" }, + { "source": "44", "target": "423" }, + { "source": "45", "target": "31" }, + { "source": "45", "target": "34" }, + { "source": "45", "target": "35" }, + { "source": "45", "target": "44" }, + { "source": "45", "target": "46" }, + { "source": "45", "target": "48" }, + { "source": "45", "target": "54" }, + { "source": "45", "target": "64" }, + { "source": "45", "target": "71" }, + { "source": "45", "target": "77" }, + { "source": "45", "target": "82" }, + { "source": "45", "target": "85" }, + { "source": "45", "target": "92" }, + { "source": "45", "target": "149" }, + { "source": "45", "target": "163" }, + { "source": "45", "target": "190" }, + { "source": "45", "target": "191" }, + { "source": "45", "target": "238" }, + { "source": "45", "target": "296" }, + { "source": "45", "target": "345" }, + { "source": "45", "target": "354" }, + { "source": "45", "target": "380" }, + { "source": "45", "target": "417" }, + { "source": "45", "target": "419" }, + { "source": "45", "target": "423" }, + { "source": "46", "target": "65" }, + { "source": "46", "target": "323" }, + { "source": "46", "target": "325" }, + { "source": "46", "target": "375" }, + { "source": "47", "target": "44" }, + { "source": "47", "target": "45" }, + { "source": "47", "target": "50" }, + { "source": "47", "target": "54" }, + { "source": "47", "target": "66" }, + { "source": "47", "target": "71" }, + { "source": "47", "target": "80" }, + { "source": "47", "target": "82" }, + { "source": "47", "target": "288" }, + { "source": "47", "target": "344" }, + { "source": "48", "target": "44" }, + { "source": "48", "target": "54" }, + { "source": "48", "target": "66" }, + { "source": "48", "target": "71" }, + { "source": "48", "target": "77" }, + { "source": "48", "target": "82" }, + { "source": "48", "target": "104" }, + { "source": "48", "target": "149" }, + { "source": "49", "target": "44" }, + { "source": "49", "target": "45" }, + { "source": "49", "target": "48" }, + { "source": "49", "target": "50" }, + { "source": "49", "target": "54" }, + { "source": "49", "target": "64" }, + { "source": "49", "target": "66" }, + { "source": "49", "target": "71" }, + { "source": "49", "target": "73" }, + { "source": "49", "target": "80" }, + { "source": "49", "target": "82" }, + { "source": "49", "target": "91" }, + { "source": "49", "target": "326" }, + { "source": "49", "target": "354" }, + { "source": "50", "target": "65" }, + { "source": "50", "target": "325" }, + { "source": "50", "target": "375" }, + { "source": "51", "target": "44" }, + { "source": "51", "target": "48" }, + { "source": "51", "target": "54" }, + { "source": "51", "target": "64" }, + { "source": "51", "target": "79" }, + { "source": "51", "target": "82" }, + { "source": "51", "target": "134" }, + { "source": "51", "target": "376" }, + { "source": "52", "target": "63" }, + { "source": "53", "target": "44" }, + { "source": "53", "target": "248" }, + { "source": "53", "target": "380" }, + { "source": "54", "target": "32" }, + { "source": "54", "target": "55" }, + { "source": "54", "target": "70" }, + { "source": "54", "target": "71" }, + { "source": "54", "target": "77" }, + { "source": "54", "target": "82" }, + { "source": "54", "target": "163" }, + { "source": "54", "target": "181" }, + { "source": "54", "target": "327" }, + { "source": "54", "target": "346" }, + { "source": "54", "target": "354" }, + { "source": "54", "target": "371" }, + { "source": "54", "target": "380" }, + { "source": "55", "target": "65" }, + { "source": "55", "target": "323" }, + { "source": "55", "target": "325" }, + { "source": "55", "target": "375" }, + { "source": "56", "target": "65" }, + { "source": "56", "target": "167" }, + { "source": "57", "target": "44" }, + { "source": "57", "target": "54" }, + { "source": "57", "target": "62" }, + { "source": "57", "target": "64" }, + { "source": "57", "target": "79" }, + { "source": "57", "target": "82" }, + { "source": "57", "target": "195" }, + { "source": "57", "target": "380" }, + { "source": "58", "target": "44" }, + { "source": "58", "target": "45" }, + { "source": "58", "target": "48" }, + { "source": "58", "target": "49" }, + { "source": "58", "target": "54" }, + { "source": "58", "target": "59" }, + { "source": "58", "target": "64" }, + { "source": "58", "target": "66" }, + { "source": "58", "target": "69" }, + { "source": "58", "target": "71" }, + { "source": "58", "target": "73" }, + { "source": "58", "target": "76" }, + { "source": "58", "target": "80" }, + { "source": "58", "target": "82" }, + { "source": "59", "target": "65" }, + { "source": "59", "target": "323" }, + { "source": "59", "target": "325" }, + { "source": "59", "target": "375" }, + { "source": "60", "target": "40" }, + { "source": "60", "target": "43" }, + { "source": "60", "target": "44" }, + { "source": "60", "target": "45" }, + { "source": "60", "target": "48" }, + { "source": "60", "target": "49" }, + { "source": "60", "target": "54" }, + { "source": "60", "target": "61" }, + { "source": "60", "target": "64" }, + { "source": "60", "target": "66" }, + { "source": "60", "target": "69" }, + { "source": "60", "target": "71" }, + { "source": "60", "target": "73" }, + { "source": "60", "target": "75" }, + { "source": "60", "target": "77" }, + { "source": "60", "target": "80" }, + { "source": "60", "target": "82" }, + { "source": "60", "target": "203" }, + { "source": "60", "target": "302" }, + { "source": "60", "target": "354" }, + { "source": "60", "target": "356" }, + { "source": "60", "target": "380" }, + { "source": "61", "target": "44" }, + { "source": "61", "target": "48" }, + { "source": "61", "target": "54" }, + { "source": "61", "target": "64" }, + { "source": "61", "target": "71" }, + { "source": "61", "target": "82" }, + { "source": "62", "target": "44" }, + { "source": "62", "target": "54" }, + { "source": "62", "target": "66" }, + { "source": "62", "target": "71" }, + { "source": "62", "target": "82" }, + { "source": "62", "target": "367" }, + { "source": "62", "target": "380" }, + { "source": "63", "target": "42" }, + { "source": "63", "target": "43" }, + { "source": "63", "target": "44" }, + { "source": "63", "target": "45" }, + { "source": "63", "target": "47" }, + { "source": "63", "target": "48" }, + { "source": "63", "target": "49" }, + { "source": "63", "target": "50" }, + { "source": "63", "target": "51" }, + { "source": "63", "target": "54" }, + { "source": "63", "target": "57" }, + { "source": "63", "target": "58" }, + { "source": "63", "target": "60" }, + { "source": "63", "target": "61" }, + { "source": "63", "target": "62" }, + { "source": "63", "target": "64" }, + { "source": "63", "target": "66" }, + { "source": "63", "target": "69" }, + { "source": "63", "target": "70" }, + { "source": "63", "target": "71" }, + { "source": "63", "target": "73" }, + { "source": "63", "target": "75" }, + { "source": "63", "target": "76" }, + { "source": "63", "target": "77" }, + { "source": "63", "target": "78" }, + { "source": "63", "target": "79" }, + { "source": "63", "target": "80" }, + { "source": "63", "target": "81" }, + { "source": "63", "target": "82" }, + { "source": "63", "target": "84" }, + { "source": "63", "target": "85" }, + { "source": "64", "target": "16" }, + { "source": "64", "target": "44" }, + { "source": "64", "target": "54" }, + { "source": "64", "target": "82" }, + { "source": "64", "target": "133" }, + { "source": "64", "target": "391" }, + { "source": "64", "target": "393" }, + { "source": "64", "target": "394" }, + { "source": "65", "target": "323" }, + { "source": "65", "target": "325" }, + { "source": "65", "target": "346" }, + { "source": "65", "target": "375" }, + { "source": "65", "target": "387" }, + { "source": "66", "target": "23" }, + { "source": "66", "target": "198" }, + { "source": "66", "target": "354" }, + { "source": "67", "target": "198" }, + { "source": "68", "target": "41" }, + { "source": "69", "target": "44" }, + { "source": "69", "target": "45" }, + { "source": "69", "target": "49" }, + { "source": "69", "target": "50" }, + { "source": "69", "target": "54" }, + { "source": "69", "target": "66" }, + { "source": "69", "target": "71" }, + { "source": "69", "target": "73" }, + { "source": "69", "target": "80" }, + { "source": "69", "target": "82" }, + { "source": "69", "target": "84" }, + { "source": "69", "target": "91" }, + { "source": "69", "target": "104" }, + { "source": "69", "target": "181" }, + { "source": "69", "target": "326" }, + { "source": "69", "target": "366" }, + { "source": "69", "target": "382" }, + { "source": "71", "target": "66" }, + { "source": "71", "target": "70" }, + { "source": "71", "target": "72" }, + { "source": "71", "target": "82" }, + { "source": "71", "target": "86" }, + { "source": "71", "target": "163" }, + { "source": "71", "target": "169" }, + { "source": "71", "target": "198" }, + { "source": "71", "target": "343" }, + { "source": "71", "target": "345" }, + { "source": "71", "target": "354" }, + { "source": "71", "target": "356" }, + { "source": "71", "target": "367" }, + { "source": "71", "target": "371" }, + { "source": "71", "target": "380" }, + { "source": "72", "target": "65" }, + { "source": "72", "target": "323" }, + { "source": "72", "target": "325" }, + { "source": "72", "target": "375" }, + { "source": "72", "target": "411" }, + { "source": "73", "target": "32" }, + { "source": "73", "target": "44" }, + { "source": "73", "target": "45" }, + { "source": "73", "target": "48" }, + { "source": "73", "target": "50" }, + { "source": "73", "target": "54" }, + { "source": "73", "target": "56" }, + { "source": "73", "target": "61" }, + { "source": "73", "target": "64" }, + { "source": "73", "target": "66" }, + { "source": "73", "target": "67" }, + { "source": "73", "target": "71" }, + { "source": "73", "target": "74" }, + { "source": "73", "target": "77" }, + { "source": "73", "target": "79" }, + { "source": "73", "target": "80" }, + { "source": "73", "target": "82" }, + { "source": "73", "target": "84" }, + { "source": "73", "target": "91" }, + { "source": "73", "target": "104" }, + { "source": "73", "target": "125" }, + { "source": "73", "target": "163" }, + { "source": "73", "target": "165" }, + { "source": "73", "target": "191" }, + { "source": "73", "target": "220" }, + { "source": "73", "target": "227" }, + { "source": "73", "target": "238" }, + { "source": "73", "target": "241" }, + { "source": "73", "target": "261" }, + { "source": "73", "target": "262" }, + { "source": "73", "target": "349" }, + { "source": "73", "target": "354" }, + { "source": "73", "target": "380" }, + { "source": "73", "target": "382" }, + { "source": "73", "target": "417" }, + { "source": "73", "target": "423" }, + { "source": "73", "target": "425" }, + { "source": "74", "target": "65" }, + { "source": "74", "target": "323" }, + { "source": "74", "target": "325" }, + { "source": "74", "target": "375" }, + { "source": "75", "target": "44" }, + { "source": "75", "target": "45" }, + { "source": "75", "target": "50" }, + { "source": "75", "target": "54" }, + { "source": "75", "target": "61" }, + { "source": "75", "target": "71" }, + { "source": "75", "target": "73" }, + { "source": "75", "target": "80" }, + { "source": "75", "target": "82" }, + { "source": "75", "target": "86" }, + { "source": "75", "target": "317" }, + { "source": "75", "target": "343" }, + { "source": "75", "target": "354" }, + { "source": "75", "target": "380" }, + { "source": "75", "target": "411" }, + { "source": "76", "target": "44" }, + { "source": "76", "target": "45" }, + { "source": "76", "target": "49" }, + { "source": "76", "target": "50" }, + { "source": "76", "target": "54" }, + { "source": "76", "target": "64" }, + { "source": "76", "target": "66" }, + { "source": "76", "target": "71" }, + { "source": "76", "target": "73" }, + { "source": "76", "target": "80" }, + { "source": "76", "target": "82" }, + { "source": "76", "target": "91" }, + { "source": "76", "target": "104" }, + { "source": "76", "target": "181" }, + { "source": "76", "target": "214" }, + { "source": "76", "target": "326" }, + { "source": "76", "target": "333" }, + { "source": "76", "target": "380" }, + { "source": "77", "target": "32" }, + { "source": "77", "target": "33" }, + { "source": "77", "target": "36" }, + { "source": "77", "target": "132" }, + { "source": "77", "target": "191" }, + { "source": "77", "target": "419" }, + { "source": "77", "target": "424" }, + { "source": "78", "target": "0" }, + { "source": "78", "target": "44" }, + { "source": "78", "target": "45" }, + { "source": "78", "target": "54" }, + { "source": "78", "target": "66" }, + { "source": "78", "target": "71" }, + { "source": "78", "target": "73" }, + { "source": "78", "target": "76" }, + { "source": "78", "target": "80" }, + { "source": "78", "target": "82" }, + { "source": "78", "target": "84" }, + { "source": "78", "target": "207" }, + { "source": "78", "target": "354" }, + { "source": "78", "target": "380" }, + { "source": "79", "target": "44" }, + { "source": "79", "target": "54" }, + { "source": "79", "target": "71" }, + { "source": "79", "target": "82" }, + { "source": "79", "target": "149" }, + { "source": "79", "target": "380" }, + { "source": "80", "target": "23" }, + { "source": "80", "target": "44" }, + { "source": "80", "target": "54" }, + { "source": "80", "target": "61" }, + { "source": "80", "target": "66" }, + { "source": "80", "target": "71" }, + { "source": "80", "target": "77" }, + { "source": "80", "target": "380" }, + { "source": "81", "target": "42" }, + { "source": "81", "target": "44" }, + { "source": "81", "target": "45" }, + { "source": "81", "target": "49" }, + { "source": "81", "target": "50" }, + { "source": "81", "target": "54" }, + { "source": "81", "target": "61" }, + { "source": "81", "target": "62" }, + { "source": "81", "target": "64" }, + { "source": "81", "target": "66" }, + { "source": "81", "target": "71" }, + { "source": "81", "target": "73" }, + { "source": "81", "target": "76" }, + { "source": "81", "target": "78" }, + { "source": "81", "target": "80" }, + { "source": "81", "target": "82" }, + { "source": "81", "target": "84" }, + { "source": "81", "target": "104" }, + { "source": "81", "target": "377" }, + { "source": "81", "target": "380" }, + { "source": "82", "target": "8" }, + { "source": "82", "target": "83" }, + { "source": "82", "target": "194" }, + { "source": "82", "target": "216" }, + { "source": "82", "target": "271" }, + { "source": "82", "target": "307" }, + { "source": "82", "target": "366" }, + { "source": "82", "target": "371" }, + { "source": "82", "target": "380" }, + { "source": "82", "target": "382" }, + { "source": "82", "target": "388" }, + { "source": "82", "target": "411" }, + { "source": "82", "target": "424" }, + { "source": "83", "target": "323" }, + { "source": "83", "target": "325" }, + { "source": "83", "target": "375" }, + { "source": "84", "target": "42" }, + { "source": "84", "target": "44" }, + { "source": "84", "target": "54" }, + { "source": "84", "target": "62" }, + { "source": "84", "target": "66" }, + { "source": "84", "target": "71" }, + { "source": "84", "target": "82" }, + { "source": "84", "target": "332" }, + { "source": "84", "target": "367" }, + { "source": "85", "target": "6" }, + { "source": "85", "target": "23" }, + { "source": "85", "target": "42" }, + { "source": "85", "target": "44" }, + { "source": "85", "target": "50" }, + { "source": "85", "target": "54" }, + { "source": "85", "target": "61" }, + { "source": "85", "target": "62" }, + { "source": "85", "target": "66" }, + { "source": "85", "target": "77" }, + { "source": "85", "target": "82" }, + { "source": "85", "target": "84" }, + { "source": "85", "target": "149" }, + { "source": "85", "target": "332" }, + { "source": "85", "target": "417" }, + { "source": "85", "target": "423" }, + { "source": "85", "target": "467" }, + { "source": "86", "target": "354" }, + { "source": "87", "target": "90" }, + { "source": "87", "target": "111" }, + { "source": "87", "target": "112" }, + { "source": "87", "target": "119" }, + { "source": "87", "target": "242" }, + { "source": "87", "target": "243" }, + { "source": "87", "target": "301" }, + { "source": "87", "target": "323" }, + { "source": "87", "target": "325" }, + { "source": "87", "target": "336" }, + { "source": "87", "target": "346" }, + { "source": "87", "target": "360" }, + { "source": "88", "target": "89" }, + { "source": "91", "target": "354" }, + { "source": "92", "target": "27" }, + { "source": "92", "target": "28" }, + { "source": "92", "target": "109" }, + { "source": "92", "target": "113" }, + { "source": "92", "target": "137" }, + { "source": "94", "target": "192" }, + { "source": "95", "target": "281" }, + { "source": "96", "target": "282" }, + { "source": "97", "target": "95" }, + { "source": "97", "target": "285" }, + { "source": "98", "target": "96" }, + { "source": "98", "target": "284" }, + { "source": "99", "target": "32" }, + { "source": "99", "target": "35" }, + { "source": "99", "target": "36" }, + { "source": "99", "target": "179" }, + { "source": "99", "target": "190" }, + { "source": "99", "target": "191" }, + { "source": "99", "target": "313" }, + { "source": "99", "target": "388" }, + { "source": "100", "target": "258" }, + { "source": "100", "target": "354" }, + { "source": "101", "target": "91" }, + { "source": "101", "target": "354" }, + { "source": "101", "target": "378" }, + { "source": "101", "target": "387" }, + { "source": "102", "target": "120" }, + { "source": "102", "target": "477" }, + { "source": "104", "target": "105" }, + { "source": "105", "target": "323" }, + { "source": "105", "target": "325" }, + { "source": "105", "target": "375" }, + { "source": "108", "target": "91" }, + { "source": "108", "target": "253" }, + { "source": "108", "target": "316" }, + { "source": "108", "target": "348" }, + { "source": "108", "target": "363" }, + { "source": "108", "target": "380" }, + { "source": "109", "target": "245" }, + { "source": "111", "target": "270" }, + { "source": "115", "target": "15" }, + { "source": "115", "target": "223" }, + { "source": "115", "target": "275" }, + { "source": "115", "target": "445" }, + { "source": "116", "target": "115" }, + { "source": "116", "target": "117" }, + { "source": "116", "target": "308" }, + { "source": "117", "target": "298" }, + { "source": "117", "target": "308" }, + { "source": "117", "target": "309" }, + { "source": "118", "target": "91" }, + { "source": "118", "target": "477" }, + { "source": "119", "target": "199" }, + { "source": "119", "target": "245" }, + { "source": "119", "target": "246" }, + { "source": "120", "target": "121" }, + { "source": "120", "target": "122" }, + { "source": "121", "target": "18" }, + { "source": "121", "target": "19" }, + { "source": "121", "target": "123" }, + { "source": "121", "target": "372" }, + { "source": "122", "target": "219" }, + { "source": "122", "target": "323" }, + { "source": "122", "target": "325" }, + { "source": "122", "target": "375" }, + { "source": "125", "target": "379" }, + { "source": "125", "target": "408" }, + { "source": "128", "target": "129" }, + { "source": "129", "target": "130" }, + { "source": "129", "target": "323" }, + { "source": "129", "target": "374" }, + { "source": "130", "target": "323" }, + { "source": "130", "target": "325" }, + { "source": "130", "target": "374" }, + { "source": "131", "target": "107" }, + { "source": "131", "target": "258" }, + { "source": "132", "target": "152" }, + { "source": "133", "target": "113" }, + { "source": "133", "target": "417" }, + { "source": "138", "target": "136" }, + { "source": "139", "target": "140" }, + { "source": "139", "target": "245" }, + { "source": "141", "target": "90" }, + { "source": "141", "target": "139" }, + { "source": "141", "target": "142" }, + { "source": "141", "target": "185" }, + { "source": "141", "target": "245" }, + { "source": "142", "target": "90" }, + { "source": "142", "target": "139" }, + { "source": "142", "target": "184" }, + { "source": "142", "target": "245" }, + { "source": "143", "target": "90" }, + { "source": "143", "target": "140" }, + { "source": "143", "target": "144" }, + { "source": "144", "target": "87" }, + { "source": "145", "target": "11" }, + { "source": "145", "target": "140" }, + { "source": "145", "target": "143" }, + { "source": "145", "target": "156" }, + { "source": "145", "target": "234" }, + { "source": "145", "target": "238" }, + { "source": "145", "target": "245" }, + { "source": "145", "target": "254" }, + { "source": "145", "target": "263" }, + { "source": "145", "target": "265" }, + { "source": "145", "target": "288" }, + { "source": "145", "target": "291" }, + { "source": "145", "target": "296" }, + { "source": "145", "target": "417" }, + { "source": "145", "target": "419" }, + { "source": "145", "target": "423" }, + { "source": "145", "target": "434" }, + { "source": "146", "target": "245" }, + { "source": "147", "target": "112" }, + { "source": "149", "target": "152" }, + { "source": "150", "target": "151" }, + { "source": "150", "target": "152" }, + { "source": "151", "target": "152" }, + { "source": "153", "target": "192" }, + { "source": "153", "target": "397" }, + { "source": "155", "target": "91" }, + { "source": "155", "target": "248" }, + { "source": "155", "target": "430" }, + { "source": "158", "target": "323" }, + { "source": "158", "target": "325" }, + { "source": "158", "target": "374" }, + { "source": "160", "target": "94" }, + { "source": "160", "target": "153" }, + { "source": "162", "target": "248" }, + { "source": "165", "target": "135" }, + { "source": "165", "target": "166" }, + { "source": "165", "target": "198" }, + { "source": "165", "target": "380" }, + { "source": "166", "target": "167" }, + { "source": "167", "target": "323" }, + { "source": "167", "target": "325" }, + { "source": "167", "target": "375" }, + { "source": "169", "target": "354" }, + { "source": "170", "target": "245" }, + { "source": "170", "target": "442" }, + { "source": "171", "target": "41" }, + { "source": "172", "target": "275" }, + { "source": "174", "target": "132" }, + { "source": "174", "target": "295" }, + { "source": "174", "target": "312" }, + { "source": "175", "target": "132" }, + { "source": "175", "target": "295" }, + { "source": "175", "target": "312" }, + { "source": "176", "target": "174" }, + { "source": "176", "target": "312" }, + { "source": "177", "target": "175" }, + { "source": "177", "target": "312" }, + { "source": "178", "target": "120" }, + { "source": "178", "target": "300" }, + { "source": "178", "target": "345" }, + { "source": "178", "target": "387" }, + { "source": "178", "target": "477" }, + { "source": "180", "target": "361" }, + { "source": "182", "target": "147" }, + { "source": "182", "target": "260" }, + { "source": "184", "target": "187" }, + { "source": "185", "target": "186" }, + { "source": "185", "target": "188" }, + { "source": "186", "target": "323" }, + { "source": "186", "target": "325" }, + { "source": "186", "target": "375" }, + { "source": "191", "target": "179" }, + { "source": "191", "target": "189" }, + { "source": "191", "target": "190" }, + { "source": "191", "target": "295" }, + { "source": "191", "target": "312" }, + { "source": "192", "target": "397" }, + { "source": "192", "target": "414" }, + { "source": "193", "target": "245" }, + { "source": "193", "target": "444" }, + { "source": "194", "target": "113" }, + { "source": "194", "target": "238" }, + { "source": "194", "target": "245" }, + { "source": "194", "target": "416" }, + { "source": "194", "target": "417" }, + { "source": "195", "target": "183" }, + { "source": "195", "target": "196" }, + { "source": "195", "target": "253" }, + { "source": "195", "target": "411" }, + { "source": "195", "target": "413" }, + { "source": "196", "target": "139" }, + { "source": "196", "target": "230" }, + { "source": "196", "target": "232" }, + { "source": "196", "target": "238" }, + { "source": "196", "target": "245" }, + { "source": "196", "target": "250" }, + { "source": "196", "target": "253" }, + { "source": "196", "target": "269" }, + { "source": "196", "target": "411" }, + { "source": "196", "target": "413" }, + { "source": "196", "target": "417" }, + { "source": "196", "target": "423" }, + { "source": "196", "target": "436" }, + { "source": "197", "target": "240" }, + { "source": "197", "target": "253" }, + { "source": "197", "target": "476" }, + { "source": "198", "target": "23" }, + { "source": "198", "target": "104" }, + { "source": "198", "target": "354" }, + { "source": "200", "target": "9" }, + { "source": "200", "target": "100" }, + { "source": "200", "target": "253" }, + { "source": "200", "target": "338" }, + { "source": "200", "target": "340" }, + { "source": "201", "target": "90" }, + { "source": "201", "target": "226" }, + { "source": "201", "target": "415" }, + { "source": "202", "target": "238" }, + { "source": "202", "target": "364" }, + { "source": "202", "target": "417" }, + { "source": "202", "target": "423" }, + { "source": "203", "target": "106" }, + { "source": "203", "target": "205" }, + { "source": "203", "target": "242" }, + { "source": "203", "target": "356" }, + { "source": "204", "target": "229" }, + { "source": "204", "target": "323" }, + { "source": "204", "target": "325" }, + { "source": "204", "target": "375" }, + { "source": "205", "target": "204" }, + { "source": "205", "target": "354" }, + { "source": "205", "target": "355" }, + { "source": "205", "target": "356" }, + { "source": "206", "target": "197" }, + { "source": "207", "target": "0" }, + { "source": "207", "target": "23" }, + { "source": "207", "target": "473" }, + { "source": "208", "target": "91" }, + { "source": "208", "target": "209" }, + { "source": "209", "target": "91" }, + { "source": "210", "target": "253" }, + { "source": "210", "target": "320" }, + { "source": "210", "target": "380" }, + { "source": "210", "target": "430" }, + { "source": "210", "target": "436" }, + { "source": "211", "target": "91" }, + { "source": "211", "target": "212" }, + { "source": "211", "target": "216" }, + { "source": "212", "target": "91" }, + { "source": "214", "target": "172" }, + { "source": "214", "target": "373" }, + { "source": "215", "target": "106" }, + { "source": "216", "target": "8" }, + { "source": "216", "target": "10" }, + { "source": "216", "target": "354" }, + { "source": "217", "target": "91" }, + { "source": "217", "target": "128" }, + { "source": "217", "target": "245" }, + { "source": "217", "target": "248" }, + { "source": "217", "target": "380" }, + { "source": "217", "target": "429" }, + { "source": "217", "target": "430" }, + { "source": "218", "target": "37" }, + { "source": "218", "target": "215" }, + { "source": "218", "target": "347" }, + { "source": "218", "target": "354" }, + { "source": "218", "target": "368" }, + { "source": "218", "target": "370" }, + { "source": "220", "target": "138" }, + { "source": "220", "target": "198" }, + { "source": "223", "target": "17" }, + { "source": "223", "target": "140" }, + { "source": "223", "target": "224" }, + { "source": "223", "target": "238" }, + { "source": "223", "target": "417" }, + { "source": "223", "target": "437" }, + { "source": "224", "target": "109" }, + { "source": "225", "target": "98" }, + { "source": "225", "target": "161" }, + { "source": "225", "target": "284" }, + { "source": "226", "target": "150" }, + { "source": "226", "target": "200" }, + { "source": "226", "target": "253" }, + { "source": "226", "target": "258" }, + { "source": "226", "target": "338" }, + { "source": "226", "target": "351" }, + { "source": "226", "target": "415" }, + { "source": "226", "target": "432" }, + { "source": "227", "target": "104" }, + { "source": "227", "target": "106" }, + { "source": "227", "target": "126" }, + { "source": "227", "target": "275" }, + { "source": "227", "target": "315" }, + { "source": "228", "target": "168" }, + { "source": "228", "target": "216" }, + { "source": "230", "target": "90" }, + { "source": "230", "target": "231" }, + { "source": "230", "target": "245" }, + { "source": "231", "target": "245" }, + { "source": "232", "target": "140" }, + { "source": "232", "target": "254" }, + { "source": "234", "target": "110" }, + { "source": "234", "target": "131" }, + { "source": "234", "target": "237" }, + { "source": "234", "target": "253" }, + { "source": "234", "target": "380" }, + { "source": "234", "target": "415" }, + { "source": "235", "target": "110" }, + { "source": "235", "target": "131" }, + { "source": "235", "target": "237" }, + { "source": "235", "target": "253" }, + { "source": "235", "target": "380" }, + { "source": "235", "target": "415" }, + { "source": "236", "target": "110" }, + { "source": "236", "target": "113" }, + { "source": "236", "target": "131" }, + { "source": "236", "target": "237" }, + { "source": "236", "target": "253" }, + { "source": "236", "target": "380" }, + { "source": "236", "target": "415" }, + { "source": "236", "target": "440" }, + { "source": "238", "target": "417" }, + { "source": "239", "target": "245" }, + { "source": "239", "target": "248" }, + { "source": "239", "target": "314" }, + { "source": "241", "target": "90" }, + { "source": "244", "target": "106" }, + { "source": "244", "target": "290" }, + { "source": "244", "target": "383" }, + { "source": "246", "target": "109" }, + { "source": "246", "target": "430" }, + { "source": "247", "target": "113" }, + { "source": "247", "target": "430" }, + { "source": "248", "target": "113" }, + { "source": "248", "target": "441" }, + { "source": "249", "target": "91" }, + { "source": "249", "target": "245" }, + { "source": "249", "target": "335" }, + { "source": "250", "target": "245" }, + { "source": "250", "target": "314" }, + { "source": "252", "target": "352" }, + { "source": "254", "target": "245" }, + { "source": "255", "target": "245" }, + { "source": "256", "target": "337" }, + { "source": "259", "target": "91" }, + { "source": "259", "target": "93" }, + { "source": "259", "target": "142" }, + { "source": "259", "target": "185" }, + { "source": "259", "target": "253" }, + { "source": "259", "target": "280" }, + { "source": "259", "target": "299" }, + { "source": "260", "target": "7" }, + { "source": "260", "target": "361" }, + { "source": "261", "target": "88" }, + { "source": "261", "target": "91" }, + { "source": "261", "target": "125" }, + { "source": "261", "target": "221" }, + { "source": "261", "target": "228" }, + { "source": "261", "target": "253" }, + { "source": "261", "target": "275" }, + { "source": "261", "target": "318" }, + { "source": "261", "target": "346" }, + { "source": "261", "target": "369" }, + { "source": "261", "target": "379" }, + { "source": "261", "target": "380" }, + { "source": "261", "target": "409" }, + { "source": "262", "target": "88" }, + { "source": "262", "target": "125" }, + { "source": "262", "target": "157" }, + { "source": "262", "target": "228" }, + { "source": "262", "target": "261" }, + { "source": "262", "target": "291" }, + { "source": "262", "target": "336" }, + { "source": "262", "target": "340" }, + { "source": "262", "target": "346" }, + { "source": "262", "target": "380" }, + { "source": "262", "target": "388" }, + { "source": "262", "target": "406" }, + { "source": "263", "target": "90" }, + { "source": "263", "target": "237" }, + { "source": "263", "target": "266" }, + { "source": "263", "target": "276" }, + { "source": "263", "target": "331" }, + { "source": "263", "target": "380" }, + { "source": "264", "target": "91" }, + { "source": "264", "target": "237" }, + { "source": "264", "target": "253" }, + { "source": "264", "target": "267" }, + { "source": "264", "target": "277" }, + { "source": "264", "target": "332" }, + { "source": "264", "target": "380" }, + { "source": "266", "target": "237" }, + { "source": "267", "target": "237" }, + { "source": "268", "target": "90" }, + { "source": "268", "target": "113" }, + { "source": "268", "target": "245" }, + { "source": "269", "target": "91" }, + { "source": "269", "target": "113" }, + { "source": "269", "target": "245" }, + { "source": "270", "target": "258" }, + { "source": "270", "target": "414" }, + { "source": "272", "target": "430" }, + { "source": "273", "target": "293" }, + { "source": "273", "target": "430" }, + { "source": "274", "target": "323" }, + { "source": "274", "target": "325" }, + { "source": "274", "target": "374" }, + { "source": "275", "target": "39" }, + { "source": "276", "target": "278" }, + { "source": "277", "target": "279" }, + { "source": "278", "target": "321" }, + { "source": "278", "target": "323" }, + { "source": "278", "target": "325" }, + { "source": "278", "target": "374" }, + { "source": "279", "target": "322" }, + { "source": "279", "target": "323" }, + { "source": "279", "target": "325" }, + { "source": "279", "target": "375" }, + { "source": "280", "target": "255" }, + { "source": "280", "target": "287" }, + { "source": "283", "target": "97" }, + { "source": "283", "target": "281" }, + { "source": "283", "target": "285" }, + { "source": "284", "target": "282" }, + { "source": "284", "target": "286" }, + { "source": "285", "target": "281" }, + { "source": "287", "target": "109" }, + { "source": "288", "target": "235" }, + { "source": "288", "target": "263" }, + { "source": "288", "target": "265" }, + { "source": "288", "target": "274" }, + { "source": "288", "target": "275" }, + { "source": "288", "target": "289" }, + { "source": "289", "target": "109" }, + { "source": "290", "target": "106" }, + { "source": "292", "target": "249" }, + { "source": "294", "target": "395" }, + { "source": "296", "target": "252" }, + { "source": "296", "target": "297" }, + { "source": "297", "target": "113" }, + { "source": "297", "target": "245" }, + { "source": "297", "target": "335" }, + { "source": "297", "target": "366" }, + { "source": "297", "target": "444" }, + { "source": "298", "target": "336" }, + { "source": "300", "target": "149" }, + { "source": "300", "target": "245" }, + { "source": "300", "target": "430" }, + { "source": "303", "target": "258" }, + { "source": "303", "target": "380" }, + { "source": "303", "target": "398" }, + { "source": "304", "target": "303" }, + { "source": "304", "target": "305" }, + { "source": "305", "target": "303" }, + { "source": "305", "target": "306" }, + { "source": "305", "target": "323" }, + { "source": "305", "target": "325" }, + { "source": "305", "target": "375" }, + { "source": "306", "target": "291" }, + { "source": "306", "target": "303" }, + { "source": "306", "target": "358" }, + { "source": "307", "target": "181" }, + { "source": "307", "target": "228" }, + { "source": "308", "target": "311" }, + { "source": "309", "target": "310" }, + { "source": "309", "target": "311" }, + { "source": "310", "target": "311" }, + { "source": "310", "target": "327" }, + { "source": "311", "target": "362" }, + { "source": "311", "target": "399" }, + { "source": "313", "target": "38" }, + { "source": "313", "target": "179" }, + { "source": "313", "target": "190" }, + { "source": "315", "target": "90" }, + { "source": "315", "target": "147" }, + { "source": "315", "target": "180" }, + { "source": "315", "target": "182" }, + { "source": "315", "target": "260" }, + { "source": "316", "target": "113" }, + { "source": "316", "target": "132" }, + { "source": "316", "target": "312" }, + { "source": "316", "target": "348" }, + { "source": "316", "target": "388" }, + { "source": "316", "target": "442" }, + { "source": "317", "target": "124" }, + { "source": "317", "target": "164" }, + { "source": "317", "target": "218" }, + { "source": "317", "target": "354" }, + { "source": "318", "target": "409" }, + { "source": "321", "target": "291" }, + { "source": "321", "target": "385" }, + { "source": "322", "target": "386" }, + { "source": "323", "target": "406" }, + { "source": "325", "target": "323" }, + { "source": "327", "target": "245" }, + { "source": "327", "target": "328" }, + { "source": "327", "target": "329" }, + { "source": "328", "target": "319" }, + { "source": "328", "target": "329" }, + { "source": "329", "target": "194" }, + { "source": "334", "target": "90" }, + { "source": "335", "target": "90" }, + { "source": "336", "target": "9" }, + { "source": "336", "target": "258" }, + { "source": "336", "target": "338" }, + { "source": "336", "target": "340" }, + { "source": "337", "target": "339" }, + { "source": "338", "target": "9" }, + { "source": "338", "target": "258" }, + { "source": "338", "target": "340" }, + { "source": "342", "target": "106" }, + { "source": "342", "target": "275" }, + { "source": "342", "target": "299" }, + { "source": "343", "target": "106" }, + { "source": "343", "target": "342" }, + { "source": "343", "target": "354" }, + { "source": "344", "target": "145" }, + { "source": "344", "target": "244" }, + { "source": "345", "target": "40" }, + { "source": "345", "target": "91" }, + { "source": "345", "target": "354" }, + { "source": "345", "target": "355" }, + { "source": "347", "target": "353" }, + { "source": "348", "target": "91" }, + { "source": "348", "target": "170" }, + { "source": "348", "target": "245" }, + { "source": "348", "target": "251" }, + { "source": "348", "target": "442" }, + { "source": "349", "target": "106" }, + { "source": "349", "target": "158" }, + { "source": "349", "target": "396" }, + { "source": "351", "target": "432" }, + { "source": "354", "target": "355" }, + { "source": "355", "target": "323" }, + { "source": "355", "target": "325" }, + { "source": "355", "target": "375" }, + { "source": "356", "target": "233" }, + { "source": "356", "target": "350" }, + { "source": "356", "target": "354" }, + { "source": "358", "target": "113" }, + { "source": "358", "target": "146" }, + { "source": "358", "target": "160" }, + { "source": "359", "target": "242" }, + { "source": "363", "target": "39" }, + { "source": "364", "target": "414" }, + { "source": "365", "target": "159" }, + { "source": "365", "target": "417" }, + { "source": "366", "target": "354" }, + { "source": "367", "target": "354" }, + { "source": "368", "target": "252" }, + { "source": "369", "target": "91" }, + { "source": "374", "target": "323" }, + { "source": "374", "target": "325" }, + { "source": "374", "target": "406" }, + { "source": "375", "target": "323" }, + { "source": "375", "target": "325" }, + { "source": "375", "target": "406" }, + { "source": "376", "target": "113" }, + { "source": "376", "target": "140" }, + { "source": "376", "target": "245" }, + { "source": "376", "target": "272" }, + { "source": "376", "target": "291" }, + { "source": "376", "target": "436" }, + { "source": "377", "target": "28" }, + { "source": "377", "target": "213" }, + { "source": "377", "target": "275" }, + { "source": "377", "target": "364" }, + { "source": "378", "target": "115" }, + { "source": "378", "target": "116" }, + { "source": "378", "target": "201" }, + { "source": "378", "target": "222" }, + { "source": "378", "target": "242" }, + { "source": "378", "target": "302" }, + { "source": "378", "target": "303" }, + { "source": "378", "target": "304" }, + { "source": "378", "target": "327" }, + { "source": "378", "target": "336" }, + { "source": "378", "target": "354" }, + { "source": "378", "target": "356" }, + { "source": "378", "target": "365" }, + { "source": "378", "target": "403" }, + { "source": "379", "target": "432" }, + { "source": "380", "target": "381" }, + { "source": "381", "target": "323" }, + { "source": "381", "target": "325" }, + { "source": "381", "target": "375" }, + { "source": "382", "target": "113" }, + { "source": "382", "target": "291" }, + { "source": "385", "target": "228" }, + { "source": "385", "target": "384" }, + { "source": "385", "target": "468" }, + { "source": "386", "target": "228" }, + { "source": "386", "target": "384" }, + { "source": "386", "target": "468" }, + { "source": "387", "target": "228" }, + { "source": "387", "target": "384" }, + { "source": "387", "target": "469" }, + { "source": "388", "target": "312" }, + { "source": "388", "target": "389" }, + { "source": "388", "target": "390" }, + { "source": "389", "target": "323" }, + { "source": "389", "target": "325" }, + { "source": "389", "target": "375" }, + { "source": "390", "target": "291" }, + { "source": "390", "target": "412" }, + { "source": "391", "target": "253" }, + { "source": "391", "target": "291" }, + { "source": "391", "target": "390" }, + { "source": "392", "target": "253" }, + { "source": "392", "target": "291" }, + { "source": "392", "target": "390" }, + { "source": "393", "target": "256" }, + { "source": "393", "target": "273" }, + { "source": "393", "target": "291" }, + { "source": "393", "target": "336" }, + { "source": "393", "target": "359" }, + { "source": "393", "target": "366" }, + { "source": "393", "target": "382" }, + { "source": "393", "target": "388" }, + { "source": "393", "target": "390" }, + { "source": "393", "target": "392" }, + { "source": "394", "target": "388" }, + { "source": "394", "target": "393" }, + { "source": "394", "target": "417" }, + { "source": "396", "target": "112" }, + { "source": "396", "target": "371" }, + { "source": "399", "target": "414" }, + { "source": "400", "target": "401" }, + { "source": "403", "target": "404" }, + { "source": "404", "target": "400" }, + { "source": "404", "target": "401" }, + { "source": "404", "target": "405" }, + { "source": "405", "target": "402" }, + { "source": "411", "target": "194" }, + { "source": "411", "target": "354" }, + { "source": "411", "target": "357" }, + { "source": "415", "target": "351" }, + { "source": "415", "target": "432" }, + { "source": "417", "target": "113" }, + { "source": "417", "target": "420" }, + { "source": "418", "target": "103" }, + { "source": "418", "target": "253" }, + { "source": "418", "target": "291" }, + { "source": "418", "target": "323" }, + { "source": "418", "target": "325" }, + { "source": "418", "target": "375" }, + { "source": "418", "target": "422" }, + { "source": "419", "target": "113" }, + { "source": "419", "target": "238" }, + { "source": "419", "target": "417" }, + { "source": "419", "target": "423" }, + { "source": "420", "target": "325" }, + { "source": "420", "target": "421" }, + { "source": "421", "target": "323" }, + { "source": "421", "target": "325" }, + { "source": "421", "target": "375" }, + { "source": "421", "target": "418" }, + { "source": "421", "target": "422" }, + { "source": "423", "target": "238" }, + { "source": "423", "target": "417" }, + { "source": "424", "target": "238" }, + { "source": "424", "target": "417" }, + { "source": "425", "target": "28" }, + { "source": "425", "target": "113" }, + { "source": "425", "target": "114" }, + { "source": "425", "target": "238" }, + { "source": "425", "target": "253" }, + { "source": "425", "target": "261" }, + { "source": "425", "target": "296" }, + { "source": "425", "target": "324" }, + { "source": "425", "target": "332" }, + { "source": "425", "target": "366" }, + { "source": "425", "target": "371" }, + { "source": "425", "target": "417" }, + { "source": "425", "target": "419" }, + { "source": "425", "target": "423" }, + { "source": "425", "target": "426" }, + { "source": "425", "target": "427" }, + { "source": "425", "target": "428" }, + { "source": "426", "target": "28" }, + { "source": "426", "target": "89" }, + { "source": "426", "target": "91" }, + { "source": "426", "target": "114" }, + { "source": "426", "target": "125" }, + { "source": "426", "target": "228" }, + { "source": "426", "target": "253" }, + { "source": "426", "target": "261" }, + { "source": "426", "target": "291" }, + { "source": "426", "target": "296" }, + { "source": "426", "target": "324" }, + { "source": "426", "target": "332" }, + { "source": "426", "target": "346" }, + { "source": "426", "target": "366" }, + { "source": "426", "target": "380" }, + { "source": "426", "target": "423" }, + { "source": "426", "target": "427" }, + { "source": "426", "target": "428" }, + { "source": "427", "target": "17" }, + { "source": "427", "target": "28" }, + { "source": "427", "target": "30" }, + { "source": "427", "target": "88" }, + { "source": "427", "target": "91" }, + { "source": "427", "target": "93" }, + { "source": "427", "target": "114" }, + { "source": "427", "target": "142" }, + { "source": "427", "target": "155" }, + { "source": "427", "target": "202" }, + { "source": "427", "target": "206" }, + { "source": "427", "target": "208" }, + { "source": "427", "target": "210" }, + { "source": "427", "target": "211" }, + { "source": "427", "target": "217" }, + { "source": "427", "target": "238" }, + { "source": "427", "target": "239" }, + { "source": "427", "target": "245" }, + { "source": "427", "target": "248" }, + { "source": "427", "target": "253" }, + { "source": "427", "target": "259" }, + { "source": "427", "target": "261" }, + { "source": "427", "target": "280" }, + { "source": "427", "target": "291" }, + { "source": "427", "target": "296" }, + { "source": "427", "target": "324" }, + { "source": "427", "target": "330" }, + { "source": "427", "target": "332" }, + { "source": "427", "target": "341" }, + { "source": "427", "target": "346" }, + { "source": "427", "target": "366" }, + { "source": "427", "target": "380" }, + { "source": "427", "target": "417" }, + { "source": "427", "target": "423" }, + { "source": "427", "target": "428" }, + { "source": "427", "target": "430" }, + { "source": "428", "target": "91" }, + { "source": "428", "target": "238" }, + { "source": "428", "target": "423" }, + { "source": "430", "target": "431" }, + { "source": "430", "target": "433" }, + { "source": "432", "target": "430" }, + { "source": "434", "target": "443" }, + { "source": "435", "target": "438" }, + { "source": "435", "target": "439" }, + { "source": "435", "target": "444" }, + { "source": "436", "target": "437" }, + { "source": "436", "target": "445" }, + { "source": "437", "target": "445" }, + { "source": "438", "target": "323" }, + { "source": "438", "target": "325" }, + { "source": "438", "target": "374" }, + { "source": "439", "target": "323" }, + { "source": "439", "target": "325" }, + { "source": "439", "target": "374" }, + { "source": "440", "target": "443" }, + { "source": "441", "target": "444" }, + { "source": "442", "target": "445" }, + { "source": "443", "target": "446" }, + { "source": "443", "target": "449" }, + { "source": "443", "target": "452" }, + { "source": "443", "target": "455" }, + { "source": "443", "target": "458" }, + { "source": "443", "target": "461" }, + { "source": "443", "target": "464" }, + { "source": "444", "target": "447" }, + { "source": "444", "target": "450" }, + { "source": "444", "target": "453" }, + { "source": "444", "target": "456" }, + { "source": "444", "target": "459" }, + { "source": "444", "target": "462" }, + { "source": "444", "target": "465" }, + { "source": "445", "target": "448" }, + { "source": "445", "target": "451" }, + { "source": "445", "target": "454" }, + { "source": "445", "target": "457" }, + { "source": "445", "target": "460" }, + { "source": "445", "target": "463" }, + { "source": "445", "target": "466" }, + { "source": "467", "target": "13" }, + { "source": "467", "target": "38" }, + { "source": "467", "target": "91" }, + { "source": "467", "target": "104" }, + { "source": "467", "target": "108" }, + { "source": "467", "target": "114" }, + { "source": "467", "target": "139" }, + { "source": "467", "target": "141" }, + { "source": "467", "target": "154" }, + { "source": "467", "target": "225" }, + { "source": "467", "target": "238" }, + { "source": "467", "target": "245" }, + { "source": "467", "target": "253" }, + { "source": "467", "target": "264" }, + { "source": "467", "target": "267" }, + { "source": "467", "target": "284" }, + { "source": "467", "target": "291" }, + { "source": "467", "target": "292" }, + { "source": "467", "target": "302" }, + { "source": "467", "target": "332" }, + { "source": "467", "target": "334" }, + { "source": "467", "target": "348" }, + { "source": "467", "target": "367" }, + { "source": "467", "target": "407" }, + { "source": "467", "target": "417" }, + { "source": "467", "target": "419" }, + { "source": "467", "target": "423" }, + { "source": "467", "target": "424" }, + { "source": "467", "target": "441" }, + { "source": "467", "target": "470" }, + { "source": "467", "target": "471" }, + { "source": "467", "target": "474" }, + { "source": "468", "target": "258" }, + { "source": "469", "target": "258" }, + { "source": "470", "target": "242" }, + { "source": "470", "target": "245" }, + { "source": "470", "target": "257" }, + { "source": "470", "target": "314" }, + { "source": "471", "target": "29" }, + { "source": "471", "target": "193" }, + { "source": "471", "target": "245" }, + { "source": "471", "target": "248" }, + { "source": "471", "target": "291" }, + { "source": "471", "target": "348" }, + { "source": "471", "target": "472" }, + { "source": "474", "target": "91" }, + { "source": "474", "target": "162" }, + { "source": "474", "target": "253" }, + { "source": "474", "target": "291" }, + { "source": "474", "target": "475" }, + { "source": "477", "target": "478" }, + { "source": "479", "target": "480" }, + { "source": "480", "target": "323" }, + { "source": "480", "target": "325" }, + { "source": "480", "target": "375" } + ] +} diff --git a/packages/layerchart/static/data/examples/graph/dag-medium.json b/packages/layerchart/static/data/examples/graph/dag-medium.json new file mode 100644 index 000000000..544d9bc2e --- /dev/null +++ b/packages/layerchart/static/data/examples/graph/dag-medium.json @@ -0,0 +1,311 @@ +{ + "nodes": [ + { "id": "0", "name": "112ef21b3cba85614a3ca14ec3ffed8a" }, + { "id": "1", "name": "183453b020e941b9478ccf4c18af2b27" }, + { "id": "2", "name": "dc51a7d438ed5e023a4aa7347e6de8dc" }, + { "id": "3", "name": "7e0a00244e129a260c2d00efcb137ab7" }, + { "id": "4", "name": "593c2ce3452ed8df09e0435aefd18bd8" }, + { "id": "5", "name": "4b3a6218bb3e3a7303e8a171a60fcf92" }, + { "id": "6", "name": "54c280558263a67e0a84ba34f625c464" }, + { "id": "7", "name": "21b8735d8a7a218da89a7fb174c792f3" }, + { "id": "8", "name": "0d9e2b2753f492ab4307253ef862c37a" }, + { "id": "9", "name": "dbad862e2720f8a2b3a51efb1ebe3fc1" }, + { "id": "10", "name": "edac976a125467998ee6eccd35ba94f6" }, + { "id": "11", "name": "bb5b2ae1f13372e0f31c9c51c90e1537" }, + { "id": "12", "name": "bb5b2ae1f13372e0f31c9c51c90e1537" }, + { "id": "13", "name": "b400c8f718345d43f396fe655509445f" }, + { "id": "14", "name": "9a59bf06c28bfdd2004fd9ca4f416381" }, + { "id": "15", "name": "39adfacef8f9f6766dbcbf4d77a5e01e" }, + { "id": "16", "name": "d649c565bb540fb2eefb6c0b539d6242" }, + { "id": "17", "name": "8bdba20fbf947deb51bb901d81013b4d" }, + { "id": "18", "name": "8bdba20fbf947deb51bb901d81013b4d" }, + { "id": "19", "name": "ff79dadf97072cc43968b8fc493d918c" }, + { "id": "20", "name": "c3eef34d092ed60c3b2791814511903a" }, + { "id": "21", "name": "c14031940383c0c73116d659fc7fea2e" }, + { "id": "22", "name": "44a3cdb869ff629fe47411912927e71e" }, + { "id": "23", "name": "4d4b370ab9b3dbca1ccdb1a5cca6a728" }, + { "id": "24", "name": "f1b980d0edb32ee093ce6d5f03829765" }, + { "id": "25", "name": "51c3fbe0170e433dd010f9b8634f1c93" }, + { "id": "26", "name": "e41fad42ce43492fd3ec1aca019866d8" }, + { "id": "27", "name": "af15d11229bb0dee2b5d037bc92fb7ff" }, + { "id": "28", "name": "b54dbbc002e9e7cf4507b390989bfe86" }, + { "id": "29", "name": "1852fbae944d82f4da0c9410f0763ca8" }, + { "id": "30", "name": "7f5c935094204f88cbaaad83db991b17" }, + { "id": "31", "name": "8684147451a6cc3b92142c6f4b78e61c" }, + { "id": "32", "name": "7afe399f1415b137d0962f82662fa9d4" }, + { "id": "33", "name": "afc85ee276f33abe7d041853c634fc36" }, + { "id": "34", "name": "3ff47a2d7c0f78a49c8774990d82ccdd" }, + { "id": "35", "name": "4e4eaf9e2289f546ab4e89a58cb3a866" }, + { "id": "36", "name": "d0923e2dcda86958c930938c946649fb" }, + { "id": "37", "name": "c87ba77ad88418483bc707b655300574" }, + { "id": "38", "name": "9cbb47c15bdee9d8f1ac2b6ffc96a39c" }, + { "id": "39", "name": "73015feba463836004e192dd64b4c85e" }, + { "id": "40", "name": "c5b825e5c013d16600775fb568bd934c" }, + { "id": "41", "name": "013764cfe4d1f0c0bb74403295d0f208" }, + { "id": "42", "name": "bf911b21d6cb2222f430658c4c281604" }, + { "id": "43", "name": "e5823ba08cf6f8acc6662017ec572078" }, + { "id": "44", "name": "dc1d71bbb5c4d2a5e936db79ef10c19f" }, + { "id": "45", "name": "8861021ea041394f627e3a1b60c3e92c" }, + { "id": "46", "name": "a3b623e7b25c44ed41eb6b8314a10f41" }, + { "id": "47", "name": "e376836d2234522833fa3c07d077f560" }, + { "id": "48", "name": "8345a34a65aa1a67f3e6f8852297c25b" }, + { "id": "49", "name": "8248c04590fc509824b9b5f7c606a590" }, + { "id": "50", "name": "f1ce1e003b7fcaa301e3e84a2a17caf3" }, + { "id": "51", "name": "d07ee43840f516baf4e9fc94ba41bd77" }, + { "id": "52", "name": "7711be245e38138607b03d2eafb32740" }, + { "id": "53", "name": "e44d5b0493cfce7c63a46b8114098e56" }, + { "id": "54", "name": "ae1eed9aa160f0eb2db25ce57c2388d5" }, + { "id": "55", "name": "ac0d1ac1f21abd32b30bf4e44990b94a" }, + { "id": "56", "name": "4627023a7757fbfdc063f16e22dad049" }, + { "id": "57", "name": "b7529e2456536d65b72ff4eafbe8d6a6" }, + { "id": "58", "name": "72990d5b72e9f7d712372696ea7b0d36" }, + { "id": "59", "name": "d88b0dd70cc3da6c8f5e0e6c64aa3d2a" }, + { "id": "60", "name": "7a674c327bfa07f7c1204fb38ca6ef3b" }, + { "id": "61", "name": "c8bd1df85941b8f0fa7b9ff5d42b5319" }, + { "id": "62", "name": "df0cc91e0f37d78d6137617cb7377ee3" }, + { "id": "63", "name": "44c5b763d21e9a3ed8cad56977bfd75c" }, + { "id": "64", "name": "9cd81e68982526e6d5f8e853d2d88149" }, + { "id": "65", "name": "223beda8a3f91ec1c7fb94f17bd1a918" }, + { "id": "66", "name": "1078def2526ca3ac25242174cb5df6c9" }, + { "id": "67", "name": "d4cfab1b518d245bc1fc8db52b6d8ddc" }, + { "id": "68", "name": "a1890b4c4f2b5e1944c40a9b0f84a1c9" }, + { "id": "69", "name": "61e4a0242b73a47ca5be012eec164602" }, + { "id": "70", "name": "5fb4f826eb039e06dcd48602b6f47744" }, + { "id": "71", "name": "d780e58e7e113a4d9b3b8f7cb93e0d90" }, + { "id": "72", "name": "197a397c6699d48b4e3d0684e3d60409" }, + { "id": "73", "name": "ad96132928e568d000afd7430976a47a" }, + { "id": "74", "name": "10faae554c642e7607b1dd0cc8607703" }, + { "id": "75", "name": "68b958c892719d213e8d9118f14430ac" }, + { "id": "76", "name": "dc0d4d2d9881175e8caf18416000e2ab" }, + { "id": "77", "name": "93237e284f0a749ffba472e449bfc25e" }, + { "id": "78", "name": "efdd6be310211dc9f99352a528639a69" }, + { "id": "79", "name": "d726760b0467b77803d6d1f3585deb6e" }, + { "id": "80", "name": "a8cbe673c91e4d81ec83c0cab9067500" }, + { "id": "81", "name": "a8f29833a3d589de6093d0e72f7718d6" }, + { "id": "82", "name": "945715dcef391d4a708567515456476b" }, + { "id": "83", "name": "ec18ad9a83c312380533fa93ac6fc61c" }, + { "id": "84", "name": "ef82bc84de1446be5cfb022f09a35779" }, + { "id": "85", "name": "11233c483a51e4e0a14c9e7f13c591eb" }, + { "id": "86", "name": "8b9c754a47f15ad23b43d47052a0a530" }, + { "id": "87", "name": "d1d88fa25cf5d33c474f514746583b8a" }, + { "id": "88", "name": "d1792b3856fcd0a9c4d37aed5060977d" }, + { "id": "89", "name": "e5df42e20907d1dd015404c25257655f" }, + { "id": "90", "name": "a4c973de7cd1cad6a7fd96309f7251f8" }, + { "id": "91", "name": "109e84982280068d94d40ad3c8e5954a" }, + { "id": "92", "name": "fee9e500058a8269de4e0f3bedf94046" }, + { "id": "93", "name": "1f4eaf4419512c0e8b4c337a0f22e5dd" }, + { "id": "94", "name": "9cc91d204f5795048050d39859a7cab6" }, + { "id": "95", "name": "d1dbf933a5b6913a22927ac2fb763b3c" }, + { "id": "96", "name": "c04b6fa7a56d0da7c952442232b4f0c4" }, + { "id": "97", "name": "1d6efdf2bbe004c7dc5483ad0a44ca30" }, + { "id": "98", "name": "deb563564005ef6b03805fcc97a04cbe" }, + { "id": "99", "name": "558c8720b5b05214362ab84f0a215d27" }, + { "id": "100", "name": "b6acf90bdb44c2d3b804683b6525ec8d" }, + { "id": "101", "name": "d88c3e9efafa6c134c03fce74fcd6873" }, + { "id": "102", "name": "866c37703f08cc4913e30314a8075467" }, + { "id": "103", "name": "2ae607ba615284096f49177a739fdf9a" }, + { "id": "104", "name": "b324540f4b8f0ba32c08d08f7d4bf4e0" }, + { "id": "105", "name": "ae70b95a170877b7638329348cc14b9a" }, + { "id": "106", "name": "c05d2d71da2e1af6820a8ff040cb5719" } + ], + "links": [ + { "source": "1", "target": "35" }, + { "source": "1", "target": "43" }, + { "source": "1", "target": "102" }, + { "source": "8", "target": "9" }, + { "source": "8", "target": "10" }, + { "source": "8", "target": "70" }, + { "source": "10", "target": "9" }, + { "source": "10", "target": "32" }, + { "source": "11", "target": "3" }, + { "source": "11", "target": "17" }, + { "source": "11", "target": "38" }, + { "source": "11", "target": "81" }, + { "source": "12", "target": "1" }, + { "source": "12", "target": "3" }, + { "source": "12", "target": "16" }, + { "source": "12", "target": "18" }, + { "source": "12", "target": "36" }, + { "source": "12", "target": "50" }, + { "source": "12", "target": "66" }, + { "source": "12", "target": "73" }, + { "source": "12", "target": "75" }, + { "source": "12", "target": "77" }, + { "source": "12", "target": "78" }, + { "source": "12", "target": "80" }, + { "source": "12", "target": "85" }, + { "source": "12", "target": "86" }, + { "source": "12", "target": "90" }, + { "source": "13", "target": "12" }, + { "source": "13", "target": "23" }, + { "source": "13", "target": "42" }, + { "source": "14", "target": "12" }, + { "source": "14", "target": "75" }, + { "source": "14", "target": "86" }, + { "source": "15", "target": "12" }, + { "source": "15", "target": "14" }, + { "source": "15", "target": "75" }, + { "source": "16", "target": "34" }, + { "source": "16", "target": "57" }, + { "source": "16", "target": "59" }, + { "source": "16", "target": "60" }, + { "source": "16", "target": "79" }, + { "source": "17", "target": "53" }, + { "source": "18", "target": "53" }, + { "source": "19", "target": "12" }, + { "source": "19", "target": "65" }, + { "source": "19", "target": "75" }, + { "source": "20", "target": "5" }, + { "source": "20", "target": "45" }, + { "source": "21", "target": "1" }, + { "source": "21", "target": "3" }, + { "source": "21", "target": "22" }, + { "source": "23", "target": "0" }, + { "source": "23", "target": "1" }, + { "source": "23", "target": "6" }, + { "source": "23", "target": "8" }, + { "source": "23", "target": "11" }, + { "source": "23", "target": "24" }, + { "source": "23", "target": "39" }, + { "source": "23", "target": "42" }, + { "source": "23", "target": "48" }, + { "source": "23", "target": "51" }, + { "source": "23", "target": "54" }, + { "source": "23", "target": "61" }, + { "source": "23", "target": "63" }, + { "source": "23", "target": "70" }, + { "source": "23", "target": "71" }, + { "source": "23", "target": "72" }, + { "source": "23", "target": "82" }, + { "source": "23", "target": "95" }, + { "source": "24", "target": "6" }, + { "source": "24", "target": "39" }, + { "source": "25", "target": "7" }, + { "source": "25", "target": "28" }, + { "source": "26", "target": "7" }, + { "source": "26", "target": "27" }, + { "source": "26", "target": "28" }, + { "source": "27", "target": "2" }, + { "source": "27", "target": "7" }, + { "source": "27", "target": "28" }, + { "source": "27", "target": "46" }, + { "source": "27", "target": "50" }, + { "source": "27", "target": "69" }, + { "source": "28", "target": "7" }, + { "source": "30", "target": "44" }, + { "source": "30", "target": "50" }, + { "source": "30", "target": "70" }, + { "source": "30", "target": "72" }, + { "source": "35", "target": "43" }, + { "source": "37", "target": "36" }, + { "source": "37", "target": "70" }, + { "source": "38", "target": "2" }, + { "source": "38", "target": "33" }, + { "source": "39", "target": "29" }, + { "source": "41", "target": "96" }, + { "source": "44", "target": "7" }, + { "source": "46", "target": "2" }, + { "source": "48", "target": "2" }, + { "source": "49", "target": "35" }, + { "source": "49", "target": "43" }, + { "source": "52", "target": "43" }, + { "source": "52", "target": "102" }, + { "source": "54", "target": "48" }, + { "source": "54", "target": "55" }, + { "source": "54", "target": "56" }, + { "source": "54", "target": "96" }, + { "source": "54", "target": "101" }, + { "source": "56", "target": "55" }, + { "source": "57", "target": "58" }, + { "source": "57", "target": "59" }, + { "source": "57", "target": "60" }, + { "source": "57", "target": "79" }, + { "source": "57", "target": "93" }, + { "source": "58", "target": "59" }, + { "source": "58", "target": "60" }, + { "source": "58", "target": "93" }, + { "source": "59", "target": "92" }, + { "source": "60", "target": "59" }, + { "source": "61", "target": "2" }, + { "source": "61", "target": "26" }, + { "source": "61", "target": "29" }, + { "source": "61", "target": "62" }, + { "source": "62", "target": "25" }, + { "source": "62", "target": "26" }, + { "source": "62", "target": "28" }, + { "source": "62", "target": "49" }, + { "source": "63", "target": "64" }, + { "source": "68", "target": "104" }, + { "source": "70", "target": "71" }, + { "source": "71", "target": "59" }, + { "source": "71", "target": "60" }, + { "source": "71", "target": "79" }, + { "source": "72", "target": "40" }, + { "source": "72", "target": "67" }, + { "source": "72", "target": "70" }, + { "source": "75", "target": "21" }, + { "source": "75", "target": "47" }, + { "source": "75", "target": "52" }, + { "source": "75", "target": "74" }, + { "source": "75", "target": "76" }, + { "source": "75", "target": "94" }, + { "source": "75", "target": "106" }, + { "source": "79", "target": "59" }, + { "source": "79", "target": "60" }, + { "source": "79", "target": "92" }, + { "source": "80", "target": "104" }, + { "source": "82", "target": "70" }, + { "source": "82", "target": "72" }, + { "source": "83", "target": "70" }, + { "source": "84", "target": "20" }, + { "source": "84", "target": "38" }, + { "source": "84", "target": "39" }, + { "source": "84", "target": "70" }, + { "source": "85", "target": "31" }, + { "source": "85", "target": "50" }, + { "source": "85", "target": "70" }, + { "source": "85", "target": "71" }, + { "source": "85", "target": "72" }, + { "source": "85", "target": "80" }, + { "source": "85", "target": "83" }, + { "source": "86", "target": "30" }, + { "source": "86", "target": "31" }, + { "source": "86", "target": "36" }, + { "source": "86", "target": "37" }, + { "source": "86", "target": "61" }, + { "source": "86", "target": "70" }, + { "source": "86", "target": "73" }, + { "source": "86", "target": "75" }, + { "source": "86", "target": "84" }, + { "source": "87", "target": "88" }, + { "source": "90", "target": "87" }, + { "source": "90", "target": "88" }, + { "source": "90", "target": "91" }, + { "source": "91", "target": "89" }, + { "source": "94", "target": "43" }, + { "source": "95", "target": "68" }, + { "source": "95", "target": "102" }, + { "source": "95", "target": "104" }, + { "source": "96", "target": "7" }, + { "source": "96", "target": "98" }, + { "source": "97", "target": "4" }, + { "source": "97", "target": "44" }, + { "source": "97", "target": "50" }, + { "source": "97", "target": "59" }, + { "source": "97", "target": "60" }, + { "source": "97", "target": "79" }, + { "source": "97", "target": "100" }, + { "source": "98", "target": "60" }, + { "source": "98", "target": "99" }, + { "source": "99", "target": "59" }, + { "source": "99", "target": "60" }, + { "source": "99", "target": "79" }, + { "source": "99", "target": "97" }, + { "source": "99", "target": "100" }, + { "source": "101", "target": "41" }, + { "source": "101", "target": "96" }, + { "source": "102", "target": "103" }, + { "source": "102", "target": "105" }, + { "source": "104", "target": "102" } + ] +} diff --git a/packages/layerchart/static/data/examples/graph/tcp-state.json b/packages/layerchart/static/data/examples/graph/tcp-state.json new file mode 100644 index 000000000..ae5d3f2f5 --- /dev/null +++ b/packages/layerchart/static/data/examples/graph/tcp-state.json @@ -0,0 +1,35 @@ +{ + "nodes": [ + { "id": "CLOSED" }, + { "id": "LISTEN" }, + { "id": "SYN RCVD" }, + { "id": "SYN SENT" }, + { "id": "ESTAB" }, + { "id": "FINWAIT-1" }, + { "id": "CLOSE WAIT" }, + { "id": "FINWAIT-2" }, + { "id": "CLOSING" }, + { "id": "LAST-ACK" }, + { "id": "TIME WAIT" } + ], + "links": [ + { "source": "CLOSED", "target": "LISTEN", "label": "open" }, + { "source": "LISTEN", "target": "SYN RCVD", "label": "rcv SYN" }, + { "source": "LISTEN", "target": "SYN SENT", "label": "send" }, + { "source": "LISTEN", "target": "CLOSED", "label": "close" }, + { "source": "SYN RCVD", "target": "FINWAIT-1", "label": "close" }, + { "source": "SYN RCVD", "target": "ESTAB", "label": "rcv ACK of SYN" }, + { "source": "SYN SENT", "target": "SYN RCVD", "label": "rcv SYN" }, + { "source": "SYN SENT", "target": "ESTAB", "label": "rcv SYN, ACK" }, + { "source": "SYN SENT", "target": "CLOSED", "label": "close" }, + { "source": "ESTAB", "target": "FINWAIT-1", "label": "close" }, + { "source": "ESTAB", "target": "CLOSE WAIT", "label": "rcv FIN" }, + { "source": "FINWAIT-1", "target": "FINWAIT-2", "label": "rcv ACK of FIN" }, + { "source": "FINWAIT-1", "target": "CLOSING", "label": "rcv FIN" }, + { "source": "CLOSE WAIT", "target": "LAST-ACK", "label": "close" }, + { "source": "FINWAIT-2", "target": "TIME WAIT", "label": "rcv FIN" }, + { "source": "CLOSING", "target": "TIME WAIT", "label": "rcv ACK of FIN" }, + { "source": "LAST-ACK", "target": "CLOSED", "label": "rcv ACK of FIN" }, + { "source": "TIME WAIT", "target": "CLOSED", "label": "timeout=2MSL" } + ] +} diff --git a/packages/layerchart/tailwind.config.cjs b/packages/layerchart/tailwind.config.cjs index 513003c32..e2d1c2ff0 100644 --- a/packages/layerchart/tailwind.config.cjs +++ b/packages/layerchart/tailwind.config.cjs @@ -43,5 +43,25 @@ module.exports = { }), }, }, - plugins: [require('@tailwindcss/typography'), svelteUx], + plugins: [ + require('@tailwindcss/typography'), + svelteUx, + plugin(function ({ addComponents }) { + // Consider moving to tailwind plugin + addComponents({ + '.grid-cols-xs': { + '@apply grid-cols-[repeat(auto-fill,minmax(200px,1fr))]': {}, + }, + '.grid-cols-sm': { + '@apply grid-cols-1 sm:grid-cols-[repeat(auto-fill,minmax(300px,1fr))]': {}, + }, + '.grid-cols-md': { + '@apply grid-cols-1 sm:grid-cols-[repeat(auto-fill,minmax(400px,1fr))]': {}, + }, + '.grid-cols-lg': { + '@apply grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(600px,1fr))]': {}, + }, + }); + }), + ], }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7fa7e07a..9c96edeaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: packages/layerchart: dependencies: + '@dagrejs/dagre': + specifier: ^1.1.4 + version: 1.1.4 '@layerstack/svelte-actions': specifier: ^0.0.9 version: 0.0.9 @@ -394,6 +397,13 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@dagrejs/dagre@1.1.4': + resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==} + + '@dagrejs/graphlib@2.2.4': + resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} + engines: {node: '>17.0.0'} + '@esbuild-plugins/node-globals-polyfill@0.2.3': resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} peerDependencies: @@ -2822,6 +2832,12 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@dagrejs/dagre@1.1.4': + dependencies: + '@dagrejs/graphlib': 2.2.4 + + '@dagrejs/graphlib@2.2.4': {} + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': dependencies: esbuild: 0.17.19