packages feed

ghc-vis 0.5 → 0.6

raw patch · 11 files changed

+2541/−26 lines, 11 filesdep +SDLdep +svgcairodep ~cairosetup-changed

Dependencies added: SDL, svgcairo

Dependency ranges changed: cairo

Files

Setup.hs view
@@ -3,11 +3,14 @@ import Distribution.Simple import Distribution.Simple.Setup import Distribution.Simple.LocalBuildInfo+import Distribution.PackageDescription (PackageDescription)  import System.FilePath -main = defaultMainWithHooks $-       simpleUserHooks { postInst = postInstHook (postInst simpleUserHooks) }+main = defaultMainWithHooks $ simpleUserHooks+  { postInst = postInstHook (postInst simpleUserHooks)+  , postConf = postConfHook (postConf simpleUserHooks)+  }  postInstHook oldHook args iflags pDesc lbi = do   let instDataDir = datadir $ absoluteInstallDirs pDesc lbi (fromFlag $ copyDest defaultCopyFlags)@@ -15,3 +18,8 @@   putStrLn $ "echo \":script " ++ (instDataDir </> "ghci") ++ "\" >> ~/.ghci"    oldHook args iflags pDesc lbi++postConfHook oldHook args flags descr buildInfo = case profFlag of+  Flag True -> error "This library cannot be built using profiling. Try invoking cabal with the --disable-library-profiling flag."+  _ -> oldHook args flags descr buildInfo+  where profFlag = configProfLib $ configFlags buildInfo
+ data/legend_graph.svg view
@@ -0,0 +1,177 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="683.32867"+   height="198.40143"+   id="svg3254"+   version="1.1"+   inkscape:version="0.48.3.1 r9886"+   sodipodi:docname="legend_graph.svg">+  <defs+     id="defs3256" />+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="0.98994949"+     inkscape:cx="271.34121"+     inkscape:cy="-73.141686"+     inkscape:document-units="px"+     inkscape:current-layer="g3407"+     showgrid="false"+     inkscape:window-width="638"+     inkscape:window-height="503"+     inkscape:window-x="640"+     inkscape:window-y="519"+     inkscape:window-maximized="0"+     fit-margin-top="30"+     fit-margin-left="30"+     fit-margin-right="30"+     fit-margin-bottom="30" />+  <metadata+     id="metadata3259">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1"+     transform="translate(-106.4685,-260.81906)">+    <g+       id="g3419">+      <text+         sodipodi:linespacing="125%"+         id="text3379"+         y="308.88992"+         x="143.44167"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="308.88992"+           x="143.44167"+           id="tspan3381"+           sodipodi:role="line">S# 1</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3383"+         y="338.35858"+         x="136.52739"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="338.35858"+           x="136.52739"+           id="tspan3385"+           sodipodi:role="line">Thunk</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3387"+         y="396.6333"+         x="149.4481"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="396.6333"+           x="149.4481"+           id="tspan3389"+           sodipodi:role="line">Fun</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3391"+         y="367.48367"+         x="154.90495"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="367.48367"+           x="154.90495"+           id="tspan3393"+           sodipodi:role="line">AP</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3399"+         y="426.0676"+         x="148.57463"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="426.0676"+           x="148.57463"+           id="tspan3401"+           sodipodi:role="line">PAP</tspan></text>+    </g>+    <g+       id="g3407"+       transform="translate(0,-3.0483551)">+      <text+         xml:space="preserve"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         x="229.28676"+         y="309.1387"+         id="text3198"+         sodipodi:linespacing="125%"><tspan+           sodipodi:role="line"+           id="tspan3200"+           x="229.28676"+           y="309.1387">Data Constructor S# with argument 1</tspan></text>+      <text+         xml:space="preserve"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         x="229.5125"+         y="338.87601"+         id="text3202"+         sodipodi:linespacing="125%"><tspan+           sodipodi:role="line"+           id="tspan3204"+           x="229.5125"+           y="338.87601">Unevaluated Expression</tspan></text>+      <text+         xml:space="preserve"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         x="229.28676"+         y="400.29871"+         id="text3206"+         sodipodi:linespacing="125%"><tspan+           sodipodi:role="line"+           id="tspan3208"+           x="229.28676"+           y="400.29871">Function</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3395"+         y="368.61334"+         x="229.5125"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="368.61334"+           x="229.5125"+           id="tspan3397"+           sodipodi:role="line">Unevaluated Expression (mostly in interpreted code)</tspan></text>+      <text+         sodipodi:linespacing="125%"+         id="text3403"+         y="428.08789"+         x="229.28676"+         style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+         xml:space="preserve"><tspan+           y="428.08789"+           x="229.28676"+           id="tspan3405"+           sodipodi:role="line">Function (mostly in interpreted code)</tspan></text>+    </g>+  </g>+</svg>
+ data/legend_list.svg view
@@ -0,0 +1,236 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="528.88135"+   height="294.60281"+   id="svg2"+   version="1.1"+   inkscape:version="0.48.3.1 r9886"+   sodipodi:docname="legend_list.svg">+  <defs+     id="defs4" />+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="0.49497475"+     inkscape:cx="111.81327"+     inkscape:cy="95.144158"+     inkscape:document-units="px"+     inkscape:current-layer="g3014"+     showgrid="false"+     fit-margin-top="30"+     fit-margin-left="30"+     fit-margin-right="30"+     fit-margin-bottom="30"+     inkscape:window-width="638"+     inkscape:window-height="503"+     inkscape:window-x="640"+     inkscape:window-y="14"+     inkscape:window-maximized="0" />+  <metadata+     id="metadata7">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1"+     transform="translate(-226.47563,-43.350422)">+    <g+       transform="matrix(1.25,0,0,-1.25,256.47572,261.42618)"+       inkscape:label="block"+       id="g3012">+      <g+         id="g3014">+        <path+           id="path3016"+           style="fill:#80ff80;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60214996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           d="m 0.801,43.704 0,-37.301 c 0,-2.211 1.793,-4.004 4.004,-4.004 l 42.886,0 c 2.211,0 4.004,1.793 4.004,4.004 l 0,37.301 c 0,2.215 -1.793,4.008 -4.004,4.008 l -42.886,0 c -2.211,0 -4.004,-1.793 -4.004,-4.008 z"+           inkscape:connector-curvature="0" />+        <path+           id="path3018"+           style="fill:none;stroke:#000000;stroke-width:1.60214996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           d="m 0.801,25.056 50.894,0"+           inkscape:connector-curvature="0" />+        <text+           xml:space="preserve"+           style="font-size:16.01600075px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+           x="16.071358"+           y="-8.1712036"+           id="text5596"+           sodipodi:linespacing="125%"+           transform="scale(1,-1)"><tspan+             sodipodi:role="line"+             id="tspan5598"+             x="16.071358"+             y="-8.1712036">b0</tspan></text>+        <text+           xml:space="preserve"+           style="font-size:16.01600075px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+           x="6.785646"+           y="-28.83638"+           id="text5592"+           sodipodi:linespacing="125%"+           transform="scale(1,-1)"><tspan+             sodipodi:role="line"+             id="tspan5594"+             x="6.785646"+             y="-28.83638">S# 1</tspan></text>+      </g>+    </g>+    <g+       transform="matrix(1.25,0,0,-1.25,273.37009,189.72929)"+       inkscape:label="function"+       id="g3060">+      <g+         id="g3062">+        <path+           id="path3064"+           style="fill:#ffff80;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 15.813,0 c 2.222,0 4.023,1.801 4.023,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.023,4.024 l -15.813,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+           inkscape:connector-curvature="0" />+        <text+           id="text3066"+           transform="matrix(1,0,0,-1,4.823543,10.21773)">+          <tspan+             id="tspan3068"+             sodipodi:role="line"+             y="0"+             x="0 5.6290526"+             style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">f0</tspan>+        </text>+      </g>+    </g>+    <g+       transform="matrix(1.25,0,0,-1.25,270.54259,309.95433)"+       inkscape:label="link"+       id="g3102">+      <g+         id="g3104">+        <path+           id="path3106"+           style="fill:#8080ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 20.336,0 c 2.223,0 4.024,1.801 4.024,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.024,4.024 l -20.336,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+           inkscape:connector-curvature="0" />+        <text+           id="text3108"+           transform="matrix(1,0,0,-1,4.824073,10.21773)">+          <tspan+             id="tspan3110"+             sodipodi:role="line"+             y="0"+             x="0 10.116212"+             style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">b0</tspan>+        </text>+      </g>+    </g>+    <g+       id="g3146"+       transform="matrix(1.25,0,0,-1.25,272.96947,141.20482)">+      <path+         inkscape:connector-curvature="0"+         d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 16.453,0 c 2.223,0 4.024,1.801 4.024,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.024,4.024 l -16.453,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+         style="fill:#ff8080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+         id="path3148" />+      <text+         transform="matrix(1,0,0,-1,4.823723,10.217731)"+         id="text3150">+        <tspan+           style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 6.2723732"+           y="0"+           sodipodi:role="line"+           id="tspan3152">t0</tspan>+      </text>+    </g>+    <g+       id="g3188"+       transform="matrix(1.25,0,0,-1.25,266.63856,92.67926)">+      <text+         transform="matrix(1,0,0,-1,-1.060159,1.827738)"+         id="text3190">+        <tspan+           style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 10.116212 28.547338"+           y="0"+           sodipodi:role="line"+           id="tspan3192">S#1</tspan>+      </text>+    </g>+    <text+       sodipodi:linespacing="125%"+       id="text3198"+       y="88.621712"+       x="345.71429"+       style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       xml:space="preserve"><tspan+         y="88.621712"+         x="345.71429"+         id="tspan3200"+         sodipodi:role="line">Data Constructor S# with argument 1</tspan></text>+    <text+       sodipodi:linespacing="125%"+       id="text3202"+       y="127.01498"+       x="347.74588"+       style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       xml:space="preserve"><tspan+         y="127.01498"+         x="347.74588"+         id="tspan3204"+         sodipodi:role="line">Thunk (unevaluated expression)</tspan></text>+    <text+       sodipodi:linespacing="125%"+       id="text3206"+       y="177.48763"+       x="345.71429"+       style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       xml:space="preserve"><tspan+         y="177.48763"+         x="345.71429"+         id="tspan3208"+         sodipodi:role="line">Function</tspan></text>+    <text+       sodipodi:linespacing="125%"+       id="text3210"+       y="236.57452"+       x="346.36203"+       style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       xml:space="preserve"><tspan+         y="236.57452"+         x="346.36203"+         id="tspan3212"+         sodipodi:role="line">Same as S# 1, but with the name b0</tspan></text>+    <text+       sodipodi:linespacing="125%"+       id="text3214"+       y="295.7645"+       x="347.52994"+       style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       xml:space="preserve"><tspan+         y="295.7645"+         x="347.52994"+         id="tspan3216"+         sodipodi:role="line">A link to the memory location of b0</tspan></text>+  </g>+</svg>
+ data/main.ui view
@@ -0,0 +1,311 @@+<?xml version="1.0" encoding="UTF-8"?>+<interface>+  <requires lib="gtk+" version="2.24"/>+  <!-- interface-naming-policy project-wide -->+  <object class="GtkAboutDialog" id="aboutdialog">+    <property name="can_focus">False</property>+    <property name="border_width">5</property>+    <property name="type_hint">dialog</property>+    <property name="program_name">ghc-vis</property>+    <property name="version">0.6</property>+    <property name="website">http://felsin9.de/nnis/ghc-vis</property>+    <property name="authors">Dennis Felsing</property>+    <child internal-child="vbox">+      <object class="GtkVBox" id="dialog-vbox3">+        <property name="visible">True</property>+        <property name="can_focus">False</property>+        <property name="spacing">2</property>+        <child internal-child="action_area">+          <object class="GtkHButtonBox" id="dialog-action_area3">+            <property name="visible">True</property>+            <property name="can_focus">False</property>+            <property name="layout_style">end</property>+          </object>+          <packing>+            <property name="expand">False</property>+            <property name="fill">True</property>+            <property name="pack_type">end</property>+            <property name="position">0</property>+          </packing>+        </child>+        <child>+          <placeholder/>+        </child>+      </object>+    </child>+  </object>+  <object class="GtkImage" id="image1">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-save</property>+  </object>+  <object class="GtkImage" id="image2">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-save</property>+  </object>+  <object class="GtkImage" id="image3">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-new</property>+  </object>+  <object class="GtkImage" id="image4">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-jump-to</property>+  </object>+  <object class="GtkImage" id="image5">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-refresh</property>+  </object>+  <object class="GtkImage" id="image6">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-missing-image</property>+  </object>+  <object class="GtkImage" id="image7">+    <property name="visible">True</property>+    <property name="can_focus">False</property>+    <property name="stock">gtk-justify-left</property>+  </object>+  <object class="GtkWindow" id="legenddialog">+    <property name="can_focus">False</property>+    <property name="title" translatable="yes">ghc-vis Legend</property>+    <property name="default_width">440</property>+    <property name="default_height">250</property>+    <property name="destroy_with_parent">True</property>+    <property name="type_hint">dialog</property>+    <child>+      <object class="GtkDrawingArea" id="legenddrawingarea">+        <property name="visible">True</property>+        <property name="can_focus">False</property>+      </object>+    </child>+  </object>+  <object class="GtkFileChooserDialog" id="savedialog">+    <property name="can_focus">False</property>+    <property name="border_width">5</property>+    <property name="title" translatable="yes">ghc-vis Save</property>+    <property name="role">GtkFileChooserDialog</property>+    <property name="type_hint">dialog</property>+    <property name="action">save</property>+    <child internal-child="vbox">+      <object class="GtkVBox" id="dialog-vbox1">+        <property name="visible">True</property>+        <property name="can_focus">False</property>+        <property name="spacing">2</property>+        <child internal-child="action_area">+          <object class="GtkHButtonBox" id="dialog-action_area1">+            <property name="visible">True</property>+            <property name="can_focus">False</property>+            <property name="layout_style">end</property>+            <child>+              <object class="GtkButton" id="cancelbutton">+                <property name="label">gtk-cancel</property>+                <property name="use_action_appearance">False</property>+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="use_stock">True</property>+              </object>+              <packing>+                <property name="expand">False</property>+                <property name="fill">False</property>+                <property name="position">0</property>+              </packing>+            </child>+            <child>+              <object class="GtkButton" id="savebutton">+                <property name="label">gtk-save</property>+                <property name="use_action_appearance">False</property>+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="has_focus">True</property>+                <property name="is_focus">True</property>+                <property name="can_default">True</property>+                <property name="has_default">True</property>+                <property name="receives_default">True</property>+                <property name="use_stock">True</property>+              </object>+              <packing>+                <property name="expand">False</property>+                <property name="fill">False</property>+                <property name="position">1</property>+              </packing>+            </child>+          </object>+          <packing>+            <property name="expand">False</property>+            <property name="fill">True</property>+            <property name="pack_type">end</property>+            <property name="position">0</property>+          </packing>+        </child>+        <child>+          <placeholder/>+        </child>+      </object>+    </child>+    <action-widgets>+      <action-widget response="-6">cancelbutton</action-widget>+      <action-widget response="-5">savebutton</action-widget>+    </action-widgets>+  </object>+  <object class="GtkWindow" id="window">+    <property name="can_focus">False</property>+    <property name="title" translatable="yes">ghc-vis</property>+    <property name="default_width">640</property>+    <property name="default_height">480</property>+    <child>+      <object class="GtkVBox" id="vbox1">+        <property name="visible">True</property>+        <property name="can_focus">False</property>+        <child>+          <object class="GtkMenuBar" id="menubar1">+            <property name="visible">True</property>+            <property name="can_focus">False</property>+            <child>+              <object class="GtkMenuItem" id="menuitem1">+                <property name="use_action_appearance">False</property>+                <property name="visible">True</property>+                <property name="can_focus">False</property>+                <property name="label" translatable="yes">_File</property>+                <property name="use_underline">True</property>+                <child type="submenu">+                  <object class="GtkMenu" id="menu1">+                    <property name="visible">True</property>+                    <property name="can_focus">False</property>+                    <child>+                      <object class="GtkImageMenuItem" id="clear">+                        <property name="label" translatable="yes">Clear (:clear, c)</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="image">image3</property>+                        <property name="use_stock">False</property>+                      </object>+                    </child>+                    <child>+                      <object class="GtkImageMenuItem" id="export">+                        <property name="label" translatable="yes">Export (:export)</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="image">image2</property>+                        <property name="use_stock">False</property>+                      </object>+                    </child>+                    <child>+                      <object class="GtkSeparatorMenuItem" id="separatormenuitem1">+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                      </object>+                    </child>+                    <child>+                      <object class="GtkImageMenuItem" id="quit">+                        <property name="label">gtk-quit</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="use_underline">True</property>+                        <property name="use_stock">True</property>+                      </object>+                    </child>+                  </object>+                </child>+              </object>+            </child>+            <child>+              <object class="GtkMenuItem" id="menuitem3">+                <property name="use_action_appearance">False</property>+                <property name="visible">True</property>+                <property name="can_focus">False</property>+                <property name="label" translatable="yes">_View</property>+                <property name="use_underline">True</property>+                <child type="submenu">+                  <object class="GtkMenu" id="menu2">+                    <property name="visible">True</property>+                    <property name="can_focus">False</property>+                    <child>+                      <object class="GtkImageMenuItem" id="switch">+                        <property name="label" translatable="yes">Switch (:switch, v)</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="image">image4</property>+                        <property name="use_stock">False</property>+                      </object>+                    </child>+                    <child>+                      <object class="GtkImageMenuItem" id="update">+                        <property name="label" translatable="yes">Update (:update, u)</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="image">image5</property>+                        <property name="use_stock">False</property>+                      </object>+                    </child>+                  </object>+                </child>+              </object>+            </child>+            <child>+              <object class="GtkMenuItem" id="menuitem4">+                <property name="use_action_appearance">False</property>+                <property name="visible">True</property>+                <property name="can_focus">False</property>+                <property name="label" translatable="yes">_Help</property>+                <property name="use_underline">True</property>+                <child type="submenu">+                  <object class="GtkMenu" id="menu3">+                    <property name="visible">True</property>+                    <property name="can_focus">False</property>+                    <child>+                      <object class="GtkImageMenuItem" id="legend">+                        <property name="label" translatable="yes">Legend</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="image">image7</property>+                        <property name="use_stock">False</property>+                      </object>+                    </child>+                    <child>+                      <object class="GtkImageMenuItem" id="about">+                        <property name="label">gtk-about</property>+                        <property name="use_action_appearance">False</property>+                        <property name="visible">True</property>+                        <property name="can_focus">False</property>+                        <property name="use_underline">True</property>+                        <property name="use_stock">True</property>+                      </object>+                    </child>+                  </object>+                </child>+              </object>+            </child>+          </object>+          <packing>+            <property name="expand">False</property>+            <property name="fill">True</property>+            <property name="position">0</property>+          </packing>+        </child>+        <child>+          <object class="GtkDrawingArea" id="drawingarea">+            <property name="visible">True</property>+            <property name="can_focus">False</property>+          </object>+          <packing>+            <property name="expand">True</property>+            <property name="fill">True</property>+            <property name="position">1</property>+          </packing>+        </child>+      </object>+    </child>+  </object>+</interface>
+ data/welcome.svg view
@@ -0,0 +1,1487 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:xlink="http://www.w3.org/1999/xlink"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="919.96094"+   height="889.92102"+   id="svg3450"+   version="1.1"+   inkscape:version="0.48.3.1 r9886"+   sodipodi:docname="welcome.svg">+  <defs+     id="defs3452">+    <g+       id="g3824">+      <symbol+         id="glyph0-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3827"+           d="m 1.4375,5.125 0,-25.578125 14.5,0 0,25.578125 z m 1.640625,-1.609375 11.25,0 0,-22.328125 -11.25,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3830"+           d="m 2.734375,-22.03125 2.609375,0 0,22.03125 -2.609375,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3833"+           d="m 3.40625,-3.59375 2.984375,0 0,3.59375 -2.984375,0 z m 0,-11.40625 2.984375,0 0,3.59375 -2.984375,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-3"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3836"+           d=""+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-4"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3839"+           d="m 8.984375,-22 c -1.261719,2.167969 -2.199219,4.3125 -2.8125,6.4375 C 5.554688,-13.4375 5.25,-11.285156 5.25,-9.109375 c 0,2.1875 0.304688,4.351563 0.921875,6.484375 0.625,2.136719 1.5625,4.285156 2.8125,6.453125 l -2.265625,0 C 5.3125,1.609375 4.253906,-0.570312 3.546875,-2.71875 2.847656,-4.863281 2.5,-6.992188 2.5,-9.109375 c 0,-2.101563 0.347656,-4.21875 1.046875,-6.34375 C 4.242188,-17.585938 5.300781,-19.769531 6.71875,-22 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-5"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3842"+           d="m 15.515625,-20.453125 0,2.796875 c -1.085937,-0.519531 -2.109375,-0.90625 -3.078125,-1.15625 -0.960938,-0.257812 -1.886719,-0.390625 -2.78125,-0.390625 -1.554688,0 -2.757812,0.304687 -3.609375,0.90625 -0.84375,0.605469 -1.265625,1.464844 -1.265625,2.578125 0,0.9375 0.28125,1.648438 0.84375,2.125 0.5625,0.46875 1.628906,0.851562 3.203125,1.140625 l 1.71875,0.359375 c 2.132813,0.40625 3.707031,1.125 4.71875,2.15625 1.019531,1.023438 1.53125,2.390625 1.53125,4.109375 0,2.042969 -0.6875,3.59375 -2.0625,4.65625 -1.375,1.054687 -3.390625,1.578125 -6.046875,1.578125 -1,0 -2.0625,-0.117188 -3.1875,-0.34375 -1.125,-0.21875 -2.292969,-0.550781 -3.5,-1 L 2,-3.875 c 1.15625,0.648438 2.289062,1.136719 3.40625,1.46875 1.113281,0.335938 2.207031,0.5 3.28125,0.5 1.632812,0 2.894531,-0.320312 3.78125,-0.96875 0.894531,-0.644531 1.34375,-1.5625 1.34375,-2.75 0,-1.03125 -0.324219,-1.835938 -0.96875,-2.421875 -0.636719,-0.59375 -1.679688,-1.035156 -3.125,-1.328125 l -1.75,-0.34375 c -2.136719,-0.414062 -3.683594,-1.078125 -4.640625,-1.984375 -0.949219,-0.90625 -1.421875,-2.164063 -1.421875,-3.78125 0,-1.875 0.65625,-3.347656 1.96875,-4.421875 1.320312,-1.082031 3.140625,-1.625 5.453125,-1.625 0.988281,0 2,0.09375 3.03125,0.28125 1.03125,0.179688 2.082031,0.445312 3.15625,0.796875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-6"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3845"+           d="m 14.828125,-12.765625 -4.125,0 -1.1875,4.734375 4.15625,0 z m -2.125,-8.046875 -1.46875,5.875 4.125,0 1.484375,-5.875 2.265625,0 -1.453125,5.875 4.421875,0 0,2.171875 -4.96875,0 -1.171875,4.734375 4.515625,0 0,2.171875 -5.0625,0 L 13.921875,0 11.65625,0 l 1.453125,-5.859375 -4.140625,0 L 7.5,0 5.21875,0 l 1.484375,-5.859375 -4.46875,0 0,-2.171875 4.984375,0 1.1875,-4.734375 -4.546875,0 0,-2.171875 5.109375,0 1.4375,-5.875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-7"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3848"+           d="m 3.59375,-2.40625 4.671875,0 0,-16.125 -5.078125,1.015625 0,-2.609375 5.046875,-1.015625 2.875,0 0,18.734375 4.671875,0 0,2.40625 -12.1875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-8"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3851"+           d="m 2.328125,-22 2.265625,0 c 1.414062,2.230469 2.472656,4.414062 3.171875,6.546875 0.707031,2.125 1.0625,4.242187 1.0625,6.34375 0,2.117187 -0.355469,4.246094 -1.0625,6.390625 C 7.066406,-0.570312 6.007812,1.609375 4.59375,3.828125 l -2.265625,0 C 3.578125,1.660156 4.507812,-0.488281 5.125,-2.625 5.75,-4.757812 6.0625,-6.921875 6.0625,-9.109375 6.0625,-11.285156 5.75,-13.4375 5.125,-15.5625 4.507812,-17.6875 3.578125,-19.832031 2.328125,-22 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-9"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3854"+           d="m 5.5625,-2.40625 9.984375,0 0,2.40625 L 2.125,0 l 0,-2.40625 c 1.082031,-1.125 2.5625,-2.628906 4.4375,-4.515625 1.875,-1.894531 3.050781,-3.117187 3.53125,-3.671875 0.914062,-1.03125 1.554688,-1.898438 1.921875,-2.609375 0.363281,-0.71875 0.546875,-1.421875 0.546875,-2.109375 0,-1.125 -0.398438,-2.035156 -1.1875,-2.734375 -0.78125,-0.707031 -1.808594,-1.0625 -3.078125,-1.0625 -0.898437,0 -1.84375,0.15625 -2.84375,0.46875 -0.992187,0.304687 -2.054687,0.773437 -3.1875,1.40625 l 0,-2.890625 C 3.421875,-20.582031 4.5,-20.929688 5.5,-21.171875 c 1,-0.238281 1.910156,-0.359375 2.734375,-0.359375 2.195313,0 3.945313,0.554688 5.25,1.65625 1.300781,1.09375 1.953125,2.558594 1.953125,4.390625 0,0.867187 -0.167969,1.6875 -0.5,2.46875 -0.324219,0.773437 -0.914062,1.6875 -1.765625,2.75 -0.242187,0.273437 -0.996094,1.0625 -2.265625,2.375 -1.261719,1.304687 -3.042969,3.132813 -5.34375,5.484375 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-10"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3857"+           d="m 11.765625,-11.40625 c 1.375,0.304688 2.441406,0.917969 3.203125,1.84375 0.769531,0.917969 1.15625,2.058594 1.15625,3.421875 0,2.085937 -0.71875,3.699219 -2.15625,4.84375 -1.429688,1.136719 -3.464844,1.703125 -6.109375,1.703125 -0.886719,0 -1.804687,-0.089844 -2.75,-0.265625 -0.9375,-0.1640625 -1.90625,-0.425781 -2.90625,-0.78125 l 0,-2.765625 C 3.003906,-2.9375 3.875,-2.582031 4.8125,-2.34375 5.757812,-2.113281 6.75,-2 7.78125,-2 c 1.789062,0 3.15625,-0.351562 4.09375,-1.0625 0.9375,-0.707031 1.40625,-1.734375 1.40625,-3.078125 0,-1.25 -0.4375,-2.222656 -1.3125,-2.921875 -0.875,-0.707031 -2.089844,-1.0625 -3.640625,-1.0625 l -2.46875,0 0,-2.34375 2.578125,0 c 1.40625,0 2.476562,-0.28125 3.21875,-0.84375 0.75,-0.5625 1.125,-1.375 1.125,-2.4375 0,-1.082031 -0.386719,-1.910156 -1.15625,-2.484375 -0.761719,-0.582031 -1.859375,-0.875 -3.296875,-0.875 -0.78125,0 -1.625,0.08594 -2.53125,0.25 -0.898437,0.167969 -1.882813,0.433594 -2.953125,0.796875 l 0,-2.5625 c 1.082031,-0.300781 2.097656,-0.523438 3.046875,-0.671875 0.957031,-0.15625 1.851563,-0.234375 2.6875,-0.234375 2.175781,0 3.894531,0.496094 5.15625,1.484375 1.269531,0.992187 1.90625,2.324219 1.90625,4 0,1.179687 -0.339844,2.171875 -1.015625,2.984375 -0.667969,0.804688 -1.621094,1.355469 -2.859375,1.65625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-11"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3860"+           d="m 2.5,-22.03125 6,0 0,2.015625 -3.40625,0 0,21.8125 3.40625,0 0,2.03125 -6,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-12"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3863"+           d="m 8.828125,-22.03125 0,25.859375 -6.015625,0 0,-2.03125 3.390625,0 0,-21.8125 -3.390625,0 0,-2.015625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-13"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3866"+           d="m 14.125,-7.921875 c 0,-1.914063 -0.398438,-3.414063 -1.1875,-4.5 -0.792969,-1.09375 -1.875,-1.640625 -3.25,-1.640625 -1.375,0 -2.460938,0.546875 -3.25,1.640625 -0.792969,1.085937 -1.1875,2.585937 -1.1875,4.5 0,1.917969 0.394531,3.421875 1.1875,4.515625 0.789062,1.09375 1.875,1.640625 3.25,1.640625 1.375,0 2.457031,-0.546875 3.25,-1.640625 C 13.726562,-4.5 14.125,-6.003906 14.125,-7.921875 z m -8.875,-5.53125 c 0.550781,-0.945313 1.242188,-1.644531 2.078125,-2.09375 0.832031,-0.457031 1.832031,-0.6875 3,-0.6875 1.925781,0 3.488281,0.765625 4.6875,2.296875 1.207031,1.523438 1.8125,3.527344 1.8125,6.015625 0,2.5 -0.605469,4.515625 -1.8125,6.046875 -1.199219,1.523438 -2.761719,2.28125 -4.6875,2.28125 -1.167969,0 -2.167969,-0.230469 -3,-0.6875 C 6.492188,-0.738281 5.800781,-1.4375 5.25,-2.375 l 0,2.375 -2.609375,0 0,-22.03125 2.609375,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-14"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3869"+           d="m 9.21875,-19.265625 c -1.46875,0 -2.578125,0.730469 -3.328125,2.1875 -0.742187,1.449219 -1.109375,3.625 -1.109375,6.53125 0,2.898437 0.367188,5.070313 1.109375,6.515625 0.75,1.449219 1.859375,2.171875 3.328125,2.171875 1.476562,0 2.585938,-0.722656 3.328125,-2.171875 0.75,-1.445312 1.125,-3.617188 1.125,-6.515625 0,-2.90625 -0.375,-5.082031 -1.125,-6.53125 -0.742187,-1.457031 -1.851563,-2.1875 -3.328125,-2.1875 z m 0,-2.265625 c 2.363281,0 4.171875,0.9375 5.421875,2.8125 1.257813,1.875 1.890625,4.601562 1.890625,8.171875 0,3.554687 -0.632812,6.265625 -1.890625,8.140625 -1.25,1.875 -3.058594,2.8125 -5.421875,2.8125 -2.367188,0 -4.179688,-0.9375 -5.4375,-2.8125 -1.25,-1.875 -1.875,-4.585938 -1.875,-8.140625 0,-3.570313 0.625,-6.296875 1.875,-8.171875 1.257812,-1.875 3.070312,-2.8125 5.4375,-2.8125 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-15"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3872"+           d="m 10.953125,-18.65625 -7.21875,11.296875 7.21875,0 z m -0.75,-2.484375 3.609375,0 0,13.78125 3.015625,0 0,2.375 -3.015625,0 0,4.984375 -2.859375,0 0,-4.984375 -9.53125,0 0,-2.765625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-16"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3875"+           d="M 15.921875,-15.859375 10.1875,-8.140625 16.21875,0 13.140625,0 8.53125,-6.234375 3.90625,0 0.828125,0 7,-8.296875 l -5.640625,-7.5625 3.078125,0 4.203125,5.65625 4.203125,-5.65625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-17"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3878"+           d="m 5.3125,-20.359375 0,4.5 5.359375,0 0,2.03125 -5.359375,0 0,8.609375 c 0,1.292969 0.175781,2.121094 0.53125,2.484375 C 6.195312,-2.367188 6.914062,-2.1875 8,-2.1875 l 2.671875,0 0,2.1875 L 8,0 C 5.988281,0 4.597656,-0.375 3.828125,-1.125 3.066406,-1.875 2.6875,-3.238281 2.6875,-5.21875 l 0,-8.609375 -1.90625,0 0,-2.03125 1.90625,0 0,-4.5 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-18"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3881"+           d="m 3.40625,-3.59375 2.984375,0 0,2.4375 L 4.0625,3.375 l -1.828125,0 1.171875,-4.53125 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-19"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path3884"+           d="M 9.328125,1.46875 C 8.597656,3.363281 7.878906,4.597656 7.171875,5.171875 6.472656,5.742188 5.539062,6.03125 4.375,6.03125 l -2.078125,0 0,-2.171875 1.53125,0 C 4.546875,3.859375 5.101562,3.6875 5.5,3.34375 5.894531,3 6.332031,2.195312 6.8125,0.9375 L 7.28125,-0.25 0.859375,-15.859375 l 2.765625,0 4.953125,12.40625 4.953125,-12.40625 2.765625,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+    </g>+    <g+       id="g4592">+      <symbol+         id="glyph0-0-3"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4595"+           d="m 1.296875,4.59375 0,-22.921875 13,0 0,22.921875 z M 2.75,3.15625 l 10.09375,0 0,-20.03125 -10.09375,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph0-1-8"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4598"+           d="m 3.046875,-3.21875 2.671875,0 0,3.21875 -2.671875,0 z m 0,-10.21875 2.671875,0 0,3.21875 -2.671875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph1-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4601"+           d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph1-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4604"+           d="m 7.859375,-14.53125 -3.078125,8.34375 6.171875,0 z m -1.28125,-2.234375 2.578125,0 L 15.546875,0 13.1875,0 l -1.53125,-4.296875 -7.5625,0 L 2.578125,0 0.1875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph1-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4607"+           d="m 4.53125,-14.90625 0,6.296875 2.84375,0 c 1.0625,0 1.878906,-0.269531 2.453125,-0.8125 0.570313,-0.550781 0.859375,-1.332031 0.859375,-2.34375 0,-1 -0.289062,-1.769531 -0.859375,-2.3125 C 9.253906,-14.628906 8.4375,-14.90625 7.375,-14.90625 z M 2.25,-16.765625 l 5.125,0 c 1.882812,0 3.304688,0.429687 4.265625,1.28125 0.957031,0.84375 1.4375,2.085937 1.4375,3.71875 0,1.65625 -0.480469,2.914063 -1.4375,3.765625 -0.960937,0.84375 -2.382813,1.265625 -4.265625,1.265625 l -2.84375,0 L 4.53125,0 2.25,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4610"+           d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4613"+           d="m 12.3125,-16.21875 0,2.21875 c -0.867188,-0.414062 -1.683594,-0.722656 -2.453125,-0.921875 -0.761719,-0.207031 -1.496094,-0.3125 -2.203125,-0.3125 -1.230469,0 -2.183594,0.242187 -2.859375,0.71875 -0.667969,0.480469 -1,1.164063 -1,2.046875 0,0.742188 0.21875,1.304688 0.65625,1.6875 C 4.898438,-10.40625 5.75,-10.101562 7,-9.875 l 1.359375,0.28125 c 1.695313,0.324219 2.945313,0.890625 3.75,1.703125 0.800781,0.8125 1.203125,1.902344 1.203125,3.265625 0,1.625 -0.546875,2.859375 -1.640625,3.703125 -1.085937,0.8359375 -2.679687,1.25 -4.78125,1.25 -0.792969,0 -1.636719,-0.09375 -2.53125,-0.28125 -0.898437,-0.175781 -1.824219,-0.4375 -2.78125,-0.78125 l 0,-2.34375 c 0.925781,0.523437 1.828125,0.914063 2.703125,1.171875 0.882812,0.261719 1.753906,0.390625 2.609375,0.390625 1.300781,0 2.300781,-0.253906 3,-0.765625 0.707031,-0.507812 1.0625,-1.234375 1.0625,-2.171875 0,-0.820313 -0.257813,-1.46875 -0.765625,-1.9375 -0.5,-0.46875 -1.328125,-0.816406 -2.484375,-1.046875 l -1.375,-0.265625 C 4.628906,-8.035156 3.398438,-8.5625 2.640625,-9.28125 c -0.75,-0.71875 -1.125,-1.71875 -1.125,-3 0,-1.488281 0.519531,-2.660156 1.5625,-3.515625 1.050781,-0.851563 2.492187,-1.28125 4.328125,-1.28125 0.78125,0 1.578125,0.07422 2.390625,0.21875 0.820313,0.148437 1.660156,0.359375 2.515625,0.640625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4616"+           d="m 11.765625,-10.125 -3.28125,0 -0.9375,3.75 3.296875,0 z m -1.6875,-6.390625 -1.171875,4.671875 3.28125,0 1.171875,-4.671875 1.796875,0 L 14,-11.84375 l 3.515625,0 0,1.71875 -3.953125,0 -0.921875,3.75 3.578125,0 0,1.71875 -4.015625,0 L 11.046875,0 9.25,0 l 1.15625,-4.65625 -3.296875,0 L 5.953125,0 4.140625,0 5.3125,-4.65625 l -3.53125,0 0,-1.71875 3.953125,0 0.9375,-3.75 -3.609375,0 0,-1.71875 4.046875,0 L 8.25,-16.515625 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-3"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4619"+           d=""+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-4"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4622"+           d="m 2.859375,-1.90625 3.703125,0 0,-12.796875 -4.03125,0.8125 0,-2.0625 4,-0.8125 2.28125,0 0,14.859375 3.703125,0 0,1.90625 -9.65625,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-5"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4625"+           d="m 4.40625,-1.90625 7.921875,0 0,1.90625 -10.640625,0 0,-1.90625 C 2.539062,-2.800781 3.710938,-4 5.203125,-5.5 6.691406,-7 7.625,-7.96875 8,-8.40625 c 0.726562,-0.8125 1.238281,-1.5 1.53125,-2.0625 0.289062,-0.570312 0.4375,-1.128906 0.4375,-1.671875 0,-0.894531 -0.3125,-1.617187 -0.9375,-2.171875 -0.625,-0.5625 -1.445312,-0.84375 -2.453125,-0.84375 -0.710937,0 -1.460937,0.125 -2.25,0.375 -0.792969,0.242188 -1.636719,0.609375 -2.53125,1.109375 l 0,-2.28125 c 0.914063,-0.375 1.769531,-0.65625 2.5625,-0.84375 0.789063,-0.1875 1.515625,-0.28125 2.171875,-0.28125 1.738281,0 3.125,0.4375 4.15625,1.3125 1.03125,0.867187 1.546875,2.027344 1.546875,3.484375 0,0.6875 -0.132813,1.339844 -0.390625,1.953125 -0.25,0.617187 -0.71875,1.34375 -1.40625,2.1875 -0.1875,0.21875 -0.78125,0.851563 -1.78125,1.890625 -1,1.03125 -2.417969,2.480469 -4.25,4.34375 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-6"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4628"+           d="m 9.328125,-9.046875 c 1.09375,0.242187 1.941406,0.730469 2.546875,1.46875 0.613281,0.730469 0.921875,1.632813 0.921875,2.703125 0,1.65625 -0.574219,2.9375 -1.71875,3.84375 -1.136719,0.90625 -2.75,1.359375 -4.84375,1.359375 -0.710937,0 -1.4375,-0.074219 -2.1875,-0.21875 C 3.304688,-0.0234375 2.539062,-0.226562 1.75,-0.5 l 0,-2.203125 c 0.632812,0.375 1.320312,0.65625 2.0625,0.84375 0.75,0.1875 1.535156,0.28125 2.359375,0.28125 1.414063,0 2.492187,-0.28125 3.234375,-0.84375 0.75,-0.5625 1.125,-1.378906 1.125,-2.453125 0,-0.988281 -0.351562,-1.757812 -1.046875,-2.3125 -0.6875,-0.5625 -1.648437,-0.84375 -2.875,-0.84375 l -1.953125,0 0,-1.859375 2.03125,0 c 1.113281,0 1.96875,-0.222656 2.5625,-0.671875 0.59375,-0.445312 0.890625,-1.085938 0.890625,-1.921875 0,-0.863281 -0.308594,-1.523437 -0.921875,-1.984375 -0.605469,-0.457031 -1.476562,-0.6875 -2.609375,-0.6875 -0.625,0 -1.296875,0.07031 -2.015625,0.203125 -0.710938,0.136719 -1.492188,0.34375 -2.34375,0.625 l 0,-2.03125 c 0.863281,-0.238281 1.671875,-0.414063 2.421875,-0.53125 0.757813,-0.125 1.472656,-0.1875 2.140625,-0.1875 1.71875,0 3.078125,0.398437 4.078125,1.1875 1.007813,0.78125 1.515625,1.839844 1.515625,3.171875 0,0.929688 -0.273438,1.714844 -0.8125,2.359375 -0.53125,0.636719 -1.289062,1.074219 -2.265625,1.3125 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph2-7"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4631"+           d="m 8.6875,-14.796875 -5.71875,8.953125 5.71875,0 z m -0.59375,-1.96875 2.859375,0 0,10.921875 2.390625,0 0,1.890625 -2.390625,0 0,3.953125 -2.265625,0 0,-3.953125 -7.5625,0 0,-2.1875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph3-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4634"+           d="m 1.203125,4.25 0,-21.171875 12,0 0,21.171875 z m 1.34375,-1.34375 9.3125,0 0,-18.484375 -9.3125,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph3-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4637"+           d="m 2.0625,-18.234375 4.96875,0 0,1.671875 -2.8125,0 0,18.046875 2.8125,0 0,1.6875 -4.96875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph3-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4640"+           d="m 7.296875,-18.234375 0,21.40625 -4.96875,0 0,-1.6875 2.8125,0 0,-18.046875 -2.8125,0 0,-1.671875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph3-3"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4643"+           d="m 7.4375,-18.21875 c -1.042969,1.804688 -1.820312,3.585938 -2.328125,5.34375 -0.511719,1.75 -0.765625,3.53125 -0.765625,5.34375 0,1.804688 0.253906,3.589844 0.765625,5.359375 0.519531,1.773437 1.296875,3.550781 2.328125,5.34375 l -1.875,0 C 4.394531,1.328125 3.519531,-0.476562 2.9375,-2.25 2.351562,-4.019531 2.0625,-5.78125 2.0625,-7.53125 c 0,-1.75 0.285156,-3.503906 0.859375,-5.265625 C 3.503906,-14.566406 4.382812,-16.375 5.5625,-18.21875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph3-4"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4646"+           d="m 1.921875,-18.21875 1.875,0 c 1.175781,1.84375 2.050781,3.652344 2.625,5.421875 0.582031,1.761719 0.875,3.515625 0.875,5.265625 0,1.75 -0.292969,3.511719 -0.875,5.28125 -0.574219,1.773438 -1.449219,3.578125 -2.625,5.421875 l -1.875,0 C 2.960938,1.378906 3.738281,-0.398438 4.25,-2.171875 4.757812,-3.941406 5.015625,-5.726562 5.015625,-7.53125 5.015625,-9.34375 4.757812,-11.125 4.25,-12.875 3.738281,-14.632812 2.960938,-16.414062 1.921875,-18.21875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph4-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4649"+           d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph4-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4652"+           d="m 4.53125,-8 0,6.140625 3.640625,0 c 1.21875,0 2.117187,-0.25 2.703125,-0.75 0.59375,-0.507813 0.890625,-1.285156 0.890625,-2.328125 0,-1.050781 -0.296875,-1.820312 -0.890625,-2.3125 C 10.289062,-7.75 9.390625,-8 8.171875,-8 z m 0,-6.90625 0,5.0625 3.359375,0 c 1.101563,0 1.925781,-0.207031 2.46875,-0.625 0.539063,-0.414062 0.8125,-1.050781 0.8125,-1.90625 0,-0.84375 -0.273437,-1.472656 -0.8125,-1.890625 -0.542969,-0.425781 -1.367187,-0.640625 -2.46875,-0.640625 z M 2.25,-16.765625 l 5.796875,0 c 1.726563,0 3.0625,0.359375 4,1.078125 0.9375,0.71875 1.40625,1.742188 1.40625,3.0625 0,1.03125 -0.242187,1.851562 -0.71875,2.453125 -0.480469,0.605469 -1.183594,0.980469 -2.109375,1.125 1.113281,0.242187 1.976562,0.742187 2.59375,1.5 0.625,0.761719 0.9375,1.714844 0.9375,2.859375 0,1.492188 -0.511719,2.648438 -1.53125,3.46875 C 11.601562,-0.40625 10.15625,0 8.28125,0 L 2.25,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph4-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4655"+           d="m 14.8125,-15.46875 0,2.390625 c -0.761719,-0.71875 -1.574219,-1.25 -2.4375,-1.59375 -0.867188,-0.351563 -1.789062,-0.53125 -2.765625,-0.53125 -1.917969,0 -3.386719,0.589844 -4.40625,1.765625 -1.011719,1.167969 -1.515625,2.859375 -1.515625,5.078125 0,2.210937 0.503906,3.902344 1.515625,5.078125 1.019531,1.167969 2.488281,1.75 4.40625,1.75 0.976563,0 1.898437,-0.175781 2.765625,-0.53125 0.863281,-0.351562 1.675781,-0.882812 2.4375,-1.59375 l 0,2.359375 c -0.792969,0.542969 -1.632812,0.949219 -2.515625,1.21875 -0.886719,0.269531 -1.824219,0.40625 -2.8125,0.40625 -2.542969,0 -4.542969,-0.773437 -6,-2.328125 -1.460937,-1.550781 -2.1875,-3.671875 -2.1875,-6.359375 0,-2.695313 0.726563,-4.820313 2.1875,-6.375 1.457031,-1.5625 3.457031,-2.34375 6,-2.34375 1,0 1.941406,0.136719 2.828125,0.40625 0.882812,0.273437 1.71875,0.671875 2.5,1.203125 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph4-3"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4658"+           d="m 9.0625,-15.234375 c -1.648438,0 -2.953125,0.617187 -3.921875,1.84375 -0.96875,1.230469 -1.453125,2.90625 -1.453125,5.03125 0,2.105469 0.484375,3.773437 1.453125,5 0.96875,1.230469 2.273437,1.84375 3.921875,1.84375 1.644531,0 2.945312,-0.613281 3.90625,-1.84375 0.96875,-1.226563 1.453125,-2.894531 1.453125,-5 0,-2.125 -0.484375,-3.800781 -1.453125,-5.03125 -0.960938,-1.226563 -2.261719,-1.84375 -3.90625,-1.84375 z m 0,-1.84375 c 2.351562,0 4.234375,0.792969 5.640625,2.375 1.40625,1.574219 2.109375,3.6875 2.109375,6.34375 0,2.636719 -0.703125,4.746094 -2.109375,6.328125 -1.40625,1.574219 -3.289063,2.359375 -5.640625,2.359375 -2.355469,0 -4.242188,-0.785156 -5.65625,-2.359375 C 2,-3.601562 1.296875,-5.710938 1.296875,-8.359375 c 0,-2.65625 0.703125,-4.769531 2.109375,-6.34375 1.414062,-1.582031 3.300781,-2.375 5.65625,-2.375 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph5-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4661"+           d="m 1.25,4.421875 0,-22.046875 12.5,0 0,22.046875 z m 1.40625,-1.390625 9.703125,0 0,-19.25 -9.703125,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph5-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4664"+           d="M 8.046875,1.265625 C 7.410156,2.898438 6.789062,3.960938 6.1875,4.453125 c -0.605469,0.5 -1.414062,0.75 -2.421875,0.75 l -1.78125,0 0,-1.875 1.3125,0 c 0.613281,0 1.09375,-0.152344 1.4375,-0.453125 C 5.078125,2.582031 5.457031,1.894531 5.875,0.8125 L 6.28125,-0.21875 0.75,-13.671875 l 2.375,0 4.265625,10.6875 4.28125,-10.6875 2.375,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph5-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4667"+           d="M 13.71875,-13.671875 8.78125,-7.015625 13.984375,0 11.328125,0 7.34375,-5.375 3.375,0 0.71875,0 l 5.3125,-7.15625 -4.859375,-6.515625 2.65625,0 3.625,4.875 3.625,-4.875 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph6-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4670"+           d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph6-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4673"+           d="m 2.171875,-17.46875 2.0625,0 0,17.46875 -2.0625,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph6-2"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4676"+           d="m 4.40625,-1.90625 7.921875,0 0,1.90625 -10.640625,0 0,-1.90625 C 2.539062,-2.800781 3.710938,-4 5.203125,-5.5 6.691406,-7 7.625,-7.96875 8,-8.40625 c 0.726562,-0.8125 1.238281,-1.5 1.53125,-2.0625 0.289062,-0.570312 0.4375,-1.128906 0.4375,-1.671875 0,-0.894531 -0.3125,-1.617187 -0.9375,-2.171875 -0.625,-0.5625 -1.445312,-0.84375 -2.453125,-0.84375 -0.710937,0 -1.460937,0.125 -2.25,0.375 -0.792969,0.242188 -1.636719,0.609375 -2.53125,1.109375 l 0,-2.28125 c 0.914063,-0.375 1.769531,-0.65625 2.5625,-0.84375 0.789063,-0.1875 1.515625,-0.28125 2.171875,-0.28125 1.738281,0 3.125,0.4375 4.15625,1.3125 1.03125,0.867187 1.546875,2.027344 1.546875,3.484375 0,0.6875 -0.132813,1.339844 -0.390625,1.953125 -0.25,0.617187 -0.71875,1.34375 -1.40625,2.1875 -0.1875,0.21875 -0.78125,0.851563 -1.78125,1.890625 -1,1.03125 -2.417969,2.480469 -4.25,4.34375 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph7-0"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4679"+           d="m 1.203125,4.25 0,-21.171875 12,0 0,21.171875 z m 1.34375,-1.34375 9.3125,0 0,-18.484375 -9.3125,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+      <symbol+         id="glyph7-1"+         overflow="visible"+         style="overflow:visible">+        <path+           id="path4682"+           d="m 2.265625,-18.234375 2.15625,0 0,18.234375 -2.15625,0 z"+           style="stroke:none"+           inkscape:connector-curvature="0" />+      </symbol>+    </g>+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="0.35"+     inkscape:cx="435.83443"+     inkscape:cy="33.42821"+     inkscape:document-units="px"+     inkscape:current-layer="layer1"+     showgrid="false"+     inkscape:window-width="1278"+     inkscape:window-height="1008"+     inkscape:window-x="0"+     inkscape:window-y="14"+     inkscape:window-maximized="0"+     fit-margin-top="20"+     fit-margin-left="20"+     fit-margin-right="20"+     fit-margin-bottom="20" />+  <metadata+     id="metadata3455">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1"+     transform="translate(53.377808,-160.09879)">+    <text+       xml:space="preserve"+       style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       x="127.14285"+       y="289.50504"+       id="text3464"+       sodipodi:linespacing="125%"><tspan+         sodipodi:role="line"+         id="tspan3466"+         x="127.14285"+         y="289.50504">ghc-vis</tspan></text>+    <g+       id="surface287"+       transform="matrix(0.95750438,0,0,0.95750438,7.1095031,538.67303)">+      <g+         id="g3887"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3889"+           y="43.740131"+           x="3.644531"+           xlink:href="#glyph0-1"+           width="1"+           height="1" />+        <use+           id="use3891"+           y="43.740131"+           x="11.745329"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use3893"+           y="43.740131"+           x="21.56879"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+      </g>+      <path+         id="path3895"+         transform="matrix(1.457859,0,0,1.457859,53.03246,43.735763)"+         d="m -8.30078e-4,-18.561456 0,46.560687 c 0,2.762506 2.237335078,4.999841 4.999841078,4.999841 l 233.242869,0 c 2.75982,0 4.99984,-2.237335 4.99984,-4.999841 l 0,-46.560687 c 0,-2.762506 -2.24002,-4.999842 -4.99984,-4.999842 l -233.242869,0 c -2.762506,0 -4.999841078,2.237336 -4.999841078,4.999842 z"+         style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <path+         id="path3897"+         transform="matrix(1.457859,0,0,1.457859,53.03246,43.735763)"+         d="m -8.30078e-4,4.717548 243.242550078,0"+         style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g3899"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3901"+           y="43.740131"+           x="63.964844"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+        <use+           id="use3903"+           y="43.740131"+           x="75.340126"+           xlink:href="#glyph0-5"+           width="1"+           height="1" />+        <use+           id="use3905"+           y="43.740131"+           x="93.848099"+           xlink:href="#glyph0-6"+           width="1"+           height="1" />+        <use+           id="use3907"+           y="43.740131"+           x="118.27863"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+        <use+           id="use3909"+           y="43.740131"+           x="127.54684"+           xlink:href="#glyph0-7"+           width="1"+           height="1" />+        <use+           id="use3911"+           y="43.740131"+           x="146.09753"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+        <use+           id="use3913"+           y="43.740131"+           x="157.47281"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use3915"+           y="43.740131"+           x="167.29628"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+        <use+           id="use3917"+           y="43.740131"+           x="178.67157"+           xlink:href="#glyph0-5"+           width="1"+           height="1" />+        <use+           id="use3919"+           y="43.740131"+           x="197.17953"+           xlink:href="#glyph0-6"+           width="1"+           height="1" />+        <use+           id="use3921"+           y="43.740131"+           x="221.61006"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+        <use+           id="use3923"+           y="43.740131"+           x="230.87828"+           xlink:href="#glyph0-9"+           width="1"+           height="1" />+        <use+           id="use3925"+           y="43.740131"+           x="249.42897"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+        <use+           id="use3927"+           y="43.740131"+           x="260.80426"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use3929"+           y="43.740131"+           x="270.62772"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+        <use+           id="use3931"+           y="43.740131"+           x="282.00299"+           xlink:href="#glyph0-5"+           width="1"+           height="1" />+        <use+           id="use3933"+           y="43.740131"+           x="300.51096"+           xlink:href="#glyph0-6"+           width="1"+           height="1" />+        <use+           id="use3935"+           y="43.740131"+           x="324.9415"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+        <use+           id="use3937"+           y="43.740131"+           x="334.20972"+           xlink:href="#glyph0-10"+           width="1"+           height="1" />+        <use+           id="use3939"+           y="43.740131"+           x="352.76041"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+        <use+           id="use3941"+           y="43.740131"+           x="364.13568"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use3943"+           y="43.740131"+           x="373.95914"+           xlink:href="#glyph0-11"+           width="1"+           height="1" />+        <use+           id="use3945"+           y="43.740131"+           x="385.33444"+           xlink:href="#glyph0-12"+           width="1"+           height="1" />+      </g>+      <g+         id="g3947"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3949"+           y="81.322166"+           x="211.80859"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use3951"+           y="81.322166"+           x="230.31656"+           xlink:href="#glyph0-14"+           width="1"+           height="1" />+      </g>+      <g+         id="g3953"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3955"+           y="177.2245"+           x="3.644531"+           xlink:href="#glyph0-1"+           width="1"+           height="1" />+        <use+           id="use3957"+           y="177.2245"+           x="11.745329"+           xlink:href="#glyph0-9"+           width="1"+           height="1" />+        <use+           id="use3959"+           y="177.2245"+           x="30.296013"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use3961"+           y="177.2245"+           x="40.119473"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+      </g>+      <path+         id="path3963"+         transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+         d="m -8.30078e-4,-18.562018 0,56.563049 c 0,2.759827 2.237335078,4.999842 4.999841078,4.999842 l 111.298719,0 c 2.76251,0 4.99984,-2.240015 4.99984,-4.999842 l 0,-56.563049 c 0,-2.762506 -2.23733,-4.999841 -4.99984,-4.999841 l -111.298719,0 c -2.762506,0 -4.999841078,2.237335 -4.999841078,4.999841 z"+         style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <path+         id="path3965"+         transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+         d="m -8.30078e-4,14.719348 121.298400078,0"+         style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g3967"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3969"+           y="177.2245"+           x="63.964844"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+        <use+           id="use3971"+           y="177.2245"+           x="75.340126"+           xlink:href="#glyph0-5"+           width="1"+           height="1" />+        <use+           id="use3973"+           y="177.2245"+           x="93.848099"+           xlink:href="#glyph0-6"+           width="1"+           height="1" />+        <use+           id="use3975"+           y="177.2245"+           x="118.27863"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+        <use+           id="use3977"+           y="177.2245"+           x="127.54684"+           xlink:href="#glyph0-15"+           width="1"+           height="1" />+        <use+           id="use3979"+           y="177.2245"+           x="146.09753"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+        <use+           id="use3981"+           y="177.2245"+           x="157.47281"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+      </g>+      <path+         id="path3983"+         transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+         d="m 80.878168,-18.562018 0,23.281684 c 0,2.759826 2.237335,4.999841 4.999841,4.999841 l 25.419881,0 c 2.7625,0 4.99984,-2.240015 4.99984,-4.999841 l 0,-23.281684 c 0,-2.762506 -2.23734,-4.999841 -4.99984,-4.999841 l -25.419881,0 c -2.762506,0 -4.999841,2.237335 -4.999841,4.999841 z"+         style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g3985"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3987"+           y="177.2245"+           x="178.23047"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use3989"+           y="177.2245"+           x="196.73843"+           xlink:href="#glyph0-14"+           width="1"+           height="1" />+      </g>+      <g+         id="g3991"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3993"+           y="229.38857"+           x="122.92188"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use3995"+           y="229.38857"+           x="141.42986"+           xlink:href="#glyph0-7"+           width="1"+           height="1" />+      </g>+      <g+         id="g3997"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use3999"+           y="325.28702"+           x="3.644531"+           xlink:href="#glyph0-16"+           width="1"+           height="1" />+        <use+           id="use4001"+           y="325.28702"+           x="20.899656"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use4003"+           y="325.28702"+           x="30.72312"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+      </g>+      <path+         id="path4005"+         transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+         d="m -8.30078e-4,-18.562897 0,23.281684 c 0,2.762506 2.237335078,4.999841 4.999841078,4.999841 l 20.567407,0 c 2.759827,0 4.999842,-2.237335 4.999842,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.240015,-4.999841 -4.999842,-4.999841 l -20.567407,0 c -2.762506,0 -4.999841078,2.240015 -4.999841078,4.999841 z"+         style="fill:#ff7f7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g4007"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4009"+           y="325.28702"+           x="60.320312"+           xlink:href="#glyph0-17"+           width="1"+           height="1" />+        <use+           id="use4011"+           y="325.28702"+           x="71.752548"+           xlink:href="#glyph0-14"+           width="1"+           height="1" />+      </g>+      <g+         id="g4013"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4015"+           y="325.28702"+           x="101.23828"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+      </g>+      <path+         id="path4017"+         transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+         d="m 43.36864,-18.562897 0,23.281684 c 0,2.762506 2.237335,4.999841 4.999841,4.999841 l 25.41988,0 c 2.762506,0 4.999841,-2.237335 4.999841,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.237335,-4.999841 -4.999841,-4.999841 l -25.41988,0 c -2.762506,0 -4.999841,2.240015 -4.999841,4.999841 z"+         style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g4019"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4021"+           y="325.28702"+           x="123.54688"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use4023"+           y="325.28702"+           x="142.05486"+           xlink:href="#glyph0-7"+           width="1"+           height="1" />+      </g>+      <g+         id="g4025"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4027"+           y="325.28702"+           x="171.53906"+           xlink:href="#glyph0-18"+           width="1"+           height="1" />+      </g>+      <path+         id="path4029"+         transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+         d="m 90.146362,-18.562897 0,23.281684 c 0,2.762506 2.237336,4.999841 4.999842,4.999841 l 25.419876,0 c 2.76251,0 4.99984,-2.237335 4.99984,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.23733,-4.999841 -4.99984,-4.999841 l -25.419876,0 c -2.762506,0 -4.999842,2.240015 -4.999842,4.999841 z"+         style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g4031"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4033"+           y="325.28702"+           x="191.74219"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use4035"+           y="325.28702"+           x="210.25015"+           xlink:href="#glyph0-14"+           width="1"+           height="1" />+      </g>+      <g+         id="g4037"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4039"+           y="325.28702"+           x="239.73438"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+      </g>+      <g+         id="g4041"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4043"+           y="417.54092"+           x="3.644531"+           xlink:href="#glyph0-19"+           width="1"+           height="1" />+        <use+           id="use4045"+           y="417.54092"+           x="18.778358"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+        <use+           id="use4047"+           y="417.54092"+           x="28.601822"+           xlink:href="#glyph0-3"+           width="1"+           height="1" />+      </g>+      <path+         id="path4049"+         transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+         d="m -8.30078e-4,-18.563733 0,56.563049 c 0,2.762507 2.237335078,4.999842 4.999841078,4.999842 l 62.763281,0 c 2.762507,0 4.999842,-2.237335 4.999842,-4.999842 l 0,-56.563049 c 0,-2.759827 -2.237335,-4.999841 -4.999842,-4.999841 l -62.763281,0 c -2.762506,0 -4.999841078,2.240014 -4.999841078,4.999841 z"+         style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <path+         id="path4051"+         transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+         d="m -8.30078e-4,14.717633 72.762964078,0"+         style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g4053"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4055"+           y="417.54092"+           x="63.964844"+           xlink:href="#glyph0-4"+           width="1"+           height="1" />+        <use+           id="use4057"+           y="417.54092"+           x="75.340126"+           xlink:href="#glyph0-8"+           width="1"+           height="1" />+        <use+           id="use4059"+           y="417.54092"+           x="86.715416"+           xlink:href="#glyph0-2"+           width="1"+           height="1" />+      </g>+      <path+         id="path4061"+         transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+         d="m 32.342731,-18.563733 0,23.281683 c 0,2.762507 2.237335,4.999842 4.999841,4.999842 l 25.419879,0 c 2.762506,0 4.999841,-2.237335 4.999841,-4.999842 l 0,-23.281683 c 0,-2.759827 -2.237335,-4.999841 -4.999841,-4.999841 l -25.419879,0 c -2.762506,0 -4.999841,2.240014 -4.999841,4.999841 z"+         style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+         inkscape:connector-curvature="0" />+      <g+         id="g4063"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4065"+           y="417.54092"+           x="107.47266"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use4067"+           y="417.54092"+           x="125.98063"+           xlink:href="#glyph0-9"+           width="1"+           height="1" />+      </g>+      <g+         id="g4069"+         style="fill:#000000;fill-opacity:1">+        <use+           id="use4071"+           y="469.70499"+           x="87.542969"+           xlink:href="#glyph0-13"+           width="1"+           height="1" />+        <use+           id="use4073"+           y="469.70499"+           x="106.05094"+           xlink:href="#glyph0-9"+           width="1"+           height="1" />+      </g>+    </g>+    <text+       xml:space="preserve"+       style="font-size:72px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+       x="406.8136"+       y="408.48969"+       id="text3468-5"+       sodipodi:linespacing="125%"><tspan+         sodipodi:role="line"+         x="406.8136"+         y="408.48969"+         id="tspan3472-8">Type :view x in GHCi</tspan><tspan+         sodipodi:role="line"+         x="406.8136"+         y="498.48969"+         id="tspan5130">to visualize expression x</tspan></text>+    <g+       transform="matrix(1.25,0,0,-1.25,439.73215,1037.3623)"+       id="g4843">+      <g+         id="g4845"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 110.125,-23.82 c 0,9.644 -11.727,17.461 -26.191,17.461 -14.465,0 -26.188,-7.817 -26.188,-17.461 0,-9.645 11.723,-17.461 26.188,-17.461 14.464,0 26.191,7.816 26.191,17.461"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4847" />+      </g>+      <g+         id="g4849"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 110.125,-130.52 c 0,13.93 -11.727,25.219 -26.191,25.219 -14.465,0 -26.188,-11.289 -26.188,-25.219 0,-13.929 11.723,-25.218 26.188,-25.218 14.464,0 26.191,11.289 26.191,25.218"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4851" />+      </g>+      <text+         transform="matrix(1,0,0,-1,79.570312,287.62471)"+         id="text4853">+        <tspan+           style="font-size:25.9445858px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0"+           y="0"+           id="tspan4855">:</tspan>+      </text>+      <g+         id="g4857"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 105.273,-217.82 c 0,13.929 -22.582,25.218 -50.437,25.218 -27.859,0 -50.441,-11.289 -50.441,-25.218 0,-13.93 22.582,-25.219 50.441,-25.219 27.855,0 50.437,11.289 50.437,25.219"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4859" />+      </g>+      <text+         transform="matrix(1,0,0,-1,26.703125,200.02351)"+         id="text4861">+        <tspan+           style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 14.693829 34.099895 41.45842"+           y="0"+           sodipodi:role="line"+           id="tspan4863">S# 1</tspan>+      </text>+      <g+         id="g4865"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 175.113,-217.82 c 0,13.929 -11.722,25.218 -26.187,25.218 -14.465,0 -26.192,-11.289 -26.192,-25.218 0,-13.93 11.727,-25.219 26.192,-25.219 14.465,0 26.187,11.289 26.187,25.219"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4867" />+      </g>+      <text+         transform="matrix(1,0,0,-1,144.55859,200.32393)"+         id="text4869">+        <tspan+           style="font-size:25.9445858px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0"+           y="0"+           id="tspan4871">:</tspan>+      </text>+      <g+         id="g4873"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 170.266,-392.422 c 0,13.93 -22.582,25.223 -50.442,25.223 -27.855,0 -50.437,-11.293 -50.437,-25.223 0,-13.926 22.582,-25.219 50.437,-25.219 27.86,0 50.442,11.293 50.442,25.219"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4875" />+      </g>+      <text+         transform="matrix(1,0,0,-1,91.695313,25.421945)"+         id="text4877">+        <tspan+           style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 14.693829 34.099895 41.45842"+           y="0"+           sodipodi:role="line"+           id="tspan4879">S# 1</tspan>+      </text>+      <g+         id="g4881"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 275.023,-305.121 c 0,13.93 -28.66,25.223 -64.019,25.223 -35.356,0 -64.02,-11.293 -64.02,-25.223 0,-13.926 28.664,-25.219 64.02,-25.219 35.359,0 64.019,11.293 64.019,25.219"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4883" />+      </g>+      <text+         transform="matrix(1,0,0,-1,173.66016,112.83297)"+         id="text4885">+        <tspan+           style="font-size:24.19260597px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 14.733297 30.023024 45.336945 60.626671"+           y="0"+           sodipodi:role="line"+           id="tspan4887">Thunk</tspan>+      </text>+      <g+         id="g4889"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 288.605,-392.422 c 0,13.93 -22.582,25.223 -50.441,25.223 -27.855,0 -50.437,-11.293 -50.437,-25.223 0,-13.926 22.582,-25.219 50.437,-25.219 27.859,0 50.441,11.293 50.441,25.219"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4891" />+      </g>+      <text+         transform="matrix(1,0,0,-1,210.03516,25.421945)"+         id="text4893">+        <tspan+           style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 14.693829 34.099895 41.45842"+           y="0"+           sodipodi:role="line"+           id="tspan4895">S# 0</tspan>+      </text>+      <g+         id="g4897"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 83.934,-41.281 c 0,-14.547 0,-35.891 0,-54.321"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4899" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 87.816,328.398 -3.882,-9.699 -2.911,9.699 6.793,0 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4901" />+      <g+         id="g4903"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 87.816,-95.602 -3.882,-9.699 -2.911,9.699 6.793,0 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4905" />+      </g>+      <text+         transform="matrix(1,0,0,-1,84.421875,344.52158)"+         id="text4907">+        <tspan+           style="font-size:22.93732834px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+           x="0 8.9455585 23.510763 30.758959 45.324162 52.595295 59.866428"+           y="0"+           sodipodi:role="line"+           id="tspan4909">[1,1..]</tspan>+      </text>+      <g+         id="g4911"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 76.176,-154.77 c -2.91,-8.73 -6.789,-19.402 -9.699,-29.101"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4913" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 69.387,239.16 -5.821,-7.762 -0.972,9.704 6.793,-1.942 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4915" />+      <g+         id="g4917"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 69.387,-184.84 -5.821,-7.762 -0.972,9.704 6.793,-1.942 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4919" />+      </g>+      <g+         id="g4921"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 99.453,-150.891 c 8.731,-11.64 19.402,-26.187 28.133,-38.8"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4923" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 130.496,236.25 2.91,-9.699 -8.73,5.82 5.82,3.879 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4925" />+      <g+         id="g4927"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 130.496,-187.75 2.91,-9.699 -8.73,5.82 5.82,3.879 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4929" />+      </g>+      <g+         id="g4931"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 145.047,-243.039 c -2.91,-10.672 -4.852,-24.25 -6.793,-36.859 -3.879,-26.192 -8.731,-55.293 -12.609,-77.602"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4933" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 128.555,66.5 -4.852,-9.699 -1.937,10.668 6.789,-0.969 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4935" />+      <g+         id="g4937"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 128.555,-357.5 -4.852,-9.699 -1.937,10.668 6.789,-0.969 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4939" />+      </g>+      <g+         id="g4941"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 163.477,-239.16 c 7.757,-9.699 16.488,-22.309 24.25,-33.949"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4943" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 190.637,152.828 2.91,-9.699 -7.762,5.82 4.852,3.879 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4945" />+      <g+         id="g4947"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 190.637,-271.172 2.91,-9.699 -7.762,5.82 4.852,3.879 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4949" />+      </g>+      <g+         id="g4951"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 186.754,-328.398 c -11.641,-10.672 -24.25,-23.282 -35.891,-34.922"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4953" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 152.805,58.738 -9.7,-4.847 4.848,9.699 4.852,-4.852 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4955" />+      <g+         id="g4957"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 152.805,-365.262 -9.7,-4.847 4.848,9.699 4.852,-4.852 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4959" />+      </g>+      <g+         id="g4961"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 218.766,-330.34 c 2.91,-8.73 5.82,-18.43 8.73,-27.16"+           style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4963" />+      </g>+      <path+         inkscape:connector-curvature="0"+         d="m 230.406,67.469 0,-10.668 -5.82,7.758 5.82,2.91 z"+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+         id="path4965" />+      <g+         id="g4967"+         transform="translate(0,424)">+        <path+           inkscape:connector-curvature="0"+           d="m 230.406,-356.531 0,-10.668 -5.82,7.758 5.82,2.91 z"+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+           id="path4969" />+      </g>+    </g>+  </g>+</svg>
ghc-vis.cabal view
@@ -1,5 +1,5 @@ name:               ghc-vis-version:            0.5+version:            0.6 license:            BSD3 license-file:       LICENSE category:           GHC, Debug, Development@@ -21,16 +21,24 @@                     <http://felsin9.de/nnis/ghc-vis/#combined-debugger>  tested-with: GHC == 7.4.1, GHC == 7.4.2, GHC == 7.6.1-data-files: ghci+data-files: ghci data/main.ui data/welcome.svg data/legend_graph.svg data/legend_list.svg Extra-source-files: nonghci-test.hs  flag graph   Default: True   Description: "Enable graph view using Graphviz" +flag full+  Default: True+  Description: "Full ghc-vis window: decorations, buttons, legend"++flag sdl+  Default: False+  Description: "SDL window"+ Library   Exposed-modules: GHC.Vis-  Other-modules: GHC.Vis.Internal GHC.Vis.Types GHC.Vis.View.List GHC.Vis.View.Common+  Other-modules: GHC.Vis.Internal GHC.Vis.Types GHC.Vis.View.List GHC.Vis.View.Common Paths_ghc_vis   Default-Language: Haskell2010   Build-depends: base == 4.*,                  mtl >= 2.0,@@ -50,6 +58,15 @@                      xdot >= 0.2       Cpp-options: -DGRAPH_VIEW ---source-repository head---    type:     darcs---    location: http://+  if flag(full)+      Build-depends: svgcairo >= 0.12+      Cpp-options: -DFULL_WINDOW++  if flag(sdl)+      Build-depends: SDL >= 0.6,+                     cairo >= 0.12.4+      Cpp-options: -DSDL_WINDOW++source-repository head+    type:     git+    location: git://r0q.ath.cx/vis
ghci view
@@ -1,4 +1,6 @@-:def vis    \_ -> return $ "GHC.Vis.visualization"+:def vis    \_ -> return $ "GHC.Vis.vis"+:def mvis   \_ -> return $ "GHC.Vis.mvis"+:def svis   \_ -> return $ "GHC.Vis.svis" :def view   \x -> return $ "GHC.Vis.view (" ++ x ++ ") " ++ show x :def eval   \x -> return $ "GHC.Vis.eval \"" ++ x ++ "\"" :def switch \_ -> return $ "GHC.Vis.switch"
src/GHC/Vis.hs view
@@ -34,7 +34,11 @@ >   putStrLn "End"  -} module GHC.Vis (-  visualization, -- TODO: Maybe rename to vis+  vis,+  mvis,+#ifdef SDL_WINDOW+  svis,+#endif   view,   eval,   switch,@@ -50,7 +54,7 @@ import Prelude hiding (error) #endif -import Graphics.UI.Gtk hiding (Box, Signal)+import Graphics.UI.Gtk hiding (Box, Signal, get, response) import qualified Graphics.UI.Gtk.Gdk.Events as E  import System.IO@@ -79,6 +83,16 @@  import Graphics.Rendering.Cairo +#ifdef FULL_WINDOW+import Graphics.Rendering.Cairo.SVG+import Paths_ghc_vis as My+#endif++#ifdef SDL_WINDOW+import qualified Graphics.UI.SDL as SDL+import Foreign.Ptr ( castPtr )+#endif+ views :: [View] views =   View List.redraw List.click List.move List.updateObjects List.export :@@ -108,13 +122,38 @@ signalTimeout :: Int signalTimeout = 1000000 +#ifdef SDL_WINDOW+black = SDL.Pixel maxBound+white = SDL.Pixel 0xFFFFFF+#endif+ -- | This is the main function. It's to be called from GHCi and launches a --   graphical window in a new thread.-visualization :: IO ()-visualization = do+vis :: IO ()+#ifdef FULL_WINDOW+vis = do   vr <- swapMVar visRunning True   unless vr $ void $ forkIO visMainThread+#else+vis = mvis+#endif +-- | A minimalistic version of ghc-vis, without window decorations, help and+--   all that other stuff.+mvis :: IO ()+mvis = do+  vr <- swapMVar visRunning True+  unless vr $ void $ forkIO mVisMainThread++#ifdef SDL_WINDOW+-- | SDL version. Not properly working yet. Mainly for testing whether SDL+--   works better than GTK on some platforms.+svis :: IO ()+svis = do+  vr <- swapMVar visRunning True+  unless vr $ void $ forkIO sdlVisMainThread+#endif+ -- | Add expressions with a name to the visualization window. view :: a -> String -> IO () view a name = put $ NewSignal (asBox a) name@@ -140,10 +179,15 @@ -- | Export the current visualization view to a file, format depends on the --   file ending. Currently supported: svg, png, pdf, ps export :: String -> IO ()-export filename = case mbDrawFn of-  Right error -> putStrLn error-  Left _ -> put $ ExportSignal ((\(Left x) -> x) mbDrawFn) filename+export filename = void $ export' filename +export' :: String -> IO (Maybe String)+export' filename = case mbDrawFn of+  Right error -> do putStrLn error+                    return $ Just error+  Left _ -> do put $ ExportSignal ((\(Left x) -> x) mbDrawFn) filename+               return Nothing+   where mbDrawFn = case map toLower (reverse . take 4 . reverse $ filename) of           ".svg"  -> Left withSVGSurface           ".pdf"  -> Left withPDFSurface@@ -161,8 +205,8 @@ put :: Signal -> IO () put s = void $ timeout signalTimeout $ putMVar visSignal s -visMainThread :: IO ()-visMainThread = do+mVisMainThread :: IO ()+mVisMainThread = do   initGUI   window <- windowNew @@ -180,6 +224,50 @@     runCorrect move >>= \f -> f canvas     return True +  dummy <- windowNew++  setupGUI window canvas dummy++#ifdef SDL_WINDOW+sdlVisMainThread :: IO ()+sdlVisMainThread = SDL.withInit [ SDL.InitVideo ] $ do+  screen <- SDL.setVideoMode 600 600 32 [ SDL.Resizable ]++  SDL.fillRect screen Nothing black++  pixels <- fmap castPtr $ SDL.surfaceGetPixels screen++  -- Here we test the first of the user facing functions added by the patch.+  -- Be sure to use FORMATRGB24 so Cairo and SDL don't conflict about alpha+  -- values. If you need to use alpha channel in your Cairo routines, consider+  -- using an independent Cairo surface to buffer your alpha drawing to.+  --renderWith canvas demo1++  -- And here is the other new function for when you want to hide the+  -- Cairo.Surface from the caller.++  canvas <- createImageSurfaceForData pixels FormatRGB24 600 600 (600 * 4)++  reactThread <- forkIO $ react2++  let idle = do+        e <- SDL.waitEvent+        case e of+          SDL.Quit -> quit reactThread+          otherwise -> do+            putStrLn "Updating"+            s <- List.getState+            SDL.fillRect screen Nothing white+            boundingBoxes <- renderWith canvas $ List.draw s 600 600+            List.updateBoundingBoxes boundingBoxes+            SDL.flip screen+            idle++  idle+#endif++setupGUI :: (WidgetClass w1, WidgetClass w2, WidgetClass w3) => w1 -> w2 -> w3 -> IO ()+setupGUI window canvas legendCanvas = do   onMotionNotify canvas False $ \e -> do     state <- readIORef visState     modifyIORef visState (\s -> s {mousePos = (E.eventX e, E.eventY e)})@@ -316,7 +404,7 @@    widgetShowAll window -  reactThread <- forkIO $ react canvas window+  reactThread <- forkIO $ react canvas legendCanvas   --onDestroy window mainQuit -- Causes :r problems with multiple windows   onDestroy window (quit reactThread) @@ -328,8 +416,64 @@   swapMVar visRunning False   killThread reactThread +#ifdef SDL_WINDOW+react2 :: IO b+react2 = do+  -- Timeout used to handle ghci reloads (:r)+  -- Reloads cause the visSignal to be reinitialized, but takeMVar is still+  -- waiting for the old one.  This solution is not perfect, but it works for+  -- now.+  mbSignal <- timeout signalTimeout (takeMVar visSignal)+  case mbSignal of+    Nothing -> do+      running <- readMVar visRunning+      if running then react2 else+        -- :r caused visRunning to be reset+        (do swapMVar visRunning True+            timeout signalTimeout (putMVar visSignal UpdateSignal)+            react2)+    Just signal -> do+      case signal of+        NewSignal x n  -> modifyMVar_ visBoxes (+          \y -> return $ if (x,n) `elem` y then y else y ++ [(x,n)])+        ClearSignal    -> modifyMVar_ visBoxes (\_ -> return [])+        UpdateSignal   -> return ()+        SwitchSignal   -> doSwitch+        ExportSignal d f -> catch (runCorrect exportView >>= \e -> e d f)+          (\e -> do let err = show (e :: IOException)+                    hPutStrLn stderr $ "Couldn't export to file \"" ++ f ++ "\": " ++ err+                    return ())++      boxes <- readMVar visBoxes+      performGC -- TODO: Else Blackholes appear. Do we want this?+                -- Blackholes stop our current thread and only resume after+                -- they have been replaced with their result, thereby leading+                -- to an additional element in the HeapMap we don't want.+                -- Example for bad behaviour that would happen then:+                -- λ> let xs = [1..42] :: [Int]+                -- λ> let x = 17 :: Int+                -- λ> let ys = [ y | y <- xs, y >= x ]++      runCorrect updateObjects >>= \f -> f boxes++      --postGUISync $ widgetQueueDraw canvas+      --postGUISync $ widgetQueueDraw legendCanvas+      react2++#ifdef GRAPH_VIEW+  where doSwitch = isGraphvizInstalled >>= \gvi -> if gvi+          then modifyIORef visState (\s -> s {T.view = succN (T.view s), zoomRatio = 1, position = (0, 0)})+          else putStrLn "Cannot switch view: Graphviz not installed"++        succN GraphView = ListView+        succN ListView = GraphView+#else+  where doSwitch = putStrLn "Cannot switch view: Graph view disabled at build"+#endif+#endif+ react :: (WidgetClass w1, WidgetClass w2) => w1 -> w2 -> IO b-react canvas window = do+react canvas legendCanvas = do   -- Timeout used to handle ghci reloads (:r)   -- Reloads cause the visSignal to be reinitialized, but takeMVar is still   -- waiting for the old one.  This solution is not perfect, but it works for@@ -338,15 +482,15 @@   case mbSignal of     Nothing -> do       running <- readMVar visRunning-      if running then react canvas window else+      if running then react canvas legendCanvas else         -- :r caused visRunning to be reset         (do swapMVar visRunning True             timeout signalTimeout (putMVar visSignal UpdateSignal)-            react canvas window)+            react canvas legendCanvas)     Just signal -> do       case signal of         NewSignal x n  -> modifyMVar_ visBoxes (-          \y -> if (x,n) `elem` y then return y else return $ y ++ [(x,n)])+          \y -> return $ if (x,n) `elem` y then y else y ++ [(x,n)])         ClearSignal    -> modifyMVar_ visBoxes (\_ -> return [])         UpdateSignal   -> return ()         SwitchSignal   -> doSwitch@@ -368,7 +512,8 @@       runCorrect updateObjects >>= \f -> f boxes        postGUISync $ widgetQueueDraw canvas-      react canvas window+      postGUISync $ widgetQueueDraw legendCanvas+      react canvas legendCanvas  #ifdef GRAPH_VIEW   where doSwitch = isGraphvizInstalled >>= \gvi -> if gvi@@ -399,6 +544,117 @@       newPos = (oldPosX * zoom, oldPosY * zoom)    return newPos++#ifdef FULL_WINDOW+visMainThread :: IO ()+visMainThread = do+  initGUI++  mainUIFile <- My.getDataFileName "data/main.ui"+  builder <- builderNew+  builderAddFromFile builder mainUIFile++  let get :: forall cls . GObjectClass cls+          => (GObject -> cls)+          -> String+          -> IO cls+      get = builderGetObject builder++  window       <- get castToWindow "window"+  canvas       <- get castToDrawingArea "drawingarea"++  saveDialog   <- get castToFileChooserDialog "savedialog"+  aboutDialog  <- get castToAboutDialog "aboutdialog"++  legendDialog <- get castToWindow "legenddialog"+  legendCanvas <- get castToDrawingArea "legenddrawingarea"++  newFilter "*.pdf" "PDF" saveDialog+  newFilter "*.svg" "SVG" saveDialog+  newFilter "*.ps" "PostScript" saveDialog+  newFilter "*.png" "PNG" saveDialog++  onResponse saveDialog $ fileSave saveDialog+  onResponse aboutDialog $ const $ widgetHide aboutDialog++  onDelete saveDialog   $ const $ widgetHide saveDialog   >> return True+  onDelete aboutDialog  $ const $ widgetHide aboutDialog  >> return True+  onDelete legendDialog $ const $ widgetHide legendDialog >> return True++  get castToMenuItem "clear"  >>= \item -> onActivateLeaf item clear+  get castToMenuItem "switch" >>= \item -> onActivateLeaf item switch+  get castToMenuItem "update" >>= \item -> onActivateLeaf item update+  get castToMenuItem "export" >>= \item -> onActivateLeaf item $ widgetShow saveDialog+  get castToMenuItem "quit"   >>= \item -> onActivateLeaf item $ widgetDestroy window+  get castToMenuItem "about"  >>= \item -> onActivateLeaf item $ widgetShow aboutDialog+  get castToMenuItem "legend" >>= \item -> onActivateLeaf item $ widgetShow legendDialog++  widgetModifyBg canvas StateNormal backgroundColor+  widgetModifyBg legendCanvas StateNormal backgroundColor++  welcomeSVG <- My.getDataFileName "data/welcome.svg" >>= svgNewFromFile++  legendListSVG  <- My.getDataFileName "data/legend_list.svg" >>= svgNewFromFile+  legendGraphSVG <- My.getDataFileName "data/legend_graph.svg" >>= svgNewFromFile++  onExpose canvas $ const $ do+    boxes <- readMVar visBoxes++    if null boxes+    then renderSVGScaled canvas welcomeSVG+    else do+      runCorrect redraw >>= \f -> f canvas+      runCorrect move >>= \f -> f canvas+      return True++  onExpose legendCanvas $ const $ do+    state <- readIORef visState+    renderSVGScaled legendCanvas $ case T.view state of+      ListView  -> legendListSVG+      GraphView -> legendGraphSVG++  setupGUI window canvas legendCanvas++fileSave :: FileChooserDialog -> ResponseId -> IO ()+fileSave fcdialog response = do+  case response of+    ResponseOk -> do Just filename <- fileChooserGetFilename fcdialog+                     mbError <- export' filename+                     case mbError of+                       Nothing -> return ()+                       Just error -> do+                         errorDialog <- messageDialogNew Nothing [] MessageError ButtonsOk error+                         widgetShow errorDialog+                         onResponse errorDialog $ const $ widgetHide errorDialog+                         return ()+    _ -> return ()+  widgetHide fcdialog++newFilter :: FileChooserClass fc => String -> String -> fc -> IO ()+newFilter filterString name dialog = do+  filt <- fileFilterNew+  fileFilterAddPattern filt filterString+  fileFilterSetName filt $ name ++ " (" ++ filterString ++ ")"+  fileChooserAddFilter dialog filt++renderSVGScaled :: (WidgetClass w) => w -> SVG -> IO Bool+renderSVGScaled canvas svg = do+  E.Rectangle _ _ rw2 rh2 <- widgetGetAllocation canvas+  win <- widgetGetDrawWindow canvas+  renderWithDrawable win $ do+    let (cx2, cy2) = svgGetSize svg++        (rw,rh) = (fromIntegral rw2, fromIntegral rh2)+        (cx,cy) = (fromIntegral cx2, fromIntegral cy2)++        -- Proportional scaling+        (sx,sy) = (min (rw/cx) (rh/cy), sx)+        (ox,oy) = (rw/2 - sx*cx/2, rh/2 - sy*cy/2)++    translate ox oy+    scale sx sy+    svgRender svg+#endif  -- Zoom into mouse, but only working from (0,0) -- newPos = ( oldPosX + x * zoomRatio s - x * newZoomRatio
src/GHC/Vis/Types.hs view
@@ -28,6 +28,7 @@ import Graphics.UI.Gtk hiding (Box, Signal, Point) import Graphics.Rendering.Cairo +-- | A simple Point type Point = (Double, Double)  -- | A function to draw a cairo drawing to a file.@@ -83,6 +84,7 @@   , heapMap' :: HeapMap   } +-- | The state of a printing operation type PrintState = MS.State PState  -- | Simple representation of objects on the heap, so they can be arranged linearly
src/GHC/Vis/View/Graph/Parser.hs view
@@ -12,6 +12,8 @@ ) where +import Data.List+ import Control.Monad  import qualified Data.Text.Lazy as B@@ -85,7 +87,7 @@       mbEdges xs (p,c) = return $ map (\b -> (p, boxPos b)) (allPtrs c) ++ xs        boxPos :: Box -> Maybe Int-      boxPos b = lookup b $ zip (map fst rhm) [0..]+      boxPos b = elemIndex b $ map fst rhm        bcoChildren :: [Box] -> IO [Int]       bcoChildren [] = return []@@ -120,6 +122,7 @@ defaultVis :: (Graph gr) => gr String String -> DotGraph Node defaultVis = graphToDot nonClusteredParams   -- Somehow (X11Color Transparency) is white, use (RGBA 0 0 0 0) instead+  -- Ordering OutEdges is not strong enough to force edge ordering, might not look good anyway   { globalAttributes = [GraphAttrs [BgColor [RGBA 0 0 0 0], FontName fontName, FontSize graphFontSize]]   , fmtNode = \ (_,l) -> [toLabel l, FontName fontName, FontSize nodeFontSize]   --, fmtNode = \ (_,l) -> [toLabel l, FontName fontName, FontSize nodeFontSize, Style [SItem Filled []], FillColor [RGBA 255 255 255 255], Color [RGBA 0 0 0 255]]
src/GHC/Vis/View/List.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE CPP, RankNTypes #-} {- |    Module      : GHC.Vis.View.List    Copyright   : (c) Dennis Felsing@@ -8,6 +8,13 @@  -} module GHC.Vis.View.List (   export,++#ifdef SDL_WINDOW+  getState,+  draw,+  updateBoundingBoxes,+#endif+   redraw,   click,   move,@@ -91,6 +98,15 @@    boundingBoxes <- render canvas (draw s rw2 rh2)   modifyIORef state (\s' -> s' {bounds = boundingBoxes})++#ifdef SDL_WINDOW+getState :: IO State+getState = readIORef state++updateBoundingBoxes :: [(String, Rectangle)] -> IO ()+updateBoundingBoxes boundingBoxes = do+  modifyIORef state (\s' -> s' {bounds = boundingBoxes})+#endif  -- | Export the visualization to an SVG file export :: DrawFunction -> String -> IO ()