dotparse 0.0.3 → 0.1.0.0
raw patch · 12 files changed
+1992/−254 lines, 12 filesdep ~chart-svgdep ~containersdep ~flatparsePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: chart-svg, containers, flatparse, optics-core, process-extras, string-interpolate, template-haskell, text, these
API changes (from Hackage documentation)
- DotParse: [labelf] :: ChartConfig -> ID -> Text
- DotParse: [nodeHeight] :: ChartConfig -> Double
- DotParse: [nodeSize] :: ChartConfig -> Double
- DotParse: [vshift] :: ChartConfig -> Double
- DotParse.Examples.NumHask: dotGraphNH' :: Directed -> Graph
- DotParse.Examples.NumHask: toLink :: ID -> Text
- DotParse.Examples.NumHask: writeNHChart :: IO ()
- DotParse.Types: [labelf] :: ChartConfig -> ID -> Text
- DotParse.Types: [nodeHeight] :: ChartConfig -> Double
- DotParse.Types: [nodeSize] :: ChartConfig -> Double
- DotParse.Types: [vshift] :: ChartConfig -> Double
+ DotParse: [backupNodeHeight] :: ChartConfig -> Double
+ DotParse: [backupNodeWidth] :: ChartConfig -> Double
+ DotParse: [chartVshift] :: ChartConfig -> Double
+ DotParse: [escapeText] :: ChartConfig -> EscapeText
+ DotParse: [nodeBorderSize] :: ChartConfig -> Double
+ DotParse.Examples.AST: ComponentEdge :: ByteString -> ByteString -> ByteString -> Maybe ByteString -> ComponentEdge
+ DotParse.Examples.AST: ItemModule :: ByteString -> ByteString -> ByteString -> ItemModule
+ DotParse.Examples.AST: SubComponents :: ByteString -> [ByteString] -> SubComponents
+ DotParse.Examples.AST: [classComponent] :: SubComponents -> ByteString
+ DotParse.Examples.AST: [edgeClassComponent] :: ComponentEdge -> ByteString
+ DotParse.Examples.AST: [edgeLabel] :: ComponentEdge -> Maybe ByteString
+ DotParse.Examples.AST: [edgeSubComponent] :: ComponentEdge -> ByteString
+ DotParse.Examples.AST: [itemModule] :: ItemModule -> ByteString
+ DotParse.Examples.AST: [itemPackage] :: ItemModule -> ByteString
+ DotParse.Examples.AST: [item] :: ItemModule -> ByteString
+ DotParse.Examples.AST: [subComponentClass] :: ComponentEdge -> ByteString
+ DotParse.Examples.AST: [subComponents] :: SubComponents -> [ByteString]
+ DotParse.Examples.AST: allSC :: [SubComponents]
+ DotParse.Examples.AST: componentEdges :: [ComponentEdge]
+ DotParse.Examples.AST: data ComponentEdge
+ DotParse.Examples.AST: data ItemModule
+ DotParse.Examples.AST: data SubComponents
+ DotParse.Examples.AST: dotAST :: [SubComponents] -> [ComponentEdge] -> Graph
+ DotParse.Examples.AST: fromCEs :: [ComponentEdge] -> [SubComponents]
+ DotParse.Examples.AST: graphAST :: [SubComponents] -> [ComponentEdge] -> Graph (Maybe ByteString) (ByteString, ByteString)
+ DotParse.Examples.AST: graphEs :: [ComponentEdge] -> Graph (Maybe ByteString) (ByteString, ByteString)
+ DotParse.Examples.AST: graphVs :: Monoid a => [SubComponents] -> Graph a (ByteString, ByteString)
+ DotParse.Examples.AST: instance GHC.Classes.Eq DotParse.Examples.AST.ComponentEdge
+ DotParse.Examples.AST: instance GHC.Classes.Eq DotParse.Examples.AST.ItemModule
+ DotParse.Examples.AST: instance GHC.Classes.Eq DotParse.Examples.AST.SubComponents
+ DotParse.Examples.AST: instance GHC.Classes.Ord DotParse.Examples.AST.ComponentEdge
+ DotParse.Examples.AST: instance GHC.Classes.Ord DotParse.Examples.AST.SubComponents
+ DotParse.Examples.AST: instance GHC.Generics.Generic DotParse.Examples.AST.ComponentEdge
+ DotParse.Examples.AST: instance GHC.Generics.Generic DotParse.Examples.AST.ItemModule
+ DotParse.Examples.AST: instance GHC.Generics.Generic DotParse.Examples.AST.SubComponents
+ DotParse.Examples.AST: instance GHC.Show.Show DotParse.Examples.AST.ComponentEdge
+ DotParse.Examples.AST: instance GHC.Show.Show DotParse.Examples.AST.ItemModule
+ DotParse.Examples.AST: instance GHC.Show.Show DotParse.Examples.AST.SubComponents
+ DotParse.Examples.AST: itemModules :: [ItemModule]
+ DotParse.Examples.AST: recordEdges :: Directed -> Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]
+ DotParse.Examples.AST: recordNodes :: Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]
+ DotParse.Examples.AST: subs :: SubComponents -> [(ByteString, ByteString)]
+ DotParse.Examples.AST: toStatementsRecord :: Directed -> Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]
+ DotParse.Examples.AST: toURL :: ByteString -> Maybe ByteString
+ DotParse.Examples.NumHask: toLinkNH :: ID -> Text
+ DotParse.Types: [backupNodeHeight] :: ChartConfig -> Double
+ DotParse.Types: [backupNodeWidth] :: ChartConfig -> Double
+ DotParse.Types: [chartVshift] :: ChartConfig -> Double
+ DotParse.Types: [escapeText] :: ChartConfig -> EscapeText
+ DotParse.Types: [nodeBorderSize] :: ChartConfig -> Double
+ DotParse.Types: instance GHC.Classes.Eq DotParse.Types.ChartConfig
+ DotParse.Types: instance GHC.Show.Show DotParse.Types.ChartConfig
- DotParse: ChartConfig :: Double -> Double -> Double -> Colour -> Colour -> Double -> Double -> Double -> Double -> (ID -> Text) -> ChartConfig
+ DotParse: ChartConfig :: Double -> Double -> Double -> Double -> Colour -> Colour -> Double -> Double -> Double -> Double -> EscapeText -> ChartConfig
- DotParse: graphToChartWith :: ChartConfig -> Graph -> ChartOptions
+ DotParse: graphToChartWith :: ChartConfig -> (ID -> Text) -> Graph -> ChartOptions
- DotParse.Types: ChartConfig :: Double -> Double -> Double -> Colour -> Colour -> Double -> Double -> Double -> Double -> (ID -> Text) -> ChartConfig
+ DotParse.Types: ChartConfig :: Double -> Double -> Double -> Double -> Colour -> Colour -> Double -> Double -> Double -> Double -> EscapeText -> ChartConfig
- DotParse.Types: graphToChartWith :: ChartConfig -> Graph -> ChartOptions
+ DotParse.Types: graphToChartWith :: ChartConfig -> (ID -> Text) -> Graph -> ChartOptions
Files
- ChangeLog.md +5/−0
- LICENSE +30/−0
- dotparse.cabal +120/−115
- other/ast.svg +1114/−0
- other/exga.svg +9/−2
- other/nh.svg +9/−2
- readme.org +19/−44
- src/DotParse/Examples.hs +3/−3
- src/DotParse/Examples/AST.hs +592/−0
- src/DotParse/Examples/NumHask.hs +18/−22
- src/DotParse/FlatParse/TH.hs +1/−0
- src/DotParse/Types.hs +72/−66
ChangeLog.md view
@@ -1,3 +1,8 @@+0.1+===+- Added AST example+- defaultChartConfig/graphToChartWith refactor+ 0.0.3 ===
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2020, Tony Day++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Tony Day nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dotparse.cabal view
@@ -1,127 +1,132 @@-cabal-version: 3.0-name: dotparse-version: 0.0.3-synopsis: dot language parsing and printing.-description: This package provides parsing and printing of the dot language.+cabal-version: 3.0+name: dotparse+version: 0.1.0.0+license: BSD-3-Clause+license-file: LICENSE+copyright: Tony Day (c) 2020+category: graphics+author: Tony Day+maintainer: tonyday567@gmail.com+homepage: https://github.com/tonyday567/dotparse#readme+bug-reports: https://github.com/tonyday567/dotparse/issues+synopsis: dot language parsing and printing.+description:+ This package provides parsing and printing of the dot language. - == Usage+ == Usage - >>> :set -XOverloadedLabels- >>> :set -XOverloadedStrings- >>> import DotParse- >>> import Chart- >>> import DotParse.Examples (exInt)- >>> ex <- processGraph exInt- >>> writeChartOptions "other/exga.svg" (graphToChartWith defaultChartConfig ex)+ >>> :set -XOverloadedLabels+ >>> :set -XOverloadedStrings+ >>> import DotParse+ >>> import Chart+ >>> import Data.Text (pack)+ >>> import DotParse.Examples (exInt)+ >>> ex <- processGraph exInt+ >>> writeChartOptions "other/exga.svg" (graphToChart ex) - +  -category: project-author: Tony Day-maintainer: tonyday567@gmail.com-copyright: Tony Day (c) 2022-license: BSD-3-Clause-homepage: https://github.com/tonyday567/dotparse#readme-bug-reports: https://github.com/tonyday567/dotparse/issues-build-type: Simple-extra-doc-files: other/*.svg- ChangeLog.md- readme.org+build-type: Simple+tested-with: GHC == 8.10.7 || ==9.2.8 || ==9.4.5 || ==9.6.2 || ==9.8.1+extra-doc-files:+ ChangeLog.md+ other/*.svg+ readme.org source-repository head- type: git- location: https://github.com/tonyday567/dotparse+ type: git+ location: https://github.com/tonyday567/dotparse +common ghc-options-stanza+ ghc-options:+ -Wall+ -Wcompat+ -Widentities+ -Wincomplete-record-updates+ -Wincomplete-uni-patterns+ -Wpartial-fields+ -Wredundant-constraints+ common ghc2021-stanza- if impl(ghc >=9.2)- default-language:- GHC2021- if impl(ghc <9.2)- default-language:- Haskell2010- default-extensions:- BangPatterns- BinaryLiterals- ConstrainedClassMethods- ConstraintKinds- DeriveDataTypeable- DeriveFoldable- DeriveFunctor- DeriveGeneric- DeriveLift- DeriveTraversable- DoAndIfThenElse- EmptyCase- EmptyDataDecls- EmptyDataDeriving- ExistentialQuantification- ExplicitForAll- FlexibleContexts- FlexibleInstances- ForeignFunctionInterface- GADTSyntax- GeneralisedNewtypeDeriving- HexFloatLiterals- ImplicitPrelude- InstanceSigs- KindSignatures- MonomorphismRestriction- MultiParamTypeClasses- NamedFieldPuns- NamedWildCards- NumericUnderscores- PatternGuards- PolyKinds- PostfixOperators- RankNTypes- RelaxedPolyRec- ScopedTypeVariables- StandaloneDeriving- StarIsType- TraditionalRecordSyntax- TupleSections- TypeApplications- TypeOperators- TypeSynonymInstances- if impl(ghc <9.2) && impl(ghc >=8.10)- default-extensions:- ImportQualifiedPost- StandaloneKindSignatures+ if impl ( ghc >= 9.2 )+ default-language: GHC2021 -common ghc-options-stanza- ghc-options:- -Wall- -Wcompat- -Wincomplete-record-updates- -Wincomplete-uni-patterns- -Wredundant-constraints- -Widentities- -Wpartial-fields+ if impl ( ghc < 9.2 )+ default-language: Haskell2010+ default-extensions:+ BangPatterns+ BinaryLiterals+ ConstrainedClassMethods+ ConstraintKinds+ DeriveDataTypeable+ DeriveFoldable+ DeriveFunctor+ DeriveGeneric+ DeriveLift+ DeriveTraversable+ DoAndIfThenElse+ EmptyCase+ EmptyDataDecls+ EmptyDataDeriving+ ExistentialQuantification+ ExplicitForAll+ FlexibleContexts+ FlexibleInstances+ ForeignFunctionInterface+ GADTSyntax+ GeneralisedNewtypeDeriving+ HexFloatLiterals+ ImplicitPrelude+ InstanceSigs+ KindSignatures+ MonomorphismRestriction+ MultiParamTypeClasses+ NamedFieldPuns+ NamedWildCards+ NumericUnderscores+ PatternGuards+ PolyKinds+ PostfixOperators+ RankNTypes+ RelaxedPolyRec+ ScopedTypeVariables+ StandaloneDeriving+ StarIsType+ TraditionalRecordSyntax+ TupleSections+ TypeApplications+ TypeOperators+ TypeSynonymInstances -library- import: ghc2021-stanza- import: ghc-options-stanza- hs-source-dirs: src- build-depends:- , algebraic-graphs >=0.6 && <0.8- , base >=4.7 && <5- , bytestring >=0.11.3 && <0.13- , chart-svg >=0.3 && < 0.5- , containers ^>=0.6- , flatparse >=0.3.2 && <0.6- , numhask-space >=0.10 && <0.12- , optics-core ^>=0.4- , process-extras ^>=0.7.4- , string-interpolate ^>=0.3- , template-haskell >=2.16 && < 2.21- , text >=1.2 && <2.1- , these >=1.1.1 && < 1.3+ if impl ( ghc < 9.2 ) && impl ( ghc >= 8.10 )+ default-extensions:+ ImportQualifiedPost+ StandaloneKindSignatures - exposed-modules:- DotParse- DotParse.Examples- DotParse.Examples.NumHask- DotParse.FlatParse- DotParse.FlatParse.TH- DotParse.Types+library+ import: ghc-options-stanza+ import: ghc2021-stanza+ hs-source-dirs: src+ build-depends:+ , algebraic-graphs >=0.6 && <0.8+ , base >=4.7 && <5+ , bytestring >=0.11.3 && <0.13+ , chart-svg >=0.6 && <0.7+ , containers >=0.6 && <0.8+ , flatparse >=0.3.5 && <0.6+ , numhask-space >=0.10 && <0.12+ , optics-core >=0.4 && <0.5+ , process-extras >=0.7.4 && <0.8+ , string-interpolate >=0.3 && <0.4+ , template-haskell >=2.16 && <2.22+ , text >=1.2 && <2.2+ , these >=1.1 && <1.3+ exposed-modules:+ DotParse+ DotParse.Examples+ DotParse.Examples.AST+ DotParse.Examples.NumHask+ DotParse.FlatParse+ DotParse.FlatParse.TH+ DotParse.Types
+ other/ast.svg view
@@ -0,0 +1,1114 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<!-- Generated by graphviz version 9.0.0 (20230911.1827)+ -->+<!-- Pages: 1 -->+<svg width="339pt" height="360pt"+ viewBox="0.00 0.00 339.06 360.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">+<g id="graph0" class="graph" transform="scale(0.200865 0.200865) rotate(0) translate(4 1788.25)">+<polygon fill="white" stroke="none" points="-4,4 -4,-1788.25 1684,-1788.25 1684,4 -4,4"/>+<!-- Tree -->+<g id="node1" class="node">+<title>Tree</title>+<g id="a_node1"><a xlink:href="https://hackage.haskell.org/package/containers/docs/Data-Tree.html#t:Tree" xlink:title="<xTree> Tree">+<polygon fill="none" stroke="black" points="401.75,-1397 401.75,-1433 455.75,-1433 455.75,-1397 401.75,-1397"/>+<text text-anchor="middle" x="428.75" y="-1410.2" font-family="Times,serif" font-size="14.00">Tree</text>+</a>+</g>+</g>+<!-- TitleOptions -->+<g id="node2" class="node">+<title>TitleOptions</title>+<g id="a_node2"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:TitleOptions" xlink:title="<xTitleOptions> TitleOptions| <xtext> text| <xstyle> style| <xplace> place| <xbuffer> buffer| <xanchor> anchor">+<polygon fill="none" stroke="black" points="632.12,-1192.5 632.12,-1339.5 716.38,-1339.5 716.38,-1192.5 632.12,-1192.5"/>+<text text-anchor="middle" x="674.25" y="-1322.2" font-family="Times,serif" font-size="14.00">TitleOptions</text>+<polyline fill="none" stroke="black" points="632.12,-1315 716.38,-1315"/>+<text text-anchor="middle" x="674.25" y="-1297.7" font-family="Times,serif" font-size="14.00">text</text>+<polyline fill="none" stroke="black" points="632.12,-1290.5 716.38,-1290.5"/>+<text text-anchor="middle" x="674.25" y="-1273.2" font-family="Times,serif" font-size="14.00">style</text>+<polyline fill="none" stroke="black" points="632.12,-1266 716.38,-1266"/>+<text text-anchor="middle" x="674.25" y="-1248.7" font-family="Times,serif" font-size="14.00">place</text>+<polyline fill="none" stroke="black" points="632.12,-1241.5 716.38,-1241.5"/>+<text text-anchor="middle" x="674.25" y="-1224.2" font-family="Times,serif" font-size="14.00">buffer</text>+<polyline fill="none" stroke="black" points="632.12,-1217 716.38,-1217"/>+<text text-anchor="middle" x="674.25" y="-1199.7" font-family="Times,serif" font-size="14.00">anchor</text>+</a>+</g>+</g>+<!-- Style -->+<g id="node7" class="node">+<title>Style</title>+<g id="a_node7"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:Style" xlink:title="<xStyle> Style| <xvsize> vsize| <xvshift> vshift| <xtranslate> translate| <xsize> size| <xscaleP> scaleP| <xrotation> rotation| <xlineJoin> lineJoin| <xlineCap> lineCap| <xhsize> hsize| <xglyphShape> glyphShape| <xframe> frame| <xescapeText> escapeText| <xdashoffset> dashoffset| <xdasharray> dasharray| <xcolor> color| <xborderSize> borderSize| <xborderColor> borderColor| <xanchor> anchor">+<polygon fill="none" stroke="black" points="1136.62,-670.25 1136.62,-1135.75 1218.62,-1135.75 1218.62,-670.25 1136.62,-670.25"/>+<text text-anchor="middle" x="1177.62" y="-1118.45" font-family="Times,serif" font-size="14.00">Style</text>+<polyline fill="none" stroke="black" points="1136.62,-1111.25 1218.62,-1111.25"/>+<text text-anchor="middle" x="1177.62" y="-1093.95" font-family="Times,serif" font-size="14.00">vsize</text>+<polyline fill="none" stroke="black" points="1136.62,-1086.75 1218.62,-1086.75"/>+<text text-anchor="middle" x="1177.62" y="-1069.45" font-family="Times,serif" font-size="14.00">vshift</text>+<polyline fill="none" stroke="black" points="1136.62,-1062.25 1218.62,-1062.25"/>+<text text-anchor="middle" x="1177.62" y="-1044.95" font-family="Times,serif" font-size="14.00">translate</text>+<polyline fill="none" stroke="black" points="1136.62,-1037.75 1218.62,-1037.75"/>+<text text-anchor="middle" x="1177.62" y="-1020.45" font-family="Times,serif" font-size="14.00">size</text>+<polyline fill="none" stroke="black" points="1136.62,-1013.25 1218.62,-1013.25"/>+<text text-anchor="middle" x="1177.62" y="-995.95" font-family="Times,serif" font-size="14.00">scaleP</text>+<polyline fill="none" stroke="black" points="1136.62,-988.75 1218.62,-988.75"/>+<text text-anchor="middle" x="1177.62" y="-971.45" font-family="Times,serif" font-size="14.00">rotation</text>+<polyline fill="none" stroke="black" points="1136.62,-964.25 1218.62,-964.25"/>+<text text-anchor="middle" x="1177.62" y="-946.95" font-family="Times,serif" font-size="14.00">lineJoin</text>+<polyline fill="none" stroke="black" points="1136.62,-939.75 1218.62,-939.75"/>+<text text-anchor="middle" x="1177.62" y="-922.45" font-family="Times,serif" font-size="14.00">lineCap</text>+<polyline fill="none" stroke="black" points="1136.62,-915.25 1218.62,-915.25"/>+<text text-anchor="middle" x="1177.62" y="-897.95" font-family="Times,serif" font-size="14.00">hsize</text>+<polyline fill="none" stroke="black" points="1136.62,-890.75 1218.62,-890.75"/>+<text text-anchor="middle" x="1177.62" y="-873.45" font-family="Times,serif" font-size="14.00">glyphShape</text>+<polyline fill="none" stroke="black" points="1136.62,-866.25 1218.62,-866.25"/>+<text text-anchor="middle" x="1177.62" y="-848.95" font-family="Times,serif" font-size="14.00">frame</text>+<polyline fill="none" stroke="black" points="1136.62,-841.75 1218.62,-841.75"/>+<text text-anchor="middle" x="1177.62" y="-824.45" font-family="Times,serif" font-size="14.00">escapeText</text>+<polyline fill="none" stroke="black" points="1136.62,-817.25 1218.62,-817.25"/>+<text text-anchor="middle" x="1177.62" y="-799.95" font-family="Times,serif" font-size="14.00">dashoffset</text>+<polyline fill="none" stroke="black" points="1136.62,-792.75 1218.62,-792.75"/>+<text text-anchor="middle" x="1177.62" y="-775.45" font-family="Times,serif" font-size="14.00">dasharray</text>+<polyline fill="none" stroke="black" points="1136.62,-768.25 1218.62,-768.25"/>+<text text-anchor="middle" x="1177.62" y="-750.95" font-family="Times,serif" font-size="14.00">color</text>+<polyline fill="none" stroke="black" points="1136.62,-743.75 1218.62,-743.75"/>+<text text-anchor="middle" x="1177.62" y="-726.45" font-family="Times,serif" font-size="14.00">borderSize</text>+<polyline fill="none" stroke="black" points="1136.62,-719.25 1218.62,-719.25"/>+<text text-anchor="middle" x="1177.62" y="-701.95" font-family="Times,serif" font-size="14.00">borderColor</text>+<polyline fill="none" stroke="black" points="1136.62,-694.75 1218.62,-694.75"/>+<text text-anchor="middle" x="1177.62" y="-677.45" font-family="Times,serif" font-size="14.00">anchor</text>+</a>+</g>+</g>+<!-- TitleOptions->Style -->+<g id="edge1" class="edge">+<title>TitleOptions:xstyle->Style:xStyle</title>+<path fill="none" stroke="black" d="M717.25,-1278C743.47,-1278 739.84,-1304.81 764.75,-1313 807.82,-1327.15 823.3,-1325.92 866.75,-1313 976.73,-1280.31 992.26,-1242.22 1083,-1172 1106.18,-1154.06 1104.41,-1128.2 1129.14,-1124.46"/>+<polygon fill="black" stroke="black" points="1129.25,-1126.2 1134.12,-1124.11 1129,-1122.71 1129.25,-1126.2"/>+</g>+<!-- Place -->+<g id="node15" class="node">+<title>Place</title>+<g id="a_node15"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:Place" xlink:title="<xPlace> Place| <xPlaceTop> PlaceTop| <xPlaceRight> PlaceRight| <xPlaceLeft> PlaceLeft| <xPlaceBottom> PlaceBottom| <xPlaceAbsolute> PlaceAbsolute">+<polygon fill="none" stroke="black" points="884.75,-919.5 884.75,-1066.5 978.75,-1066.5 978.75,-919.5 884.75,-919.5"/>+<text text-anchor="middle" x="931.75" y="-1049.2" font-family="Times,serif" font-size="14.00">Place</text>+<polyline fill="none" stroke="black" points="884.75,-1042 978.75,-1042"/>+<text text-anchor="middle" x="931.75" y="-1024.7" font-family="Times,serif" font-size="14.00">PlaceTop</text>+<polyline fill="none" stroke="black" points="884.75,-1017.5 978.75,-1017.5"/>+<text text-anchor="middle" x="931.75" y="-1000.2" font-family="Times,serif" font-size="14.00">PlaceRight</text>+<polyline fill="none" stroke="black" points="884.75,-993 978.75,-993"/>+<text text-anchor="middle" x="931.75" y="-975.7" font-family="Times,serif" font-size="14.00">PlaceLeft</text>+<polyline fill="none" stroke="black" points="884.75,-968.5 978.75,-968.5"/>+<text text-anchor="middle" x="931.75" y="-951.2" font-family="Times,serif" font-size="14.00">PlaceBottom</text>+<polyline fill="none" stroke="black" points="884.75,-944 978.75,-944"/>+<text text-anchor="middle" x="931.75" y="-926.7" font-family="Times,serif" font-size="14.00">PlaceAbsolute</text>+</a>+</g>+</g>+<!-- TitleOptions->Place -->+<g id="edge2" class="edge">+<title>TitleOptions:xplace->Place:xPlace</title>+<path fill="none" stroke="black" d="M717.25,-1254C751.42,-1254 737.49,-1215.89 746.75,-1183 753.76,-1158.1 746.11,-1085.93 764.75,-1068 801.87,-1032.31 828.77,-1052.2 878.27,-1053.89"/>+<polygon fill="black" stroke="black" points="878.21,-1055.64 883.24,-1053.97 878.27,-1052.14 878.21,-1055.64"/>+</g>+<!-- Anchor -->+<g id="node38" class="node">+<title>Anchor</title>+<g id="a_node38"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:Anchor" xlink:title="<xAnchor> Anchor| <xAnchorStart> AnchorStart| <xAnchorMiddle> AnchorMiddle| <xAnchorEnd> AnchorEnd">+<polygon fill="none" stroke="black" points="1375.75,-739 1375.75,-837 1472,-837 1472,-739 1375.75,-739"/>+<text text-anchor="middle" x="1423.88" y="-819.7" font-family="Times,serif" font-size="14.00">Anchor</text>+<polyline fill="none" stroke="black" points="1375.75,-812.5 1472,-812.5"/>+<text text-anchor="middle" x="1423.88" y="-795.2" font-family="Times,serif" font-size="14.00">AnchorStart</text>+<polyline fill="none" stroke="black" points="1375.75,-788 1472,-788"/>+<text text-anchor="middle" x="1423.88" y="-770.7" font-family="Times,serif" font-size="14.00">AnchorMiddle</text>+<polyline fill="none" stroke="black" points="1375.75,-763.5 1472,-763.5"/>+<text text-anchor="middle" x="1423.88" y="-746.2" font-family="Times,serif" font-size="14.00">AnchorEnd</text>+</a>+</g>+</g>+<!-- TitleOptions->Anchor -->+<g id="edge3" class="edge">+<title>TitleOptions:xanchor->Anchor:xAnchor</title>+<path fill="none" stroke="black" d="M717.25,-1205C792.52,-1205 809.69,-1224.43 884.75,-1230 1052.8,-1242.47 1105.06,-1223.35 1254.25,-1145 1299.36,-1121.31 1320.23,-1118.93 1344.25,-1074 1368.11,-1029.38 1327.67,-883.94 1362.25,-847 1370.08,-838.63 1407.2,-847.44 1419.73,-842.86"/>+<polygon fill="black" stroke="black" points="1420.98,-844.09 1422.89,-839.15 1418.32,-841.82 1420.98,-844.09"/>+</g>+<!-- Ticks -->+<g id="node3" class="node">+<title>Ticks</title>+<g id="a_node3"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:Ticks" xlink:title="<xTicks> Ticks| <xtick> tick| <xtextTick> textTick| <xlineTick> lineTick| <xglyphTick> glyphTick">+<polygon fill="none" stroke="black" points="638.5,-599.75 638.5,-722.25 710,-722.25 710,-599.75 638.5,-599.75"/>+<text text-anchor="middle" x="674.25" y="-704.95" font-family="Times,serif" font-size="14.00">Ticks</text>+<polyline fill="none" stroke="black" points="638.5,-697.75 710,-697.75"/>+<text text-anchor="middle" x="674.25" y="-680.45" font-family="Times,serif" font-size="14.00">tick</text>+<polyline fill="none" stroke="black" points="638.5,-673.25 710,-673.25"/>+<text text-anchor="middle" x="674.25" y="-655.95" font-family="Times,serif" font-size="14.00">textTick</text>+<polyline fill="none" stroke="black" points="638.5,-648.75 710,-648.75"/>+<text text-anchor="middle" x="674.25" y="-631.45" font-family="Times,serif" font-size="14.00">lineTick</text>+<polyline fill="none" stroke="black" points="638.5,-624.25 710,-624.25"/>+<text text-anchor="middle" x="674.25" y="-606.95" font-family="Times,serif" font-size="14.00">glyphTick</text>+</a>+</g>+</g>+<!-- TickStyle -->+<g id="node4" class="node">+<title>TickStyle</title>+<g id="a_node4"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:TickStyle" xlink:title="<xTickStyle> TickStyle| <xstyle> style| <xbuffer> buffer| <xanchorTo> anchorTo">+<polygon fill="none" stroke="black" points="897.5,-510 897.5,-608 966,-608 966,-510 897.5,-510"/>+<text text-anchor="middle" x="931.75" y="-590.7" font-family="Times,serif" font-size="14.00">TickStyle</text>+<polyline fill="none" stroke="black" points="897.5,-583.5 966,-583.5"/>+<text text-anchor="middle" x="931.75" y="-566.2" font-family="Times,serif" font-size="14.00">style</text>+<polyline fill="none" stroke="black" points="897.5,-559 966,-559"/>+<text text-anchor="middle" x="931.75" y="-541.7" font-family="Times,serif" font-size="14.00">buffer</text>+<polyline fill="none" stroke="black" points="897.5,-534.5 966,-534.5"/>+<text text-anchor="middle" x="931.75" y="-517.2" font-family="Times,serif" font-size="14.00">anchorTo</text>+</a>+</g>+</g>+<!-- Ticks->TickStyle -->+<g id="edge5" class="edge">+<title>Ticks:xtextTick->TickStyle:xTickStyle</title>+<path fill="none" stroke="black" d="M711.25,-661C780.43,-661 808.94,-692 866.75,-654 888.92,-639.43 871.38,-603.04 890.36,-596.89"/>+<polygon fill="black" stroke="black" points="890.54,-598.63 895.25,-596.21 890.06,-595.16 890.54,-598.63"/>+<text text-anchor="middle" x="815.75" y="-675.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- Ticks->TickStyle -->+<g id="edge6" class="edge">+<title>Ticks:xlineTick->TickStyle:xTickStyle</title>+<path fill="none" stroke="black" d="M711.25,-636C746.15,-636 833.85,-625.65 866.75,-614 879.12,-609.62 880.9,-599.82 890.5,-596.86"/>+<polygon fill="black" stroke="black" points="890.54,-598.62 895.25,-596.21 890.06,-595.15 890.54,-598.62"/>+<text text-anchor="middle" x="815.75" y="-635.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- Ticks->TickStyle -->+<g id="edge7" class="edge">+<title>Ticks:xglyphTick->TickStyle:xTickStyle</title>+<path fill="none" stroke="black" d="M711.25,-612C736.41,-612 739.94,-597.67 764.75,-593.5 809.46,-585.99 821.46,-591.62 866.75,-593.5 877.82,-593.96 881.95,-595.37 890.65,-595.84"/>+<polygon fill="black" stroke="black" points="890.19,-597.58 895.24,-595.96 890.28,-594.08 890.19,-597.58"/>+<text text-anchor="middle" x="815.75" y="-596.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- Tick -->+<g id="node6" class="node">+<title>Tick</title>+<g id="a_node6"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:Tick" xlink:title="<xTick> Tick| <xtickExtend'> tickExtend'| <xnumTicks'> numTicks'| <xformatN'> formatN'| <xTickRound> TickRound| <xTickPlaced> TickPlaced| <xTickNone> TickNone| <xTickLabels> TickLabels| <xTickExact> TickExact">+<polygon fill="none" stroke="black" points="893.38,-626.75 893.38,-847.25 970.12,-847.25 970.12,-626.75 893.38,-626.75"/>+<text text-anchor="middle" x="931.75" y="-829.95" font-family="Times,serif" font-size="14.00">Tick</text>+<polyline fill="none" stroke="black" points="893.38,-822.75 970.12,-822.75"/>+<text text-anchor="middle" x="931.75" y="-805.45" font-family="Times,serif" font-size="14.00">tickExtend'</text>+<polyline fill="none" stroke="black" points="893.38,-798.25 970.12,-798.25"/>+<text text-anchor="middle" x="931.75" y="-780.95" font-family="Times,serif" font-size="14.00">numTicks'</text>+<polyline fill="none" stroke="black" points="893.38,-773.75 970.12,-773.75"/>+<text text-anchor="middle" x="931.75" y="-756.45" font-family="Times,serif" font-size="14.00">formatN'</text>+<polyline fill="none" stroke="black" points="893.38,-749.25 970.12,-749.25"/>+<text text-anchor="middle" x="931.75" y="-731.95" font-family="Times,serif" font-size="14.00">TickRound</text>+<polyline fill="none" stroke="black" points="893.38,-724.75 970.12,-724.75"/>+<text text-anchor="middle" x="931.75" y="-707.45" font-family="Times,serif" font-size="14.00">TickPlaced</text>+<polyline fill="none" stroke="black" points="893.38,-700.25 970.12,-700.25"/>+<text text-anchor="middle" x="931.75" y="-682.95" font-family="Times,serif" font-size="14.00">TickNone</text>+<polyline fill="none" stroke="black" points="893.38,-675.75 970.12,-675.75"/>+<text text-anchor="middle" x="931.75" y="-658.45" font-family="Times,serif" font-size="14.00">TickLabels</text>+<polyline fill="none" stroke="black" points="893.38,-651.25 970.12,-651.25"/>+<text text-anchor="middle" x="931.75" y="-633.95" font-family="Times,serif" font-size="14.00">TickExact</text>+</a>+</g>+</g>+<!-- Ticks->Tick -->+<g id="edge4" class="edge">+<title>Ticks:xtick->Tick:xTick</title>+<path fill="none" stroke="black" d="M711.25,-686C813.48,-686 789.44,-828.95 886.49,-834.81"/>+<polygon fill="black" stroke="black" points="886.19,-836.56 891.24,-834.96 886.29,-833.06 886.19,-836.56"/>+<text text-anchor="middle" x="815.75" y="-833.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- TickStyle->Style -->+<g id="edge8" class="edge">+<title>TickStyle:xstyle->Style:xStyle</title>+<path fill="none" stroke="black" d="M966.75,-571C1018.79,-571 1046.62,-547.79 1083,-585 1123.59,-626.51 1078.83,-1089.69 1129.68,-1122.2"/>+<polygon fill="black" stroke="black" points="1128.88,-1123.79 1134.18,-1123.56 1129.9,-1120.44 1128.88,-1123.79"/>+</g>+<!-- HudChartSection -->+<g id="node22" class="node">+<title>HudChartSection</title>+<g id="a_node22"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:HudChartSection" xlink:title="<xHudChartSection> HudChartSection| <xHudStyleSection> HudStyleSection| <xHudSection> HudSection| <xCanvasStyleSection> CanvasStyleSection| <xCanvasSection> CanvasSection">+<polygon fill="none" stroke="black" points="1115.62,-245.75 1115.62,-368.25 1239.62,-368.25 1239.62,-245.75 1115.62,-245.75"/>+<text text-anchor="middle" x="1177.62" y="-350.95" font-family="Times,serif" font-size="14.00">HudChartSection</text>+<polyline fill="none" stroke="black" points="1115.62,-343.75 1239.62,-343.75"/>+<text text-anchor="middle" x="1177.62" y="-326.45" font-family="Times,serif" font-size="14.00">HudStyleSection</text>+<polyline fill="none" stroke="black" points="1115.62,-319.25 1239.62,-319.25"/>+<text text-anchor="middle" x="1177.62" y="-301.95" font-family="Times,serif" font-size="14.00">HudSection</text>+<polyline fill="none" stroke="black" points="1115.62,-294.75 1239.62,-294.75"/>+<text text-anchor="middle" x="1177.62" y="-277.45" font-family="Times,serif" font-size="14.00">CanvasStyleSection</text>+<polyline fill="none" stroke="black" points="1115.62,-270.25 1239.62,-270.25"/>+<text text-anchor="middle" x="1177.62" y="-252.95" font-family="Times,serif" font-size="14.00">CanvasSection</text>+</a>+</g>+</g>+<!-- TickStyle->HudChartSection -->+<g id="edge9" class="edge">+<title>TickStyle:xanchorTo->HudChartSection:xHudChartSection</title>+<path fill="none" stroke="black" d="M966.75,-522C977.89,-522 974.01,-510.08 978.75,-500 987.92,-480.51 984.12,-472.45 996.75,-455 1005.91,-442.33 1082.52,-370.11 1108.68,-357.79"/>+<polygon fill="black" stroke="black" points="1108.89,-359.55 1113.18,-356.44 1107.88,-356.2 1108.89,-359.55"/>+</g>+<!-- TickExtend -->+<g id="node5" class="node">+<title>TickExtend</title>+<g id="a_node5"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:TickExtend" xlink:title="<xTickExtend> TickExtend| <xNoTickExtend> NoTickExtend">+<polygon fill="none" stroke="black" points="1129.88,-602.5 1129.88,-651.5 1225.38,-651.5 1225.38,-602.5 1129.88,-602.5"/>+<text text-anchor="middle" x="1177.62" y="-634.2" font-family="Times,serif" font-size="14.00">TickExtend</text>+<polyline fill="none" stroke="black" points="1129.88,-627 1225.38,-627"/>+<text text-anchor="middle" x="1177.62" y="-609.7" font-family="Times,serif" font-size="14.00">NoTickExtend</text>+</a>+</g>+</g>+<!-- Tick->TickExtend -->+<g id="edge10" class="edge">+<title>Tick:xtickExtend'->TickExtend:xTickExtend</title>+<path fill="none" stroke="black" d="M970.75,-811C1072.29,-811 1026.92,-646.31 1122.15,-639.23"/>+<polygon fill="black" stroke="black" points="1122.18,-640.98 1127.11,-639.05 1122.05,-637.49 1122.18,-640.98"/>+<text text-anchor="middle" x="1039.88" y="-809.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- FormatN -->+<g id="node25" class="node">+<title>FormatN</title>+<g id="a_node25"><a xlink:href="https://hackage.haskell.org/package/formatn/docs/Data-FormatN.html#t:FormatN" xlink:title="<xFormatN> FormatN| <xsigFigs> sigFigs| <xmaxDistinguishIterations> maxDistinguishIterations| <xfstyle> fstyle| <xcutRightZeros> cutRightZeros| <xaddLPad> addLPad">+<polygon fill="none" stroke="black" points="1101,-414.5 1101,-561.5 1254.25,-561.5 1254.25,-414.5 1101,-414.5"/>+<text text-anchor="middle" x="1177.62" y="-544.2" font-family="Times,serif" font-size="14.00">FormatN</text>+<polyline fill="none" stroke="black" points="1101,-537 1254.25,-537"/>+<text text-anchor="middle" x="1177.62" y="-519.7" font-family="Times,serif" font-size="14.00">sigFigs</text>+<polyline fill="none" stroke="black" points="1101,-512.5 1254.25,-512.5"/>+<text text-anchor="middle" x="1177.62" y="-495.2" font-family="Times,serif" font-size="14.00">maxDistinguishIterations</text>+<polyline fill="none" stroke="black" points="1101,-488 1254.25,-488"/>+<text text-anchor="middle" x="1177.62" y="-470.7" font-family="Times,serif" font-size="14.00">fstyle</text>+<polyline fill="none" stroke="black" points="1101,-463.5 1254.25,-463.5"/>+<text text-anchor="middle" x="1177.62" y="-446.2" font-family="Times,serif" font-size="14.00">cutRightZeros</text>+<polyline fill="none" stroke="black" points="1101,-439 1254.25,-439"/>+<text text-anchor="middle" x="1177.62" y="-421.7" font-family="Times,serif" font-size="14.00">addLPad</text>+</a>+</g>+</g>+<!-- Tick->FormatN -->+<g id="edge11" class="edge">+<title>Tick:xformatN'->FormatN:xFormatN</title>+<path fill="none" stroke="black" d="M970.75,-762C1028.15,-762 967.22,-684.72 996.75,-635.5 1026.58,-585.79 1039.8,-551.61 1094.49,-549.14"/>+<polygon fill="black" stroke="black" points="1094.53,-550.89 1099.49,-549.03 1094.45,-547.39 1094.53,-550.89"/>+<text text-anchor="middle" x="1039.88" y="-638.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- Style->Style -->+<g id="edge17" class="edge">+<title>Style:xframe->Style:xStyle</title>+<path fill="none" stroke="black" d="M1136.16,-852.56C1104.05,-859.77 1071.31,-891.12 1071.31,-989 1071.31,-1080.76 1100.09,-1114.05 1130.14,-1123.8"/>+<polygon fill="black" stroke="black" points="1129.41,-1125.41 1134.7,-1125.04 1130.34,-1122.04 1129.41,-1125.41"/>+<text text-anchor="middle" x="1057.44" y="-897.95" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- ScaleP -->+<g id="node9" class="node">+<title>ScaleP</title>+<g id="a_node9"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:ScaleP" xlink:title="<xScaleP> ScaleP| <xScalePY> ScalePY| <xScalePX> ScalePX| <xScalePMinDim> ScalePMinDim| <xScalePArea> ScalePArea| <xNoScaleP> NoScaleP">+<polygon fill="none" stroke="black" points="1373.5,-1090.5 1373.5,-1237.5 1474.25,-1237.5 1474.25,-1090.5 1373.5,-1090.5"/>+<text text-anchor="middle" x="1423.88" y="-1220.2" font-family="Times,serif" font-size="14.00">ScaleP</text>+<polyline fill="none" stroke="black" points="1373.5,-1213 1474.25,-1213"/>+<text text-anchor="middle" x="1423.88" y="-1195.7" font-family="Times,serif" font-size="14.00">ScalePY</text>+<polyline fill="none" stroke="black" points="1373.5,-1188.5 1474.25,-1188.5"/>+<text text-anchor="middle" x="1423.88" y="-1171.2" font-family="Times,serif" font-size="14.00">ScalePX</text>+<polyline fill="none" stroke="black" points="1373.5,-1164 1474.25,-1164"/>+<text text-anchor="middle" x="1423.88" y="-1146.7" font-family="Times,serif" font-size="14.00">ScalePMinDim</text>+<polyline fill="none" stroke="black" points="1373.5,-1139.5 1474.25,-1139.5"/>+<text text-anchor="middle" x="1423.88" y="-1122.2" font-family="Times,serif" font-size="14.00">ScalePArea</text>+<polyline fill="none" stroke="black" points="1373.5,-1115 1474.25,-1115"/>+<text text-anchor="middle" x="1423.88" y="-1097.7" font-family="Times,serif" font-size="14.00">NoScaleP</text>+</a>+</g>+</g>+<!-- Style->ScaleP -->+<g id="edge13" class="edge">+<title>Style:xscaleP->ScaleP:xScaleP</title>+<path fill="none" stroke="black" d="M1219.62,-1001C1233.58,-1001 1340.12,-1192.98 1367.82,-1221.48"/>+<polygon fill="black" stroke="black" points="1366.53,-1222.71 1371.63,-1224.14 1368.53,-1219.84 1366.53,-1222.71"/>+</g>+<!-- Point -->+<g id="node14" class="node">+<title>Point</title>+<g id="a_node14"><a xlink:href="https://hackage.haskell.org/package/numhask-space/docs/NumHask-Space-Point.html#t:Point" xlink:title="<xPoint> Point| <x_y> _y| <x_x> _x">+<polygon fill="none" stroke="black" points="1618,-1265.25 1618,-1338.75 1672,-1338.75 1672,-1265.25 1618,-1265.25"/>+<text text-anchor="middle" x="1645" y="-1321.45" font-family="Times,serif" font-size="14.00">Point</text>+<polyline fill="none" stroke="black" points="1618,-1314.25 1672,-1314.25"/>+<text text-anchor="middle" x="1645" y="-1296.95" font-family="Times,serif" font-size="14.00">_y</text>+<polyline fill="none" stroke="black" points="1618,-1289.75 1672,-1289.75"/>+<text text-anchor="middle" x="1645" y="-1272.45" font-family="Times,serif" font-size="14.00">_x</text>+</a>+</g>+</g>+<!-- Style->Point -->+<g id="edge12" class="edge">+<title>Style:xtranslate->Point:xPoint</title>+<path fill="none" stroke="black" d="M1219.62,-1050C1268.67,-1050 1243.95,-1106.94 1272.25,-1147 1306.75,-1195.84 1311.81,-1214.89 1362.25,-1247 1452.3,-1304.32 1491.3,-1281.59 1592,-1317 1601,-1320.16 1603.93,-1324.64 1610.81,-1326.32"/>+<polygon fill="black" stroke="black" points="1610.33,-1328.03 1615.5,-1326.84 1610.72,-1324.55 1610.33,-1328.03"/>+<text text-anchor="middle" x="1423.88" y="-1295.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- LineJoin -->+<g id="node18" class="node">+<title>LineJoin</title>+<g id="a_node18"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:LineJoin" xlink:title="<xLineJoin> LineJoin| <xLineJoinRound> LineJoinRound| <xLineJoinMiter> LineJoinMiter| <xLineJoinBevel> LineJoinBevel">+<polygon fill="none" stroke="black" points="1374.25,-973 1374.25,-1071 1473.5,-1071 1473.5,-973 1374.25,-973"/>+<text text-anchor="middle" x="1423.88" y="-1053.7" font-family="Times,serif" font-size="14.00">LineJoin</text>+<polyline fill="none" stroke="black" points="1374.25,-1046.5 1473.5,-1046.5"/>+<text text-anchor="middle" x="1423.88" y="-1029.2" font-family="Times,serif" font-size="14.00">LineJoinRound</text>+<polyline fill="none" stroke="black" points="1374.25,-1022 1473.5,-1022"/>+<text text-anchor="middle" x="1423.88" y="-1004.7" font-family="Times,serif" font-size="14.00">LineJoinMiter</text>+<polyline fill="none" stroke="black" points="1374.25,-997.5 1473.5,-997.5"/>+<text text-anchor="middle" x="1423.88" y="-980.2" font-family="Times,serif" font-size="14.00">LineJoinBevel</text>+</a>+</g>+</g>+<!-- Style->LineJoin -->+<g id="edge14" class="edge">+<title>Style:xlineJoin->LineJoin:xLineJoin</title>+<path fill="none" stroke="black" d="M1219.62,-952C1300.59,-952 1290.4,-1053.64 1366.73,-1058.8"/>+<polygon fill="black" stroke="black" points="1366.31,-1060.53 1371.36,-1058.95 1366.42,-1057.04 1366.31,-1060.53"/>+<text text-anchor="middle" x="1308.25" y="-1056.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- LineCap -->+<g id="node19" class="node">+<title>LineCap</title>+<g id="a_node19"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:LineCap" xlink:title="<xLineCap> LineCap| <xLineCapSquare> LineCapSquare| <xLineCapRound> LineCapRound| <xLineCapButt> LineCapButt">+<polygon fill="none" stroke="black" points="1373.88,-856 1373.88,-954 1473.88,-954 1473.88,-856 1373.88,-856"/>+<text text-anchor="middle" x="1423.88" y="-936.7" font-family="Times,serif" font-size="14.00">LineCap</text>+<polyline fill="none" stroke="black" points="1373.88,-929.5 1473.88,-929.5"/>+<text text-anchor="middle" x="1423.88" y="-912.2" font-family="Times,serif" font-size="14.00">LineCapSquare</text>+<polyline fill="none" stroke="black" points="1373.88,-905 1473.88,-905"/>+<text text-anchor="middle" x="1423.88" y="-887.7" font-family="Times,serif" font-size="14.00">LineCapRound</text>+<polyline fill="none" stroke="black" points="1373.88,-880.5 1473.88,-880.5"/>+<text text-anchor="middle" x="1423.88" y="-863.2" font-family="Times,serif" font-size="14.00">LineCapButt</text>+</a>+</g>+</g>+<!-- Style->LineCap -->+<g id="edge15" class="edge">+<title>Style:xlineCap->LineCap:xLineCap</title>+<path fill="none" stroke="black" d="M1219.62,-928C1285.88,-928 1303.4,-941.14 1366.61,-941.96"/>+<polygon fill="black" stroke="black" points="1366.35,-943.71 1371.36,-941.99 1366.37,-940.21 1366.35,-943.71"/>+<text text-anchor="middle" x="1308.25" y="-944.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- GlyphShape -->+<g id="node23" class="node">+<title>GlyphShape</title>+<g id="a_node23"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:GlyphShape" xlink:title="<xGlyphShape> GlyphShape| <xVLineGlyph> VLineGlyph| <xTriangleGlyph> TriangleGlyph| <xSquareGlyph> SquareGlyph| <xRectSharpGlyph> RectSharpGlyph| <xRectRoundedGlyph> RectRoundedGlyph| <xPathGlyph> PathGlyph| <xHLineGlyph> HLineGlyph| <xEllipseGlyph> EllipseGlyph| <xCircleGlyph> CircleGlyph">+<polygon fill="none" stroke="black" points="1362.25,-474.5 1362.25,-719.5 1485.5,-719.5 1485.5,-474.5 1362.25,-474.5"/>+<text text-anchor="middle" x="1423.88" y="-702.2" font-family="Times,serif" font-size="14.00">GlyphShape</text>+<polyline fill="none" stroke="black" points="1362.25,-695 1485.5,-695"/>+<text text-anchor="middle" x="1423.88" y="-677.7" font-family="Times,serif" font-size="14.00">VLineGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-670.5 1485.5,-670.5"/>+<text text-anchor="middle" x="1423.88" y="-653.2" font-family="Times,serif" font-size="14.00">TriangleGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-646 1485.5,-646"/>+<text text-anchor="middle" x="1423.88" y="-628.7" font-family="Times,serif" font-size="14.00">SquareGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-621.5 1485.5,-621.5"/>+<text text-anchor="middle" x="1423.88" y="-604.2" font-family="Times,serif" font-size="14.00">RectSharpGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-597 1485.5,-597"/>+<text text-anchor="middle" x="1423.88" y="-579.7" font-family="Times,serif" font-size="14.00">RectRoundedGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-572.5 1485.5,-572.5"/>+<text text-anchor="middle" x="1423.88" y="-555.2" font-family="Times,serif" font-size="14.00">PathGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-548 1485.5,-548"/>+<text text-anchor="middle" x="1423.88" y="-530.7" font-family="Times,serif" font-size="14.00">HLineGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-523.5 1485.5,-523.5"/>+<text text-anchor="middle" x="1423.88" y="-506.2" font-family="Times,serif" font-size="14.00">EllipseGlyph</text>+<polyline fill="none" stroke="black" points="1362.25,-499 1485.5,-499"/>+<text text-anchor="middle" x="1423.88" y="-481.7" font-family="Times,serif" font-size="14.00">CircleGlyph</text>+</a>+</g>+</g>+<!-- Style->GlyphShape -->+<g id="edge16" class="edge">+<title>Style:xglyphShape->GlyphShape:xGlyphShape</title>+<path fill="none" stroke="black" d="M1219.62,-878C1293.22,-878 1216,-768.46 1272.25,-721 1301.5,-696.32 1319.7,-705.79 1355.8,-706.9"/>+<polygon fill="black" stroke="black" points="1355.71,-708.65 1360.74,-706.98 1355.76,-705.15 1355.71,-708.65"/>+</g>+<!-- EscapeText -->+<g id="node27" class="node">+<title>EscapeText</title>+<g id="a_node27"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Style.html#t:EscapeText" xlink:title="<xEscapeText> EscapeText| <xNoEscapeText> NoEscapeText">+<polygon fill="none" stroke="black" points="1376.12,-406.5 1376.12,-455.5 1471.62,-455.5 1471.62,-406.5 1376.12,-406.5"/>+<text text-anchor="middle" x="1423.88" y="-438.2" font-family="Times,serif" font-size="14.00">EscapeText</text>+<polyline fill="none" stroke="black" points="1376.12,-431 1471.62,-431"/>+<text text-anchor="middle" x="1423.88" y="-413.7" font-family="Times,serif" font-size="14.00">NoEscapeText</text>+</a>+</g>+</g>+<!-- Style->EscapeText -->+<g id="edge18" class="edge">+<title>Style:xescapeText->EscapeText:xEscapeText</title>+<path fill="none" stroke="black" d="M1219.62,-829C1222.34,-829 1361.08,-467.45 1362.25,-465 1365.91,-457.38 1364.84,-448.81 1368.83,-445.01"/>+<polygon fill="black" stroke="black" points="1369.25,-446.71 1373.44,-443.48 1368.14,-443.39 1369.25,-446.71"/>+</g>+<!-- Colour -->+<g id="node29" class="node">+<title>Colour</title>+<g id="a_node29"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Data-Colour.html#t:Colour" xlink:title="<xColour> Colour| <xopac'> opac'| <xlightness'> lightness'| <xhue'> hue'| <xchroma'> chroma'">+<polygon fill="none" stroke="black" points="1390.75,-264.75 1390.75,-387.25 1457,-387.25 1457,-264.75 1390.75,-264.75"/>+<text text-anchor="middle" x="1423.88" y="-369.95" font-family="Times,serif" font-size="14.00">Colour</text>+<polyline fill="none" stroke="black" points="1390.75,-362.75 1457,-362.75"/>+<text text-anchor="middle" x="1423.88" y="-345.45" font-family="Times,serif" font-size="14.00">opac'</text>+<polyline fill="none" stroke="black" points="1390.75,-338.25 1457,-338.25"/>+<text text-anchor="middle" x="1423.88" y="-320.95" font-family="Times,serif" font-size="14.00">lightness'</text>+<polyline fill="none" stroke="black" points="1390.75,-313.75 1457,-313.75"/>+<text text-anchor="middle" x="1423.88" y="-296.45" font-family="Times,serif" font-size="14.00">hue'</text>+<polyline fill="none" stroke="black" points="1390.75,-289.25 1457,-289.25"/>+<text text-anchor="middle" x="1423.88" y="-271.95" font-family="Times,serif" font-size="14.00">chroma'</text>+</a>+</g>+</g>+<!-- Style->Colour -->+<g id="edge19" class="edge">+<title>Style:xcolor->Colour:xColour</title>+<path fill="none" stroke="black" d="M1219.62,-756C1264.56,-756 1243.76,-704.7 1254.25,-661 1269.62,-597 1247.3,-574.91 1272.25,-514 1286.81,-478.46 1343.25,-385.15 1383.55,-375.76"/>+<polygon fill="black" stroke="black" points="1383.62,-377.52 1388.37,-375.18 1383.2,-374.04 1383.62,-377.52"/>+</g>+<!-- Style->Colour -->+<g id="edge20" class="edge">+<title>Style:xborderColor->Colour:xColour</title>+<path fill="none" stroke="black" d="M1219.62,-707C1245.21,-707 1245.31,-684.98 1254.25,-661 1274.57,-606.53 1234.13,-443.9 1272.25,-400 1305.86,-361.3 1334.03,-373.83 1383.42,-374.93"/>+<polygon fill="black" stroke="black" points="1383.34,-376.68 1388.36,-374.98 1383.38,-373.18 1383.34,-376.68"/>+</g>+<!-- Style->Anchor -->+<g id="edge21" class="edge">+<title>Style:xanchor->Anchor:xAnchor</title>+<path fill="none" stroke="black" d="M1219.62,-682C1264.42,-682 1322.48,-812.44 1368.47,-824.16"/>+<polygon fill="black" stroke="black" points="1368.19,-825.89 1373.37,-824.8 1368.64,-822.42 1368.19,-825.89"/>+</g>+<!-- ShapeRendering -->+<g id="node8" class="node">+<title>ShapeRendering</title>+<g id="a_node8"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Markup.html#t:ShapeRendering" xlink:title="<xShapeRendering> ShapeRendering| <xUseGeometricPrecision> UseGeometricPrecision| <xUseCssCrisp> UseCssCrisp| <xNoShapeRendering> NoShapeRendering">+<polygon fill="none" stroke="black" points="601.75,-1615 601.75,-1713 746.75,-1713 746.75,-1615 601.75,-1615"/>+<text text-anchor="middle" x="674.25" y="-1695.7" font-family="Times,serif" font-size="14.00">ShapeRendering</text>+<polyline fill="none" stroke="black" points="601.75,-1688.5 746.75,-1688.5"/>+<text text-anchor="middle" x="674.25" y="-1671.2" font-family="Times,serif" font-size="14.00">UseGeometricPrecision</text>+<polyline fill="none" stroke="black" points="601.75,-1664 746.75,-1664"/>+<text text-anchor="middle" x="674.25" y="-1646.7" font-family="Times,serif" font-size="14.00">UseCssCrisp</text>+<polyline fill="none" stroke="black" points="601.75,-1639.5 746.75,-1639.5"/>+<text text-anchor="middle" x="674.25" y="-1622.2" font-family="Times,serif" font-size="14.00">NoShapeRendering</text>+</a>+</g>+</g>+<!-- RenderStyle -->+<g id="node10" class="node">+<title>RenderStyle</title>+<g id="a_node10"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Markup.html#t:RenderStyle" xlink:title="<xRenderStyle> RenderStyle| <xIndented> Indented| <xCompact> Compact">+<polygon fill="none" stroke="black" points="387.38,-1710.25 387.38,-1783.75 470.12,-1783.75 470.12,-1710.25 387.38,-1710.25"/>+<text text-anchor="middle" x="428.75" y="-1766.45" font-family="Times,serif" font-size="14.00">RenderStyle</text>+<polyline fill="none" stroke="black" points="387.38,-1759.25 470.12,-1759.25"/>+<text text-anchor="middle" x="428.75" y="-1741.95" font-family="Times,serif" font-size="14.00">Indented</text>+<polyline fill="none" stroke="black" points="387.38,-1734.75 470.12,-1734.75"/>+<text text-anchor="middle" x="428.75" y="-1717.45" font-family="Times,serif" font-size="14.00">Compact</text>+</a>+</g>+</g>+<!-- Rect -->+<g id="node11" class="node">+<title>Rect</title>+<g id="a_node11"><a xlink:href="https://hackage.haskell.org/package/numhask-space/docs/NumHask-Space-Rect.html#t:Rect" xlink:title="<xRect> Rect">+<polygon fill="none" stroke="black" points="1396.88,-1582 1396.88,-1618 1450.88,-1618 1450.88,-1582 1396.88,-1582"/>+<text text-anchor="middle" x="1423.88" y="-1595.2" font-family="Times,serif" font-size="14.00">Rect</text>+</a>+</g>+</g>+<!-- Priority -->+<g id="node12" class="node">+<title>Priority</title>+<g id="a_node12"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:Priority" xlink:title="<xPriority> Priority">+<polygon fill="none" stroke="black" points="400.12,-1051 400.12,-1087 457.38,-1087 457.38,-1051 400.12,-1051"/>+<text text-anchor="middle" x="428.75" y="-1064.2" font-family="Times,serif" font-size="14.00">Priority</text>+</a>+</g>+</g>+<!-- PreferColorScheme -->+<g id="node13" class="node">+<title>PreferColorScheme</title>+<g id="a_node13"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Primitive.html#t:PreferColorScheme" xlink:title="<xPreferColorScheme> PreferColorScheme| <xPreferNormal> PreferNormal| <xPreferLight> PreferLight| <xPreferHud> PreferHud| <xPreferDark> PreferDark">+<polygon fill="none" stroke="black" points="612.62,-1473.75 612.62,-1596.25 735.88,-1596.25 735.88,-1473.75 612.62,-1473.75"/>+<text text-anchor="middle" x="674.25" y="-1578.95" font-family="Times,serif" font-size="14.00">PreferColorScheme</text>+<polyline fill="none" stroke="black" points="612.62,-1571.75 735.88,-1571.75"/>+<text text-anchor="middle" x="674.25" y="-1554.45" font-family="Times,serif" font-size="14.00">PreferNormal</text>+<polyline fill="none" stroke="black" points="612.62,-1547.25 735.88,-1547.25"/>+<text text-anchor="middle" x="674.25" y="-1529.95" font-family="Times,serif" font-size="14.00">PreferLight</text>+<polyline fill="none" stroke="black" points="612.62,-1522.75 735.88,-1522.75"/>+<text text-anchor="middle" x="674.25" y="-1505.45" font-family="Times,serif" font-size="14.00">PreferHud</text>+<polyline fill="none" stroke="black" points="612.62,-1498.25 735.88,-1498.25"/>+<text text-anchor="middle" x="674.25" y="-1480.95" font-family="Times,serif" font-size="14.00">PreferDark</text>+</a>+</g>+</g>+<!-- PathData -->+<g id="node16" class="node">+<title>PathData</title>+<g id="a_node16"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Data-Path.html#t:PathData" xlink:title="<xPathData> PathData| <xStartP> StartP| <xQuadP> QuadP| <xLineP> LineP| <xCubicP> CubicP| <xArcP> ArcP">+<polygon fill="none" stroke="black" points="1391.12,-1415.5 1391.12,-1562.5 1456.62,-1562.5 1456.62,-1415.5 1391.12,-1415.5"/>+<text text-anchor="middle" x="1423.88" y="-1545.2" font-family="Times,serif" font-size="14.00">PathData</text>+<polyline fill="none" stroke="black" points="1391.12,-1538 1456.62,-1538"/>+<text text-anchor="middle" x="1423.88" y="-1520.7" font-family="Times,serif" font-size="14.00">StartP</text>+<polyline fill="none" stroke="black" points="1391.12,-1513.5 1456.62,-1513.5"/>+<text text-anchor="middle" x="1423.88" y="-1496.2" font-family="Times,serif" font-size="14.00">QuadP</text>+<polyline fill="none" stroke="black" points="1391.12,-1489 1456.62,-1489"/>+<text text-anchor="middle" x="1423.88" y="-1471.7" font-family="Times,serif" font-size="14.00">LineP</text>+<polyline fill="none" stroke="black" points="1391.12,-1464.5 1456.62,-1464.5"/>+<text text-anchor="middle" x="1423.88" y="-1447.2" font-family="Times,serif" font-size="14.00">CubicP</text>+<polyline fill="none" stroke="black" points="1391.12,-1440 1456.62,-1440"/>+<text text-anchor="middle" x="1423.88" y="-1422.7" font-family="Times,serif" font-size="14.00">ArcP</text>+</a>+</g>+</g>+<!-- ArcInfo -->+<g id="node37" class="node">+<title>ArcInfo</title>+<g id="a_node37"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Data-Path.html#t:ArcInfo" xlink:title="<xArcInfo> ArcInfo| <xradii> radii| <xphi> phi| <xlarge> large| <xclockwise> clockwise">+<polygon fill="none" stroke="black" points="1610,-1357.75 1610,-1480.25 1680,-1480.25 1680,-1357.75 1610,-1357.75"/>+<text text-anchor="middle" x="1645" y="-1462.95" font-family="Times,serif" font-size="14.00">ArcInfo</text>+<polyline fill="none" stroke="black" points="1610,-1455.75 1680,-1455.75"/>+<text text-anchor="middle" x="1645" y="-1438.45" font-family="Times,serif" font-size="14.00">radii</text>+<polyline fill="none" stroke="black" points="1610,-1431.25 1680,-1431.25"/>+<text text-anchor="middle" x="1645" y="-1413.95" font-family="Times,serif" font-size="14.00">phi</text>+<polyline fill="none" stroke="black" points="1610,-1406.75 1680,-1406.75"/>+<text text-anchor="middle" x="1645" y="-1389.45" font-family="Times,serif" font-size="14.00">large</text>+<polyline fill="none" stroke="black" points="1610,-1382.25 1680,-1382.25"/>+<text text-anchor="middle" x="1645" y="-1364.95" font-family="Times,serif" font-size="14.00">clockwise</text>+</a>+</g>+</g>+<!-- PathData->ArcInfo -->+<g id="edge22" class="edge">+<title>PathData:xArcP->ArcInfo:xArcInfo</title>+<path fill="none" stroke="black" d="M1457.88,-1428C1525.6,-1428 1539.27,-1465.54 1603.61,-1467.89"/>+<polygon fill="black" stroke="black" points="1603.46,-1469.63 1608.49,-1467.97 1603.52,-1466.13 1603.46,-1469.63"/>+<text text-anchor="middle" x="1547.75" y="-1469.2" font-family="Times,serif" font-size="14.00">(ArcP arcinfo _)</text>+</g>+<!-- MarkupOptions -->+<g id="node17" class="node">+<title>MarkupOptions</title>+<g id="a_node17"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Markup.html#t:MarkupOptions" xlink:title="<xMarkupOptions> MarkupOptions| <xrenderStyle> renderStyle| <xmarkupHeight> markupHeight| <xcssOptions> cssOptions| <xchartAspect> chartAspect">+<polygon fill="none" stroke="black" points="137.75,-1554.75 137.75,-1677.25 240,-1677.25 240,-1554.75 137.75,-1554.75"/>+<text text-anchor="middle" x="188.88" y="-1659.95" font-family="Times,serif" font-size="14.00">MarkupOptions</text>+<polyline fill="none" stroke="black" points="137.75,-1652.75 240,-1652.75"/>+<text text-anchor="middle" x="188.88" y="-1635.45" font-family="Times,serif" font-size="14.00">renderStyle</text>+<polyline fill="none" stroke="black" points="137.75,-1628.25 240,-1628.25"/>+<text text-anchor="middle" x="188.88" y="-1610.95" font-family="Times,serif" font-size="14.00">markupHeight</text>+<polyline fill="none" stroke="black" points="137.75,-1603.75 240,-1603.75"/>+<text text-anchor="middle" x="188.88" y="-1586.45" font-family="Times,serif" font-size="14.00">cssOptions</text>+<polyline fill="none" stroke="black" points="137.75,-1579.25 240,-1579.25"/>+<text text-anchor="middle" x="188.88" y="-1561.95" font-family="Times,serif" font-size="14.00">chartAspect</text>+</a>+</g>+</g>+<!-- MarkupOptions->RenderStyle -->+<g id="edge23" class="edge">+<title>MarkupOptions:xrenderStyle->RenderStyle:xRenderStyle</title>+<path fill="none" stroke="black" d="M240,-1641C260.23,-1641 350.05,-1753.28 380.61,-1769.94"/>+<polygon fill="black" stroke="black" points="380.02,-1771.59 385.31,-1771.52 381.13,-1768.27 380.02,-1771.59"/>+</g>+<!-- CssOptions -->+<g id="node28" class="node">+<title>CssOptions</title>+<g id="a_node28"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Markup.html#t:CssOptions" xlink:title="<xCssOptions> CssOptions| <xshapeRendering> shapeRendering| <xpreferColorScheme> preferColorScheme| <xfontFamilies> fontFamilies| <xcssExtra> cssExtra">+<polygon fill="none" stroke="black" points="367.5,-1568.75 367.5,-1691.25 490,-1691.25 490,-1568.75 367.5,-1568.75"/>+<text text-anchor="middle" x="428.75" y="-1673.95" font-family="Times,serif" font-size="14.00">CssOptions</text>+<polyline fill="none" stroke="black" points="367.5,-1666.75 490,-1666.75"/>+<text text-anchor="middle" x="428.75" y="-1649.45" font-family="Times,serif" font-size="14.00">shapeRendering</text>+<polyline fill="none" stroke="black" points="367.5,-1642.25 490,-1642.25"/>+<text text-anchor="middle" x="428.75" y="-1624.95" font-family="Times,serif" font-size="14.00">preferColorScheme</text>+<polyline fill="none" stroke="black" points="367.5,-1617.75 490,-1617.75"/>+<text text-anchor="middle" x="428.75" y="-1600.45" font-family="Times,serif" font-size="14.00">fontFamilies</text>+<polyline fill="none" stroke="black" points="367.5,-1593.25 490,-1593.25"/>+<text text-anchor="middle" x="428.75" y="-1575.95" font-family="Times,serif" font-size="14.00">cssExtra</text>+</a>+</g>+</g>+<!-- MarkupOptions->CssOptions -->+<g id="edge24" class="edge">+<title>MarkupOptions:xcssOptions->CssOptions:xCssOptions</title>+<path fill="none" stroke="black" d="M240,-1591C306.7,-1591 299.21,-1673.59 361.27,-1678.75"/>+<polygon fill="black" stroke="black" points="360.92,-1680.48 365.99,-1678.94 361.06,-1676.99 360.92,-1680.48"/>+</g>+<!-- ChartAspect -->+<g id="node33" class="node">+<title>ChartAspect</title>+<g id="a_node33"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Primitive.html#t:ChartAspect" xlink:title="<xChartAspect> ChartAspect| <xUnscaledAspect> UnscaledAspect| <xFixedAspect> FixedAspect| <xCanvasAspect> CanvasAspect">+<polygon fill="none" stroke="black" points="376.88,-1452 376.88,-1550 480.62,-1550 480.62,-1452 376.88,-1452"/>+<text text-anchor="middle" x="428.75" y="-1532.7" font-family="Times,serif" font-size="14.00">ChartAspect</text>+<polyline fill="none" stroke="black" points="376.88,-1525.5 480.62,-1525.5"/>+<text text-anchor="middle" x="428.75" y="-1508.2" font-family="Times,serif" font-size="14.00">UnscaledAspect</text>+<polyline fill="none" stroke="black" points="376.88,-1501 480.62,-1501"/>+<text text-anchor="middle" x="428.75" y="-1483.7" font-family="Times,serif" font-size="14.00">FixedAspect</text>+<polyline fill="none" stroke="black" points="376.88,-1476.5 480.62,-1476.5"/>+<text text-anchor="middle" x="428.75" y="-1459.2" font-family="Times,serif" font-size="14.00">CanvasAspect</text>+</a>+</g>+</g>+<!-- MarkupOptions->ChartAspect -->+<g id="edge25" class="edge">+<title>MarkupOptions:xchartAspect->ChartAspect:xChartAspect</title>+<path fill="none" stroke="black" d="M240,-1567C299.53,-1567 313.13,-1540 369.42,-1538.11"/>+<polygon fill="black" stroke="black" points="369.27,-1539.86 374.24,-1538.03 369.21,-1536.36 369.27,-1539.86"/>+</g>+<!-- LegendOptions -->+<g id="node20" class="node">+<title>LegendOptions</title>+<g id="a_node20"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:LegendOptions" xlink:title="<xLegendOptions> LegendOptions| <xvgap> vgap| <xtextStyle> textStyle| <xscaleP> scaleP| <xscaleChartsBy> scaleChartsBy| <xplace> place| <xouterPad> outerPad| <xlegendSize> legendSize| <xlegendCharts> legendCharts| <xinnerPad> innerPad| <xhgap> hgap| <xframe> frame| <xbuffer> buffer">+<polygon fill="none" stroke="black" points="624.62,-854.75 624.62,-1173.25 723.88,-1173.25 723.88,-854.75 624.62,-854.75"/>+<text text-anchor="middle" x="674.25" y="-1155.95" font-family="Times,serif" font-size="14.00">LegendOptions</text>+<polyline fill="none" stroke="black" points="624.62,-1148.75 723.88,-1148.75"/>+<text text-anchor="middle" x="674.25" y="-1131.45" font-family="Times,serif" font-size="14.00">vgap</text>+<polyline fill="none" stroke="black" points="624.62,-1124.25 723.88,-1124.25"/>+<text text-anchor="middle" x="674.25" y="-1106.95" font-family="Times,serif" font-size="14.00">textStyle</text>+<polyline fill="none" stroke="black" points="624.62,-1099.75 723.88,-1099.75"/>+<text text-anchor="middle" x="674.25" y="-1082.45" font-family="Times,serif" font-size="14.00">scaleP</text>+<polyline fill="none" stroke="black" points="624.62,-1075.25 723.88,-1075.25"/>+<text text-anchor="middle" x="674.25" y="-1057.95" font-family="Times,serif" font-size="14.00">scaleChartsBy</text>+<polyline fill="none" stroke="black" points="624.62,-1050.75 723.88,-1050.75"/>+<text text-anchor="middle" x="674.25" y="-1033.45" font-family="Times,serif" font-size="14.00">place</text>+<polyline fill="none" stroke="black" points="624.62,-1026.25 723.88,-1026.25"/>+<text text-anchor="middle" x="674.25" y="-1008.95" font-family="Times,serif" font-size="14.00">outerPad</text>+<polyline fill="none" stroke="black" points="624.62,-1001.75 723.88,-1001.75"/>+<text text-anchor="middle" x="674.25" y="-984.45" font-family="Times,serif" font-size="14.00">legendSize</text>+<polyline fill="none" stroke="black" points="624.62,-977.25 723.88,-977.25"/>+<text text-anchor="middle" x="674.25" y="-959.95" font-family="Times,serif" font-size="14.00">legendCharts</text>+<polyline fill="none" stroke="black" points="624.62,-952.75 723.88,-952.75"/>+<text text-anchor="middle" x="674.25" y="-935.45" font-family="Times,serif" font-size="14.00">innerPad</text>+<polyline fill="none" stroke="black" points="624.62,-928.25 723.88,-928.25"/>+<text text-anchor="middle" x="674.25" y="-910.95" font-family="Times,serif" font-size="14.00">hgap</text>+<polyline fill="none" stroke="black" points="624.62,-903.75 723.88,-903.75"/>+<text text-anchor="middle" x="674.25" y="-886.45" font-family="Times,serif" font-size="14.00">frame</text>+<polyline fill="none" stroke="black" points="624.62,-879.25 723.88,-879.25"/>+<text text-anchor="middle" x="674.25" y="-861.95" font-family="Times,serif" font-size="14.00">buffer</text>+</a>+</g>+</g>+<!-- LegendOptions->Style -->+<g id="edge26" class="edge">+<title>LegendOptions:xtextStyle->Style:xStyle</title>+<path fill="none" stroke="black" d="M725.25,-1112C905.58,-1112 952.07,-1123.72 1129.27,-1124"/>+<polygon fill="black" stroke="black" points="1129.11,-1125.74 1134.11,-1124 1129.11,-1122.24 1129.11,-1125.74"/>+</g>+<!-- LegendOptions->Style -->+<g id="edge30" class="edge">+<title>LegendOptions:xframe->Style:xStyle</title>+<path fill="none" stroke="black" d="M725.25,-891C837.92,-891 879.42,-840.32 978.75,-893.5 1086.08,-950.96 1014.33,-1117.99 1129.27,-1123.84"/>+<polygon fill="black" stroke="black" points="1129.07,-1125.59 1134.11,-1123.96 1129.16,-1122.09 1129.07,-1125.59"/>+<text text-anchor="middle" x="931.75" y="-896.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- LegendOptions->ScaleP -->+<g id="edge27" class="edge">+<title>LegendOptions:xscaleP->ScaleP:xScaleP</title>+<path fill="none" stroke="black" d="M725.25,-1088C749.92,-1088 746.6,-1110.29 764.75,-1127 816.46,-1174.61 823,-1196.43 884.75,-1230 930.34,-1254.78 945.39,-1255.59 996.75,-1263 1149.61,-1285.05 1206.04,-1331.92 1344.25,-1263 1360.95,-1254.67 1354,-1231.43 1366.68,-1226.1"/>+<polygon fill="black" stroke="black" points="1366.77,-1227.86 1371.38,-1225.26 1366.16,-1224.42 1366.77,-1227.86"/>+</g>+<!-- LegendOptions->Place -->+<g id="edge28" class="edge">+<title>LegendOptions:xplace->Place:xPlace</title>+<path fill="none" stroke="black" d="M725.25,-1039C788.16,-1039 806.43,-1025.11 866.75,-1043 873.21,-1044.92 874.84,-1049.76 878.73,-1052.33"/>+<polygon fill="black" stroke="black" points="878.01,-1053.95 883.29,-1053.6 878.94,-1050.58 878.01,-1053.95"/>+</g>+<!-- Chart -->+<g id="node34" class="node">+<title>Chart</title>+<g id="a_node34"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Primitive.html#t:Chart" xlink:title="<xChart> Chart| <xchartStyle> chartStyle| <xchartData> chartData">+<polygon fill="none" stroke="black" points="896.38,-1147.25 896.38,-1220.75 967.12,-1220.75 967.12,-1147.25 896.38,-1147.25"/>+<text text-anchor="middle" x="931.75" y="-1203.45" font-family="Times,serif" font-size="14.00">Chart</text>+<polyline fill="none" stroke="black" points="896.38,-1196.25 967.12,-1196.25"/>+<text text-anchor="middle" x="931.75" y="-1178.95" font-family="Times,serif" font-size="14.00">chartStyle</text>+<polyline fill="none" stroke="black" points="896.38,-1171.75 967.12,-1171.75"/>+<text text-anchor="middle" x="931.75" y="-1154.45" font-family="Times,serif" font-size="14.00">chartData</text>+</a>+</g>+</g>+<!-- LegendOptions->Chart -->+<g id="edge29" class="edge">+<title>LegendOptions:xlegendCharts->Chart:xChart</title>+<path fill="none" stroke="black" d="M725.25,-965C767.72,-965 742.16,-1016.04 764.75,-1052 811.9,-1127.08 805.24,-1205.09 889.27,-1208.86"/>+<polygon fill="black" stroke="black" points="889.2,-1210.61 894.24,-1208.97 889.28,-1207.11 889.2,-1210.61"/>+<text text-anchor="middle" x="815.75" y="-1207.2" font-family="Times,serif" font-size="14.00">each % _2 % each</text>+</g>+<!-- HudOptions -->+<g id="node21" class="node">+<title>HudOptions</title>+<g id="a_node21"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:HudOptions" xlink:title="<xHudOptions> HudOptions| <xtitles> titles| <xlegends> legends| <xframes> frames| <xaxes> axes">+<polygon fill="none" stroke="black" points="147.88,-1027.75 147.88,-1150.25 229.88,-1150.25 229.88,-1027.75 147.88,-1027.75"/>+<text text-anchor="middle" x="188.88" y="-1132.95" font-family="Times,serif" font-size="14.00">HudOptions</text>+<polyline fill="none" stroke="black" points="147.88,-1125.75 229.88,-1125.75"/>+<text text-anchor="middle" x="188.88" y="-1108.45" font-family="Times,serif" font-size="14.00">titles</text>+<polyline fill="none" stroke="black" points="147.88,-1101.25 229.88,-1101.25"/>+<text text-anchor="middle" x="188.88" y="-1083.95" font-family="Times,serif" font-size="14.00">legends</text>+<polyline fill="none" stroke="black" points="147.88,-1076.75 229.88,-1076.75"/>+<text text-anchor="middle" x="188.88" y="-1059.45" font-family="Times,serif" font-size="14.00">frames</text>+<polyline fill="none" stroke="black" points="147.88,-1052.25 229.88,-1052.25"/>+<text text-anchor="middle" x="188.88" y="-1034.95" font-family="Times,serif" font-size="14.00">axes</text>+</a>+</g>+</g>+<!-- HudOptions->TitleOptions -->+<g id="edge31" class="edge">+<title>HudOptions:xtitles->TitleOptions:xTitleOptions</title>+<path fill="none" stroke="black" d="M230.88,-1114C258.13,-1114 238.18,-1150.29 258,-1169 387.47,-1291.2 449.65,-1326.18 624.97,-1326.99"/>+<polygon fill="black" stroke="black" points="624.73,-1328.74 629.74,-1327 624.74,-1325.24 624.73,-1328.74"/>+<text text-anchor="middle" x="428.75" y="-1317.2" font-family="Times,serif" font-size="14.00">each % #item</text>+</g>+<!-- HudOptions->Priority -->+<g id="edge32" class="edge">+<title>HudOptions:xtitles->Priority:xPriority</title>+<path fill="none" stroke="black" d="M230.88,-1114C283.69,-1114 298.37,-1120.22 349.5,-1107 364.75,-1103.06 380.59,-1096.11 394.07,-1089.23"/>+<polygon fill="black" stroke="black" points="394.72,-1090.86 398.35,-1086.99 393.1,-1087.76 394.72,-1090.86"/>+<text text-anchor="middle" x="303.75" y="-1118.2" font-family="Times,serif" font-size="14.00">each % #priority</text>+</g>+<!-- HudOptions->Priority -->+<g id="edge33" class="edge">+<title>HudOptions:xlegends->Priority:xPriority</title>+<path fill="none" stroke="black" d="M230.88,-1089C234.9,-1089 337.88,-1078.41 393.64,-1072.64"/>+<polygon fill="black" stroke="black" points="393.57,-1074.41 398.37,-1072.15 393.21,-1070.92 393.57,-1074.41"/>+<text text-anchor="middle" x="303.75" y="-1089.2" font-family="Times,serif" font-size="14.00">each % #priority</text>+</g>+<!-- HudOptions->Priority -->+<g id="edge35" class="edge">+<title>HudOptions:xframes->Priority:xPriority</title>+<path fill="none" stroke="black" d="M230.88,-1064C243.38,-1064 245.61,-1058.18 258,-1056.5 298.3,-1051.03 308.96,-1053.32 349.5,-1056.5 364.07,-1057.64 380.01,-1059.95 393.75,-1062.27"/>+<polygon fill="black" stroke="black" points="393.18,-1063.95 398.4,-1063.08 393.78,-1060.5 393.18,-1063.95"/>+<text text-anchor="middle" x="303.75" y="-1059.2" font-family="Times,serif" font-size="14.00">each % #priority</text>+</g>+<!-- HudOptions->Priority -->+<g id="edge37" class="edge">+<title>HudOptions:xaxes->Priority:xPriority</title>+<path fill="none" stroke="black" d="M230.88,-1040C243.38,-1040 245.61,-1034.18 258,-1032.5 298.3,-1027.03 309.78,-1023.79 349.5,-1032.5 364.78,-1035.85 380.62,-1042.43 394.09,-1049.1"/>+<polygon fill="black" stroke="black" points="393.11,-1050.56 398.36,-1051.27 394.7,-1047.44 393.11,-1050.56"/>+<text text-anchor="middle" x="303.75" y="-1035.2" font-family="Times,serif" font-size="14.00">each % #priority</text>+</g>+<!-- HudOptions->LegendOptions -->+<g id="edge34" class="edge">+<title>HudOptions:xlegends->LegendOptions:xLegendOptions</title>+<path fill="none" stroke="black" d="M230.88,-1089C254.99,-1089 237.54,-1123.23 258,-1136 394.29,-1221.04 458.89,-1162.53 617.1,-1161.03"/>+<polygon fill="black" stroke="black" points="616.74,-1162.78 621.74,-1161.01 616.73,-1159.28 616.74,-1162.78"/>+<text text-anchor="middle" x="428.75" y="-1185.2" font-family="Times,serif" font-size="14.00">each % #item</text>+</g>+<!-- FrameOptions -->+<g id="node24" class="node">+<title>FrameOptions</title>+<g id="a_node24"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:FrameOptions" xlink:title="<xFrameOptions> FrameOptions| <xframe> frame| <xbuffer> buffer| <xanchorTo> anchorTo">+<polygon fill="none" stroke="black" points="884.75,-226 884.75,-324 978.75,-324 978.75,-226 884.75,-226"/>+<text text-anchor="middle" x="931.75" y="-306.7" font-family="Times,serif" font-size="14.00">FrameOptions</text>+<polyline fill="none" stroke="black" points="884.75,-299.5 978.75,-299.5"/>+<text text-anchor="middle" x="931.75" y="-282.2" font-family="Times,serif" font-size="14.00">frame</text>+<polyline fill="none" stroke="black" points="884.75,-275 978.75,-275"/>+<text text-anchor="middle" x="931.75" y="-257.7" font-family="Times,serif" font-size="14.00">buffer</text>+<polyline fill="none" stroke="black" points="884.75,-250.5 978.75,-250.5"/>+<text text-anchor="middle" x="931.75" y="-233.2" font-family="Times,serif" font-size="14.00">anchorTo</text>+</a>+</g>+</g>+<!-- HudOptions->FrameOptions -->+<g id="edge36" class="edge">+<title>HudOptions:xframes->FrameOptions:xFrameOptions</title>+<path fill="none" stroke="black" d="M230.88,-1064C262.2,-1064 348.15,-541.63 367.5,-517 518.95,-324.27 635.4,-312.2 878.26,-312"/>+<polygon fill="black" stroke="black" points="878.24,-313.75 883.24,-312 878.24,-310.25 878.24,-313.75"/>+<text text-anchor="middle" x="545.88" y="-384.2" font-family="Times,serif" font-size="14.00">each % #item</text>+</g>+<!-- AxisOptions -->+<g id="node35" class="node">+<title>AxisOptions</title>+<g id="a_node35"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:AxisOptions" xlink:title="<xAxisOptions> AxisOptions| <xticks> ticks| <xplace> place| <xaxisBar> axisBar| <xadjustments> adjustments">+<polygon fill="none" stroke="black" points="386.62,-526.75 386.62,-649.25 470.88,-649.25 470.88,-526.75 386.62,-526.75"/>+<text text-anchor="middle" x="428.75" y="-631.95" font-family="Times,serif" font-size="14.00">AxisOptions</text>+<polyline fill="none" stroke="black" points="386.62,-624.75 470.88,-624.75"/>+<text text-anchor="middle" x="428.75" y="-607.45" font-family="Times,serif" font-size="14.00">ticks</text>+<polyline fill="none" stroke="black" points="386.62,-600.25 470.88,-600.25"/>+<text text-anchor="middle" x="428.75" y="-582.95" font-family="Times,serif" font-size="14.00">place</text>+<polyline fill="none" stroke="black" points="386.62,-575.75 470.88,-575.75"/>+<text text-anchor="middle" x="428.75" y="-558.45" font-family="Times,serif" font-size="14.00">axisBar</text>+<polyline fill="none" stroke="black" points="386.62,-551.25 470.88,-551.25"/>+<text text-anchor="middle" x="428.75" y="-533.95" font-family="Times,serif" font-size="14.00">adjustments</text>+</a>+</g>+</g>+<!-- HudOptions->AxisOptions -->+<g id="edge38" class="edge">+<title>HudOptions:xaxes->AxisOptions:xAxisOptions</title>+<path fill="none" stroke="black" d="M188.88,-1027C188.88,-835.01 191.52,-641.4 379.28,-637.07"/>+<polygon fill="black" stroke="black" points="379.26,-638.82 384.24,-637.02 379.22,-635.32 379.26,-638.82"/>+<text text-anchor="middle" x="303.75" y="-682.2" font-family="Times,serif" font-size="14.00">each % #item</text>+</g>+<!-- FrameOptions->Style -->+<g id="edge39" class="edge">+<title>FrameOptions:xframe->Style:xStyle</title>+<path fill="none" stroke="black" d="M978.75,-287C990.81,-287 1079.54,-465.94 1083,-477.5 1103.07,-544.52 1065.85,-1090.6 1129.58,-1122.54"/>+<polygon fill="black" stroke="black" points="1128.88,-1124.17 1134.15,-1123.65 1129.7,-1120.77 1128.88,-1124.17"/>+<text text-anchor="middle" x="1039.88" y="-480.2" font-family="Times,serif" font-size="14.00">#frame % _Just</text>+</g>+<!-- FrameOptions->HudChartSection -->+<g id="edge40" class="edge">+<title>FrameOptions:xanchorTo->HudChartSection:xHudChartSection</title>+<path fill="none" stroke="black" d="M978.75,-238C1016.71,-238 1069,-344.32 1108.41,-355.12"/>+<polygon fill="black" stroke="black" points="1107.93,-356.82 1113.13,-355.79 1108.42,-353.35 1107.93,-356.82"/>+</g>+<!-- FStyle -->+<g id="node26" class="node">+<title>FStyle</title>+<g id="a_node26"><a xlink:href="https://hackage.haskell.org/package/formatn/docs/Data-FormatN.html#t:FStyle" xlink:title="<xFStyle> FStyle| <xFSPrec> FSPrec| <xFSPercent> FSPercent| <xFSNone> FSNone| <xFSFixed Int> FSFixed Int| <xFSExponent> FSExponent| <xFSDollar> FSDollar| <xFSDecimal> FSDecimal| <xFSCommaPrec> FSCommaPrec| <xFSComma> FSComma">+<polygon fill="none" stroke="black" points="1374.25,-0.5 1374.25,-245.5 1473.5,-245.5 1473.5,-0.5 1374.25,-0.5"/>+<text text-anchor="middle" x="1423.88" y="-228.2" font-family="Times,serif" font-size="14.00">FStyle</text>+<polyline fill="none" stroke="black" points="1374.25,-221 1473.5,-221"/>+<text text-anchor="middle" x="1423.88" y="-203.7" font-family="Times,serif" font-size="14.00">FSPrec</text>+<polyline fill="none" stroke="black" points="1374.25,-196.5 1473.5,-196.5"/>+<text text-anchor="middle" x="1423.88" y="-179.2" font-family="Times,serif" font-size="14.00">FSPercent</text>+<polyline fill="none" stroke="black" points="1374.25,-172 1473.5,-172"/>+<text text-anchor="middle" x="1423.88" y="-154.7" font-family="Times,serif" font-size="14.00">FSNone</text>+<polyline fill="none" stroke="black" points="1374.25,-147.5 1473.5,-147.5"/>+<text text-anchor="middle" x="1423.88" y="-130.2" font-family="Times,serif" font-size="14.00">FSFixed Int</text>+<polyline fill="none" stroke="black" points="1374.25,-123 1473.5,-123"/>+<text text-anchor="middle" x="1423.88" y="-105.7" font-family="Times,serif" font-size="14.00">FSExponent</text>+<polyline fill="none" stroke="black" points="1374.25,-98.5 1473.5,-98.5"/>+<text text-anchor="middle" x="1423.88" y="-81.2" font-family="Times,serif" font-size="14.00">FSDollar</text>+<polyline fill="none" stroke="black" points="1374.25,-74 1473.5,-74"/>+<text text-anchor="middle" x="1423.88" y="-56.7" font-family="Times,serif" font-size="14.00">FSDecimal</text>+<polyline fill="none" stroke="black" points="1374.25,-49.5 1473.5,-49.5"/>+<text text-anchor="middle" x="1423.88" y="-32.2" font-family="Times,serif" font-size="14.00">FSCommaPrec</text>+<polyline fill="none" stroke="black" points="1374.25,-25 1473.5,-25"/>+<text text-anchor="middle" x="1423.88" y="-7.7" font-family="Times,serif" font-size="14.00">FSComma</text>+</a>+</g>+</g>+<!-- FormatN->FStyle -->+<g id="edge41" class="edge">+<title>FormatN:xfstyle->FStyle:xFStyle</title>+<path fill="none" stroke="black" d="M1254.25,-476C1279.24,-476 1262.38,-387.96 1272.25,-365 1300.53,-299.21 1299.21,-236.77 1366.58,-233.16"/>+<polygon fill="black" stroke="black" points="1366.41,-234.92 1371.36,-233.04 1366.32,-231.42 1366.41,-234.92"/>+</g>+<!-- CssOptions->ShapeRendering -->+<g id="edge42" class="edge">+<title>CssOptions:xshapeRendering->ShapeRendering:xShapeRendering</title>+<path fill="none" stroke="black" d="M490,-1655C541.51,-1655 547.6,-1697.3 595.38,-1700.77"/>+<polygon fill="black" stroke="black" points="595.18,-1702.52 600.24,-1700.95 595.3,-1699.02 595.18,-1702.52"/>+</g>+<!-- CssOptions->PreferColorScheme -->+<g id="edge43" class="edge">+<title>CssOptions:xpreferColorScheme->PreferColorScheme:xPreferColorScheme</title>+<path fill="none" stroke="black" d="M490,-1630C545.5,-1630 553.1,-1587.35 605.04,-1584.19"/>+<polygon fill="black" stroke="black" points="604.79,-1585.94 609.74,-1584.05 604.69,-1582.45 604.79,-1585.94"/>+</g>+<!-- ChartTree -->+<g id="node30" class="node">+<title>ChartTree</title>+<g id="a_node30"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Primitive.html#t:ChartTree" xlink:title="<xChartTree> ChartTree| <xtree> tree| <xcharts'> charts'">+<polygon fill="none" stroke="black" points="153.5,-1367.25 153.5,-1440.75 224.25,-1440.75 224.25,-1367.25 153.5,-1367.25"/>+<text text-anchor="middle" x="188.88" y="-1423.45" font-family="Times,serif" font-size="14.00">ChartTree</text>+<polyline fill="none" stroke="black" points="153.5,-1416.25 224.25,-1416.25"/>+<text text-anchor="middle" x="188.88" y="-1398.95" font-family="Times,serif" font-size="14.00">tree</text>+<polyline fill="none" stroke="black" points="153.5,-1391.75 224.25,-1391.75"/>+<text text-anchor="middle" x="188.88" y="-1374.45" font-family="Times,serif" font-size="14.00">charts'</text>+</a>+</g>+</g>+<!-- ChartTree->Tree -->+<g id="edge44" class="edge">+<title>ChartTree:xtree->Tree:xTree</title>+<path fill="none" stroke="black" d="M224.88,-1404C284.81,-1404 354.51,-1408.8 394.93,-1412.06"/>+<polygon fill="black" stroke="black" points="394.77,-1413.8 399.9,-1412.46 395.06,-1410.31 394.77,-1413.8"/>+</g>+<!-- ChartTree->Chart -->+<g id="edge45" class="edge">+<title>ChartTree:xcharts'->Chart:xChart</title>+<path fill="none" stroke="black" d="M224.88,-1379C341.04,-1379 640.02,-1394.86 746.75,-1349 828.28,-1313.97 806.01,-1213.84 889.55,-1209.17"/>+<polygon fill="black" stroke="black" points="889.29,-1210.93 894.24,-1209.04 889.19,-1207.43 889.29,-1210.93"/>+<text text-anchor="middle" x="545.88" y="-1383.2" font-family="Times,serif" font-size="14.00">each</text>+</g>+<!-- ChartOptions -->+<g id="node31" class="node">+<title>ChartOptions</title>+<g id="a_node31"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Markup.html#t:ChartOptions" xlink:title="<xChartOptions> ChartOptions| <xmarkupOptions> markupOptions| <xhudOptions> hudOptions| <xchartTree> chartTree">+<polygon fill="none" stroke="black" points="0,-1417 0,-1515 100.75,-1515 100.75,-1417 0,-1417"/>+<text text-anchor="middle" x="50.38" y="-1497.7" font-family="Times,serif" font-size="14.00">ChartOptions</text>+<polyline fill="none" stroke="black" points="0,-1490.5 100.75,-1490.5"/>+<text text-anchor="middle" x="50.38" y="-1473.2" font-family="Times,serif" font-size="14.00">markupOptions</text>+<polyline fill="none" stroke="black" points="0,-1466 100.75,-1466"/>+<text text-anchor="middle" x="50.38" y="-1448.7" font-family="Times,serif" font-size="14.00">hudOptions</text>+<polyline fill="none" stroke="black" points="0,-1441.5 100.75,-1441.5"/>+<text text-anchor="middle" x="50.38" y="-1424.2" font-family="Times,serif" font-size="14.00">chartTree</text>+</a>+</g>+</g>+<!-- ChartOptions->MarkupOptions -->+<g id="edge46" class="edge">+<title>ChartOptions:xmarkupOptions->MarkupOptions:xMarkupOptions</title>+<path fill="none" stroke="black" d="M100.75,-1478C183.16,-1478 60.11,-1654.91 131.28,-1664.59"/>+<polygon fill="black" stroke="black" points="131.14,-1666.33 136.24,-1664.9 131.36,-1662.84 131.14,-1666.33"/>+</g>+<!-- ChartOptions->HudOptions -->+<g id="edge47" class="edge">+<title>ChartOptions:xhudOptions->HudOptions:xHudOptions</title>+<path fill="none" stroke="black" d="M100.75,-1454C134.15,-1454 114.1,-1173.95 141.23,-1141.13"/>+<polygon fill="black" stroke="black" points="142.03,-1142.69 145.55,-1138.73 140.33,-1139.63 142.03,-1142.69"/>+</g>+<!-- ChartOptions->ChartTree -->+<g id="edge48" class="edge">+<title>ChartOptions:xchartTree->ChartTree:xChartTree</title>+<path fill="none" stroke="black" d="M100.75,-1429C121.74,-1429 128.47,-1429 146.79,-1429"/>+<polygon fill="black" stroke="black" points="146.36,-1430.75 151.36,-1429 146.36,-1427.25 146.36,-1430.75"/>+</g>+<!-- ChartData -->+<g id="node32" class="node">+<title>ChartData</title>+<g id="a_node32"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Primitive.html#t:ChartData" xlink:title="<xChartData> ChartData| <xtextData'> textData'| <xrectData'> rectData'| <xpathData'> pathData'| <xlineData'> lineData'| <xglyphData'> glyphData'| <xblankData'> blankData'">+<polygon fill="none" stroke="black" points="1140.38,-1464.25 1140.38,-1635.75 1214.88,-1635.75 1214.88,-1464.25 1140.38,-1464.25"/>+<text text-anchor="middle" x="1177.62" y="-1618.45" font-family="Times,serif" font-size="14.00">ChartData</text>+<polyline fill="none" stroke="black" points="1140.38,-1611.25 1214.88,-1611.25"/>+<text text-anchor="middle" x="1177.62" y="-1593.95" font-family="Times,serif" font-size="14.00">textData'</text>+<polyline fill="none" stroke="black" points="1140.38,-1586.75 1214.88,-1586.75"/>+<text text-anchor="middle" x="1177.62" y="-1569.45" font-family="Times,serif" font-size="14.00">rectData'</text>+<polyline fill="none" stroke="black" points="1140.38,-1562.25 1214.88,-1562.25"/>+<text text-anchor="middle" x="1177.62" y="-1544.95" font-family="Times,serif" font-size="14.00">pathData'</text>+<polyline fill="none" stroke="black" points="1140.38,-1537.75 1214.88,-1537.75"/>+<text text-anchor="middle" x="1177.62" y="-1520.45" font-family="Times,serif" font-size="14.00">lineData'</text>+<polyline fill="none" stroke="black" points="1140.38,-1513.25 1214.88,-1513.25"/>+<text text-anchor="middle" x="1177.62" y="-1495.95" font-family="Times,serif" font-size="14.00">glyphData'</text>+<polyline fill="none" stroke="black" points="1140.38,-1488.75 1214.88,-1488.75"/>+<text text-anchor="middle" x="1177.62" y="-1471.45" font-family="Times,serif" font-size="14.00">blankData'</text>+</a>+</g>+</g>+<!-- ChartData->Rect -->+<g id="edge50" class="edge">+<title>ChartData:xrectData'->Rect:xRect</title>+<path fill="none" stroke="black" d="M1215.62,-1575C1277.5,-1575 1348.98,-1586.01 1390.05,-1593.42"/>+<polygon fill="black" stroke="black" points="1389.66,-1595.13 1394.89,-1594.3 1390.29,-1591.68 1389.66,-1595.13"/>+<text text-anchor="middle" x="1308.25" y="-1588.2" font-family="Times,serif" font-size="14.00">_Just % each</text>+</g>+<!-- ChartData->Rect -->+<g id="edge54" class="edge">+<title>ChartData:xblankData'->Rect:xRect</title>+<path fill="none" stroke="black" d="M1215.62,-1476C1274.93,-1476 1301.9,-1469.98 1344.25,-1511.5 1364.28,-1531.14 1343.82,-1550.85 1362.25,-1572 1369.67,-1580.52 1380.21,-1586.59 1390.48,-1590.84"/>+<polygon fill="black" stroke="black" points="1389.76,-1592.44 1395.05,-1592.6 1391.01,-1589.18 1389.76,-1592.44"/>+<text text-anchor="middle" x="1308.25" y="-1514.2" font-family="Times,serif" font-size="14.00">_Just % each</text>+</g>+<!-- ChartData->Point -->+<g id="edge52" class="edge">+<title>ChartData:xlineData'->Point:xPoint</title>+<path fill="none" stroke="black" d="M1215.62,-1525C1250.1,-1525 1246.96,-1495.42 1272.25,-1472 1312.06,-1435.13 1313.99,-1414.32 1362.25,-1389.5 1455.06,-1341.77 1494.3,-1377.69 1592,-1341 1601.69,-1337.36 1603.73,-1330.39 1610.99,-1327.91"/>+<polygon fill="black" stroke="black" points="1610.82,-1329.7 1615.5,-1327.23 1610.3,-1326.24 1610.82,-1329.7"/>+<text text-anchor="middle" x="1423.88" y="-1392.2" font-family="Times,serif" font-size="14.00">_Just % each % each</text>+</g>+<!-- ChartData->Point -->+<g id="edge53" class="edge">+<title>ChartData:xglyphData'->Point:xPoint</title>+<path fill="none" stroke="black" d="M1215.62,-1501C1268.65,-1501 1236.02,-1434.71 1272.25,-1396 1304.53,-1361.52 1317.2,-1353.67 1362.25,-1339.5 1468.38,-1306.11 1502.38,-1326.22 1610.77,-1326.98"/>+<polygon fill="black" stroke="black" points="1610.48,-1328.73 1615.49,-1326.99 1610.49,-1325.23 1610.48,-1328.73"/>+<text text-anchor="middle" x="1423.88" y="-1342.2" font-family="Times,serif" font-size="14.00">_Just % each</text>+</g>+<!-- ChartData->PathData -->+<g id="edge51" class="edge">+<title>ChartData:xpathData'->PathData:xPathData</title>+<path fill="none" stroke="black" d="M1215.62,-1550C1290.95,-1550 1311.33,-1550 1383.65,-1550"/>+<polygon fill="black" stroke="black" points="1383.36,-1551.75 1388.36,-1550 1383.36,-1548.25 1383.36,-1551.75"/>+<text text-anchor="middle" x="1308.25" y="-1553.2" font-family="Times,serif" font-size="14.00">_Just % each</text>+</g>+<!-- (Text,Point) -->+<g id="node40" class="node">+<title>(Text,Point)</title>+<polygon fill="none" stroke="black" points="1382.88,-1637.25 1382.88,-1710.75 1464.88,-1710.75 1464.88,-1637.25 1382.88,-1637.25"/>+<text text-anchor="middle" x="1423.88" y="-1693.45" font-family="Times,serif" font-size="14.00">(Text,Point)</text>+<polyline fill="none" stroke="black" points="1382.88,-1686.25 1464.88,-1686.25"/>+<text text-anchor="middle" x="1423.88" y="-1668.95" font-family="Times,serif" font-size="14.00">_2</text>+<polyline fill="none" stroke="black" points="1382.88,-1661.75 1464.88,-1661.75"/>+<text text-anchor="middle" x="1423.88" y="-1644.45" font-family="Times,serif" font-size="14.00">_1</text>+</g>+<!-- ChartData->(Text,Point) -->+<g id="edge49" class="edge">+<title>ChartData:xtextData'->(Text,Point):x(Text,Point)</title>+<path fill="none" stroke="black" d="M1215.62,-1599C1299.66,-1599 1295.9,-1693.99 1375.48,-1698.81"/>+<polygon fill="black" stroke="black" points="1375.31,-1700.56 1380.36,-1698.95 1375.42,-1697.06 1375.31,-1700.56"/>+<text text-anchor="middle" x="1308.25" y="-1693.2" font-family="Times,serif" font-size="14.00">_Just % each</text>+</g>+<!-- Chart->Style -->+<g id="edge55" class="edge">+<title>Chart:xchartStyle->Style:xStyle</title>+<path fill="none" stroke="black" d="M967.75,-1184C1044.82,-1184 1055.82,-1127.24 1129.28,-1124.13"/>+<polygon fill="black" stroke="black" points="1129.15,-1125.89 1134.11,-1124.03 1129.08,-1122.39 1129.15,-1125.89"/>+</g>+<!-- Chart->ChartData -->+<g id="edge56" class="edge">+<title>Chart:xchartData->ChartData:xChartData</title>+<path fill="none" stroke="black" d="M967.75,-1159C1075.76,-1159 1031.29,-1606.01 1133.35,-1623.47"/>+<polygon fill="black" stroke="black" points="1132.99,-1625.2 1138.12,-1623.87 1133.28,-1621.71 1132.99,-1625.2"/>+</g>+<!-- AxisOptions->Ticks -->+<g id="edge57" class="edge">+<title>AxisOptions:xticks->Ticks:xTicks</title>+<path fill="none" stroke="black" d="M471.75,-613C554.84,-613 552.19,-705.14 630.93,-709.82"/>+<polygon fill="black" stroke="black" points="630.69,-711.56 635.74,-709.96 630.79,-708.06 630.69,-711.56"/>+</g>+<!-- AxisOptions->Place -->+<g id="edge58" class="edge">+<title>AxisOptions:xplace->Place:xPlace</title>+<path fill="none" stroke="black" d="M471.75,-588C511.6,-588 483.03,-638.95 508,-670 590.45,-772.53 656.03,-749.72 746.75,-845 748.93,-847.29 858.58,-1018.54 880.88,-1049.3"/>+<polygon fill="black" stroke="black" points="879.26,-1050.08 883.79,-1052.83 881.97,-1047.86 879.26,-1050.08"/>+</g>+<!-- AxisBar -->+<g id="node36" class="node">+<title>AxisBar</title>+<g id="a_node36"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:AxisBar" xlink:title="<xAxisBar> AxisBar| <xstyle> style| <xsize> size| <xoverhang> overhang| <xbuffer> buffer| <xanchorTo> anchorTo">+<polygon fill="none" stroke="black" points="897.88,-343.5 897.88,-490.5 965.62,-490.5 965.62,-343.5 897.88,-343.5"/>+<text text-anchor="middle" x="931.75" y="-473.2" font-family="Times,serif" font-size="14.00">AxisBar</text>+<polyline fill="none" stroke="black" points="897.88,-466 965.62,-466"/>+<text text-anchor="middle" x="931.75" y="-448.7" font-family="Times,serif" font-size="14.00">style</text>+<polyline fill="none" stroke="black" points="897.88,-441.5 965.62,-441.5"/>+<text text-anchor="middle" x="931.75" y="-424.2" font-family="Times,serif" font-size="14.00">size</text>+<polyline fill="none" stroke="black" points="897.88,-417 965.62,-417"/>+<text text-anchor="middle" x="931.75" y="-399.7" font-family="Times,serif" font-size="14.00">overhang</text>+<polyline fill="none" stroke="black" points="897.88,-392.5 965.62,-392.5"/>+<text text-anchor="middle" x="931.75" y="-375.2" font-family="Times,serif" font-size="14.00">buffer</text>+<polyline fill="none" stroke="black" points="897.88,-368 965.62,-368"/>+<text text-anchor="middle" x="931.75" y="-350.7" font-family="Times,serif" font-size="14.00">anchorTo</text>+</a>+</g>+</g>+<!-- AxisOptions->AxisBar -->+<g id="edge59" class="edge">+<title>AxisOptions:xaxisBar->AxisBar:xAxisBar</title>+<path fill="none" stroke="black" d="M471.75,-563C594.56,-563 627.27,-564.41 746.75,-536 814.25,-519.95 824.69,-480.41 890.63,-478.11"/>+<polygon fill="black" stroke="black" points="890.27,-479.86 895.24,-478.03 890.21,-476.36 890.27,-479.86"/>+<text text-anchor="middle" x="674.25" y="-563.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- Adjustments -->+<g id="node39" class="node">+<title>Adjustments</title>+<g id="a_node39"><a xlink:href="https://hackage.haskell.org/package/chart-svg/docs/Chart-Hud.html#t:Adjustments" xlink:title="<xAdjustments> Adjustments| <xmaxYRatio> maxYRatio| <xmaxXRatio> maxXRatio| <xangledRatio> angledRatio| <xallowDiagonal> allowDiagonal">+<polygon fill="none" stroke="black" points="626.5,-403.75 626.5,-526.25 722,-526.25 722,-403.75 626.5,-403.75"/>+<text text-anchor="middle" x="674.25" y="-508.95" font-family="Times,serif" font-size="14.00">Adjustments</text>+<polyline fill="none" stroke="black" points="626.5,-501.75 722,-501.75"/>+<text text-anchor="middle" x="674.25" y="-484.45" font-family="Times,serif" font-size="14.00">maxYRatio</text>+<polyline fill="none" stroke="black" points="626.5,-477.25 722,-477.25"/>+<text text-anchor="middle" x="674.25" y="-459.95" font-family="Times,serif" font-size="14.00">maxXRatio</text>+<polyline fill="none" stroke="black" points="626.5,-452.75 722,-452.75"/>+<text text-anchor="middle" x="674.25" y="-435.45" font-family="Times,serif" font-size="14.00">angledRatio</text>+<polyline fill="none" stroke="black" points="626.5,-428.25 722,-428.25"/>+<text text-anchor="middle" x="674.25" y="-410.95" font-family="Times,serif" font-size="14.00">allowDiagonal</text>+</a>+</g>+</g>+<!-- AxisOptions->Adjustments -->+<g id="edge60" class="edge">+<title>AxisOptions:xadjustments->Adjustments:xAdjustments</title>+<path fill="none" stroke="black" d="M471.75,-539C488.12,-539 491.86,-535.22 508,-532.5 557.89,-524.09 571.4,-514.8 618.96,-514.05"/>+<polygon fill="black" stroke="black" points="618.75,-515.8 623.74,-514.01 618.72,-512.3 618.75,-515.8"/>+<text text-anchor="middle" x="545.88" y="-535.2" font-family="Times,serif" font-size="14.00">_Just</text>+</g>+<!-- AxisBar->Style -->+<g id="edge61" class="edge">+<title>AxisBar:xstyle->Style:xStyle</title>+<path fill="none" stroke="black" d="M966.75,-454C990.42,-454 980.16,-481.12 996.75,-498 1029.66,-531.48 1059.51,-518.35 1083,-559 1113.5,-611.78 1075.28,-1090.61 1129.69,-1122.35"/>+<polygon fill="black" stroke="black" points="1128.88,-1123.94 1134.17,-1123.59 1129.82,-1120.57 1128.88,-1123.94"/>+</g>+<!-- AxisBar->HudChartSection -->+<g id="edge62" class="edge">+<title>AxisBar:xanchorTo->HudChartSection:xHudChartSection</title>+<path fill="none" stroke="black" d="M966.75,-356C1030.29,-356 1047.76,-356 1108.24,-356"/>+<polygon fill="black" stroke="black" points="1108.11,-357.75 1113.11,-356 1108.11,-354.25 1108.11,-357.75"/>+</g>+<!-- (Text,Point)->Point -->+<g id="edge63" class="edge">+<title>(Text,Point):x_2->Point:xPoint</title>+<path fill="none" stroke="black" d="M1465.88,-1674C1488.1,-1674 1480.05,-1649.55 1485.5,-1628 1496.12,-1586.03 1478.36,-1469.25 1503.5,-1434 1528.56,-1398.85 1562.52,-1425.53 1592,-1394 1612.01,-1372.6 1589.36,-1333.72 1610.6,-1327.77"/>+<polygon fill="black" stroke="black" points="1610.74,-1329.52 1615.5,-1327.18 1610.32,-1326.04 1610.74,-1329.52"/>+</g>+</g>+</svg>
other/exga.svg view
@@ -1,4 +1,4 @@-<svg height="500" viewBox="-0.25 -483.23 428.9983 483.4803" width="443" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><style>svg {+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="445" height="500" viewBox="-0.4457 -0.5000 0.8914 1.0"><style>svg { color-scheme: light dark; } {@@ -22,4 +22,11 @@ .legendBorder g { fill: rgb(5%, 5%, 5%); }-}</style><g class="chart"><g class="edges"><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 360.9900,-227.29 C 364.7400,-217.15 369.6200,-203.9500 373.74,-192.83 L 375.9300,-186.9"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 341.66,-231.76 C 327.63,-219.4100 305.45,-199.91 289.9000,-186.23 L 285.3,-182.19"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 348.79,-227.29 C 345.0300,-217.51 340.19,-204.8700 336.02,-194.01 L 333.78,-188.18"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 367.8400,-157.82 C 363.81,-155.06 359.3400,-152.24 355.0,-149.99 C 312.9800,-128.2900 260.2900,-111.07 230.46,-102.16 L 224.4500,-100.38"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 375.7900,-152.29 C 371.87,-142.08 366.76,-128.77 362.4800,-117.6 L 360.2,-111.65"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 387.99,-152.29 C 391.61,-142.51 396.2800,-129.88 400.3000,-119.01 L 402.4600,-113.18"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 204.88,-112.78 C 201.68,-140.37 196.0000,-196.0800 196.0000,-243.49 C 196.0000,-320.48 196.0000,-320.48 196.0000,-320.48 C 196.0000,-362.1 188.7700,-372.9 172.0,-410.9800 C 166.72,-422.97 158.9400,-435.35 152.1500,-445.12 L 148.5,-450.26"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 217.9100,-79.7650 C 227.0600,-68.243 240.2200,-51.6830 250.3000,-38.994 L 254.1400,-34.167"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 207.7100,-76.196 C 208.08,-67.134 208.5500,-55.866 208.96,-45.841 L 209.2200,-39.467"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 196.59,-79.42 C 188.4900,-68.4730 177.1400,-53.13 168.0500,-40.846 L 164.31,-35.7900"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 192.0300,-83.65 C 172.8300,-71.022 139.39,-49.034 117.4800,-34.622 L 112.17,-31.1320"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 154.52,-456.76 C 183.53,-444.06 243.6400,-417.77 276.08,-403.57 L 281.8100,-401.0700"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 122.8,-455.1200 C 101.55,-442.72 62.8730,-420.16 38.9150,-406.18 L 33.454,-403.0"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 133.57,-447.3300 C 126.8800,-420.73 115.0000,-366.91 115.0000,-320.48 C 115.0000,-320.48 115.0000,-320.48 115.0000,-243.49 C 115.0000,-200.2400 113.2700,-149.9 112.0900,-120.4800 L 111.83,-114.18"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 291.8700,-375.76 C 288.1800,-365.98 283.4200,-353.38 279.38,-342.69 L 277.1,-336.64"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 311.28,-380.81 C 325.33,-368.99 347.6300,-350.2300 363.64,-336.77 L 368.39,-332.78"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 304.35,-375.76 C 308.02,-366.39 312.7,-354.44 316.7700,-344.05 L 319.08,-338.15"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 284.12,-307.08 C 298.3400,-294.72 321.1200,-274.93 337.0,-261.13 L 341.69,-257.0500"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 277.44,-302.28 C 281.32,-292.5 286.34,-279.87 290.66,-269.0 L 292.9700,-263.1800"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 264.7900,-302.28 C 261.03,-292.5 256.19,-279.87 252.02,-269.0 L 249.7800,-263.1800"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 120.53,-76.9310 C 126.38,-66.758 133.95,-53.604 140.31,-42.556 L 143.51,-36.997"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 107.2100,-75.0750 C 105.35,-65.9970 103.0700,-54.924 101.06,-45.13 L 99.7840,-38.912"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 154.0400,-39.181 C 155.5000,-67.246 158.0000,-121.96 158.0000,-168.49 C 158.0000,-320.48 158.0000,-320.48 158.0000,-320.48 C 158.0000,-363.33 149.1400,-412.69 143.2200,-440.93 L 141.86,-447.3000"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 89.6780,-38.0020 C 80.352,-65.432 64.0,-120.3900 64.0,-168.49 C 64.0,-320.48 64.0,-320.48 64.0,-320.48 C 64.0,-370.68 100.2,-420.86 121.9700,-446.49 L 126.11,-451.28"/></g></g><g class="shapes"><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="355.0" cy="-244.49" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="382.0" cy="-169.49" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="207.0000" cy="-94.495" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="138.0" cy="-464.98" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="298.0000" cy="-392.98" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="271.0" cy="-319.48" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="272.0" cy="-169.49" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="354.0" cy="-94.495" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="265.0" cy="-19.498" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="18.0" cy="-392.98" r="18.0"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="383.0000" cy="-319.48" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="300.0000" cy="-244.49" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="327.0" cy="-169.49" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="409.0" cy="-94.495" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="210.0" cy="-19.498" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="111.0" cy="-94.495" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="326.0" cy="-319.48" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="243.0" cy="-244.49" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="153.0" cy="-19.498" r="19.4983"/></g><g fill="rgb(2%, 73%, 80%)" fill-opacity="0.2" stroke="rgb(-51%, 30%, 37%)" stroke-opacity="1.0" stroke-width="0.5"><circle cx="96.0000" cy="-19.498" r="19.4983"/></g></g><g class="labels"><g fill="rgb(-51%, 30%, 37%)" fill-opacity="1.0" font-size="14.0" stroke="none" stroke-width="0.0" text-anchor="middle"><text x="355.0" y="-240.7900">0</text><text x="382.0" y="-165.7900">1</text><text x="207.0000" y="-90.795">2</text><text x="138.0" y="-461.28">3</text><text x="298.0000" y="-389.2800">4</text><text x="271.0" y="-315.7800">5</text><text x="272.0" y="-165.7900">6</text><text x="354.0" y="-90.795">7</text><text x="265.0" y="-15.7980">8</text><text x="18.0" y="-389.2800">9</text><text x="383.0000" y="-315.7800">10</text><text x="300.0000" y="-240.7900">11</text><text x="327.0" y="-165.7900">12</text><text x="409.0" y="-90.795">13</text><text x="210.0" y="-15.7980">14</text><text x="111.0" y="-90.795">15</text><text x="326.0" y="-315.7800">16</text><text x="243.0" y="-240.7900">17</text><text x="153.0" y="-15.7980">18</text><text x="96.0000" y="-15.7980">19</text></g></g></g><g class="hud"/></svg>+}+svg { font-family: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";+}++ticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;+}++</style><g class="chart"><g class="edges"><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3022,0.0262 C 0.3103,0.0477 0.3210,0.0761 0.3299,0.0997 L 0.3344,0.1116"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.2630,0.0170 C 0.2340,0.0427 0.1874,0.0838 0.1550,0.1125 L 0.1455,0.1209"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.2774,0.0262 C 0.2697,0.0465 0.2598,0.0729 0.2512,0.0957 L 0.2466,0.1078"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3187,0.1712 C 0.3103,0.1772 0.3010,0.1833 0.2918,0.1881 C 0.2036,0.2342 0.0923,0.2696 0.0298,0.2875 L 0.0172,0.2911"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3345,0.1819 C 0.3264,0.2034 0.3157,0.2318 0.3068,0.2554 L 0.3024,0.2673"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3594,0.1819 C 0.3670,0.2022 0.3770,0.2286 0.3855,0.2514 L 0.3901,0.2636"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0227,0.2657 C -0.0292,0.2087 -0.0410,0.0923 -0.0410,-0.0067 C -0.0410,-0.1664 -0.0410,-0.1664 -0.0410,-0.1664 C -0.0410,-0.2519 -0.0545,-0.2747 -0.0900,-0.3525 C -0.1012,-0.3773 -0.1181,-0.4026 -0.1328,-0.4224 L -0.1407,-0.4329"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.0041,0.3318 C 0.0247,0.3564 0.0551,0.3928 0.0777,0.4200 L 0.0856,0.4295"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0157,0.3399 C -0.0141,0.3589 -0.0122,0.3827 -0.0105,0.4038 L -0.0095,0.4166"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0390,0.3340 C -0.0547,0.3564 -0.0766,0.3877 -0.0944,0.4131 L -0.1017,0.4235"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0488,0.3252 C -0.0874,0.3513 -0.1545,0.3966 -0.1989,0.4265 L -0.2096,0.4338"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1299,-0.4465 C -0.0691,-0.4207 0.0593,-0.3662 0.1279,-0.3371 L 0.1400,-0.3320"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1945,-0.4426 C -0.2379,-0.4173 -0.3168,-0.3712 -0.3658,-0.3427 L -0.3769,-0.3362"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1717,-0.4265 C -0.1842,-0.3719 -0.2063,-0.2614 -0.2063,-0.1664 C -0.2063,-0.1664 -0.2063,-0.1664 -0.2063,-0.0067 C -0.2063,0.0827 -0.2107,0.1865 -0.2137,0.2478 L -0.2144,0.2609"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1604,-0.2803 C 0.1525,-0.2599 0.1423,-0.2337 0.1338,-0.2116 L 0.1292,-0.1997"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.2008,-0.2907 C 0.2297,-0.2665 0.2754,-0.2282 0.3084,-0.2005 L 0.3182,-0.1923"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1864,-0.2803 C 0.1938,-0.2613 0.2031,-0.2371 0.2114,-0.2159 L 0.2160,-0.2039"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1434,-0.1387 C 0.1729,-0.1129 0.2203,-0.0714 0.2532,-0.0427 L 0.2628,-0.0343"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1291,-0.1295 C 0.1370,-0.1092 0.1473,-0.0828 0.1562,-0.0600 L 0.1609,-0.0478"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1034,-0.1295 C 0.0955,-0.1092 0.0852,-0.0828 0.0763,-0.0600 L 0.0715,-0.0478"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1957,0.3391 C -0.1828,0.3605 -0.1660,0.3881 -0.1520,0.4112 L -0.1454,0.4221"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.2234,0.3438 C -0.2266,0.3622 -0.2305,0.3845 -0.2340,0.4043 L -0.2362,0.4169"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1234,0.4166 C -0.1216,0.3580 -0.1185,0.2451 -0.1185,0.1490 C -0.1185,-0.1664 -0.1185,-0.1664 -0.1185,-0.1664 C -0.1185,-0.2548 -0.1386,-0.3565 -0.1519,-0.4142 L -0.1548,-0.4265"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.2575,0.4191 C -0.2784,0.3620 -0.3145,0.2487 -0.3145,0.1490 C -0.3145,-0.1664 -0.3145,-0.1664 -0.3145,-0.1664 C -0.3145,-0.2693 -0.2406,-0.3722 -0.1962,-0.4248 L -0.1877,-0.4346"/></g></g><g class="shapes"><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.2898" cy="-0.0087" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.3469" cy="0.1470" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.0185" cy="0.3027" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.1635" cy="-0.4627" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.1734" cy="-0.3157" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.1162" cy="-0.1644" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.1183" cy="0.1470" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.2898" cy="0.3027" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.1081" cy="0.4584" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.4085" cy="-0.3157" r="0.0367"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.3490" cy="-0.1644" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.1754" cy="-0.0087" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.2326" cy="0.1470" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.4041" cy="0.3027" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.0063" cy="0.4584" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.2165" cy="0.3027" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.2306" cy="-0.1644" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="0.0570" cy="-0.0087" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.1247" cy="0.4584" r="0.0411"/></g><g stroke-width="0.0010" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><circle cx="-0.2431" cy="0.4584" r="0.0411"/></g></g><g class="labels"><g stroke-width="0.0" stroke="none" fill="rgb(40%, 40%, 40%)" fill-opacity="0.8" font-size="0.0327" text-anchor="middle"><text x="0.2898" y="0.0035">0</text><text x="0.3469" y="0.1592">1</text><text x="-0.0185" y="0.3149">2</text><text x="-0.1635" y="-0.4505">3</text><text x="0.1734" y="-0.3035">4</text><text x="0.1162" y="-0.1522">5</text><text x="0.1183" y="0.1592">6</text><text x="0.2898" y="0.3149">7</text><text x="0.1081" y="0.4706">8</text><text x="-0.4085" y="-0.3035">9</text><text x="0.3490" y="-0.1522">10</text><text x="0.1754" y="0.0035">11</text><text x="0.2326" y="0.1592">12</text><text x="0.4041" y="0.3149">13</text><text x="-0.0063" y="0.4706">14</text><text x="-0.2165" y="0.3149">15</text><text x="0.2306" y="-0.1522">16</text><text x="0.0570" y="0.0035">17</text><text x="-0.1247" y="0.4706">18</text><text x="-0.2431" y="0.4706">19</text></g></g></g><g class="hud"></g></svg>
other/nh.svg view
@@ -1,4 +1,4 @@-<svg height="500" viewBox="-315.65 -324.5 1005.0000 325.0" width="1546" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><style>svg {+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="500" viewBox="-0.5654 -0.5000 1.13 1.0"><style>svg { color-scheme: light dark; } {@@ -22,4 +22,11 @@ .legendBorder g { fill: rgb(5%, 5%, 5%); }-}</style><g class="chart"><g class="edges"><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 226.67,-180.3000 C 218.42,-189.6300 208.1400,-201.23 199.34,-211.1700 L 195.15,-215.9000"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 170.21,-180.3000 C 171.85,-189.1200 173.87,-199.97 175.64,-209.5300 L 176.82,-215.9000"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 110.74,-180.3000 C 123.2400,-189.81 138.84,-201.6800 152.07,-211.7500 L 157.2,-215.65"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 192.3600,-252.3000 C 198.9,-261.46 207.0,-272.81 214.02,-282.62 L 217.78,-287.9"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 162.7,-252.3000 C 153.29,-261.7100 141.56,-273.44 131.56,-283.4400 L 127.1,-287.9"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 76.124,-252.3000 C 82.0090,-261.46 89.304,-272.81 95.6150,-282.62 L 99.004,-287.9"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 181.36,-36.303 C 176.31,-45.3740 170.05,-56.5960 164.62,-66.35 L 161.53,-71.896"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 124.56,-96.119 C 98.982,-102.5 62.272,-116.1700 45.0,-144.0 C 32.513,-164.12 41.437,-191.1 51.02,-210.0600 L 53.992,-215.6700"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 179.35,-101.76 C 205.58,-112.2 246.22,-128.66 281.0,-144.0 C 281.87,-144.38 282.75,-144.78 283.64,-145.17 L 289.5500,-147.86"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 338.83,-108.3 C 335.11,-117.29 330.51,-128.39 326.5,-138.08 L 324.09,-143.9"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 254.03,-36.4830 C 232.89,-47.366 205.83,-61.292 184.89,-72.069 L 179.16,-75.02"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 291.56,-36.4120 C 296.76,-61.887 306.46,-109.37 312.26,-137.79 L 313.51,-143.89"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 122.6400,-36.303 C 127.6900,-45.3740 133.95,-56.5960 139.38,-66.35 L 142.47,-71.896"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 289.61,-177.0 C 269.5900,-187.22 242.1500,-201.2400 219.7400,-212.7 L 214.1500,-215.55"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 313.79,-180.3000 C 312.15,-189.1200 310.13,-199.97 308.36,-209.5300 L 307.18,-215.9000"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 285.71,-252.3000 C 275.84,-261.6400 263.55,-273.26 253.03,-283.21 L 248.34,-287.65"/></g><g fill="rgb(0%, 0%, 0%)" fill-opacity="0" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><path d="M 63.4720,-36.4830 C 80.423,-46.539 101.75,-59.193 119.2300,-69.561 L 124.5200,-72.699"/></g></g><g class="shapes"><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="58.9997" x="212.5002" y="-180.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="64.0001" x="198.0000" y="-324.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="54.0" x="140.0" y="-180.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="67.9997" x="54.0002" y="-180.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="81.0" x="139.5" y="-252.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="61.9999" x="34.0000" y="-252.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="66.0002" x="157.9999" y="-36.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="54.0" x="125.0" y="-108.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="58.9997" x="316.5002" y="-108.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="94.0032" x="62.9984" y="-324.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="92.0016" x="241.9992" y="-36.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="54.0" x="86.0" y="-36.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="54.0" x="290.0" y="-180.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="77.9976" x="265.0012" y="-252.0"/></g><g fill="rgb(2%, 29%, 48%)" fill-opacity="0.1" stroke="rgb(33%, -22%, 26%)" stroke-opacity="1.0" stroke-width="1.0"><rect height="36.0" width="67.9997" x="0.0002" y="-36.0"/></g></g><g class="labels"><g fill="rgb(33%, -22%, 26%)" fill-opacity="1.0" font-size="14.0" stroke="none" stroke-width="0.0" text-anchor="middle"><text x="242.0" y="-158.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Action.html#t:Actions">Actions</a></text><text x="230.0" y="-302.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Additive.html#t:Additive">Additive</a></text><text x="167.0" y="-158.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Metric.html#t:Basis">Basis</a></text><text x="88.0" y="-158.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Metric.html#t:Direction">Direction</a></text><text x="180.0" y="-230.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Distributive.html#t:Distributive">Distributive</a></text><text x="65.0" y="-230.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Multiplicative.html#t:Divisive">Divisive</a></text><text x="191.0" y="-14.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:ExpField">ExpField</a></text><text x="152.0" y="-86.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:Field">Field</a></text><text x="346.0" y="-86.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Data-Integral.html#t:Integral">Integral</a></text><text x="110.0" y="-302.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Multiplicative.html#t:Multiplicative">Multiplicative</a></text><text x="288.0" y="-14.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:QuotientField">QuotientField</a></text><text x="113.0" y="-14.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Data-Rational.html#t:Ratio">Ratio</a></text><text x="317.0" y="-158.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Ring.html#t:Ring">Ring</a></text><text x="304.0" y="-230.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Additive.html#t:Subtractive">Subtractive</a></text><text x="34.0" y="-14.3"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:TrigField">TrigField</a></text></g></g></g><g class="hud"/></svg>+}+svg { font-family: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";+}++ticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;+}++</style><g class="chart"><g class="edges"><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.1278,-0.0563 C 0.1028,-0.0850 0.0717,-0.1207 0.0450,-0.1513 L 0.0323,-0.1658"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0437,-0.0563 C -0.0386,-0.0834 -0.0324,-0.1168 -0.0270,-0.1462 L -0.0233,-0.1658"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.2266,-0.0563 C -0.1882,-0.0856 -0.1402,-0.1221 -0.0995,-0.1531 L -0.0837,-0.1651"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.0230,-0.2778 C 0.0423,-0.3060 0.0662,-0.3410 0.0870,-0.3711 L 0.0981,-0.3874"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0675,-0.2778 C -0.0969,-0.3068 -0.1335,-0.3429 -0.1647,-0.3737 L -0.1786,-0.3874"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.3339,-0.2778 C -0.3162,-0.3060 -0.2943,-0.3410 -0.2753,-0.3711 L -0.2651,-0.3874"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0124,0.3868 C -0.0280,0.3588 -0.0472,0.3243 -0.0639,0.2943 L -0.0734,0.2772"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1864,0.2025 C -0.2644,0.1826 -0.3763,0.1405 -0.4289,0.0554 C -0.4672,-0.0066 -0.4398,-0.0896 -0.4103,-0.1479 L -0.4012,-0.1652"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.0193,0.1853 C 0.0608,0.1531 0.1848,0.1024 0.2911,0.0554 C 0.2938,0.0542 0.2965,0.0530 0.2992,0.0518 L 0.3174,0.0435"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.4667,0.1652 C 0.4556,0.1376 0.4420,0.1034 0.4301,0.0736 L 0.4229,0.0557"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.2089,0.3862 C 0.1447,0.3529 0.0628,0.3105 -0.0010,0.2774 L -0.0185,0.2683"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3236,0.3864 C 0.3396,0.3080 0.3694,0.1619 0.3873,0.0745 L 0.3911,0.0557"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.1931,0.3868 C -0.1776,0.3588 -0.1583,0.3243 -0.1416,0.2943 L -0.1321,0.2772"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3178,-0.0467 C 0.2573,-0.0780 0.1748,-0.1208 0.1073,-0.1558 L 0.0895,-0.1650"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3920,-0.0563 C 0.3869,-0.0834 0.3807,-0.1168 0.3753,-0.1462 L 0.3716,-0.1658"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M 0.3056,-0.2778 C 0.2752,-0.3066 0.2374,-0.3423 0.2050,-0.3730 L 0.1906,-0.3866"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><path d="M -0.3752,0.3862 C -0.3230,0.3553 -0.2574,0.3163 -0.2036,0.2844 L -0.1873,0.2748"/></g></g><g class="shapes"><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1785" height="0.1108" x="0.0849" y="-0.0554"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1946" height="0.1108" x="0.0368" y="-0.4985"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1662" height="0.1108" x="-0.1366" y="-0.0554"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2062" height="0.1108" x="-0.3997" y="-0.0554"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2477" height="0.1108" x="-0.1374" y="-0.2769"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1900" height="0.1108" x="-0.4624" y="-0.2769"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2015" height="0.1108" x="-0.0835" y="0.3877"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1662" height="0.1108" x="-0.1858" y="0.1662"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1785" height="0.1108" x="0.3988" y="0.1662"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2869" height="0.1108" x="-0.3755" y="-0.4985"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2800" height="0.1108" x="0.1726" y="0.3877"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1662" height="0.1108" x="-0.3058" y="0.3877"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.1662" height="0.1108" x="0.3188" y="-0.0554"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2385" height="0.1108" x="0.2426" y="-0.2769"/></g><g stroke-width="0.0031" stroke="rgb(40%, 40%, 40%)" stroke-opacity="0.8" fill="rgb(50%, 50%, 50%)" fill-opacity="0.2"><rect width="0.2062" height="0.1108" x="-0.5689" y="0.3877"/></g></g><g class="labels"><g stroke-width="0.0" stroke="none" fill="rgb(40%, 40%, 40%)" fill-opacity="0.8" font-size="0.0369" text-anchor="middle"><text x="0.1742" y="0.0123"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Action.html#t:Actions">Actions</a></text><text x="0.1342" y="-0.4308"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Additive.html#t:Additive">Additive</a></text><text x="-0.0535" y="0.0123"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Metric.html#t:Basis">Basis</a></text><text x="-0.2966" y="0.0123"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Metric.html#t:Direction">Direction</a></text><text x="-0.0135" y="-0.2092"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Distributive.html#t:Distributive">Distributive</a></text><text x="-0.3674" y="-0.2092"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Multiplicative.html#t:Divisive">Divisive</a></text><text x="0.0172" y="0.4554"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:ExpField">ExpField</a></text><text x="-0.1028" y="0.2338"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:Field">Field</a></text><text x="0.488" y="0.2338"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Data-Integral.html#t:Integral">Integral</a></text><text x="-0.2320" y="-0.4308"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Multiplicative.html#t:Multiplicative">Multiplicative</a></text><text x="0.3126" y="0.4554"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:QuotientField">QuotientField</a></text><text x="-0.2228" y="0.4554"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Data-Rational.html#t:Ratio">Ratio</a></text><text x="0.4018" y="0.0123"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Ring.html#t:Ring">Ring</a></text><text x="0.3618" y="-0.2092"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Additive.html#t:Subtractive">Subtractive</a></text><text x="-0.4658" y="0.4554"><a href="https://hackage.haskell.org/package/numhask/docs/NumHask-Algebra-Field.html#t:TrigField">TrigField</a></text></g></g></g><g class="hud"></g></svg>
readme.org view
@@ -1,6 +1,6 @@ #+TITLE: dotparse -[[https://hackage.haskell.org/package/dotparse][file:https://img.shields.io/hackage/v/dotparse.svg]]+[[https://hackage.haskell.org/package/dotparse][file:https://img.shields.io/hackage/v/dotparse.svg]] [[https://github.com/tonyday567/chart-svg/actions?query=workflow%3Ahaskell-ci][file:https://github.com/tonyday567/dotparse/workflows/haskell-ci/badge.svg]] * Introduction @@ -165,9 +165,9 @@ ByteString of the processed Graph - #+begin_src haskell :results output+#+begin_src haskell :results output BS.putStr =<< processDot Directed (dotPrint defaultDotConfig exInt)- #+end_src+#+end_src ** processGraph @@ -187,44 +187,41 @@ #+begin_src haskell :file other/exga.svg :results output graphics file :exports both import Chart (writeChartOptions)-writeChartOptions "other/exga.svg" (graphToChartWith defaultChartConfig exGraphAugmented)+writeChartOptions "other/exga.svg" (graphToChart exGraphAugmented) #+end_src #+RESULTS: [[file:other/exga.svg]] * Development- ** imports -#+begin_src haskell :results output+#+begin_src haskell-ng :results output :reload-:set prompt "> " :set -XOverloadedLabels :set -XOverloadedStrings :set -Wno-type-defaults+:set -Wno-x-partial :set -XImportQualifiedPost import Chart import Optics.Core import FlatParse.Basic qualified as FP import qualified Data.ByteString as BS+import qualified Data.Text as Text import qualified Data.ByteString.Char8 as Char8+import Algebra.Graph qualified as G+import Data.Monoid import GHC.Exts import DotParse import DotParse.Examples+import DotParse.Examples.AST import DotParse.Examples.NumHask+import DotParse.Examples.Base import Data.Proxy print "ok" #+end_src -#+RESULTS:-: [3 of 6] Compiling DotParse.Types ( src/DotParse/Types.hs, interpreted ) [Source file changed]-: [5 of 6] Compiling DotParse.Examples.NumHask ( src/DotParse/Examples/NumHask.hs, interpreted ) [Source file changed]-: Ok, six modules loaded.-: >-: ok--** write examples+** testAll Round-trip test @@ -252,36 +249,14 @@ ex15 #+end_example -Render examples+* chart-svg AST -#+begin_src haskell-svgAll+#+begin_src haskell-ng :results output+g1 = dotAST allSC componentEdges+BS.writeFile "other/ast.dot" $ dotPrint defaultDotConfig g1 #+end_src -#+RESULTS:-#+begin_example-ex0-ex1-ex2-ex3-ex4-ex5-ex6-ex7-ex8-ex9-ex10-ex11-ex12-ex13-ex14-ex15-#+end_example--** numhask example-- #+begin_src haskell-writeNHChart- #+end_src+#+begin_src sh :results output+dot other/ast.dot -Tsvg >other/ast.svg+#+end_src -This is bugged downstream as chart-svg uses the link string (which is very long compared with the displayed text) to estimate the bounding box and results in a very wide chart with a lot of white space either side.
src/DotParse/Examples.hs view
@@ -514,9 +514,9 @@ -- | algebraic graph example ----- >>> exGraph = defaultGraph & addStatements (toStatements Directed (Char8.pack . show <$> exAGraph))--- >>> exGraphAugmented <- processGraph exGraph--- >>> writeChartOptions "other/exga.svg" (graphToChartWith defaultChartConfig exGraphAugmented)+-- > exGraph = defaultGraph & addStatements (toStatements Directed (Char8.pack . show <$> exAGraph))+-- > exGraphAugmented <- processGraph exGraph+-- > writeChartOptions "other/exga.svg" (graphToChart exGraphAugmented) -- --  exAGraph :: G.Graph Int
+ src/DotParse/Examples/AST.hs view
@@ -0,0 +1,592 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-}++-- | Example of Dot graph construction for the <https://hackage.haskell.org/package/chart-svg chart-svg> class heirarchy.+module DotParse.Examples.AST where++import Algebra.Graph.Labelled qualified as L+import Data.ByteString (ByteString)+import Data.ByteString.Char8 qualified as B+import Data.List qualified as List+import Data.List.NonEmpty hiding (filter, head, length, map, zip, zipWith, (!!))+import Data.Map.Strict qualified as Map+import Data.Maybe+import Data.Monoid+import Data.String.Interpolate+import Data.These+import DotParse.Types+import GHC.Generics+import Optics.Core+import Prelude hiding (replicate)++-- $setup+-- >>> import DotParse+-- >>> :set -XOverloadedStrings++-- | A Haskell class and (informal) list of sub-components.+data SubComponents = SubComponents+ { classComponent :: ByteString,+ subComponents :: [ByteString]+ }+ deriving (Eq, Show, Ord, Generic)++-- | Relationship between a class, a sub-component and the class of the sub-component.+data ComponentEdge = ComponentEdge+ { edgeClassComponent :: ByteString,+ edgeSubComponent :: ByteString,+ subComponentClass :: ByteString,+ edgeLabel :: Maybe ByteString+ }+ deriving (Eq, Show, Ord, Generic)++-- | algebraic graph vertices+graphVs :: (Monoid a) => [SubComponents] -> L.Graph a (ByteString, ByteString)+graphVs cs =+ L.vertices $+ ((\x -> (x, x)) . view #classComponent <$> cs)+ <> (mconcat $ subs <$> cs)++-- | Convert sub-components to a list of class, subcomponent bytestring tuples.+subs :: SubComponents -> [(ByteString, ByteString)]+subs c = (view #classComponent c,) <$> view #subComponents c++-- | algebraic graph edges+graphEs :: [ComponentEdge] -> L.Graph (Maybe ByteString) (ByteString, ByteString)+graphEs es =+ L.edges ((\c -> (view #edgeLabel c, (view #edgeClassComponent c, view #edgeSubComponent c), (view #subComponentClass c, view #subComponentClass c))) <$> es)++-- | algebraic graph+graphAST :: [SubComponents] -> [ComponentEdge] -> L.Graph (Maybe ByteString) (ByteString, ByteString)+graphAST cs es =+ graphVs cs <> graphEs es++-- | Create a list of 'SubComponents' from a list of 'ComponentEdge's+fromCEs :: [ComponentEdge] -> [SubComponents]+fromCEs es = fmap (uncurry SubComponents) $ Map.toList $ Map.fromListWith (<>) ((\e -> (view #edgeClassComponent e, [view #edgeSubComponent e])) <$> es)++-- | Convert an algebraic Graph into dot record nodes+recordNodes :: L.Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]+recordNodes g = (\(s, cs) -> StatementNode $ NodeStatement (IDQuoted s) Nothing (Map.fromList ([(ID "label", IDQuoted (ls (s, cs)))] <> maybe [] (\url -> [(ID "URL", IDQuoted url)]) (toURL s)))) <$> supers+ where+ ls (s, cs) = B.intercalate "|" $ ("<x" <> s <> "> " <> s) : fmap (\y -> " <x" <> y <> "> " <> y) cs+ supers = (\(s, cs) -> (s, filter (/= s) cs)) <$> (Map.toList $ Map.fromListWith (++) ((\(s, c) -> (s, [c])) <$> L.vertexList g))++-- | Convert an algebraic Graph into dot edges+recordEdges :: Directed -> L.Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]+recordEdges d g =+ ( \(l, (s0, c0), (s1, c1)) ->+ StatementEdge $+ EdgeStatement+ (fromDirected d)+ (EdgeID (IDQuoted s0) (Just (Port (This (IDQuoted ("x" <> c0))))))+ (fromList [EdgeID (IDQuoted c1) (Just (Port (This (IDQuoted ("x" <> s1)))))])+ (Map.fromList [(ID "label", IDQuoted (fromMaybe "x" l))])+ )+ <$> L.edgeList g++-- | create Statements from a (edge labelled) algebraic graph+--+-- https://graphviz.org/Gallery/directed/datastruct.html+toStatementsRecord :: Directed -> L.Graph (Maybe ByteString) (ByteString, ByteString) -> [Statement]+toStatementsRecord d g =+ recordEdges d g <> recordNodes g++-- | Convert a node ID to a label for chart-svg charts+-- Doing this directly in dot doesn't quite work because the engines get the width of the link wrong.+toURL :: ByteString -> Maybe ByteString+toURL name = fmap (\i' -> [i|https://hackage.haskell.org/package/#{view #itemPackage i'}/docs/#{view #itemModule i'}.html\#t:#{view #item i'}|]) item+ where+ item = List.find ((== name) . view #item) itemModules++-- | AST 'Graph'+--+-- > gAST = dotAST allSC componentEdges+-- > C.writeFile "other/ast.dot" $ dotPrint defaultDotConfig gAST+-- > bsSvg <- processDotWith Directed ["-Tsvg"] (dotPrint defaultDotConfig gAST)+-- > C.writeFile "other/ast.svg" bsSvg+dotAST :: [SubComponents] -> [ComponentEdge] -> Graph+dotAST sc ce =+ defaultGraph+ & set (attL GraphType (ID "size")) (Just $ IDQuoted "5")+ & addStatements (toStatementsRecord Directed (graphAST sc ce))+ & attL NodeType (ID "shape")+ .~ Just (ID "record")+ & gattL (ID "rankdir")+ .~ Just (IDQuoted "LR")++-- | Link values+data ItemModule = ItemModule {item :: ByteString, itemModule :: ByteString, itemPackage :: ByteString} deriving (Eq, Show, Generic)++-- | List of link values+itemModules :: [ItemModule]+itemModules =+ [ ItemModule "ChartOptions" "Chart-Markup" "chart-svg",+ ItemModule "MarkupOptions" "Chart-Markup" "chart-svg",+ ItemModule "CssOptions" "Chart-Markup" "chart-svg",+ ItemModule "ChartTree" "Chart-Primitive" "chart-svg",+ ItemModule "Chart" "Chart-Primitive" "chart-svg",+ ItemModule "HudOptions" "Chart-Hud" "chart-svg",+ ItemModule "RenderStyle" "Chart-Markup" "chart-svg",+ ItemModule "ChartAspect" "Chart-Primitive" "chart-svg",+ ItemModule "ShapeRendering" "Chart-Markup" "chart-svg",+ ItemModule "PreferColorScheme" "Chart-Primitive" "chart-svg",+ ItemModule "Tree" "Data-Tree" "containers",+ ItemModule "Priority" "Chart-Hud" "chart-svg",+ ItemModule "TitleOptions" "Chart-Hud" "chart-svg",+ ItemModule "AxisOptions" "Chart-Hud" "chart-svg",+ ItemModule "LegendOptions" "Chart-Hud" "chart-svg",+ ItemModule "FrameOptions" "Chart-Hud" "chart-svg",+ ItemModule "Adjustments" "Chart-Hud" "chart-svg",+ ItemModule "Ticks" "Chart-Hud" "chart-svg",+ ItemModule "Tick" "Chart-Hud" "chart-svg",+ ItemModule "Place" "Chart-Hud" "chart-svg",+ ItemModule "TickStyle" "Chart-Hud" "chart-svg",+ ItemModule "AxisBar" "Chart-Hud" "chart-svg",+ ItemModule "HudChartSection" "Chart-Hud" "chart-svg",+ ItemModule "TickExtend" "Chart-Hud" "chart-svg",+ ItemModule "FormatN" "Data-FormatN" "formatn",+ ItemModule "FStyle" "Data-FormatN" "formatn",+ ItemModule "Colour" "Data-Colour" "chart-svg",+ ItemModule "Style" "Chart-Style" "chart-svg",+ ItemModule "EscapeText" "Chart-Style" "chart-svg",+ ItemModule "GlyphShape" "Chart-Style" "chart-svg",+ ItemModule "Anchor" "Chart-Style" "chart-svg",+ ItemModule "LineCap" "Chart-Style" "chart-svg",+ ItemModule "LineJoin" "Chart-Style" "chart-svg",+ ItemModule "ScaleP" "Chart-Style" "chart-svg",+ ItemModule "ChartData" "Chart-Primitive" "chart-svg",+ ItemModule "PathData" "Data-Path" "chart-svg",+ ItemModule "ArcInfo" "Data-Path" "chart-svg",+ ItemModule "Rect" "NumHask-Space-Rect" "numhask-space",+ ItemModule "Point" "NumHask-Space-Point" "numhask-space"+ ]++-- | list of chart-svg component edges+componentEdges :: [ComponentEdge]+componentEdges =+ [ ComponentEdge "ChartOptions" "markupOptions" "MarkupOptions" (Just ""),+ ComponentEdge "ChartOptions" "hudOptions" "HudOptions" (Just ""),+ ComponentEdge "ChartOptions" "chartTree" "ChartTree" (Just ""),+ ComponentEdge "MarkupOptions" "chartAspect" "ChartAspect" (Just ""),+ ComponentEdge "MarkupOptions" "cssOptions" "CssOptions" (Just ""),+ ComponentEdge "MarkupOptions" "renderStyle" "RenderStyle" (Just ""),+ ComponentEdge "CssOptions" "shapeRendering" "ShapeRendering" (Just ""),+ ComponentEdge "CssOptions" "preferColorScheme" "PreferColorScheme" (Just ""),+ ComponentEdge "HudOptions" "axes" "AxisOptions" (Just "each % #item"),+ ComponentEdge "HudOptions" "frames" "FrameOptions" (Just "each % #item"),+ ComponentEdge "HudOptions" "legends" "LegendOptions" (Just "each % #item"),+ ComponentEdge "HudOptions" "titles" "TitleOptions" (Just "each % #item"),+ ComponentEdge "HudOptions" "axes" "Priority" (Just "each % #priority"),+ ComponentEdge "HudOptions" "frames" "Priority" (Just "each % #priority"),+ ComponentEdge "HudOptions" "legends" "Priority" (Just "each % #priority"),+ ComponentEdge "HudOptions" "titles" "Priority" (Just "each % #priority"),+ ComponentEdge "AxisOptions" "axisBar" "AxisBar" (Just "_Just"),+ ComponentEdge "AxisOptions" "adjustments" "Adjustments" (Just "_Just"),+ ComponentEdge "AxisOptions" "ticks" "Ticks" (Just ""),+ ComponentEdge "AxisOptions" "place" "Place" (Just ""),+ ComponentEdge "AxisBar" "style" "Style" (Just ""),+ ComponentEdge "AxisBar" "anchorTo" "HudChartSection" (Just ""),+ ComponentEdge "Tick" "formatN'" "FormatN" (Just "_Just"),+ ComponentEdge "FormatN" "fstyle" "FStyle" (Just ""),+ ComponentEdge "Tick" "tickExtend'" "TickExtend" (Just "_Just"),+ ComponentEdge "Ticks" "tick" "Tick" (Just "_Just"),+ ComponentEdge "Ticks" "glyphTick" "TickStyle" (Just "_Just"),+ ComponentEdge "Ticks" "textTick" "TickStyle" (Just "_Just"),+ ComponentEdge "Ticks" "lineTick" "TickStyle" (Just "_Just"),+ ComponentEdge "TickStyle" "style" "Style" (Just ""),+ ComponentEdge "TickStyle" "anchorTo" "HudChartSection" (Just ""),+ ComponentEdge "FrameOptions" "frame" "Style" (Just "#frame % _Just"),+ ComponentEdge "FrameOptions" "anchorTo" "HudChartSection" (Just ""),+ ComponentEdge "TitleOptions" "style" "Style" (Just ""),+ ComponentEdge "TitleOptions" "place" "Place" (Just ""),+ ComponentEdge "TitleOptions" "anchor" "Anchor" (Just ""),+ ComponentEdge "ChartTree" "tree" "Tree" (Just ""),+ ComponentEdge "ChartTree" "charts'" "Chart" (Just "each"),+ ComponentEdge "Chart" "chartStyle" "Style" (Just ""),+ ComponentEdge "Chart" "chartData" "ChartData" (Just ""),+ ComponentEdge "ChartData" "rectData'" "Rect" (Just "_Just % each"),+ ComponentEdge "ChartData" "lineData'" "Point" (Just "_Just % each % each"),+ ComponentEdge "ChartData" "glyphData'" "Point" (Just "_Just % each"),+ ComponentEdge "ChartData" "textData'" "(Text,Point)" (Just "_Just % each"),+ ComponentEdge "(Text,Point)" "_2" "Point" (Just ""),+ ComponentEdge "ChartData" "pathData'" "PathData" (Just "_Just % each"),+ ComponentEdge "ChartData" "blankData'" "Rect" (Just "_Just % each"),+ ComponentEdge "LegendOptions" "textStyle" "Style" (Just ""),+ ComponentEdge "LegendOptions" "frame" "Style" (Just "_Just"),+ ComponentEdge "LegendOptions" "place" "Place" (Just ""),+ ComponentEdge "LegendOptions" "scaleP" "ScaleP" (Just ""),+ ComponentEdge "LegendOptions" "legendCharts" "Chart" (Just "each % _2 % each"),+ ComponentEdge "PathData" "ArcP" "ArcInfo" (Just "(ArcP arcinfo _)"),+ ComponentEdge "Style" "color" "Colour" (Just ""),+ ComponentEdge "Style" "borderColor" "Colour" (Just ""),+ ComponentEdge "Style" "scaleP" "ScaleP" (Just ""),+ ComponentEdge "Style" "anchor" "Anchor" (Just ""),+ ComponentEdge "Style" "translate" "Point" (Just "_Just"),+ ComponentEdge "Style" "escapeText" "EscapeText" (Just ""),+ ComponentEdge "Style" "frame" "Style" (Just "_Just"),+ ComponentEdge "Style" "lineCap" "LineCap" (Just "_Just"),+ ComponentEdge "Style" "lineJoin" "LineJoin" (Just "_Just"),+ ComponentEdge "Style" "glyphShape" "GlyphShape" (Just "")+ ]++-- | list of chart-svg subcomponents+allSC :: [SubComponents]+allSC =+ [ SubComponents+ { classComponent = "AxisBar",+ subComponents =+ [ "style",+ "size",+ "buffer",+ "overhang",+ "anchorTo"+ ]+ },+ SubComponents+ { classComponent = "AxisOptions",+ subComponents =+ [ "axisBar",+ "adjustments",+ "ticks",+ "place"+ ]+ },+ SubComponents+ { classComponent = "Chart",+ subComponents =+ [ "chartStyle",+ "chartData"+ ]+ },+ SubComponents+ { classComponent = "ChartData",+ subComponents =+ [ "rectData'",+ "lineData'",+ "glyphData'",+ "textData'",+ "pathData'",+ "blankData'"+ ]+ },+ SubComponents+ { classComponent = "ChartOptions",+ subComponents =+ [ "markupOptions",+ "hudOptions",+ "chartTree"+ ]+ },+ SubComponents+ { classComponent = "ChartTree",+ subComponents =+ [ "tree",+ "charts'"+ ]+ },+ SubComponents+ { classComponent = "FrameOptions",+ subComponents =+ [ "frame",+ "anchorTo",+ "buffer"+ ]+ },+ SubComponents+ { classComponent = "HudOptions",+ subComponents =+ [ "axes",+ "frames",+ "legends",+ "titles"+ ]+ },+ SubComponents+ { classComponent = "MarkupOptions",+ subComponents =+ [ "markupHeight",+ "chartAspect",+ "cssOptions",+ "renderStyle"+ ]+ },+ SubComponents+ { classComponent = "(Text,Point)",+ subComponents =+ [ "_1",+ "_2"+ ]+ },+ SubComponents+ { classComponent = "TickStyle",+ subComponents =+ [ "style",+ "anchorTo",+ "buffer"+ ]+ },+ SubComponents+ { classComponent = "Ticks",+ subComponents =+ [ "tick",+ "glyphTick",+ "textTick",+ "lineTick"+ ]+ },+ SubComponents+ { classComponent = "TitleOptions",+ subComponents =+ [ "text",+ "style",+ "place",+ "anchor",+ "buffer"+ ]+ },+ SubComponents+ { classComponent = "RenderStyle",+ subComponents =+ [ "Compact",+ "Indented"+ ]+ },+ SubComponents+ { classComponent = "CssOptions",+ subComponents =+ [ "shapeRendering",+ "preferColorScheme",+ "fontFamilies",+ "cssExtra"+ ]+ },+ SubComponents+ { classComponent = "ChartAspect",+ subComponents =+ [ "FixedAspect",+ "CanvasAspect",+ "ChartAspect",+ "UnscaledAspect"+ ]+ },+ SubComponents+ { classComponent = "HudChartSection",+ subComponents =+ [ "CanvasSection",+ "CanvasStyleSection",+ "HudSection",+ "HudStyleSection"+ ]+ },+ SubComponents+ { classComponent = "Adjustments",+ subComponents =+ [ "maxXRatio",+ "maxYRatio",+ "angledRatio",+ "allowDiagonal"+ ]+ },+ SubComponents+ { classComponent = "Tick",+ subComponents =+ [ "TickNone",+ "TickLabels",+ "TickRound",+ "TickExact",+ "TickPlaced",+ "numTicks'",+ "formatN'",+ "tickExtend'"+ ]+ },+ SubComponents+ { classComponent = "TickExtend",+ subComponents =+ [ "TickExtend",+ "NoTickExtend"+ ]+ },+ SubComponents+ { classComponent = "FStyle",+ subComponents =+ [ "FSDecimal",+ "FSExponent",+ "FSComma",+ "FSFixed Int",+ "FSPercent",+ "FSDollar",+ "FSPrec",+ "FSCommaPrec",+ "FSNone"+ ]+ },+ SubComponents+ { classComponent = "FormatN",+ subComponents =+ [ "fstyle",+ "sigFigs",+ "maxDistinguishIterations",+ "addLPad",+ "cutRightZeros"+ ]+ },+ SubComponents+ { classComponent = "ShapeRendering",+ subComponents =+ [ "UseGeometricPrecision",+ "UseCssCrisp",+ "NoShapeRendering"+ ]+ },+ SubComponents+ { classComponent = "PreferColorScheme",+ subComponents =+ [ "PreferHud",+ "PreferDark",+ "PreferLight",+ "PreferNormal"+ ]+ },+ SubComponents+ { classComponent = "Place",+ subComponents =+ [ "PlaceLeft",+ "PlaceRight",+ "PlaceTop",+ "PlaceBottom",+ "PlaceAbsolute"+ ]+ },+ SubComponents+ { classComponent = "LegendOptions",+ subComponents =+ [ "legendSize",+ "buffer",+ "vgap",+ "hgap",+ "textStyle",+ "innerPad",+ "outerPad",+ "frame",+ "place",+ "scaleChartsBy",+ "scaleP",+ "legendCharts"+ ]+ },+ SubComponents+ { classComponent = "Anchor",+ subComponents =+ [ "AnchorMiddle",+ "AnchorStart",+ "AnchorEnd"+ ]+ },+ SubComponents+ { classComponent = "Point",+ subComponents =+ [ "_x",+ "_y"+ ]+ },+ SubComponents+ { classComponent = "PathData",+ subComponents =+ [ "StartP",+ "LineP",+ "CubicP",+ "QuadP",+ "ArcP"+ ]+ },+ SubComponents+ { classComponent = "ArcInfo",+ subComponents =+ [ "radii",+ "phi",+ "large",+ "clockwise"+ ]+ },+ SubComponents+ { classComponent = "Style",+ subComponents =+ [ "size",+ "borderSize",+ "color",+ "borderColor",+ "scaleP",+ "anchor",+ "rotation",+ "translate",+ "escapeText",+ "frame",+ "lineCap",+ "lineJoin",+ "dasharray",+ "dashoffset",+ "hsize",+ "vsize",+ "vshift",+ "glyphShape"+ ]+ },+ SubComponents+ { classComponent = "ScaleP",+ subComponents =+ [ "NoScaleP",+ "ScalePX",+ "ScalePY",+ "ScalePMinDim",+ "ScalePArea"+ ]+ },+ SubComponents+ { classComponent = "Colour",+ subComponents =+ [ "opac'",+ "lightness'",+ "chroma'",+ "hue'"+ ]+ },+ SubComponents+ { classComponent = "EscapeText",+ subComponents =+ [ "EscapeText",+ "NoEscapeText"+ ]+ },+ SubComponents+ { classComponent = "LineCap",+ subComponents =+ [ "LineCapButt",+ "LineCapRound",+ "LineCapSquare"+ ]+ },+ SubComponents+ { classComponent = "LineJoin",+ subComponents =+ [ "LineJoinMiter",+ "LineJoinBevel",+ "LineJoinRound"+ ]+ },+ SubComponents+ { classComponent = "GlyphShape",+ subComponents =+ [ "CircleGlyph",+ "SquareGlyph",+ "EllipseGlyph",+ "RectSharpGlyph",+ "RectRoundedGlyph",+ "TriangleGlyph",+ "VLineGlyph",+ "HLineGlyph",+ "PathGlyph"+ ]+ }+ ]
src/DotParse/Examples/NumHask.hs view
@@ -6,7 +6,6 @@ module DotParse.Examples.NumHask where import Algebra.Graph qualified as G-import Chart import Data.Bifunctor import Data.Map.Strict qualified as Map import Data.Monoid@@ -14,13 +13,15 @@ import Data.Text (Text, pack) import DotParse import FlatParse.Basic-import GHC.IO.Unsafe import Optics.Core import Prelude hiding (replicate) -- $setup -- >>> import DotParse+-- >>> import Chart+-- >>> import Optics.Core -- >>> :set -XOverloadedStrings+-- >>> :set -XOverloadedLabels -- | Names of the various classes used in numhask data Class@@ -197,32 +198,27 @@ G.edges ((\(Dependency x y) -> (x, y)) <$> dependenciesNH dependencies) <> G.vertices classesNH --- | NumHask statements in a dot Graph with box shapes for the nodes.-dotGraphNH :: Directed -> Graph-dotGraphNH d =- defaultGraph- & #directed .~ Last (Just d)- & addStatements (toStatements d (strToUtf8 . show <$> graphNHG))- & attL NodeType (ID "shape") .~ Just (ID "box")- & gattL (ID "rankdir") .~ Just (IDQuoted "BT")---- | 'dotGraphNH' after being positionally processed via 'processGraph'-dotGraphNH' :: Directed -> Graph-dotGraphNH' d = unsafePerformIO $ processGraph (dotGraphNH d)-{-# NOINLINE dotGraphNH' #-}- -- | Convert a node ID to a label for chart-svg charts -- Doing this directly in dot doesn't quite work because the engines get the width of the link wrong.-toLink :: ID -> Text-toLink id_ = [i|<a href="https://hackage.haskell.org/package/numhask/docs/#{m}.html\#t:#{t}">#{t}</a>|]+toLinkNH :: ID -> Text+toLinkNH id_ = [i|<a href="https://hackage.haskell.org/package/numhask/docs/#{m}.html\#t:#{t}">#{t}</a>|] where t = pack (label id_) m = Map.fromList (first (pack . show) <$> classesModule) Map.! t --- | A chart-svg chart with label links+-- | NumHask statements in a dot Graph with box shapes for the nodes. ----- > writeChartOptions "other/nh.svg" (graphToChart toLink (dotGraphNH' Directed))+-- > g <- processGraph (dotGraphNH Directed)+-- > writeChartOptions "other/nh.svg" (graphToChartWith (defaultChartConfig & set #chartVshift (-4) & set #textSize 12) toLinkNH g) -- -- -writeNHChart :: IO ()-writeNHChart = writeChartOptions "other/nh.svg" (graphToChartWith (defaultChartConfig & #labelf .~ toLink & #chartColor .~ over lightness' (* 0.5) (palette1 2) & #chartBackgroundColor .~ set opac' 0.1 (palette1 1)) (dotGraphNH' Directed))+dotGraphNH :: Directed -> Graph+dotGraphNH d =+ defaultGraph+ & #directed+ .~ Last (Just d)+ & addStatements (toStatements d (strToUtf8 . show <$> graphNHG))+ & attL NodeType (ID "shape")+ .~ Just (ID "box")+ & gattL (ID "rankdir")+ .~ Just (IDQuoted "BT")
src/DotParse/FlatParse/TH.hs view
@@ -4,6 +4,7 @@ {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# OPTIONS_GHC -Wno-name-shadowing #-}+{-# OPTIONS_GHC -Wno-x-partial #-} -- | TH stage restriction guff for flatparsing module DotParse.FlatParse.TH where
src/DotParse/Types.hs view
@@ -90,7 +90,6 @@ import Data.Maybe import Data.Monoid import Data.Proxy-import Data.String.Interpolate import Data.Text (Text) import Data.Text qualified as Text import Data.These@@ -106,6 +105,7 @@ -- >>> import DotParse -- >>> import qualified Data.Map as Map -- >>> import qualified FlatParse.Basic as FP+-- >>> import qualified Data.ByteString as BS -- >>> import FlatParse.Basic (runParser, Result) -- >>> :set -XOverloadedStrings @@ -171,6 +171,27 @@ instance Monoid Graph where mempty = Graph mempty mempty mempty mempty mempty mempty mempty mempty mempty mempty +-- | 'Directed' graph of size 1.+--+-- >>> BS.putStr $ dotPrint defaultDotConfig defaultGraph <> "\n"+-- digraph {+-- node [height=0.5;shape=circle]+-- graph [overlap=false;size="1!";splines=spline]+-- edge [arrowsize=0.5]+-- rankdir="TB"+-- }+defaultGraph :: Graph+defaultGraph =+ mempty+ & set (attL NodeType (ID "height")) (Just $ IDDouble 0.5)+ & set (attL NodeType (ID "shape")) (Just $ ID "circle")+ & set (attL GraphType (ID "overlap")) (Just $ ID "false")+ & set (attL GraphType (ID "size")) (Just $ IDQuoted "1!")+ & set (attL GraphType (ID "splines")) (Just $ ID "spline")+ & set (attL EdgeType (ID "arrowsize")) (Just $ IDDouble 0.5)+ & set #directed (Last (Just Directed))+ & set (gattL (ID "rankdir")) (Just (IDQuoted "TB"))+ -- | global attributes lens gattL :: ID -> Lens' Graph (Maybe ID) gattL k = #globalAttributes % at k@@ -211,9 +232,12 @@ ss <- wrapCurlyP (many dotParse) let g = (mempty :: Graph)- & #strict .~ Last (Just me)- & #directed .~ Last (Just d)- & #graphid .~ Last i+ & #strict+ .~ Last (Just me)+ & #directed+ .~ Last (Just d)+ & #graphid+ .~ Last i pure $ addStatements ss g -- * Dot Grammar@@ -285,6 +309,15 @@ -- -- >>> runDotParser "<The <font color='red'><b>foo</b></font>,<br/> the <font point-size='20'>bar</font> and<br/> the <i>baz</i>>" :: ID -- IDHtml "<The <font color='red'><b>foo</b></font>,<br/> the <font point-size='20'>bar</font> and<br/> the <i>baz</i>>"+--+-- >>> runDotParser "shape=diamond" :: (ID,ID)+-- (ID "shape",ID "diamond")+--+-- >>> runDotParser "fontname=\"Arial\"" :: (ID,ID)+-- (ID "fontname",IDQuoted "Arial")+--+-- >>> runDotParser "[shape=diamond; color=blue] [label=label]" :: Map.Map ID ID+-- fromList [(ID "color",ID "blue"),(ID "label",ID "label"),(ID "shape",ID "diamond")] data ID = ID ByteString | IDInt Int | IDDouble Double | IDQuoted ByteString | IDHtml ByteString deriving (Eq, Show, Generic, Ord) instance DotParse ID where@@ -316,12 +349,6 @@ label (IDHtml h) = utf8ToStr h -- | Attribute key-value pair of identifiers------ >>> runDotParser "shape=diamond" :: (ID,ID)--- (ID "shape",ID "diamond")------ >>> runDotParser "fontname=\"Arial\"" :: (ID,ID)--- (ID "fontname",IDQuoted "Arial") instance DotParse (ID, ID) where dotPrint cfg (x0, x1) = dotPrint cfg x0 <> "=" <> dotPrint cfg x1 @@ -334,9 +361,6 @@ -- | Attribute collections ----- >>> runDotParser "[shape=diamond; color=blue] [label=label]" :: Map.Map ID ID--- fromList [(ID "color",ID "blue"),(ID "label",ID "label"),(ID "shape",ID "diamond")]--- -- A given entity can have multiple attribute lists. For simplicity, these are mconcat'ed on parsing. instance DotParse (Map.Map ID ID) where dotPrint cfg as =@@ -566,32 +590,6 @@ addStatements :: [Statement] -> Graph -> Graph addStatements ss g = Prelude.foldr addStatement g ss --- | default dot graph as a ByteString-defaultBS :: ByteString-defaultBS =- [i|-digraph {- node [shape=circle- ,height=0.5];- graph [overlap=false- ,splines=spline- ,size="1!"];- edge [arrowsize=0.5];- }-|]---- | A default dot graph------ >>> import qualified Data.ByteString.Char8 as B--- >>> B.putStrLn $ dotPrint defaultDotConfig defaultGraph--- digraph {--- node [height=0.5;shape=circle]--- graph [overlap=false;size="1!";splines=spline]--- edge [arrowsize=0.5]--- }-defaultGraph :: Graph-defaultGraph = runDotParser defaultBS- -- | run a dot string through graphviz, supplying arguments and collecting stdout processDotWith :: Directed -> [String] -> ByteString -> IO ByteString processDotWith d args i = do@@ -695,15 +693,15 @@ setEdges_ g m = g & #edges- .~ ( ( \((x0, x1), as) ->- EdgeStatement- (fromDirected (defDirected $ view #directed g))- (EdgeID x0 Nothing)- (EdgeID x1 Nothing :| [])- as- )- <$> Map.toList m+ .~ ( ( \((x0, x1), as) ->+ EdgeStatement+ (fromDirected (defDirected $ view #directed g))+ (EdgeID x0 Nothing)+ (EdgeID x1 Nothing :| [])+ as )+ <$> Map.toList m+ ) -- | A specific attribute for all nodes in a graph nodesA :: ID -> Graph -> Map.Map ID (Maybe ID)@@ -813,37 +811,45 @@ { chartHeight :: Double, chartScale :: Double, edgeSize :: Double,+ nodeBorderSize :: Double, chartColor :: Colour, chartBackgroundColor :: Colour,- nodeHeight :: Double,- nodeSize :: Double,- vshift :: Double,+ backupNodeHeight :: Double,+ backupNodeWidth :: Double,+ chartVshift :: Double, textSize :: Double,- labelf :: ID -> Text+ escapeText :: EscapeText }- deriving (Generic)+ deriving (Generic, Show, Eq) -- | default parameters defaultChartConfig :: ChartConfig-defaultChartConfig = ChartConfig 500 72 0.5 (over lightness' (* 0.5) (palette1 0)) (set opac' 0.2 (palette1 0)) 0.5 0.5 (-3.7) 14 (Text.pack . label)+defaultChartConfig = ChartConfig 500 72 0.5 1 (grey 0.4 0.8) (grey 0.5 0.2) 0.5 0.5 (-6) 16 NoEscapeText -- | convert a 'Graph' processed via the graphviz commands to a 'ChartOptions'-graphToChartWith :: ChartConfig -> Graph -> ChartOptions-graphToChartWith cfg g =+graphToChartWith :: ChartConfig -> (ID -> Text) -> Graph -> ChartOptions+graphToChartWith cfg labelf g = mempty- & #charts .~ named "edges" ps <> named "shapes" c0 <> named "labels" [ts]- & #markupOptions % #markupHeight .~ (cfg ^. #chartHeight)- & #hudOptions .~ (mempty & #chartAspect .~ ChartAspect)+ & set #chartTree (named "edges" ps <> named "shapes" c0 <> named "labels" [ts])+ & set (#chartTree % charts' % each % #chartStyle % #scaleP) ScalePArea+ & #markupOptions+ % #markupHeight+ .~ (Just $ cfg ^. #chartHeight)+ & #markupOptions+ % #chartAspect+ .~ ChartAspect+ & #hudOptions+ .~ mempty where glyphs w = case view (attL NodeType (ID "shape")) g of- Just (ID "circle") -> defaultGlyphStyle & #shape .~ CircleGlyph & #size .~ (cfg ^. #chartScale) * w & #borderSize .~ (cfg ^. #edgeSize) & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor)- Just (ID "box") -> defaultGlyphStyle & #shape .~ RectSharpGlyph (h / w) & #size .~ 72 * w & #borderSize .~ 1 & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor)+ Just (ID "circle") -> defaultGlyphStyle & #glyphShape .~ CircleGlyph & #size .~ (cfg ^. #chartScale) * w & #borderSize .~ (cfg ^. #edgeSize) & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor)+ Just (ID "box") -> defaultGlyphStyle & #glyphShape .~ RectSharpGlyph (h / w) & #size .~ (cfg ^. #chartScale) * w & #borderSize .~ view #nodeBorderSize cfg & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor) -- defaults to circle- _ -> defaultGlyphStyle & #shape .~ CircleGlyph & #size .~ 72 * w & #borderSize .~ 1 & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor)- h = maybe (cfg ^. #nodeHeight) (runParser_ double . strToUtf8 . label) (view (attL NodeType (ID "height")) g)- vshift' = cfg ^. #vshift+ _ -> defaultGlyphStyle & #glyphShape .~ CircleGlyph & #size .~ (cfg ^. #chartScale) * w & #borderSize .~ view #nodeBorderSize cfg & #borderColor .~ (cfg ^. #chartColor) & #color .~ (cfg ^. #chartBackgroundColor)+ h = maybe (cfg ^. #backupNodeHeight) (runParser_ double . strToUtf8 . label) (view (attL NodeType (ID "height")) g)+ vshift' = cfg ^. #chartVshift -- node information- ns = nodeInfo g (cfg ^. #nodeSize)+ ns = nodeInfo g (cfg ^. #backupNodeWidth) -- edge information es = edgeInfo g (cfg ^. #edgeSize) -- paths@@ -852,11 +858,11 @@ c0 = fmap (\(NodeInfo _ w p) -> GlyphChart (glyphs w) [p]) ns -- labels ts =- TextChart (defaultTextStyle & #size .~ (cfg ^. #textSize) & #color .~ (cfg ^. #chartColor)) ((\(NodeInfo l _ (Point x y)) -> ((cfg ^. #labelf) l, Point x (vshift' + y))) <$> ns)+ TextChart (defaultTextStyle & #escapeText .~ (cfg ^. #escapeText) & #size .~ (cfg ^. #textSize) & #color .~ (cfg ^. #chartColor)) ((\(NodeInfo l _ (Point x y)) -> (labelf l, Point x (vshift' + y))) <$> ns) -- | convert a 'Graph' processed via the graphviz commands to a 'ChartOptions' using the default ChartConfig. graphToChart :: Graph -> ChartOptions-graphToChart = graphToChartWith defaultChartConfig+graphToChart = graphToChartWith defaultChartConfig (Text.pack . label) -- | Convert an algebraic graph to a dotparse graph. toDotGraphWith :: Directed -> Graph -> G.Graph ByteString -> Graph