packages feed

chart-svg 0.1.3 → 0.8.3.2

raw patch · 64 files changed

Files

+ ChangeLog.md view
@@ -0,0 +1,203 @@+0.8.3+===++- GHC 9.14.1 support+- relaxed dependency bounds via allow-newer for GHC 9.14 compatibility++0.8.2+===++- added Data instances++0.8.1+===++- bumped upper bounds for markup-parse and containers.++0.8+===++- reversed hori, vert; added Align to hori, vert, stack api+- projectWithAspect added+- computeRangeTick added+- exposed legenedChart, freezeAxes & freezeTicks+- renamed anchor ==> anchoring+- added anchoring, achorTo, numStacks & alignCharts to LegendOptions+- added asChartTree, vertCO, horiCO, stackCO+- added beside, besiseChart+- added Align+- renamed Anchor ==> TextAnchor++0.7+===++- switch to harpie++0.6.1+===++- numhask upper bound bumped to 0.12+- switch to doctest-parallel++0.6+===++0.6 is a major refactor.++* Chart++  - refactored Chart from a sum type to a named Style, ChartData pair.+  - in Chart (..) + chartStyle - style+  - introduced ChartData+  - integrated the various *Style types to a single type.+  - introduced partial data lenses: *Data'+  - added chart patterns: *Chart+  - + blankChart1++* ScaleP++  - introduced the ScaleP type+  - added scaleP to Style+  - added the scaleP function+  - - maybeProjectWith + projectChartDataWith+  - - scaleStyle - overText + scaleChartData+  - + scaleRatio++* Chart.Style+  - integrated styles+  - - colourChart + colourStyle+  - + Style (..)+  - + defaultStyle+  - + scaleStyle+  - + default*Style+  - + gpalette -gpalette1+  +* boxes+  - added safeBox', safeStyleBox'++* Chart.Compound++* Factored State out of Hud+  - ChartHud lenses removed: canvasBox', canvasStyleBox', hudBox', hudStyleBox'+  - Introduced HudChartSection type and hudChartBox' which replaces ChartHud lenses.+  - removed runHud+  - removed hud effect functionality: closes, fromEffect, applyChartAspect, getHudBox+  - new hud manipulation tools: appendHud, makeHuds, projectChartTreeWith, addHud, finalCanvas++* Chart.Hud API+  - - axis + axisHud - title + titleHud - legend + legendHud+  - removed placeText+  - added flipPlace+  - + TitleOptions - Title+  - - TickStyle + Tick+  - + axisHud + titleHud+  - - legend - legendFrame+  - new tick lenses: + formatN', numTicks', tickExtend'+  - In LegendOptions: + scaleChartBy - overallScale + legendSize - size+  - In AxisOptions: + adjustments - adjust + axisBar - bar+  +* refactored Priority to a named pair++* Chart.Markup+  - added forgetHud+  - - CssPreferColorScheme + PreferColorScheme+  - - CssShapeRendering + ShapeRendering+  - + defaultCssFontFamilies++* Integrated chart styles to a single Style type++* changed defaults+  - + defaultXAxisOptions + defaultYAxisOptions - defaultAxisOptions+  - - defaultGlyphTick + defaultGlyphTickStyleX + defaultGlyphTickStyleY+  - - defaultTicks + defaultXTicks + defaultYTicks +  - + defaultTick - defaultTickStyle++* Chart.Bar+  - added barTextCharts+  - added textShiftVert to BarOptions++* Data.Colour+  - + palette - palette1+  - + paletteO - palette1a++* Chart.Surface+  - - surfaceLegendChart+  - - surfaceAxisOptions+  - + surfaceLegendAxisOptions+  - + gridReferenceChart+  - + addSurfaceLegend++* Chart.Data+  - - singletonGuard + isSingleton+++0.5.1.1+===+* test suite removed++0.5.1.0+===+* Bumped markup-parse lower bound to >=0.1+* Renamed LegendOptions.content to LegendOptions.legendCharts+* markup* functions now return Markup+* renderStyle added as a MarkupOptions component++0.5.0+===+* Library split into markup-parse and chart-svg.+* test removed++0.4.1+===+* Changes due to numhask-0.11 upgrade+* remove broken surface legend++0.4+===++- Markup type introduced, representing an abstract markup DSL that could be described as simplified but non-compliant XML+  - Chart.Svg replaced by Chart.Markup & Chart.Markup.Parser+  - ChartSvg replaced by ChartOptions+  - functionality includes both printing and parsing.+  - the rendering pipeline is now ChartOptions => Markup => ByteString+- lucid removed as a dependency.+- tree-diff introduced in the test routines.+- flatparse replaces attoparsec+- string-interpolate replaces neat-interpolation++0.3+===++- Chart type rewritten+  - Chart data is no longer a separate element+  - charts are monomorphic (underlying data is Double)+- Aligned with prefer-color-scheme usage+- oklab usage as per emerging CSS standards+- chart-reanimate is a separate library+- formatn is a seprate library+- introduced a ChartTree type as a tree of named charts to facilitate downstream usage of classes.++0.2.2+===++* Changed api for palette++0.2.1+===++* Changed api for reanimate hooks.+* Rationalised default options.++0.2.0+=====++* Reanimate support. See app/reanimate-example.hs+* Data.Path added: support for Path style charts.+* Chart.Examples expanded+* Improvements to documentation.+* web-rep support removed.++0.1.2+=====++* basic charts
LICENSE view
@@ -1,4 +1,4 @@-Copyright Tony Day (c) 2018+Copyright (c) 2017, Tony Day  All rights reserved. 
Setup.hs view
@@ -1,2 +1,3 @@ import Distribution.Simple+ main = defaultMain
− app/examples.hs
@@ -1,77 +0,0 @@-{-# LANGUAGE ApplicativeDo #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}--import Chart-import Chart.Examples-import Control.Lens-import Lucid-import NumHask.Prelude hiding (replace)-import Web.Rep--chartServer :: SharedRep IO (Text, Text) -> IO ()-chartServer srep = sharedServer srep defaultSocketConfig (chartStyler True) defaultInputCode chartOutputCode--chartOutputCode :: Either Text (Text, Text) -> IO [Code]-chartOutputCode ea = -  pure $ case ea of-    Left err -> [Append "debug" ("hashmap error: " <> err)]-    Right (chart', debug') ->-      [ Replace "output" chart',-        Replace "debug" debug'-      ]--chartStyler :: Bool -> Page-chartStyler doDebug =-  mathjaxSvgPage "hasmathjax"-    <> bootstrapPage-    <> socketPage-    & #htmlHeader .~ title_ "chart styler"-    & #htmlBody-      .~ divClass_-        "container"-        ( divClass_-            "row d-flex justify-content-between"-            ( sec "col4" "input"-                <> sec "col8" "output"-            )-            <> bool mempty (divClass_ "row" (with div_ [id_ "debug"] mempty)) doDebug-        )-  where-    sec d n = divClass_ d (with div_ [id_ n] mempty)---- main example-main :: IO ()-main =-  chartServer-    ( repChoice-        5-        [ ("mempty", repEx memptyExample),-          ("unit", repEx unitExample),-          ("hud", repEx hudExample),-          ("rect", repEx rectExample),-          ("line", repEx lineExample),-          ("wave", repEx mainExample),-          ("text", repEx textExample),-          ("glyphs", repEx glyphExample),-          ("bar", repBarChart defaultSvgOptions barDataExample defaultBarOptions),-          ( "pixel",-            repPixelChart-              ( defaultSvgOptions,-                defaultPixelOptions-                  & #poGrain .~ Point 20 20-                  & #poRange .~ Rect 1 2 1 2,-                defaultHudOptions,-                defaultPixelLegendOptions "pixel test",-                f1-              )-          ),-          ("bound text bug", repEx (makeExample defaultHudOptions boundTextBug)),-          ("compound chart", repEx (makeExample defaultHudOptions (lglyph <> glines))),-          ("label", repEx (makeExample defaultHudOptions label)),-          ("legend test", repNoData defaultSvgOptions BlankA legendTest)-        ]-    )
− app/venn.hs
@@ -1,218 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-type-defaults #-}--import Chart-import Control.Lens-import Data.Generics.Labels ()-import qualified Data.Map.Strict as Map-import qualified Data.Text as Text-import qualified Data.Text.Lazy as Lazy-import Lucid-import Lucid.Base-import NumHask.Prelude--xs :: Map.Map Text (Point Double)-xs =-  Map.fromList-    [ ("origin", Point 0 0), -- origin-      ("circle1", Point 0.5 (-0.5 + cos (pi / 6))), -- center of circle 1-      ("circle2", Point 0 (-0.5)), -- center of circle 2-      ("circle3", Point (-0.5) ((-0.5) + cos (pi / 6))), -- center of circle 3-      ("corner1", Point 0 ((-0.5) + 2 * cos (pi / 6))), -- corner 1-      ("corner2", Point 1 (-0.5)), -- corner 2-      ("corner3", Point (-1) (-0.5)) -- corner 3-    ]--vennps :: Text -> (Double, Double)-vennps k = let (Point x y) = xs Map.! k in (x, - y)--moveA :: Double -> Double -> Text-moveA x y = "M" <> show x <> "," <> show y--data Arc = Arc {arcXr :: Double, arcYr :: Double, arcRot :: Double, arcLargeArcFlag :: Bool, arcSweepFlag :: Bool, arcX :: Double, arcY :: Double} deriving (Eq, Show, Generic)--arcA_ :: Arc -> Text-arcA_ a = show (view #arcXr a) <> " " <> show (view #arcYr a) <> " " <> show (view #arcRot a) <> " " <> bool "0" "1" (view #arcLargeArcFlag a) <> " " <> bool "0" "1" (view #arcSweepFlag a) <> " " <> show (view #arcX a) <> "," <> show (view #arcY a)--arcA :: [Arc] -> Text-arcA as = "A" <> Text.intercalate " " (arcA_ <$> as)--outerseg1 :: Text-outerseg1 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "corner1"),-      arcA-        [ uncurry (Arc 0.5 0.5 0 True True) (vennps "corner2"),-          uncurry (Arc 1 1 0 False False) (vennps "circle1"),-          uncurry (Arc 1 1 0 False False) (vennps "corner1")-        ],-      "Z"-    ]--outerseg2 :: Text-outerseg2 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "corner3"),-      arcA-        [ uncurry (Arc 0.5 0.5 0 True False) (vennps "corner2"),-          uncurry (Arc 1 1 0 False True) (vennps "circle2"),-          uncurry (Arc 1 1 0 False True) (vennps "corner3")-        ],-      "Z"-    ]--outerseg3 :: Text-outerseg3 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "corner3"),-      arcA-        [ uncurry (Arc 0.5 0.5 0 True True) (vennps "corner1"),-          uncurry (Arc 1 1 0 False False) (vennps "circle3"),-          uncurry (Arc 1 1 0 False False) (vennps "corner3")-        ],-      "Z"-    ]--innerseg :: Text-innerseg =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "circle1"),-      arcA-        [ uncurry (Arc 1 1 0 False True) (vennps "circle2"),-          uncurry (Arc 1 1 0 False True) (vennps "circle3"),-          uncurry (Arc 1 1 0 False True) (vennps "circle1")-        ],-      "Z"-    ]--midseg1 :: Text-midseg1 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "corner1"),-      arcA-        [ uncurry (Arc 1 1 0 False True) (vennps "circle1"),-          uncurry (Arc 1 1 0 False False) (vennps "circle3"),-          uncurry (Arc 1 1 0 False True) (vennps "corner1")-        ],-      "Z"-    ]--midseg2 :: Text-midseg2 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "circle1"),-      arcA-        [ uncurry (Arc 1 1 0 False True) (vennps "corner2"),-          uncurry (Arc 1 1 0 False True) (vennps "circle2"),-          uncurry (Arc 1 1 0 False False) (vennps "circle1")-        ],-      "Z"-    ]--midseg3 :: Text-midseg3 =-  Text.intercalate-    " "-    [ uncurry moveA (vennps "circle2"),-      arcA-        [ uncurry (Arc 1 1 0 False True) (vennps "corner3"),-          uncurry (Arc 1 1 0 False True) (vennps "circle3"),-          uncurry (Arc 1 1 0 False False) (vennps "circle2")-        ],-      "Z"-    ]--vennGlyphs :: [Text]-vennGlyphs = [outerseg1, outerseg2, outerseg3, midseg1, midseg2, midseg3, innerseg]--seg :: Text -> Colour -> GlyphStyle-seg p c = defaultGlyphStyle & set #shape (PathGlyph p) & set #color c & set #borderColor white & set #borderSize 0.06--venns :: [Chart Double]-venns = zipWith (\p c -> Chart (GlyphA $ seg p c) [zero]) vennGlyphs palette1--phrases :: [Chart Double]-phrases = phraseChart <$> mainPhrases--data Phrase-  = Phrase-      { phraseText :: Text,-        phrasePosition :: Point Double,-        phraseSize :: Double,-        phraseRotation :: Double,-        phraseColor :: Colour,-        phraseTag :: Text,-        phraseLevel :: Int-      }-  deriving (Eq, Show, Generic)--phraseChart :: Phrase -> Chart Double-phraseChart p = Chart (TextA a [view #phraseText p]) [PointXY (view #phrasePosition p)]-  where-    a =-      defaultTextStyle-        & set #size (view #phraseSize p)-        & set #rotation (Just $ view #phraseRotation p)-        & set #color (view #phraseColor p)--mainPhrases :: [Phrase]-mainPhrases =-  [ Phrase "Composable" (Point 0.9 0.7) 0.16 60 c "composable" 1,-    Phrase "Functional" (Point 0 (-1)) 0.16 0 c "functional" 1,-    Phrase "Open" (Point (-1) 0.55) 0.16 (-60) c "open" 1,-    Phrase "Accurate" (Point 0.6 (-0.4)) 0.16 0 c "accurate" 1,-    Phrase "Dynamic" (Point (-0.6) (-0.4)) 0.16 0 c "dynamic" 1,-    Phrase "Modern" (Point 0 0.7) 0.16 0 c "modern" 1,-    Phrase "chart-svg" (Point 0 0) 0.2 0 c "chart-svg" 1-  ]-  where-    c = black--renderToSvgt :: CssOptions -> Point Double -> Rect Double -> [Chart Double] -> [(TextStyle, Text)] -> Html ()-renderToSvgt csso (Point w' h') (Rect x z y w) cs tts =-  with-    ( svg2_-        ( bool id (cssCrisp <>) (csso == UseCssCrisp) $-            chartDefs cs-              <> mconcat (zipWith svgt cs tts)-        )-    )-    [ width_ (show w'),-      height_ (show h'),-      makeAttribute "viewBox" (show x <> " " <> show (- w) <> " " <> show (z - x) <> " " <> show (w - y))-    ]--writeVennWords :: IO ()-writeVennWords =-  writeFile "other/venn2.svg" $ Lazy.toStrict $ renderText-    $ renderToSvgt-      NoCssOptions-      (Point 300 300)-      (Rect (-2) 2 (-2) 2)-      (phrases <> venns <> [Chart BlankA [R (-2.0) 2.0 (-2.0) 2.0]])-    $ (defaultTextStyle & set #color colorText,)-      <$> (replicate 7 "" <> (phraseText <$> mainPhrases) <> [""])--writeVenn :: [Colour] -> IO ()-writeVenn cs = writeChartsWith "other/venn.svg" (defaultSvgOptions & set #scaleCharts' NoScaleCharts & set #svgAspect ChartAspect & set #svgHeight 100) ([phraseChart (Phrase "λ" (Point 0 (-0.2)) 0.8 0 (Colour 0.1 0 0.2 1) "chart-svg" 1)] <> zipWith (\p c -> Chart (GlyphA $ seg p c) [PointXY (Point 0.0 0.0)]) [outerseg1, outerseg2, outerseg3, midseg1, midseg2, midseg3] cs <> [Chart BlankA [R (-1.5) 1.5 (-1.5) 1.5]])--main :: IO ()-main = do-  writeVennWords-  writeVenn palette1
chart-svg.cabal view
@@ -1,143 +1,114 @@-cabal-version:  2.4-name:           chart-svg-version:        0.1.3-synopsis:       Charts in SVG-description:    Chart library targetting SVG.-category:       project-homepage:       https://github.com/tonyday567/chart-svg#readme-bug-reports:    https://github.com/tonyday567/chart-svg/issues-author:         Tony Day-maintainer:     tonyday567@gmail.com-copyright:      Tony Day (c) 2017-license:        BSD-3-Clause-license-file:   LICENSE-build-type:     Simple+cabal-version: 3.0+name: chart-svg+version: 0.8.3.2+license: BSD-3-Clause+license-file: LICENSE+copyright: Tony Day (c) 2017+category: graphics+author: Tony Day+maintainer: tonyday567@gmail.com+homepage: https://github.com/tonyday567/chart-svg#readme+bug-reports: https://github.com/tonyday567/chart-svg/issues+synopsis: Charting library targetting SVGs.+description:+  This package provides a charting library targetting SVG as the rendered output.++  == Usage++  >>> :set -XOverloadedLabels+  >>> :set -XOverloadedStrings+  >>> import Chart+  >>> import Optics.Core+  >>> let lines = [[Point 0.0 1.0, Point 1.0 1.0, Point 2.0 5.0],[Point 0.0 0.0, Point 2.8 3.0],[Point 0.5 4.0, Point 0.5 0]]+  >>> let styles = (\c -> defaultLineStyle & set #color (palette c) & set #size 0.015) <$> [0..2]+  >>> let cs = zipWith (\s x -> LineChart s [x]) styles lines+  >>> let lineExample = mempty & set #chartTree (named "line" cs) & set #hudOptions defaultHudOptions :: ChartOptions+  >>> writeChartOptions "other/usage.svg" lineExample++  ![usage example](docs/other/usage.svg)++  See "Chart" for concept design notes, and "Chart.Examples" for practical usage.++build-type: Simple+tested-with:+  ghc ==9.10.3+  ghc ==9.12.2+  ghc ==9.14.1+ extra-doc-files:+  ChangeLog.md   other/*.svg+  readme.md  source-repository head   type: git   location: https://github.com/tonyday567/chart-svg -library-  exposed-modules:-    Chart-    Chart.Bar-    Chart.Examples-    Chart.Pixel-    Chart.Render-    Chart.Page-    Chart.Types-    Data.Colour-    Data.FormatN-  hs-source-dirs:-    src-  build-depends:-    Color >= 0.1.4,-    attoparsec >= 0.13,-    base >=4.7 && <5,-    generic-lens >= 1.2 && < 3.0,-    lucid >= 2.9,-    lens >= 4.0,-    numhask >= 0.6 && < 0.7,-    numhask-space >= 0.6 && < 0.7,-    pretty-simple >= 3.2,-    scientific >= 0.3,-    tagsoup >= 0.14,-    text >= 1.2,-    time >= 1.9,-    transformers >= 0.5,-    web-rep >= 0.7 && < 0.8-  default-language: Haskell2010-  default-extensions:-    NegativeLiterals-    NoImplicitPrelude-    OverloadedStrings-    UnicodeSyntax+common ghc-options-stanza   ghc-options:     -Wall     -Wcompat+    -Widentities     -Wincomplete-record-updates     -Wincomplete-uni-patterns+    -Wpartial-fields     -Wredundant-constraints -executable examples-  main-is: examples.hs-  hs-source-dirs:-    app-  build-depends:-    base >=4.7 && <5,-    chart-svg,-    lens >= 4.0,-    lucid >= 2.9,-    numhask >= 0.6 && < 0.7,-    text >= 1.2,-    transformers >= 0.5,-    unordered-containers >= 0.2.10,-    web-rep >= 0.7 && < 0.8-  default-language: Haskell2010+common ghc2024-additions   default-extensions:-    NegativeLiterals-    NoImplicitPrelude-    OverloadedStrings-    UnicodeSyntax-  ghc-options:-    -Wall-    -Wcompat-    -Wincomplete-record-updates-    -Wincomplete-uni-patterns-    -Wredundant-constraints+    DataKinds+    DerivingStrategies+    DisambiguateRecordFields+    ExplicitNamespaces+    GADTs+    LambdaCase+    MonoLocalBinds+    RoleAnnotations -executable venn-  main-is: venn.hs-  hs-source-dirs:-    app-  build-depends:-    base >=4.7 && <5,-    containers >= 0.6,-    chart-svg,-    generic-lens >= 1.2 && < 3.0,-    lucid >= 2.9,-    lens >= 4.0,-    numhask >= 0.6 && < 0.7,-    numhask-space >= 0.6 && < 0.7,-    text >= 1.2,-    transformers >= 0.5,-    unordered-containers >= 0.2.10,-    web-rep >= 0.7 && < 0.8-  default-language: Haskell2010-  default-extensions:-    NegativeLiterals-    NoImplicitPrelude-    OverloadedStrings-    UnicodeSyntax-  ghc-options:-    -Wall-    -Wcompat-    -Wincomplete-record-updates-    -Wincomplete-uni-patterns-    -Wredundant-constraints+common ghc2024-stanza+  if impl(ghc >=9.10)+    default-language:+      GHC2024+  else+    import: ghc2024-additions+    default-language:+      GHC2021 -test-suite test-  type: exitcode-stdio-1.0-  main-is: test.hs-  hs-source-dirs:-    test+library+  import: ghc-options-stanza+  import: ghc2024-stanza+  hs-source-dirs: src   build-depends:-    base >=4.7 && <5,-    chart-svg,-    doctest >= 0.16,-    numhask >= 0.6 && < 0.7-  default-language: Haskell2010-  default-extensions:-    NegativeLiterals-    NoImplicitPrelude-    OverloadedStrings-    UnicodeSyntax-  ghc-options:-    -Wall-    -Wcompat-    -Wincomplete-record-updates-    -Wincomplete-uni-patterns-    -Wredundant-constraints-    -funbox-strict-fields+    Color >=0.3.2 && <0.5,+    base >=4.14 && <5,+    bytestring >=0.11.3 && <0.13,+    containers >=0.6 && <0.9,+    cubicbezier >=0.6 && <0.7,+    flatparse >=0.5 && <0.6,+    formatn >=0.3 && <0.4,+    harpie >=0.1 && <0.3,+    lens >=5 && <5.4,+    markup-parse >=0.1 && <0.3,+    mtl >=2.2.2 && <2.4,+    numhask >=0.11 && <0.14,+    numhask-space >=0.10 && <0.14,+    optics-core >=0.4 && <0.5,+    random >=1.2 && <1.4,+    text >=1.2 && <2.2,+    time >=1.9 && <1.15,++  exposed-modules:+    Chart+    Chart.Bar+    Chart.Compound+    Chart.Data+    Chart.Examples+    Chart.Hud+    Chart.Markup+    Chart.Primitive+    Chart.Style+    Chart.Surface+    Data.Colour+    Data.Path+    Data.Path.Parser+
+ other/arcflags.svg view
@@ -0,0 +1,49 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="370" height="300" viewBox="0 -4.1098 9.0 7.2898"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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;+}+++{+  .chart g {+    stroke: rgba(5%, 5%, 5%, 1.00);+  }+  .chart g text {+    fill: rgba(5%, 5%, 5%, 1.00);+  }+}+@media (prefers-color-scheme:dark) {+  .chart g {+    stroke: rgba(94%, 94%, 94%, 1.00);+  }+  .chart g text {+    fill: rgba(94%, 94%, 94%, 1.00);+  }+}+</style><g class="chart"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.6" text-anchor="middle"><text x="5.5000" y="3.0">Large</text></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.4" text-anchor="middle"><text x="5.88" y="2.35">True</text></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="7.4049,-0.0449 7.4029,-0.1077 7.3970,-0.1702 7.3872,-0.2323 7.3735,-0.2936 7.3559,-0.3539 7.3347,-0.4130 7.3097,-0.4707 7.2812,-0.5266 7.2492,-0.5807 7.2139,-0.6327 7.1754,-0.6823 7.1338,-0.7294 7.0894,-0.7738 7.0423,-0.8154 6.9927,-0.8539 6.9407,-0.8892 6.8866,-0.9212 6.8307,-0.9497 6.7730,-0.9747 6.7139,-0.9959 6.6536,-1.0135 6.5923,-1.0272 6.5302,-1.0370 6.4677,-1.0429 6.4049,-1.0449 6.3421,-1.0429 6.2795,-1.0370 6.2175,-1.0272 6.1562,-1.0135 6.0959,-0.9959 6.0368,-0.9747 5.9791,-0.9497 5.9231,-0.9212 5.8690,-0.8892 5.8171,-0.8539 5.7675,-0.8154 5.7203,-0.7738 5.6759,-0.7294 5.6344,-0.6823 5.5959,-0.6327 5.5605,-0.5807 5.5286,-0.5266 5.5000,-0.4707 5.4751,-0.4130 5.4538,-0.3539 5.4363,-0.2936 5.4226,-0.2323 5.4128,-0.1702 5.4068,-0.1077 5.4049,-0.0449 5.4068,0.0179 5.4128,0.0805 5.4226,0.1425 5.4363,0.2038 5.4538,0.2641 5.4751,0.3232 5.5000,0.3809 5.5286,0.4369 5.5605,0.4910 5.5959,0.5429 5.6344,0.5925 5.6759,0.6397 5.7203,0.6841 5.7675,0.7256 5.8171,0.7641 5.8690,0.7995 5.9231,0.8314 5.9791,0.8600 6.0368,0.8849 6.0959,0.9062 6.1562,0.9237 6.2175,0.9374 6.2795,0.9472 6.3421,0.9532 6.4049,0.9551 6.4677,0.9532 6.5302,0.9472 6.5923,0.9374 6.6536,0.9237 6.7139,0.9062 6.7730,0.8849 6.8307,0.8600 6.8866,0.8314 6.9407,0.7995 6.9927,0.7641 7.0423,0.7256 7.0894,0.6841 7.1338,0.6397 7.1754,0.5925 7.2139,0.5429 7.2492,0.4910 7.2812,0.4369 7.3097,0.3809 7.3347,0.3232 7.3559,0.2641 7.3735,0.2038 7.3872,0.1425 7.3970,0.0805 7.4029,0.0179 7.4049,-0.0449"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="6.4049,0.9551 6.4029,0.8923 6.3970,0.8298 6.3872,0.7677 6.3735,0.7064 6.3559,0.6461 6.3347,0.5870 6.3097,0.5293 6.2812,0.4734 6.2492,0.4193 6.2139,0.3673 6.1754,0.3177 6.1338,0.2706 6.0894,0.2262 6.0423,0.1846 5.9927,0.1461 5.9407,0.1108 5.8866,0.0788 5.8307,0.0503 5.7730,0.0253 5.7139,0.0041 5.6536,-0.0135 5.5923,-0.0272 5.5302,-0.0370 5.4677,-0.0429 5.4049,-0.0449 5.3421,-0.0429 5.2795,-0.0370 5.2175,-0.0272 5.1562,-0.0135 5.0959,0.0041 5.0368,0.0253 4.9791,0.0503 4.9231,0.0788 4.8690,0.1108 4.8171,0.1461 4.7675,0.1846 4.7203,0.2262 4.6759,0.2706 4.6344,0.3177 4.5959,0.3673 4.5605,0.4193 4.5286,0.4734 4.5000,0.5293 4.4751,0.5870 4.4538,0.6461 4.4363,0.7064 4.4226,0.7677 4.4128,0.8298 4.4068,0.8923 4.4049,0.9551 4.4068,1.0179 4.4128,1.0805 4.4226,1.1425 4.4363,1.2038 4.4538,1.2641 4.4751,1.3232 4.5000,1.3809 4.5286,1.4369 4.5605,1.4910 4.5959,1.5429 4.6344,1.5925 4.6759,1.6397 4.7203,1.6841 4.7675,1.7256 4.8171,1.7641 4.8690,1.7995 4.9231,1.8314 4.9791,1.8600 5.0368,1.8849 5.0959,1.9062 5.1562,1.9237 5.2175,1.9374 5.2795,1.9472 5.3421,1.9532 5.4049,1.9551 5.4677,1.9532 5.5302,1.9472 5.5923,1.9374 5.6536,1.9237 5.7139,1.9062 5.7730,1.8849 5.8307,1.8600 5.8866,1.8314 5.9407,1.7995 5.9927,1.7641 6.0423,1.7256 6.0894,1.6841 6.1338,1.6397 6.1754,1.5925 6.2139,1.5429 6.2492,1.4910 6.2812,1.4369 6.3097,1.3809 6.3347,1.3232 6.3559,1.2641 6.3735,1.2038 6.3872,1.1425 6.3970,1.0805 6.4029,1.0179 6.4049,0.9551"/></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="none"><polyline points="5.4049,-0.0449 5.3578,-0.0438 5.3108,-0.0404 5.2640,-0.0349 5.2175,-0.0272 5.1714,-0.0172 5.1259,-0.0052 5.0810,0.0090 5.0368,0.0253 4.9934,0.0437 4.9509,0.0641 4.9094,0.0865 4.8690,0.1108 4.8299,0.1370 4.7920,0.1650 4.7554,0.1947 4.7203,0.2262 4.6868,0.2592 4.6548,0.2938 4.6244,0.3299 4.5959,0.3673 4.5691,0.4061 4.5441,0.4461 4.5211,0.4872 4.5000,0.5293 4.4810,0.5724 4.4640,0.6164 4.4491,0.6611 4.4363,0.7064 4.4257,0.7523 4.4172,0.7987 4.4109,0.8454 4.4068,0.8923 4.4050,0.9394 4.4054,0.9865 4.4080,1.0336 4.4128,1.0805 4.4198,1.1271 4.4290,1.1733 4.4403,1.2190 4.4538,1.2641 4.4694,1.3086 4.4871,1.3523 4.5068,1.3951 4.5286,1.4369 4.5522,1.4776 4.5778,1.5172 4.6052,1.5555 4.6344,1.5925 4.6652,1.6281 4.6978,1.6622 4.7319,1.6948 4.7675,1.7256 4.8045,1.7548 4.8428,1.7822 4.8824,1.8078 4.9231,1.8314 4.9649,1.8532 5.0077,1.8729 5.0514,1.8906 5.0959,1.9062 5.1410,1.9197 5.1867,1.9310 5.2329,1.9402 5.2795,1.9472 5.3264,1.9520 5.3735,1.9546 5.4206,1.955 5.4677,1.9532 5.5146,1.9491 5.5613,1.9428 5.6077,1.9343 5.6536,1.9237 5.6989,1.9109 5.7436,1.8960 5.7876,1.8790 5.8307,1.8600 5.8728,1.8389 5.9139,1.8159 5.9539,1.7909 5.9927,1.7641 6.0301,1.7356 6.0662,1.7052 6.1008,1.6732 6.1338,1.6397 6.1653,1.6046 6.1950,1.5680 6.2230,1.5301 6.2492,1.4910 6.2735,1.4506 6.2959,1.4091 6.3163,1.3666 6.3347,1.3232 6.3510,1.2790 6.3652,1.2341 6.3772,1.1886 6.3872,1.1425 6.3949,1.0960 6.4004,1.0492 6.4038,1.0022 6.4049,0.9551"/></g><g stroke-width="0.0100" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="rgb(5%, 5%, 5%)" fill-opacity="0.3"><path d="M 6.4049,-0.0449 L 5.4049,-0.0449 A 1.0 1.0 0 1 0 6.4049,0.9551 L 6.4049,-0.0449"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="7.3900,-3.0849 7.3880,-3.1477 7.3821,-3.2102 7.3723,-3.2723 7.3586,-3.3336 7.3411,-3.3939 7.3198,-3.4530 7.2948,-3.5107 7.2663,-3.5666 7.2343,-3.6207 7.1990,-3.6727 7.1605,-3.7223 7.1190,-3.7694 7.0745,-3.8138 7.0274,-3.8554 6.9778,-3.8939 6.9258,-3.9292 6.8718,-3.9612 6.8158,-3.9897 6.7581,-4.0147 6.6990,-4.0359 6.6387,-4.0535 6.5774,-4.0672 6.5153,-4.0770 6.4528,-4.0829 6.39,-4.0849 6.3272,-4.0829 6.2647,-4.0770 6.2026,-4.0672 6.1413,-4.0535 6.0810,-4.0359 6.0219,-4.0147 5.9642,-3.9897 5.9082,-3.9612 5.8542,-3.9292 5.8022,-3.8939 5.7526,-3.8554 5.7055,-3.8138 5.6610,-3.7694 5.6195,-3.7223 5.5810,-3.6727 5.5457,-3.6207 5.5137,-3.5666 5.4852,-3.5107 5.4602,-3.4530 5.4389,-3.3939 5.4214,-3.3336 5.4077,-3.2723 5.3979,-3.2102 5.3920,-3.1477 5.3900,-3.0849 5.3920,-3.0221 5.3979,-2.9595 5.4077,-2.8975 5.4214,-2.8362 5.4389,-2.7759 5.4602,-2.7168 5.4852,-2.6591 5.5137,-2.6031 5.5457,-2.5490 5.5810,-2.4971 5.6195,-2.4475 5.6610,-2.4003 5.7055,-2.3559 5.7526,-2.3144 5.8022,-2.2759 5.8542,-2.2405 5.9082,-2.2086 5.9642,-2.1800 6.0219,-2.1551 6.0810,-2.1338 6.1413,-2.1163 6.2026,-2.1026 6.2647,-2.0928 6.3272,-2.0868 6.39,-2.0849 6.4528,-2.0868 6.5153,-2.0928 6.5774,-2.1026 6.6387,-2.1163 6.6990,-2.1338 6.7581,-2.1551 6.8158,-2.1800 6.8718,-2.2086 6.9258,-2.2405 6.9778,-2.2759 7.0274,-2.3144 7.0745,-2.3559 7.1190,-2.4003 7.1605,-2.4475 7.1990,-2.4971 7.2343,-2.5490 7.2663,-2.6031 7.2948,-2.6591 7.3198,-2.7168 7.3411,-2.7759 7.3586,-2.8362 7.3723,-2.8975 7.3821,-2.9595 7.3880,-3.0221 7.3900,-3.0849"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="6.39,-2.0849 6.3880,-2.1477 6.3821,-2.2102 6.3723,-2.2723 6.3586,-2.3336 6.3411,-2.3939 6.3198,-2.4530 6.2948,-2.5107 6.2663,-2.5666 6.2343,-2.6207 6.1990,-2.6727 6.1605,-2.7223 6.1190,-2.7694 6.0745,-2.8138 6.0274,-2.8554 5.9778,-2.8939 5.9258,-2.9292 5.8718,-2.9612 5.8158,-2.9897 5.7581,-3.0147 5.6990,-3.0359 5.6387,-3.0535 5.5774,-3.0672 5.5153,-3.0770 5.4528,-3.0829 5.3900,-3.0849 5.3272,-3.0829 5.2647,-3.0770 5.2026,-3.0672 5.1413,-3.0535 5.0810,-3.0359 5.0219,-3.0147 4.9642,-2.9897 4.9082,-2.9612 4.8542,-2.9292 4.8022,-2.8939 4.7526,-2.8554 4.7055,-2.8138 4.6610,-2.7694 4.6195,-2.7223 4.5810,-2.6727 4.5457,-2.6207 4.5137,-2.5666 4.4852,-2.5107 4.4602,-2.4530 4.4389,-2.3939 4.4214,-2.3336 4.4077,-2.2723 4.3979,-2.2102 4.3920,-2.1477 4.39,-2.0849 4.3920,-2.0221 4.3979,-1.9595 4.4077,-1.8975 4.4214,-1.8362 4.4389,-1.7759 4.4602,-1.7168 4.4852,-1.6591 4.5137,-1.6031 4.5457,-1.5490 4.5810,-1.4971 4.6195,-1.4475 4.6610,-1.4003 4.7055,-1.3559 4.7526,-1.3144 4.8022,-1.2759 4.8542,-1.2405 4.9082,-1.2086 4.9642,-1.1800 5.0219,-1.1551 5.0810,-1.1338 5.1413,-1.1163 5.2026,-1.1026 5.2647,-1.0928 5.3272,-1.0868 5.3900,-1.0849 5.4528,-1.0868 5.5153,-1.0928 5.5774,-1.1026 5.6387,-1.1163 5.6990,-1.1338 5.7581,-1.1551 5.8158,-1.1800 5.8718,-1.2086 5.9258,-1.2405 5.9778,-1.2759 6.0274,-1.3144 6.0745,-1.3559 6.1190,-1.4003 6.1605,-1.4475 6.1990,-1.4971 6.2343,-1.5490 6.2663,-1.6031 6.2948,-1.6591 6.3198,-1.7168 6.3411,-1.7759 6.3586,-1.8362 6.3723,-1.8975 6.3821,-1.9595 6.3880,-2.0221 6.39,-2.0849"/></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="none"><polyline points="5.3900,-3.0849 5.3911,-3.1320 5.3944,-3.1790 5.4000,-3.2258 5.4077,-3.2723 5.4176,-3.3183 5.4297,-3.3639 5.4439,-3.4088 5.4602,-3.4530 5.4786,-3.4964 5.4990,-3.5389 5.5214,-3.5803 5.5457,-3.6207 5.5719,-3.6599 5.5998,-3.6978 5.6296,-3.7343 5.6610,-3.7694 5.6941,-3.8030 5.7287,-3.8350 5.7648,-3.8653 5.8022,-3.8939 5.8410,-3.9207 5.8810,-3.9456 5.9221,-3.9686 5.9642,-3.9897 6.0073,-4.0088 6.0513,-4.0258 6.0960,-4.0407 6.1413,-4.0535 6.1872,-4.0641 6.2336,-4.0726 6.2803,-4.0788 6.3272,-4.0829 6.3743,-4.0848 6.4214,-4.0844 6.4685,-4.0818 6.5153,-4.0770 6.5619,-4.0700 6.6081,-4.0608 6.6539,-4.0494 6.6990,-4.0359 6.7435,-4.0203 6.7871,-4.0026 6.8299,-3.9829 6.8718,-3.9612 6.9125,-3.9375 6.9521,-3.9120 6.9904,-3.8846 7.0274,-3.8554 7.0630,-3.8245 7.0971,-3.7920 7.1296,-3.7579 7.1605,-3.7223 7.1897,-3.6853 7.2171,-3.6470 7.2426,-3.6074 7.2663,-3.5666 7.2880,-3.5248 7.3078,-3.4820 7.3254,-3.4384 7.3411,-3.3939 7.3546,-3.3487 7.3659,-3.3030 7.3751,-3.2568 7.3821,-3.2102 7.3869,-3.1633 7.3895,-3.1163 7.3899,-3.0692 7.3880,-3.0221 7.3840,-2.9751 7.3777,-2.9284 7.3692,-2.8821 7.3586,-2.8362 7.3458,-2.7908 7.3309,-2.7461 7.3139,-2.7022 7.2948,-2.6591 7.2738,-2.6169 7.2507,-2.5758 7.2258,-2.5359 7.1990,-2.4971 7.1704,-2.4596 7.1401,-2.4236 7.1081,-2.3890 7.0745,-2.3559 7.0394,-2.3245 7.0029,-2.2947 6.9650,-2.2667 6.9258,-2.2405 6.8855,-2.2162 6.8440,-2.1939 6.8015,-2.1735 6.7581,-2.1551 6.7139,-2.1388 6.6690,-2.1246 6.6234,-2.1125 6.5774,-2.1026 6.5309,-2.0949 6.4841,-2.0893 6.4371,-2.0860 6.3900,-2.0849"/></g><g stroke-width="0.0100" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="rgb(5%, 5%, 5%)" fill-opacity="0.3"><path d="M 6.39,-3.0849 L 5.3900,-3.0849 A 1.0 1.0 0 1 1 6.39,-2.0849 L 6.39,-3.0849"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.4" text-anchor="middle"><text x="2.8400" y="2.3351">False</text></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="4.35,-0.0449 4.3480,-0.1077 4.3421,-0.1702 4.3323,-0.2323 4.3186,-0.2936 4.3011,-0.3539 4.2798,-0.4130 4.2548,-0.4707 4.2263,-0.5266 4.1943,-0.5807 4.1590,-0.6327 4.1205,-0.6823 4.0790,-0.7294 4.0345,-0.7738 3.9874,-0.8154 3.9378,-0.8539 3.8858,-0.8892 3.8318,-0.9212 3.7758,-0.9497 3.7181,-0.9747 3.6590,-0.9959 3.5987,-1.0135 3.5374,-1.0272 3.4753,-1.0370 3.4128,-1.0429 3.35,-1.0449 3.2872,-1.0429 3.2247,-1.0370 3.1626,-1.0272 3.1013,-1.0135 3.0410,-0.9959 2.9819,-0.9747 2.9242,-0.9497 2.8682,-0.9212 2.8142,-0.8892 2.7622,-0.8539 2.7126,-0.8154 2.6655,-0.7738 2.6210,-0.7294 2.5795,-0.6823 2.5410,-0.6327 2.5057,-0.5807 2.4737,-0.5266 2.4452,-0.4707 2.4202,-0.4130 2.3989,-0.3539 2.3814,-0.2936 2.3677,-0.2323 2.3579,-0.1702 2.3520,-0.1077 2.3500,-0.0449 2.3520,0.0179 2.3579,0.0805 2.3677,0.1425 2.3814,0.2038 2.3989,0.2641 2.4202,0.3232 2.4452,0.3809 2.4737,0.4369 2.5057,0.4910 2.5410,0.5429 2.5795,0.5925 2.6210,0.6397 2.6655,0.6841 2.7126,0.7256 2.7622,0.7641 2.8142,0.7995 2.8682,0.8314 2.9242,0.8600 2.9819,0.8849 3.0410,0.9062 3.1013,0.9237 3.1626,0.9374 3.2247,0.9472 3.2872,0.9532 3.35,0.9551 3.4128,0.9532 3.4753,0.9472 3.5374,0.9374 3.5987,0.9237 3.6590,0.9062 3.7181,0.8849 3.7758,0.8600 3.8318,0.8314 3.8858,0.7995 3.9378,0.7641 3.9874,0.7256 4.0345,0.6841 4.0790,0.6397 4.1205,0.5925 4.1590,0.5429 4.1943,0.4910 4.2263,0.4369 4.2548,0.3809 4.2798,0.3232 4.3011,0.2641 4.3186,0.2038 4.3323,0.1425 4.3421,0.0805 4.3480,0.0179 4.35,-0.0449"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="3.35,0.9551 3.3480,0.8923 3.3421,0.8298 3.3323,0.7677 3.3186,0.7064 3.3011,0.6461 3.2798,0.5870 3.2548,0.5293 3.2263,0.4734 3.1943,0.4193 3.1590,0.3673 3.1205,0.3177 3.0790,0.2706 3.0345,0.2262 2.9874,0.1846 2.9378,0.1461 2.8858,0.1108 2.8318,0.0788 2.7758,0.0503 2.7181,0.0253 2.6590,0.0041 2.5987,-0.0135 2.5374,-0.0272 2.4753,-0.0370 2.4128,-0.0429 2.3500,-0.0449 2.2872,-0.0429 2.2247,-0.0370 2.1626,-0.0272 2.1013,-0.0135 2.0410,0.0041 1.9819,0.0253 1.9242,0.0503 1.8682,0.0788 1.8142,0.1108 1.7622,0.1461 1.7126,0.1846 1.6655,0.2262 1.6210,0.2706 1.5795,0.3177 1.5410,0.3673 1.5057,0.4193 1.4737,0.4734 1.4452,0.5293 1.4202,0.5870 1.3989,0.6461 1.3814,0.7064 1.3677,0.7677 1.3579,0.8298 1.3520,0.8923 1.3500,0.9551 1.3520,1.0179 1.3579,1.0805 1.3677,1.1425 1.3814,1.2038 1.3989,1.2641 1.4202,1.3232 1.4452,1.3809 1.4737,1.4369 1.5057,1.4910 1.5410,1.5429 1.5795,1.5925 1.6210,1.6397 1.6655,1.6841 1.7126,1.7256 1.7622,1.7641 1.8142,1.7995 1.8682,1.8314 1.9242,1.8600 1.9819,1.8849 2.0410,1.9062 2.1013,1.9237 2.1626,1.9374 2.2247,1.9472 2.2872,1.9532 2.35,1.9551 2.4128,1.9532 2.4753,1.9472 2.5374,1.9374 2.5987,1.9237 2.6590,1.9062 2.7181,1.8849 2.7758,1.8600 2.8318,1.8314 2.8858,1.7995 2.9378,1.7641 2.9874,1.7256 3.0345,1.6841 3.0790,1.6397 3.1205,1.5925 3.1590,1.5429 3.1943,1.4910 3.2263,1.4369 3.2548,1.3809 3.2798,1.3232 3.3011,1.2641 3.3186,1.2038 3.3323,1.1425 3.3421,1.0805 3.3480,1.0179 3.35,0.9551"/></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="none"><polyline points="2.3500,-0.0449 2.3501,-0.0292 2.3505,-0.0135 2.3511,0.0022 2.3520,0.0179 2.3531,0.0336 2.3544,0.0492 2.3560,0.0649 2.3579,0.0805 2.3600,0.0960 2.3623,0.1116 2.3649,0.1271 2.3677,0.1425 2.3708,0.1579 2.3741,0.1733 2.3776,0.1886 2.3814,0.2038 2.3854,0.2190 2.3897,0.2341 2.3942,0.2492 2.3989,0.2641 2.4039,0.2790 2.4091,0.2939 2.4146,0.3086 2.4202,0.3232 2.4261,0.3378 2.4322,0.3523 2.4386,0.3666 2.4452,0.3809 2.4520,0.3951 2.4590,0.4091 2.4662,0.4231 2.4737,0.4369 2.4814,0.4506 2.4893,0.4642 2.4974,0.4776 2.5057,0.4910 2.5142,0.5041 2.5229,0.5172 2.5319,0.5301 2.5410,0.5429 2.5503,0.5555 2.5598,0.5680 2.5696,0.5804 2.5795,0.5925 2.5896,0.6046 2.5999,0.6164 2.6104,0.6281 2.6210,0.6397 2.6319,0.6510 2.6429,0.6622 2.6541,0.6732 2.6655,0.6841 2.6770,0.6948 2.6887,0.7052 2.7006,0.7155 2.7126,0.7256 2.7248,0.7356 2.7371,0.7453 2.7496,0.7548 2.7622,0.7641 2.7750,0.7733 2.7879,0.7822 2.8010,0.7909 2.8142,0.7995 2.8275,0.8078 2.8410,0.8159 2.8545,0.8238 2.8682,0.8314 2.8821,0.8389 2.8960,0.8461 2.9101,0.8532 2.9242,0.8600 2.9385,0.8665 2.9529,0.8729 2.9673,0.8790 2.9819,0.8849 2.9965,0.8906 3.0113,0.8960 3.0261,0.9012 3.0410,0.9062 3.0560,0.9109 3.0710,0.9154 3.0861,0.9197 3.1013,0.9237 3.1166,0.9275 3.1319,0.9310 3.1472,0.9343 3.1626,0.9374 3.1781,0.9402 3.1936,0.9428 3.2091,0.9451 3.2247,0.9472 3.2403,0.9491 3.2559,0.9507 3.2715,0.9520 3.2872,0.9532 3.3029,0.9540 3.3186,0.9546 3.3343,0.9550 3.35,0.9551"/></g><g stroke-width="0.0100" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="rgb(5%, 5%, 5%)" fill-opacity="0.3"><path d="M 3.35,-0.0449 L 2.3500,-0.0449 A 1.0 1.0 0 0 0 3.35,0.9551 L 3.35,-0.0449"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="4.35,-3.0849 4.3480,-3.1477 4.3421,-3.2102 4.3323,-3.2723 4.3186,-3.3336 4.3011,-3.3939 4.2798,-3.4530 4.2548,-3.5107 4.2263,-3.5666 4.1943,-3.6207 4.1590,-3.6727 4.1205,-3.7223 4.0790,-3.7694 4.0345,-3.8138 3.9874,-3.8554 3.9378,-3.8939 3.8858,-3.9292 3.8318,-3.9612 3.7758,-3.9897 3.7181,-4.0147 3.6590,-4.0359 3.5987,-4.0535 3.5374,-4.0672 3.4753,-4.0770 3.4128,-4.0829 3.35,-4.0849 3.2872,-4.0829 3.2247,-4.0770 3.1626,-4.0672 3.1013,-4.0535 3.0410,-4.0359 2.9819,-4.0147 2.9242,-3.9897 2.8682,-3.9612 2.8142,-3.9292 2.7622,-3.8939 2.7126,-3.8554 2.6655,-3.8138 2.6210,-3.7694 2.5795,-3.7223 2.5410,-3.6727 2.5057,-3.6207 2.4737,-3.5666 2.4452,-3.5107 2.4202,-3.4530 2.3989,-3.3939 2.3814,-3.3336 2.3677,-3.2723 2.3579,-3.2102 2.3520,-3.1477 2.3500,-3.0849 2.3520,-3.0221 2.3579,-2.9595 2.3677,-2.8975 2.3814,-2.8362 2.3989,-2.7759 2.4202,-2.7168 2.4452,-2.6591 2.4737,-2.6031 2.5057,-2.5490 2.5410,-2.4971 2.5795,-2.4475 2.6210,-2.4003 2.6655,-2.3559 2.7126,-2.3144 2.7622,-2.2759 2.8142,-2.2405 2.8682,-2.2086 2.9242,-2.1800 2.9819,-2.1551 3.0410,-2.1338 3.1013,-2.1163 3.1626,-2.1026 3.2247,-2.0928 3.2872,-2.0868 3.35,-2.0849 3.4128,-2.0868 3.4753,-2.0928 3.5374,-2.1026 3.5987,-2.1163 3.6590,-2.1338 3.7181,-2.1551 3.7758,-2.1800 3.8318,-2.2086 3.8858,-2.2405 3.9378,-2.2759 3.9874,-2.3144 4.0345,-2.3559 4.0790,-2.4003 4.1205,-2.4475 4.1590,-2.4971 4.1943,-2.5490 4.2263,-2.6031 4.2548,-2.6591 4.2798,-2.7168 4.3011,-2.7759 4.3186,-2.8362 4.3323,-2.8975 4.3421,-2.9595 4.3480,-3.0221 4.35,-3.0849"/></g><g stroke-width="0.0200" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.2" fill="none"><polyline points="3.35,-2.0849 3.3480,-2.1477 3.3421,-2.2102 3.3323,-2.2723 3.3186,-2.3336 3.3011,-2.3939 3.2798,-2.4530 3.2548,-2.5107 3.2263,-2.5666 3.1943,-2.6207 3.1590,-2.6727 3.1205,-2.7223 3.0790,-2.7694 3.0345,-2.8138 2.9874,-2.8554 2.9378,-2.8939 2.8858,-2.9292 2.8318,-2.9612 2.7758,-2.9897 2.7181,-3.0147 2.6590,-3.0359 2.5987,-3.0535 2.5374,-3.0672 2.4753,-3.0770 2.4128,-3.0829 2.3500,-3.0849 2.2872,-3.0829 2.2247,-3.0770 2.1626,-3.0672 2.1013,-3.0535 2.0410,-3.0359 1.9819,-3.0147 1.9242,-2.9897 1.8682,-2.9612 1.8142,-2.9292 1.7622,-2.8939 1.7126,-2.8554 1.6655,-2.8138 1.6210,-2.7694 1.5795,-2.7223 1.5410,-2.6727 1.5057,-2.6207 1.4737,-2.5666 1.4452,-2.5107 1.4202,-2.4530 1.3989,-2.3939 1.3814,-2.3336 1.3677,-2.2723 1.3579,-2.2102 1.3520,-2.1477 1.3500,-2.0849 1.3520,-2.0221 1.3579,-1.9595 1.3677,-1.8975 1.3814,-1.8362 1.3989,-1.7759 1.4202,-1.7168 1.4452,-1.6591 1.4737,-1.6031 1.5057,-1.5490 1.5410,-1.4971 1.5795,-1.4475 1.6210,-1.4003 1.6655,-1.3559 1.7126,-1.3144 1.7622,-1.2759 1.8142,-1.2405 1.8682,-1.2086 1.9242,-1.1800 1.9819,-1.1551 2.0410,-1.1338 2.1013,-1.1163 2.1626,-1.1026 2.2247,-1.0928 2.2872,-1.0868 2.35,-1.0849 2.4128,-1.0868 2.4753,-1.0928 2.5374,-1.1026 2.5987,-1.1163 2.6590,-1.1338 2.7181,-1.1551 2.7758,-1.1800 2.8318,-1.2086 2.8858,-1.2405 2.9378,-1.2759 2.9874,-1.3144 3.0345,-1.3559 3.0790,-1.4003 3.1205,-1.4475 3.1590,-1.4971 3.1943,-1.5490 3.2263,-1.6031 3.2548,-1.6591 3.2798,-1.7168 3.3011,-1.7759 3.3186,-1.8362 3.3323,-1.8975 3.3421,-1.9595 3.3480,-2.0221 3.35,-2.0849"/></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="none"><polyline points="2.3500,-3.0849 2.3657,-3.0848 2.3814,-3.0844 2.3971,-3.0838 2.4128,-3.0829 2.4285,-3.0818 2.4441,-3.0804 2.4597,-3.0788 2.4753,-3.0770 2.4909,-3.0749 2.5064,-3.0726 2.5219,-3.0700 2.5374,-3.0672 2.5528,-3.0641 2.5681,-3.0608 2.5834,-3.0572 2.5987,-3.0535 2.6139,-3.0494 2.6290,-3.0452 2.6440,-3.0407 2.6590,-3.0359 2.6739,-3.0310 2.6887,-3.0258 2.7035,-3.0203 2.7181,-3.0147 2.7327,-3.0088 2.7471,-3.0026 2.7615,-2.9963 2.7758,-2.9897 2.7899,-2.9829 2.8040,-2.9759 2.8179,-2.9686 2.8318,-2.9612 2.8455,-2.9535 2.8590,-2.9456 2.8725,-2.9375 2.8858,-2.9292 2.8990,-2.9207 2.9121,-2.9120 2.9250,-2.9030 2.9378,-2.8939 2.9504,-2.8846 2.9629,-2.8750 2.9752,-2.8653 2.9874,-2.8554 2.9994,-2.8453 3.0113,-2.8350 3.0230,-2.8245 3.0345,-2.8138 3.0459,-2.8030 3.0571,-2.7920 3.0681,-2.7808 3.0790,-2.7694 3.0896,-2.7579 3.1001,-2.7462 3.1104,-2.7343 3.1205,-2.7223 3.1304,-2.7101 3.1402,-2.6978 3.1497,-2.6853 3.1590,-2.6727 3.1681,-2.6599 3.1771,-2.6470 3.1858,-2.6339 3.1943,-2.6207 3.2026,-2.6074 3.2107,-2.5939 3.2186,-2.5803 3.2263,-2.5666 3.2338,-2.5528 3.2410,-2.5389 3.2480,-2.5248 3.2548,-2.5107 3.2614,-2.4964 3.2678,-2.4820 3.2739,-2.4676 3.2798,-2.4530 3.2854,-2.4384 3.2909,-2.4236 3.2961,-2.4088 3.3011,-2.3939 3.3058,-2.3789 3.3103,-2.3639 3.3146,-2.3487 3.3186,-2.3336 3.3224,-2.3183 3.3259,-2.3030 3.3292,-2.2877 3.3323,-2.2723 3.3351,-2.2568 3.3377,-2.2413 3.3400,-2.2258 3.3421,-2.2102 3.3440,-2.1946 3.3456,-2.1790 3.3469,-2.1633 3.3480,-2.1477 3.3489,-2.1320 3.3495,-2.1163 3.3499,-2.1006 3.35,-2.0849"/></g><g stroke-width="0.0100" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.5" fill="rgb(5%, 5%, 5%)" fill-opacity="0.3"><path d="M 3.35,-3.0849 L 2.3500,-3.0849 A 1.0 1.0 0 0 1 3.35,-2.0849 L 3.35,-3.0849"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.4" text-anchor="middle"><text x="1.1700" y="0.7051" transform="rotate(-90.0, 1.1700, 0.7051)">False</text></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.4" text-anchor="middle"><text x="1.1700" y="-2.3149" transform="rotate(-90.0, 1.1700, -2.3149)">True</text></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.6" text-anchor="middle"><text x="0.5000" y="-0.8049" transform="rotate(-90.0, 0.5000, -0.8049)">Sweep</text></g></g><g class="hud"></g></svg>
+ other/arrow.svg view
@@ -0,0 +1,59 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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;+}+++{+  .arrow g {+    fill: rgba(5%, 5%, 5%, 1.00);+    stroke: rgba(5%, 5%, 5%, 1.00);+  }+}+@media (prefers-color-scheme:dark) {+  .arrow g {+    fill: rgba(94%, 94%, 94%, 1.00);+    stroke: rgba(94%, 94%, 94%, 1.00);+  }+}+</style><g class="chart"><g class="arrow"><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-41.7039, -0.4249, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-40.7040, -0.4249, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-39.3303, -0.4249, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-37.3282, -0.4249, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-34.1493, -0.4249, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-28.3824, -0.4249, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-15.2740, -0.4249, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(24.9171, -0.4249, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(85.2524, -0.4249, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(107.4397, -0.4249, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.4249, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-46.8993, -0.3201, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-45.4122, -0.3201, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-43.2666, -0.3201, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-39.9135, -0.3201, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-33.9991, -0.3201, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-21.3212, -0.3201, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(13.3646, -0.3201, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(70.2608, -0.3201, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(96.0844, -0.3201, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(106.0551, -0.3201, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.3201, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-53.3544, -0.2152, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-51.2345, -0.2152, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-48.0128, -0.2152, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-42.5805, -0.2152, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-31.8274, -0.2152, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-5.4403, -0.2152, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(47.1211, -0.2152, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(80.5377, -0.2152, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(93.7314, -0.2152, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(100.0607, -0.2152, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.2152, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-61.4810, -0.1103, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-58.6701, -0.1103, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-54.1700, -0.1103, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-45.9710, -0.1103, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-27.9309, -0.1103, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(14.4459, -0.1103, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(58.9537, -0.1103, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(78.3877, -0.1103, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(87.0722, -0.1103, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(91.7753, -0.1103, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.1103, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-71.6316, -0.0055, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-68.3038, -0.0055, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-62.7134, -0.0055, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-51.7434, -0.0055, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-25.4633, -0.0055, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(25.3523, -0.0055, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(58.5390, -0.0055, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(72.0351, -0.0055, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(78.5712, -0.0055, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(82.3320, -0.0055, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(-0.0055, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-83.7258, 0.0994, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-80.3796, 0.0994, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-74.5578, 0.0994, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-62.3926, 0.0994, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-30.3259, 0.0994, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(25.4633, 0.0994, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(53.3483, 0.0994, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(64.1805, 0.0994, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(69.5253, 0.0994, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(72.6569, 0.0994, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.0994, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-96.8488, 0.2043, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-94.1075, 0.2043, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-89.3167, 0.2043, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-79.0898, 0.2043, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-48.8981, 0.2043, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(16.4311, 0.2043, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(45.9710, 0.2043, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(56.0348, 0.2043, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(60.7712, 0.2043, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(63.4886, 0.2043, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.2043, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-109.4766, 0.3091, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-107.6501, 0.3091, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-104.5742, 0.3091, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-98.3659, 0.3091, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-80.5377, 0.3091, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-10.3048, 0.3091, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(36.3844, 0.3091, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(48.0128, 0.3091, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(52.7336, 0.3091, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(55.2568, 0.3091, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.3091, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-120.3900, 0.4140, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-119.3549, 0.4140, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-117.7221, 0.4140, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-114.7718, 0.4140, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-107.9102, 0.4140, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-78.8802, 0.4140, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(18.0772, 0.4140, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(39.5765, 0.4140, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(45.4122, 0.4140, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(48.0612, 0.4140, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.4140, -0.3463) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-129.2044, 0.5189, 0.2736)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, 0.2736) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-128.6756, 0.5189, 0.2047)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, 0.2047) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-127.8991, 0.5189, 0.1358)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, 0.1358) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-126.6482, 0.5189, 0.0669)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, 0.0669) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-124.3010, 0.5189, -0.0019)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.0019) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-118.3399, 0.5189, -0.0708)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.0708) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(-81.6027, 0.5189, -0.1397)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.1397) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(25.9167, 0.5189, -0.2085)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.2085) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(38.1539, 0.5189, -0.2774)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.2774) scale(0.0500)"/></g></g><g stroke-width="0.0500" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><g transform="rotate(41.7039, 0.5189, -0.3463)"><path d="M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3" transform="translate(0.5189, -0.3463) scale(0.0500)"/></g></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.2584" height="0.8264" x="-0.5822" y="-0.4496"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2617" height="0.0033" x="-0.5839" y="0.3851"/></g></g><g class="ticks"><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5822,0.4116+-0.5822,0.3868"/><polyline points="-0.3725,0.4116+-0.3725,0.3868"/><polyline points="-0.1628,0.4116+-0.1628,0.3868"/><polyline points="0.0470,0.4116+0.0470,0.3868"/><polyline points="0.2567,0.4116+0.2567,0.3868"/><polyline points="0.4664,0.4116+0.4664,0.3868"/><polyline points="0.6762,0.4116+0.6762,0.3868"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.5822" y="0.4570">-0.6</text><text x="-0.3725" y="0.4570">-0.4</text><text x="-0.1628" y="0.4570">-0.2</text><text x="0.0470" y="0.4570"> 0.0</text><text x="0.2567" y="0.4570"> 0.2</text><text x="0.4664" y="0.4570"> 0.4</text><text x="0.6762" y="0.4570"> 0.6</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0034" height="0.8298" x="-0.5940" y="-0.4512"/></g></g><g class="ticks"><g class="tickglyph"><g stroke-width="0.0034" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6174,0.3769+-0.5923,0.3769"/><polyline points="-0.6174,0.2391+-0.5923,0.2391"/><polyline points="-0.6174,0.1014+-0.5923,0.1014"/><polyline points="-0.6174,-0.0364+-0.5923,-0.0364"/><polyline points="-0.6174,-0.1741+-0.5923,-0.1741"/><polyline points="-0.6174,-0.3118+-0.5923,-0.3118"/><polyline points="-0.6174,-0.4496+-0.5923,-0.4496"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6359" y="0.3860">-0.6</text><text x="-0.6359" y="0.2482">-0.4</text><text x="-0.6359" y="0.1105">-0.2</text><text x="-0.6359" y="-0.0273"> 0.0</text><text x="-0.6359" y="-0.1650"> 0.2</text><text x="-0.6359" y="-0.3028"> 0.4</text><text x="-0.6359" y="-0.4405"> 0.6</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ 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="&lt;xTree&gt; 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="&lt;xTitleOptions&gt; TitleOptions| &lt;xtext&gt; text| &lt;xstyle&gt; style| &lt;xplace&gt; place| &lt;xbuffer&gt; buffer| &lt;xanchor&gt; 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="&lt;xStyle&gt; Style| &lt;xvsize&gt; vsize| &lt;xvshift&gt; vshift| &lt;xtranslate&gt; translate| &lt;xsize&gt; size| &lt;xscaleP&gt; scaleP| &lt;xrotation&gt; rotation| &lt;xlineJoin&gt; lineJoin| &lt;xlineCap&gt; lineCap| &lt;xhsize&gt; hsize| &lt;xglyphShape&gt; glyphShape| &lt;xframe&gt; frame| &lt;xescapeText&gt; escapeText| &lt;xdashoffset&gt; dashoffset| &lt;xdasharray&gt; dasharray| &lt;xcolor&gt; color| &lt;xborderSize&gt; borderSize| &lt;xborderColor&gt; borderColor| &lt;xanchor&gt; 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&#45;&gt;Style -->+<g id="edge1" class="edge">+<title>TitleOptions:xstyle&#45;&gt;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="&lt;xPlace&gt; Place| &lt;xPlaceTop&gt; PlaceTop| &lt;xPlaceRight&gt; PlaceRight| &lt;xPlaceLeft&gt; PlaceLeft| &lt;xPlaceBottom&gt; PlaceBottom| &lt;xPlaceAbsolute&gt; 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&#45;&gt;Place -->+<g id="edge2" class="edge">+<title>TitleOptions:xplace&#45;&gt;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="&lt;xAnchor&gt; Anchor| &lt;xAnchorStart&gt; AnchorStart| &lt;xAnchorMiddle&gt; AnchorMiddle| &lt;xAnchorEnd&gt; 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&#45;&gt;Anchor -->+<g id="edge3" class="edge">+<title>TitleOptions:xanchor&#45;&gt;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="&lt;xTicks&gt; Ticks| &lt;xtick&gt; tick| &lt;xtextTick&gt; textTick| &lt;xlineTick&gt; lineTick| &lt;xglyphTick&gt; 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="&lt;xTickStyle&gt; TickStyle| &lt;xstyle&gt; style| &lt;xbuffer&gt; buffer| &lt;xanchorTo&gt; 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&#45;&gt;TickStyle -->+<g id="edge5" class="edge">+<title>Ticks:xtextTick&#45;&gt;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&#45;&gt;TickStyle -->+<g id="edge6" class="edge">+<title>Ticks:xlineTick&#45;&gt;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&#45;&gt;TickStyle -->+<g id="edge7" class="edge">+<title>Ticks:xglyphTick&#45;&gt;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="&lt;xTick&gt; Tick| &lt;xtickExtend&#39;&gt; tickExtend&#39;| &lt;xnumTicks&#39;&gt; numTicks&#39;| &lt;xformatN&#39;&gt; formatN&#39;| &lt;xTickRound&gt; TickRound| &lt;xTickPlaced&gt; TickPlaced| &lt;xTickNone&gt; TickNone| &lt;xTickLabels&gt; TickLabels| &lt;xTickExact&gt; 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&#39;</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&#39;</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&#39;</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&#45;&gt;Tick -->+<g id="edge4" class="edge">+<title>Ticks:xtick&#45;&gt;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&#45;&gt;Style -->+<g id="edge8" class="edge">+<title>TickStyle:xstyle&#45;&gt;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="&lt;xHudChartSection&gt; HudChartSection| &lt;xHudStyleSection&gt; HudStyleSection| &lt;xHudSection&gt; HudSection| &lt;xCanvasStyleSection&gt; CanvasStyleSection| &lt;xCanvasSection&gt; 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&#45;&gt;HudChartSection -->+<g id="edge9" class="edge">+<title>TickStyle:xanchorTo&#45;&gt;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="&lt;xTickExtend&gt; TickExtend| &lt;xNoTickExtend&gt; 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&#45;&gt;TickExtend -->+<g id="edge10" class="edge">+<title>Tick:xtickExtend&#39;&#45;&gt;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="&lt;xFormatN&gt; FormatN| &lt;xsigFigs&gt; sigFigs| &lt;xmaxDistinguishIterations&gt; maxDistinguishIterations| &lt;xfstyle&gt; fstyle| &lt;xcutRightZeros&gt; cutRightZeros| &lt;xaddLPad&gt; 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&#45;&gt;FormatN -->+<g id="edge11" class="edge">+<title>Tick:xformatN&#39;&#45;&gt;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&#45;&gt;Style -->+<g id="edge17" class="edge">+<title>Style:xframe&#45;&gt;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="&lt;xScaleP&gt; ScaleP| &lt;xScalePY&gt; ScalePY| &lt;xScalePX&gt; ScalePX| &lt;xScalePMinDim&gt; ScalePMinDim| &lt;xScalePArea&gt; ScalePArea| &lt;xNoScaleP&gt; 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&#45;&gt;ScaleP -->+<g id="edge13" class="edge">+<title>Style:xscaleP&#45;&gt;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="&lt;xPoint&gt; Point| &lt;x_y&gt; _y| &lt;x_x&gt; _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&#45;&gt;Point -->+<g id="edge12" class="edge">+<title>Style:xtranslate&#45;&gt;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="&lt;xLineJoin&gt; LineJoin| &lt;xLineJoinRound&gt; LineJoinRound| &lt;xLineJoinMiter&gt; LineJoinMiter| &lt;xLineJoinBevel&gt; 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&#45;&gt;LineJoin -->+<g id="edge14" class="edge">+<title>Style:xlineJoin&#45;&gt;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="&lt;xLineCap&gt; LineCap| &lt;xLineCapSquare&gt; LineCapSquare| &lt;xLineCapRound&gt; LineCapRound| &lt;xLineCapButt&gt; 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&#45;&gt;LineCap -->+<g id="edge15" class="edge">+<title>Style:xlineCap&#45;&gt;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="&lt;xGlyphShape&gt; GlyphShape| &lt;xVLineGlyph&gt; VLineGlyph| &lt;xTriangleGlyph&gt; TriangleGlyph| &lt;xSquareGlyph&gt; SquareGlyph| &lt;xRectSharpGlyph&gt; RectSharpGlyph| &lt;xRectRoundedGlyph&gt; RectRoundedGlyph| &lt;xPathGlyph&gt; PathGlyph| &lt;xHLineGlyph&gt; HLineGlyph| &lt;xEllipseGlyph&gt; EllipseGlyph| &lt;xCircleGlyph&gt; 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&#45;&gt;GlyphShape -->+<g id="edge16" class="edge">+<title>Style:xglyphShape&#45;&gt;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="&lt;xEscapeText&gt; EscapeText| &lt;xNoEscapeText&gt; 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&#45;&gt;EscapeText -->+<g id="edge18" class="edge">+<title>Style:xescapeText&#45;&gt;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="&lt;xColour&gt; Colour| &lt;xopac&#39;&gt; opac&#39;| &lt;xlightness&#39;&gt; lightness&#39;| &lt;xhue&#39;&gt; hue&#39;| &lt;xchroma&#39;&gt; chroma&#39;">+<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&#39;</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&#39;</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&#39;</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&#39;</text>+</a>+</g>+</g>+<!-- Style&#45;&gt;Colour -->+<g id="edge19" class="edge">+<title>Style:xcolor&#45;&gt;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&#45;&gt;Colour -->+<g id="edge20" class="edge">+<title>Style:xborderColor&#45;&gt;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&#45;&gt;Anchor -->+<g id="edge21" class="edge">+<title>Style:xanchor&#45;&gt;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="&lt;xShapeRendering&gt; ShapeRendering| &lt;xUseGeometricPrecision&gt; UseGeometricPrecision| &lt;xUseCssCrisp&gt; UseCssCrisp| &lt;xNoShapeRendering&gt; 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="&lt;xRenderStyle&gt; RenderStyle| &lt;xIndented&gt; Indented| &lt;xCompact&gt; 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="&lt;xRect&gt; 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="&lt;xPriority&gt; 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="&lt;xPreferColorScheme&gt; PreferColorScheme| &lt;xPreferNormal&gt; PreferNormal| &lt;xPreferLight&gt; PreferLight| &lt;xPreferHud&gt; PreferHud| &lt;xPreferDark&gt; 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="&lt;xPathData&gt; PathData| &lt;xStartP&gt; StartP| &lt;xQuadP&gt; QuadP| &lt;xLineP&gt; LineP| &lt;xCubicP&gt; CubicP| &lt;xArcP&gt; 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="&lt;xArcInfo&gt; ArcInfo| &lt;xradii&gt; radii| &lt;xphi&gt; phi| &lt;xlarge&gt; large| &lt;xclockwise&gt; 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&#45;&gt;ArcInfo -->+<g id="edge22" class="edge">+<title>PathData:xArcP&#45;&gt;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="&lt;xMarkupOptions&gt; MarkupOptions| &lt;xrenderStyle&gt; renderStyle| &lt;xmarkupHeight&gt; markupHeight| &lt;xcssOptions&gt; cssOptions| &lt;xchartAspect&gt; 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&#45;&gt;RenderStyle -->+<g id="edge23" class="edge">+<title>MarkupOptions:xrenderStyle&#45;&gt;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="&lt;xCssOptions&gt; CssOptions| &lt;xshapeRendering&gt; shapeRendering| &lt;xpreferColorScheme&gt; preferColorScheme| &lt;xfontFamilies&gt; fontFamilies| &lt;xcssExtra&gt; 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&#45;&gt;CssOptions -->+<g id="edge24" class="edge">+<title>MarkupOptions:xcssOptions&#45;&gt;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="&lt;xChartAspect&gt; ChartAspect| &lt;xUnscaledAspect&gt; UnscaledAspect| &lt;xFixedAspect&gt; FixedAspect| &lt;xCanvasAspect&gt; 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&#45;&gt;ChartAspect -->+<g id="edge25" class="edge">+<title>MarkupOptions:xchartAspect&#45;&gt;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="&lt;xLegendOptions&gt; LegendOptions| &lt;xvgap&gt; vgap| &lt;xtextStyle&gt; textStyle| &lt;xscaleP&gt; scaleP| &lt;xscaleChartsBy&gt; scaleChartsBy| &lt;xplace&gt; place| &lt;xouterPad&gt; outerPad| &lt;xlegendSize&gt; legendSize| &lt;xlegendCharts&gt; legendCharts| &lt;xinnerPad&gt; innerPad| &lt;xhgap&gt; hgap| &lt;xframe&gt; frame| &lt;xbuffer&gt; 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&#45;&gt;Style -->+<g id="edge26" class="edge">+<title>LegendOptions:xtextStyle&#45;&gt;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&#45;&gt;Style -->+<g id="edge30" class="edge">+<title>LegendOptions:xframe&#45;&gt;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&#45;&gt;ScaleP -->+<g id="edge27" class="edge">+<title>LegendOptions:xscaleP&#45;&gt;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&#45;&gt;Place -->+<g id="edge28" class="edge">+<title>LegendOptions:xplace&#45;&gt;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="&lt;xChart&gt; Chart| &lt;xchartStyle&gt; chartStyle| &lt;xchartData&gt; 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&#45;&gt;Chart -->+<g id="edge29" class="edge">+<title>LegendOptions:xlegendCharts&#45;&gt;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="&lt;xHudOptions&gt; HudOptions| &lt;xtitles&gt; titles| &lt;xlegends&gt; legends| &lt;xframes&gt; frames| &lt;xaxes&gt; 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&#45;&gt;TitleOptions -->+<g id="edge31" class="edge">+<title>HudOptions:xtitles&#45;&gt;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&#45;&gt;Priority -->+<g id="edge32" class="edge">+<title>HudOptions:xtitles&#45;&gt;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&#45;&gt;Priority -->+<g id="edge33" class="edge">+<title>HudOptions:xlegends&#45;&gt;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&#45;&gt;Priority -->+<g id="edge35" class="edge">+<title>HudOptions:xframes&#45;&gt;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&#45;&gt;Priority -->+<g id="edge37" class="edge">+<title>HudOptions:xaxes&#45;&gt;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&#45;&gt;LegendOptions -->+<g id="edge34" class="edge">+<title>HudOptions:xlegends&#45;&gt;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="&lt;xFrameOptions&gt; FrameOptions| &lt;xframe&gt; frame| &lt;xbuffer&gt; buffer| &lt;xanchorTo&gt; 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&#45;&gt;FrameOptions -->+<g id="edge36" class="edge">+<title>HudOptions:xframes&#45;&gt;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="&lt;xAxisOptions&gt; AxisOptions| &lt;xticks&gt; ticks| &lt;xplace&gt; place| &lt;xaxisBar&gt; axisBar| &lt;xadjustments&gt; 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&#45;&gt;AxisOptions -->+<g id="edge38" class="edge">+<title>HudOptions:xaxes&#45;&gt;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&#45;&gt;Style -->+<g id="edge39" class="edge">+<title>FrameOptions:xframe&#45;&gt;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&#45;&gt;HudChartSection -->+<g id="edge40" class="edge">+<title>FrameOptions:xanchorTo&#45;&gt;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="&lt;xFStyle&gt; FStyle| &lt;xFSPrec&gt; FSPrec| &lt;xFSPercent&gt; FSPercent| &lt;xFSNone&gt; FSNone| &lt;xFSFixed Int&gt; FSFixed Int| &lt;xFSExponent&gt; FSExponent| &lt;xFSDollar&gt; FSDollar| &lt;xFSDecimal&gt; FSDecimal| &lt;xFSCommaPrec&gt; FSCommaPrec| &lt;xFSComma&gt; 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&#45;&gt;FStyle -->+<g id="edge41" class="edge">+<title>FormatN:xfstyle&#45;&gt;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&#45;&gt;ShapeRendering -->+<g id="edge42" class="edge">+<title>CssOptions:xshapeRendering&#45;&gt;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&#45;&gt;PreferColorScheme -->+<g id="edge43" class="edge">+<title>CssOptions:xpreferColorScheme&#45;&gt;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="&lt;xChartTree&gt; ChartTree| &lt;xtree&gt; tree| &lt;xcharts&#39;&gt; charts&#39;">+<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&#39;</text>+</a>+</g>+</g>+<!-- ChartTree&#45;&gt;Tree -->+<g id="edge44" class="edge">+<title>ChartTree:xtree&#45;&gt;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&#45;&gt;Chart -->+<g id="edge45" class="edge">+<title>ChartTree:xcharts&#39;&#45;&gt;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="&lt;xChartOptions&gt; ChartOptions| &lt;xmarkupOptions&gt; markupOptions| &lt;xhudOptions&gt; hudOptions| &lt;xchartTree&gt; 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&#45;&gt;MarkupOptions -->+<g id="edge46" class="edge">+<title>ChartOptions:xmarkupOptions&#45;&gt;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&#45;&gt;HudOptions -->+<g id="edge47" class="edge">+<title>ChartOptions:xhudOptions&#45;&gt;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&#45;&gt;ChartTree -->+<g id="edge48" class="edge">+<title>ChartOptions:xchartTree&#45;&gt;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="&lt;xChartData&gt; ChartData| &lt;xtextData&#39;&gt; textData&#39;| &lt;xrectData&#39;&gt; rectData&#39;| &lt;xpathData&#39;&gt; pathData&#39;| &lt;xlineData&#39;&gt; lineData&#39;| &lt;xglyphData&#39;&gt; glyphData&#39;| &lt;xblankData&#39;&gt; blankData&#39;">+<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&#39;</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&#39;</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&#39;</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&#39;</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&#39;</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&#39;</text>+</a>+</g>+</g>+<!-- ChartData&#45;&gt;Rect -->+<g id="edge50" class="edge">+<title>ChartData:xrectData&#39;&#45;&gt;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&#45;&gt;Rect -->+<g id="edge54" class="edge">+<title>ChartData:xblankData&#39;&#45;&gt;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&#45;&gt;Point -->+<g id="edge52" class="edge">+<title>ChartData:xlineData&#39;&#45;&gt;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&#45;&gt;Point -->+<g id="edge53" class="edge">+<title>ChartData:xglyphData&#39;&#45;&gt;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&#45;&gt;PathData -->+<g id="edge51" class="edge">+<title>ChartData:xpathData&#39;&#45;&gt;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&#45;&gt;(Text,Point) -->+<g id="edge49" class="edge">+<title>ChartData:xtextData&#39;&#45;&gt;(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&#45;&gt;Style -->+<g id="edge55" class="edge">+<title>Chart:xchartStyle&#45;&gt;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&#45;&gt;ChartData -->+<g id="edge56" class="edge">+<title>Chart:xchartData&#45;&gt;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&#45;&gt;Ticks -->+<g id="edge57" class="edge">+<title>AxisOptions:xticks&#45;&gt;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&#45;&gt;Place -->+<g id="edge58" class="edge">+<title>AxisOptions:xplace&#45;&gt;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="&lt;xAxisBar&gt; AxisBar| &lt;xstyle&gt; style| &lt;xsize&gt; size| &lt;xoverhang&gt; overhang| &lt;xbuffer&gt; buffer| &lt;xanchorTo&gt; 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&#45;&gt;AxisBar -->+<g id="edge59" class="edge">+<title>AxisOptions:xaxisBar&#45;&gt;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="&lt;xAdjustments&gt; Adjustments| &lt;xmaxYRatio&gt; maxYRatio| &lt;xmaxXRatio&gt; maxXRatio| &lt;xangledRatio&gt; angledRatio| &lt;xallowDiagonal&gt; 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&#45;&gt;Adjustments -->+<g id="edge60" class="edge">+<title>AxisOptions:xadjustments&#45;&gt;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&#45;&gt;Style -->+<g id="edge61" class="edge">+<title>AxisBar:xstyle&#45;&gt;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&#45;&gt;HudChartSection -->+<g id="edge62" class="edge">+<title>AxisBar:xanchorTo&#45;&gt;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)&#45;&gt;Point -->+<g id="edge63" class="edge">+<title>(Text,Point):x_2&#45;&gt;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/banner.svg view
@@ -0,0 +1,25 @@+<svg xmlns="http://www.w3.org/2000/svg" width="600.0" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-3.0 -0.5 6.0 1.0" height="100.0"><style>svg { shape-rendering: crispEdges; }svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: #0d0d0d;+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: #0d0d0d;+  }+  .legendBorder g {+    fill: #f0f0f0;+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: #f0f0f0;+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: #f0f0f0;+  }+  .legendBorder g {+    fill: #0d0d0d;+  }+}</style><g class="chart"><g class="gradient"><g fill="rgb(25%, -10%, 8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.9012903225806452" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(25%, -10%, 6%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.8432645161290324" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(26%, -10%, 4%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.7852387096774196" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(26%, -11%, 2%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.7272129032258063" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -11%, 1%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.6691870967741935" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -11%, -1%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.611161290322581" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -11%, -2%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.553135483870968" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -11%, -3%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.495109677419355" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -11%, -4%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.4370838709677423" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(28%, -11%, -4%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.379058064516129" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(28%, -11%, -5%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.321032258064516" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(28%, -10%, -6%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.2630064516129034" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -10%, -6%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.2049806451612906" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -9%, -6%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.1469548387096773" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -8%, -7%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.088929032258065" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -8%, -7%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-2.0309032258064517" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -7%, -7%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.9728774193548388" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(26%, -6%, -7%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.9148516129032258" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(26%, -4%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.856825806451613" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(25%, -3%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.7988" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(25%, -2%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.740774193548387" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(24%, -0%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.6827483870967743" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(23%, 1%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.6247225806451613" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(23%, 3%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.5666967741935482" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(22%, 4%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.5086709677419357" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(21%, 6%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.4506451612903228" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(20%, 7%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.3926193548387096" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(19%, 8%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.3345935483870965" width="5.8025806451612594e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(18%, 9%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.276567741935484" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(16%, 10%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.2185419354838711" width="5.8025806451612594e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(15%, 11%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.1605161290322585" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(14%, 12%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.1024903225806455" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(12%, 13%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-1.0444645161290322" width="5.802580645161304e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(10%, 14%, -11%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.9864387096774192" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(8%, 14%, -11%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.9284129032258064" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(5%, 15%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.8703870967741936" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(1%, 16%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.8123612903225803" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-3%, 16%, -10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.7543354838709679" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-7%, 17%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.6963096774193547" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-10%, 17%, -9%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.6382838709677419" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-14%, 18%, -8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.5802580645161286" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-17%, 18%, -6%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.5222322580645162" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-20%, 19%, -5%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.46420645161290297" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-23%, 19%, -3%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.4061806451612906" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-26%, 19%, -1%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.34815483870967734" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-28%, 19%, 2%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.2901290322580641" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-30%, 20%, 5%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.2321032258064517" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-32%, 20%, 8%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.17407741935483845" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-34%, 20%, 10%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-0.11605161290322563" width="5.802580645161237e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-36%, 20%, 12%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="-5.802580645161326e-2" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-37%, 20%, 14%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.0" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-38%, 20%, 16%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="5.8025806451612816e-2" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-39%, 20%, 18%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.11605161290322608" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-40%, 20%, 20%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.1740774193548389" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-40%, 20%, 22%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.2321032258064517" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-40%, 20%, 23%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.29012903225806497" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-40%, 20%, 25%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.3481548387096778" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-39%, 19%, 27%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.4061806451612906" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-39%, 19%, 28%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.46420645161290297" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-38%, 19%, 30%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.5222322580645167" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-36%, 18%, 31%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.5802580645161286" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-35%, 18%, 33%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.6382838709677419" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-33%, 17%, 34%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.6963096774193547" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-31%, 17%, 35%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.7543354838709679" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-29%, 16%, 36%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.8123612903225808" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-27%, 16%, 37%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.8703870967741936" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-24%, 15%, 38%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.9284129032258068" width="5.802580645161326e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-21%, 14%, 39%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="0.9864387096774201" width="5.8025806451611484e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-18%, 14%, 40%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.0444645161290316" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-15%, 13%, 41%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.1024903225806453" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-12%, 12%, 41%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.160516129032258" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-8%, 11%, 42%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.218541935483871" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-5%, 11%, 42%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.2765677419354837" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(-1%, 10%, 43%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.3345935483870974" width="5.802580645161104e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(3%, 9%, 43%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.3926193548387085" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(7%, 8%, 43%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.4506451612903222" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(10%, 8%, 43%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.5086709677419359" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(12%, 7%, 43%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.5666967741935487" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(14%, 6%, 42%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.6247225806451606" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(15%, 5%, 42%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.6827483870967743" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(17%, 4%, 42%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.740774193548388" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(18%, 3%, 41%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.7988000000000008" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(20%, 2%, 41%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.8568258064516128" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(21%, 2%, 40%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.9148516129032256" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(23%, 1%, 39%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="1.9728774193548393" width="5.802580645161104e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(24%, 0%, 38%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.0309032258064503" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(25%, -0%, 37%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.088929032258064" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(26%, -1%, 36%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.1469548387096777" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(27%, -2%, 35%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.2049806451612906" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(28%, -2%, 34%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.2630064516129025" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(29%, -3%, 32%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.321032258064516" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(30%, -3%, 31%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.37905806451613" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(31%, -4%, 30%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.4370838709677427" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(32%, -4%, 28%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.4951096774193546" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(33%, -5%, 27%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.5531354838709674" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(34%, -6%, 25%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.611161290322581" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(35%, -6%, 24%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.669187096774193" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(36%, -6%, 22%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.727212903225807" width="5.8025806451612816e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(36%, -7%, 20%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.7852387096774196" width="5.802580645161193e-2" y="-0.3401639344262295" height="0.680327868852459"/></g><g fill="rgb(37%, -8%, 19%)" stroke="rgb(2%, 29%, 48%)" stroke-width="0.0" fill-opacity="1.0" stroke-opacity="1.0"><rect x="2.8432645161290315" width="5.8025806451613704e-2" y="-0.3401639344262295" height="0.680327868852459"/></g></g><g class="border"><g fill="rgb(0%, 0%, 0%)" stroke="rgb(99%, 99%, 99%)" stroke-width="2.0e-2" fill-opacity="0.0" stroke-opacity="1.0"><rect x="-2.2124726556258776" width="0.23210322580645126" y="-0.40819672131147533" height="0.8163934426229508"/></g></g><g class="text"><g fill="rgb(94%, 94%, 94%)" stroke="none" stroke-width="0.0" font-size="0.5802580645161292" fill-opacity="1.0" text-anchor="middle"><text x="-0.5802580645161286" y="0.1700819672131148">chart-svg</text></g></g></g><g class="hud"><g class="frame"><g fill="rgb(0%, 0%, 0%)" stroke="rgb(99%, 99%, 99%)" stroke-width="4.0e-3" fill-opacity="0.0" stroke-opacity="1.0"><rect x="-2.998" width="5.996" y="-0.498" height="0.996"/></g></g></g></svg>
other/bar.svg view
@@ -1,29 +1,42 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.8200000000000001 -0.7528062429696287 1.59 1.3974338131537578" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g transform="translate(-5.3787500000000044e-2, -0.57175)" fill-opacity="1.0" font-size="0.12" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text transform="rotate(0.0, -0.2287553486975452, -5.005624296962874e-2)" x="-0.2287553486975452" y="-5.005624296962874e-2">Default Bar Chart</text></g><g stroke-opacity="0.0" fill-opacity="2.5e-2" stroke="#000000" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="0.9651785044022864" x="-0.7113446008986885" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,0.39988751406074247-0.2538339035035979,0.39988751406074247"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,0.28740157480314965-0.2538339035035979,0.28740157480314965"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,0.1749156355455569-0.2538339035035979,0.1749156355455569"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,6.2429696287964076e-2-0.2538339035035979,6.2429696287964076e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,-5.005624296962874e-2-0.2538339035035979,-5.005624296962874e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,-0.1625421822272215-0.2538339035035979,-0.1625421822272215"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,-0.27502812148481426-0.2538339035035979,-0.27502812148481426"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,-0.387514060742407-0.2538339035035979,-0.387514060742407"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.7113446008986885,-0.4999999999999999-0.2538339035035979,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.4129358830146232">-4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.30044994375703044">-2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.18796400449943768">0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="7.547806524184486e-2">2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-3.700787401574801e-2">4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.14949381327334077">6</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.2619797525309334">8</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.3744656917885262">10</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.48695163104611905">12</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><g transform="rotate(-90.0, -0.7290395401460636, 0.39988751406074247)"><polyline points="-0.7290395401460636,0.4148875140607425--0.7290395401460636,0.38488751406074245"/></g><g transform="rotate(-90.0, -0.7290395401460636, 0.28740157480314965)"><polyline points="-0.7290395401460636,0.30240157480314966--0.7290395401460636,0.27240157480314964"/></g><g transform="rotate(-90.0, -0.7290395401460636, 0.1749156355455569)"><polyline points="-0.7290395401460636,0.1899156355455569--0.7290395401460636,0.15991563554555688"/></g><g transform="rotate(-90.0, -0.7290395401460636, 6.2429696287964076e-2)"><polyline points="-0.7290395401460636,7.742969628796408e-2--0.7290395401460636,4.742969628796408e-2"/></g><g transform="rotate(-90.0, -0.7290395401460636, -5.005624296962874e-2)"><polyline points="-0.7290395401460636,-3.505624296962874e-2--0.7290395401460636,-6.505624296962874e-2"/></g><g transform="rotate(-90.0, -0.7290395401460636, -0.1625421822272215)"><polyline points="-0.7290395401460636,-0.14754218222722149--0.7290395401460636,-0.1775421822272215"/></g><g transform="rotate(-90.0, -0.7290395401460636, -0.27502812148481426)"><polyline points="-0.7290395401460636,-0.26002812148481425--0.7290395401460636,-0.29002812148481427"/></g><g transform="rotate(-90.0, -0.7290395401460636, -0.387514060742407)"><polyline points="-0.7290395401460636,-0.372514060742407--0.7290395401460636,-0.40251406074240703"/></g><g transform="rotate(-90.0, -0.7290395401460636, -0.4999999999999999)"><polyline points="-0.7290395401460636,-0.4849999999999999--0.7290395401460636,-0.5149999999999999"/></g></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="3.217261681340955e-3" x="-0.7209963859427113" y="-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.6630856756785741, 0.5)" x="-0.6630856756785741" y="0.5">row 1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.5665678252383455, 0.5)" x="-0.5665678252383455" y="0.5">row 2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.47004997479811683, 0.5)" x="-0.47004997479811683" y="0.5">row 3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.3735321243578883, 0.5)" x="-0.3735321243578883" y="0.5">row 4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.27701427391765954, 0.5)" x="-0.27701427391765954" y="0.5">row 5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -0.1804964234774309, 0.5)" x="-0.1804964234774309" y="0.5">row 6</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, -8.397857303720235e-2, 0.5)" x="-8.397857303720235e-2" y="0.5">row 7</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, 1.2539277403026294e-2, 0.5)" x="1.2539277403026294e-2" y="0.5">row 8</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, 0.10905712784325483, 0.5)" x="0.10905712784325483" y="0.5">row 9</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text transform="rotate(-45.0, 0.20557497828348348, 0.5)" x="0.20557497828348348" y="0.5">row 10</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><polyline points="-0.6630856756785741,0.4396344206974129--0.6630856756785741,0.40963442069741285"/><polyline points="-0.5665678252383455,0.4396344206974129--0.5665678252383455,0.40963442069741285"/><polyline points="-0.47004997479811683,0.4396344206974129--0.47004997479811683,0.40963442069741285"/><polyline points="-0.3735321243578883,0.4396344206974129--0.3735321243578883,0.40963442069741285"/><polyline points="-0.27701427391765954,0.4396344206974129--0.27701427391765954,0.40963442069741285"/><polyline points="-0.1804964234774309,0.4396344206974129--0.1804964234774309,0.40963442069741285"/><polyline points="-8.397857303720235e-2,0.4396344206974129--8.397857303720235e-2,0.40963442069741285"/><polyline points="1.2539277403026294e-2,0.4396344206974129-1.2539277403026294e-2,0.40963442069741285"/><polyline points="0.10905712784325483,0.4396344206974129-0.10905712784325483,0.40963442069741285"/><polyline points="0.20557497828348348,0.4396344206974129-0.20557497828348348,0.40963442069741285"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="4.499437570303688e-3" width="0.9651785044022864" x="-0.7113446008986885" y="0.4088863892013499"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#a6cee3" stroke-width="2.0e-3" fill="#a6cee3"><rect height="5.624296962879638e-2" width="3.860714017609146e-2" x="-0.7016928158546656" y="0.11867266591676051"/><rect height="0.11248593925759282" width="3.860714017609146e-2" x="-0.6051749654144369" y="6.2429696287964076e-2"/><rect height="0.1687289088863892" width="3.860714017609146e-2" x="-0.5086571149742084" y="6.186726659167696e-3"/><rect height="0.281214848143982" width="3.860714017609135e-2" x="-0.41213926453397975" y="-0.10629921259842512"/><rect height="0.44994375703037115" width="3.860714017609146e-2" x="-0.3156214140937512" y="-0.27502812148481426"/><rect height="0.0" width="3.860714017609135e-2" x="-0.21910356365352246" y="0.1749156355455569"/><rect height="0.11248593925759276" width="3.860714017609157e-2" x="-0.12258571321329392" y="0.1749156355455569"/><rect height="0.6186726659167604" width="3.860714017609124e-2" x="-2.6067862773065276e-2" y="-0.4437570303712035"/><rect height="0.11248593925759282" width="3.860714017609146e-2" x="7.044998766716337e-2" y="6.2429696287964076e-2"/><rect height="5.624296962879638e-2" width="3.860714017609146e-2" x="0.16696783810739202" y="0.11867266591676051"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#1f78b4" stroke-width="2.0e-3" fill="#1f78b4"><rect height="5.624296962879638e-2" width="3.860714017609146e-2" x="-0.6630856756785741" y="0.11867266591676051"/><rect height="0.11248593925759282" width="3.860714017609146e-2" x="-0.5665678252383455" y="6.2429696287964076e-2"/><rect height="0.1687289088863892" width="3.8607140176091403e-2" x="-0.47004997479811694" y="6.186726659167696e-3"/><rect height="0.22497187851518563" width="3.860714017609146e-2" x="-0.3735321243578884" y="-5.005624296962874e-2"/><rect height="0.281214848143982" width="3.860714017609157e-2" x="-0.27701427391765976" y="-0.10629921259842512"/><rect height="0.3374578177727784" width="3.860714017609146e-2" x="-0.1804964234774311" y="-0.1625421822272215"/><rect height="0.39370078740157477" width="3.860714017609124e-2" x="-8.397857303720235e-2" y="-0.21878515185601788"/><rect height="0.44994375703037115" width="3.860714017609146e-2" x="1.2539277403025961e-2" y="-0.27502812148481426"/><rect height="0.5061867266591675" width="3.860714017609157e-2" x="0.10905712784325483" y="-0.33127109111361064"/><rect height="0.5624296962879639" width="3.860714017609146e-2" x="0.20557497828348348" y="-0.387514060742407"/></g><g fill-opacity="1.0" font-size="4.0e-2" stroke="none" stroke-width="0.0" fill="#a6cee3" text-anchor="middle"><text x="-0.6823892457666199" y="8.942632170978637e-2">1</text><text x="-0.5858713953263912" y="3.318335208098999e-2">2</text><text x="-0.4893535448861627" y="-2.3059617547806388e-2">3</text><text x="-0.392835694445934" y="-0.13554555680539915">5</text><text x="-0.2963178440057055" y="-0.3042744656917884">8</text><text x="-0.19979999356547673" y="0.1456692913385828">0</text><text x="-0.1032821431252482" y="0.360517435320585">-2</text><text x="-6.764292685019546e-3" y="-0.4730033745781774">11</text><text x="8.975355775520888e-2" y="3.318335208098999e-2">2</text><text x="0.18627140819543786" y="8.942632170978637e-2">1</text></g><g fill-opacity="1.0" font-size="4.0e-2" stroke="none" stroke-width="0.0" fill="#1f78b4" text-anchor="middle"><text x="-0.6437821055905284" y="8.942632170978637e-2">1</text><text x="-0.5472642551502997" y="3.318335208098999e-2">2</text><text x="-0.4507464047100712" y="-2.3059617547806388e-2">3</text><text x="-0.35422855426984257" y="-7.930258717660277e-2">4</text><text x="-0.2577107038296139" y="-0.13554555680539915">5</text><text x="-0.16119285338938538" y="-0.19178852643419553">6</text><text x="-6.467500294915673e-2" y="-0.24803149606299202">7</text><text x="3.184284749107191e-2" y="-0.3042744656917884">8</text><text x="0.12836069793130056" y="-0.3605174353205848">9</text><text x="0.22487854837152932" y="-0.41676040494938105">10</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="8.0e-3" fill="#ffffff"><rect height="0.23217097862767155" width="0.3091145023432389" x="0.41257359486096057" y="-0.19965013714999813"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="0.4383116883116882" y="-2.6151824439087035e-2">column 2</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#1f78b4" stroke-width="8.0e-4" fill="#1f78b4"><rect height="4.319460067491565e-2" width="3.088571214087321e-2" x="0.6648069106780914" y="-6.934642511400269e-2"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="0.4383116883116882" y="-0.1201000809070285">column 1</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#a6cee3" stroke-width="8.0e-4" fill="#a6cee3"><rect height="4.319460067491554e-2" width="3.088571214087321e-2" x="0.6648069106780914" y="-0.16329468158194405"/></g></svg>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="451" height="300" viewBox="-0.7639 -0.5 1.5139 1.0057"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="barchart"><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.7"><rect width="0.0497" height="0.0555" x="-0.7111" y="0.1149"/><rect width="0.0497" height="0.1110" x="-0.6006" y="0.0594"/><rect width="0.0497" height="0.1665" x="-0.4902" y="0.0039"/><rect width="0.0497" height="0.2775" x="-0.3797" y="-0.1070"/><rect width="0.0497" height="0.4439" x="-0.2693" y="-0.2735"/><rect width="0.0497" height="0" x="-0.1588" y="0.1704"/><rect width="0.0497" height="0.1110" x="-0.0483" y="0.1704"/><rect width="0.0497" height="0.6104" x="0.0621" y="-0.4400"/><rect width="0.0497" height="0.1110" x="0.1726" y="0.0594"/><rect width="0.0497" height="0.0555" x="0.2830" y="0.1149"/></g><g stroke-width="0.0050" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.7"><rect width="0.0497" height="0.0555" x="-0.6614" y="0.1149"/><rect width="0.0497" height="0.1110" x="-0.5509" y="0.0594"/><rect width="0.0497" height="0.1665" x="-0.4405" y="0.0039"/><rect width="0.0497" height="0.2220" x="-0.3300" y="-0.0515"/><rect width="0.0497" height="0.2775" x="-0.2196" y="-0.1070"/><rect width="0.0497" height="0.3330" x="-0.1091" y="-0.1625"/><rect width="0.0497" height="0.3885" x="0.0014" y="-0.2180"/><rect width="0.0497" height="0.4439" x="0.1118" y="-0.2735"/><rect width="0.0497" height="0.4994" x="0.2223" y="-0.3290"/><rect width="0.0497" height="0.5549" x="0.3328" y="-0.3845"/></g><g stroke-width="0.0" stroke="none" fill="rgb(2%, 29%, 48%)" fill-opacity="1.0" font-size="0.0266" text-anchor="middle"><text x="-0.6863" y="0.0933">1.0</text><text x="-0.5758" y="0.0378">2.0</text><text x="-0.4653" y="-0.0177">3.0</text><text x="-0.3549" y="-0.1287">5.0</text><text x="-0.2444" y="-0.2952">8.0</text><text x="-0.1339" y="0.1488">0.0</text><text x="-0.0235" y="0.3175">-2.0</text><text x="0.0870" y="-0.4616">11</text><text x="0.1974" y="0.0378">2.0</text><text x="0.3079" y="0.0933">1.0</text></g><g stroke-width="0.0" stroke="none" fill="rgb(66%, 7%, 55%)" fill-opacity="1.0" font-size="0.0266" text-anchor="middle"><text x="-0.6365" y="0.0933">1.0</text><text x="-0.5261" y="0.0378">2.0</text><text x="-0.4156" y="-0.0177">3.0</text><text x="-0.3052" y="-0.0732">4.0</text><text x="-0.1947" y="-0.1287">5.0</text><text x="-0.0842" y="-0.1842">6.0</text><text x="0.0262" y="-0.2397">7.0</text><text x="0.1367" y="-0.2952">8.0</text><text x="0.2471" y="-0.3507">9.0</text><text x="0.3576" y="-0.4062">10</text></g></g></g><g class="hud"><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.0965" height="0.0032" x="-0.7126" y="0.3255"/></g></g><g class="ticks"><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6564,0.3512+-0.6564,0.3271"/><polyline points="-0.5471,0.3512+-0.5471,0.3271"/><polyline points="-0.4377,0.3512+-0.4377,0.3271"/><polyline points="-0.3284,0.3512+-0.3284,0.3271"/><polyline points="-0.2190,0.3512+-0.2190,0.3271"/><polyline points="-0.1096,0.3512+-0.1096,0.3271"/><polyline points="-0.0003,0.3512+-0.0003,0.3271"/><polyline points="0.1091,0.3512+0.1091,0.3271"/><polyline points="0.2184,0.3512+0.2184,0.3271"/><polyline points="0.3278,0.3512+0.3278,0.3271"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6564" y="0.3954" transform="rotate(-45.0, -0.6564, 0.3954)">row 1</text><text x="-0.5471" y="0.3954" transform="rotate(-45.0, -0.5471, 0.3954)">row 2</text><text x="-0.4377" y="0.3954" transform="rotate(-45.0, -0.4377, 0.3954)">row 3</text><text x="-0.3284" y="0.3954" transform="rotate(-45.0, -0.3284, 0.3954)">row 4</text><text x="-0.2190" y="0.3954" transform="rotate(-45.0, -0.2190, 0.3954)">row 5</text><text x="-0.1096" y="0.3954" transform="rotate(-45.0, -0.1096, 0.3954)">row 6</text><text x="-0.0003" y="0.3954" transform="rotate(-45.0, -0.0003, 0.3954)">row 7</text><text x="0.1091" y="0.3954" transform="rotate(-45.0, 0.1091, 0.3954)">row 8</text><text x="0.2184" y="0.3954" transform="rotate(-45.0, 0.2184, 0.3954)">row 9</text><text x="0.3278" y="0.3954" transform="rotate(-45.0, 0.3278, 0.3954)">row 10</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0009" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.2703" height="0.1827" x="0.4614" y="-0.1704"/></g></g><g class="legendContent"><g stroke-width="0.0009" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.7"><rect width="0.0550" height="0.0602" x="0.6578" y="-0.0685"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0294" text-anchor="start"><text x="0.4797" y="-0.0304">column 2</text></g><g stroke-width="0.0009" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.7"><rect width="0.0550" height="0.0602" x="0.6578" y="-0.1498"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0294" text-anchor="start"><text x="0.4797" y="-0.1117">column 1</text></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
− other/boundText.svg
@@ -1,1 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.775 -0.5469860228716645 1.9185575868372946 1.0669860228716646" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill-opacity="1.0" font-size="8.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="-0.75" y="0.1823379923761118">a pretty long piece of text</text></g><g fill-opacity="1.0" font-size="8.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="-6.444241316270571e-2" y="-0.45298602287166456">another pretty long piece of text</text></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#1f78b4"><rect height="7.369758576874202e-2" width="0.6663619744058501" x="-0.75" y="0.13532401524777637"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#1f78b4"><rect height="7.369758576874208e-2" width="0.8144424131627057" x="-6.444241316270571e-2" y="-0.5"/></g></svg>
+ other/compound.svg view
@@ -0,0 +1,56 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7521 -0.5035 1.5041 1.0040"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="chart"><g class="c1"><g stroke-width="0.0100" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.1"><rect width="1.2083" height="0.6152" x="-0.6042" y="-0.1870"/></g></g><g class="c2"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(96%, 60%, 92%)" fill-opacity="0.3"><rect width="0.8055" height="0.4101" x="-0.4028" y="-0.0845"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0"><rect width="1.2116" height="0.0025" x="-0.6058" y="0.4344"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6042,0.4282 -0.6042,-0.1870"/><polyline points="-0.3021,0.4282 -0.3021,-0.1870"/><polyline points="0,0.4282 0,-0.1870"/><polyline points="0.3021,0.4282 0.3021,-0.1870"/><polyline points="0.6042,0.4282 0.6042,-0.1870"/></g></g><g class="tickglyph"><g stroke-width="0.0025" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0"><polyline points="-0.6042,0.4543+-0.6042,0.4356"/><polyline points="-0.3021,0.4543+-0.3021,0.4356"/><polyline points="0,0.4543+0,0.4356"/><polyline points="0.3021,0.4543+0.3021,0.4356"/><polyline points="0.6042,0.4543+0.6042,0.4356"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6042" y="0.4884">-1.0</text><text x="-0.3021" y="0.4884">-0.5</text><text x="0" y="0.4884"> 0.0</text><text x="0.3021" y="0.4884"> 0.5</text><text x="0.6042" y="0.4884"> 1.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0"><rect width="0.0032" height="0.6176" x="-0.6155" y="-0.1882"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6042,0.4282 0.6042,0.4282"/><polyline points="-0.6042,0.2744 0.6042,0.2744"/><polyline points="-0.6042,0.1206 0.6042,0.1206"/><polyline points="-0.6042,-0.0332 0.6042,-0.0332"/><polyline points="-0.6042,-0.1870 0.6042,-0.1870"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0"><polyline points="-0.6382,0.4282+-0.6139,0.4282"/><polyline points="-0.6382,0.2744+-0.6139,0.2744"/><polyline points="-0.6382,0.1206+-0.6139,0.1206"/><polyline points="-0.6382,-0.0332+-0.6139,-0.0332"/><polyline points="-0.6382,-0.1870+-0.6139,-0.1870"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6561" y="0.4350">-1.0</text><text x="-0.6561" y="0.2812">-0.5</text><text x="-0.6561" y="0.1274"> 0.0</text><text x="-0.6561" y="-0.0264"> 0.5</text><text x="-0.6561" y="-0.1801"> 1.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0"><rect width="1.2116" height="0.0025" x="-0.6058" y="-0.1957"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(96%, 60%, 92%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6042,0.4282 -0.6042,-0.1870"/><polyline points="-0.4028,0.4282 -0.4028,-0.1870"/><polyline points="-0.2014,0.4282 -0.2014,-0.1870"/><polyline points="0,0.4282 0,-0.1870"/><polyline points="0.2014,0.4282 0.2014,-0.1870"/><polyline points="0.4028,0.4282 0.4028,-0.1870"/><polyline points="0.6042,0.4282 0.6042,-0.1870"/></g></g><g class="tickglyph"><g stroke-width="0.0025" stroke="rgb(96%, 60%, 92%)" stroke-opacity="1.0" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0"><polyline points="-0.6042,-0.1944+-0.6042,-0.2131"/><polyline points="-0.4028,-0.1944+-0.4028,-0.2131"/><polyline points="-0.2014,-0.1944+-0.2014,-0.2131"/><polyline points="0,-0.1944+0,-0.2131"/><polyline points="0.2014,-0.1944+0.2014,-0.2131"/><polyline points="0.4028,-0.1944+0.4028,-0.2131"/><polyline points="0.6042,-0.1944+0.6042,-0.2131"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6042" y="-0.2336">-0.6</text><text x="-0.4028" y="-0.2336">-0.4</text><text x="-0.2014" y="-0.2336">-0.2</text><text x="0" y="-0.2336"> 0.0</text><text x="0.2014" y="-0.2336"> 0.2</text><text x="0.4028" y="-0.2336"> 0.4</text><text x="0.6042" y="-0.2336"> 0.6</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0"><rect width="0.0032" height="0.6176" x="0.6123" y="-0.1882"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(96%, 60%, 92%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6042,0.4282 0.6042,0.4282"/><polyline points="-0.6042,0.3257 0.6042,0.3257"/><polyline points="-0.6042,0.2231 0.6042,0.2231"/><polyline points="-0.6042,0.1206 0.6042,0.1206"/><polyline points="-0.6042,0.0181 0.6042,0.0181"/><polyline points="-0.6042,-0.0845 0.6042,-0.0845"/><polyline points="-0.6042,-0.1870 0.6042,-0.1870"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(96%, 60%, 92%)" stroke-opacity="1.0" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0"><polyline points="0.6139,0.4282+0.6382,0.4282"/><polyline points="0.6139,0.3257+0.6382,0.3257"/><polyline points="0.6139,0.2231+0.6382,0.2231"/><polyline points="0.6139,0.1206+0.6382,0.1206"/><polyline points="0.6139,0.0181+0.6382,0.0181"/><polyline points="0.6139,-0.0845+0.6382,-0.0845"/><polyline points="0.6139,-0.1870+0.6382,-0.1870"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0" font-size="0.0400" text-anchor="start"><text x="0.6561" y="0.4350">-0.6</text><text x="0.6561" y="0.3325">-0.4</text><text x="0.6561" y="0.2300">-0.2</text><text x="0.6561" y="0.1274"> 0.0</text><text x="0.6561" y="0.0249"> 0.2</text><text x="0.6561" y="-0.0776"> 0.4</text><text x="0.6561" y="-0.1801"> 0.6</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0" font-size="0.12" text-anchor="middle"><text x="0" y="-0.3007">chart1</text></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0" font-size="0.12" text-anchor="middle"><text x="0" y="-0.4075">chart2</text></g></g></g></g><g class="hud"></g></svg>
+ other/cubic.svg view
@@ -0,0 +1,32 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.7561 -0.5017 1.5061 1.0028"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="cubic"><g stroke-width="0.0100" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(96%, 60%, 92%)" fill-opacity="0.2"><path d="M -0.7396,0.4846 C 0.1768,0.4846 -0.7396,-0.4167 0.1768,-0.4167"/></g><g stroke-width="0.0020" stroke="rgb(53%, 51%, 28%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7396,0.4846 -0.7126,0.4844 -0.6868,0.4836 -0.6620,0.4823 -0.6382,0.4804 -0.6154,0.4781 -0.5936,0.4753 -0.5728,0.4720 -0.5530,0.4683 -0.5340,0.4640 -0.5160,0.4594 -0.4988,0.4543 -0.4825,0.4488 -0.4671,0.4429 -0.4524,0.4366 -0.4385,0.4299 -0.4254,0.4228 -0.4131,0.4154 -0.4015,0.4075 -0.3906,0.3994 -0.3803,0.3909 -0.3708,0.3821 -0.3618,0.3730 -0.3535,0.3635 -0.3458,0.3538 -0.3386,0.3438 -0.3320,0.3335 -0.3260,0.3230 -0.3204,0.3122 -0.3153,0.3012 -0.3107,0.2900 -0.3065,0.2785 -0.3028,0.2668 -0.2994,0.2550 -0.2964,0.2429 -0.2937,0.2307 -0.2914,0.2183 -0.2894,0.2058 -0.2877,0.1931 -0.2863,0.1803 -0.2850,0.1674 -0.2840,0.1543 -0.2832,0.1412 -0.2826,0.1280 -0.2822,0.1147 -0.2818,0.1014 -0.2816,0.0879 -0.2815,0.0745 -0.2814,0.0610 -0.2814,0.0475 -0.2814,0.0340 -0.2814,0.0205 -0.2813,0.0070 -0.2813,-0.0065 -0.2811,-0.0200 -0.2809,-0.0334 -0.2806,-0.0467 -0.2801,-0.0600 -0.2795,-0.0733 -0.2787,-0.0864 -0.2777,-0.0994 -0.2765,-0.1123 -0.2750,-0.1251 -0.2733,-0.1378 -0.2713,-0.1503 -0.2690,-0.1627 -0.2664,-0.1749 -0.2634,-0.1870 -0.2600,-0.1989 -0.2562,-0.2105 -0.2520,-0.2220 -0.2474,-0.2332 -0.2423,-0.2443 -0.2368,-0.2550 -0.2307,-0.2656 -0.2241,-0.2758 -0.2169,-0.2858 -0.2092,-0.2956 -0.2009,-0.3050 -0.1920,-0.3141 -0.1824,-0.3229 -0.1722,-0.3314 -0.1613,-0.3396 -0.1496,-0.3474 -0.1373,-0.3548 -0.1242,-0.3619 -0.1103,-0.3686 -0.0957,-0.3749 -0.0802,-0.3808 -0.0639,-0.3864 -0.0468,-0.3914 -0.0287,-0.3961 -0.0098,-0.4003 0.0101,-0.4040 0.0309,-0.4073 0.0527,-0.4101 0.0754,-0.4125 0.0992,-0.4143 0.1240,-0.4156 0.1499,-0.4164 0.1768,-0.4167"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0300" height="0.0300" x="-0.7546" y="0.4696"/><rect width="0.0300" height="0.0300" x="0.1618" y="-0.4317"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.1768" cy="0.4846" r="0.0150"/><circle cx="-0.7396" cy="-0.4167" r="0.0150"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.9164" height="0.9013" x="-0.7396" y="-0.4167"/></g></g></g><g class="hud"><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0008" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.4933" height="0.4531" x="0.2535" y="-0.1926"/></g></g><g class="legendContent"><g stroke-width="0.0016" stroke="rgb(40%, 40%, 40%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0316" height="0.0466" x="0.6582" y="0.1884"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0316" text-anchor="start"><text x="0.2693" y="0.2233">Bounding Box</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.6735" cy="0.1372" r="0.0158"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0316" text-anchor="start"><text x="0.2693" y="0.1488">Path Control Point</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0316" height="0.0316" x="0.6577" y="0.0469"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0316" text-anchor="start"><text x="0.2693" y="0.0743">Path Endpoints</text></g><g stroke-width="0.0013" stroke="rgb(53%, 51%, 28%)" stroke-opacity="1.0" fill="none"><polyline points="0.6581,-0.0118 0.7212,-0.0118"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0316" text-anchor="start"><text x="0.2693" y="-0.0002">Path Chord</text></g><g stroke-width="0.0316" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(96%, 60%, 92%)" fill-opacity="0.2"><path d="M 0.6732,-0.0995 Q 0.7363,-0.0529 0.7048,-0.1460"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0316" text-anchor="start"><text x="0.2693" y="-0.1033">Path Fill</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0300" text-anchor="middle"><text x="0" y="-0.4777">CubicPosition (Point 0 0) (Point 1 1) (Point 1 0) (Point 0 1)</text></g></g></g></svg>
+ other/date.svg view
@@ -0,0 +1,46 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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><g class="hud"><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0033" height="0.7558" x="-0.5659" y="-0.4481"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5542,0.3063 0.7011,0.3063"/><polyline points="-0.5542,0.2122 0.7011,0.2122"/><polyline points="-0.5542,0.1181 0.7011,0.1181"/><polyline points="-0.5542,0.0240 0.7011,0.0240"/><polyline points="-0.5542,-0.0701 0.7011,-0.0701"/><polyline points="-0.5542,-0.1642 0.7011,-0.1642"/><polyline points="-0.5542,-0.2583 0.7011,-0.2583"/><polyline points="-0.5542,-0.3524 0.7011,-0.3524"/><polyline points="-0.5542,-0.4465 0.7011,-0.4465"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5893,0.3063+-0.5642,0.3063"/><polyline points="-0.5893,0.2122+-0.5642,0.2122"/><polyline points="-0.5893,0.1181+-0.5642,0.1181"/><polyline points="-0.5893,0.0240+-0.5642,0.0240"/><polyline points="-0.5893,-0.0701+-0.5642,-0.0701"/><polyline points="-0.5893,-0.1642+-0.5642,-0.1642"/><polyline points="-0.5893,-0.2583+-0.5642,-0.2583"/><polyline points="-0.5893,-0.3524+-0.5642,-0.3524"/><polyline points="-0.5893,-0.4465+-0.5642,-0.4465"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6077" y="0.3146">00:00</text><text x="-0.6077" y="0.2205">03:00</text><text x="-0.6077" y="0.1264">06:00</text><text x="-0.6077" y="0.0323">09:00</text><text x="-0.6077" y="-0.0618">12:00</text><text x="-0.6077" y="-0.1560">15:00</text><text x="-0.6077" y="-0.2501">18:00</text><text x="-0.6077" y="-0.3442">21:00</text><text x="-0.6077" y="-0.4383">00:00</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2586" height="0.0030" x="-0.5559" y="0.3138"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5542,0.3063 -0.5542,-0.4465"/><polyline points="-0.2307,0.3063 -0.2307,-0.4465"/><polyline points="0.1705,0.3063 0.1705,-0.4465"/><polyline points="0.5328,0.3063 0.5328,-0.4465"/><polyline points="0.7011,0.3063 0.7011,-0.4465"/></g></g><g class="tickglyph"><g stroke-width="0.0030" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5542,0.3379+-0.5542,0.3153"/><polyline points="-0.2307,0.3379+-0.2307,0.3153"/><polyline points="0.1705,0.3379+0.1705,0.3153"/><polyline points="0.5328,0.3379+0.5328,0.3153"/><polyline points="0.7011,0.3379+0.7011,0.3153"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.5542" y="0.3793" transform="rotate(-45.0, -0.5542, 0.3793)">06 Dec</text><text x="-0.2307" y="0.3793" transform="rotate(-45.0, -0.2307, 0.3793)">31 Dec</text><text x="0.1705" y="0.3793" transform="rotate(-45.0, 0.1705, 0.3793)">31 Jan</text><text x="0.5328" y="0.3793" transform="rotate(-45.0, 0.5328, 0.3793)">28 Feb</text><text x="0.7011" y="0.3793" transform="rotate(-45.0, 0.7011, 0.3793)">13 Mar</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ other/debug.svg view
@@ -0,0 +1,45 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7500 -0.5000 1.5000 1.0000"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="chart"><g class="line"><g stroke-width="0.0118" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6367,0.1951 -0.1969,0.1951 0.2428,-0.3664"/></g><g stroke-width="0.0118" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6367,0.3355 0.5946,-0.0857"/></g><g stroke-width="0.0118" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4168,-0.2261 -0.4168,0.3355"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.3258" height="0.7125" x="-0.6433" y="-0.3717"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.3227" height="0.0028" x="-0.6384" y="0.3425"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0039" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6367,0.3355 -0.6367,-0.3664"/><polyline points="-0.4168,0.3355 -0.4168,-0.3664"/><polyline points="-0.1969,0.3355 -0.1969,-0.3664"/><polyline points="0.0229,0.3355 0.0229,-0.3664"/><polyline points="0.2428,0.3355 0.2428,-0.3664"/><polyline points="0.4626,0.3355 0.4626,-0.3664"/><polyline points="0.6825,0.3355 0.6825,-0.3664"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6367,0.3663+-0.6367,0.3427"/><polyline points="-0.4168,0.3663+-0.4168,0.3427"/><polyline points="-0.1969,0.3663+-0.1969,0.3427"/><polyline points="0.0229,0.3663+0.0229,0.3427"/><polyline points="0.2428,0.3663+0.2428,0.3427"/><polyline points="0.4626,0.3663+0.4626,0.3427"/><polyline points="0.6825,0.3663+0.6825,0.3427"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="middle"><text x="-0.6367" y="0.4038">0.0</text><text x="-0.4168" y="0.4038">0.5</text><text x="-0.1969" y="0.4038">1.0</text><text x="0.0229" y="0.4038">1.5</text><text x="0.2428" y="0.4038">2.0</text><text x="0.4626" y="0.4038">2.5</text><text x="0.6825" y="0.4038">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0035" height="0.7047" x="-0.6490" y="-0.3678"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0039" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6367,0.3355 0.6825,0.3355"/><polyline points="-0.6367,0.1951 0.6825,0.1951"/><polyline points="-0.6367,0.0547 0.6825,0.0547"/><polyline points="-0.6367,-0.0857 0.6825,-0.0857"/><polyline points="-0.6367,-0.2261 0.6825,-0.2261"/><polyline points="-0.6367,-0.3664 0.6825,-0.3664"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6723,0.3355+-0.6486,0.3355"/><polyline points="-0.6723,0.1951+-0.6486,0.1951"/><polyline points="-0.6723,0.0547+-0.6486,0.0547"/><polyline points="-0.6723,-0.0857+-0.6486,-0.0857"/><polyline points="-0.6723,-0.2261+-0.6486,-0.2261"/><polyline points="-0.6723,-0.3664+-0.6486,-0.3664"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="end"><text x="-0.6931" y="0.3432">0</text><text x="-0.6931" y="0.2028">1</text><text x="-0.6931" y="0.0624">2</text><text x="-0.6931" y="-0.0779">3</text><text x="-0.6931" y="-0.2183">4</text><text x="-0.6931" y="-0.3587">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0630" text-anchor="middle"><text x="0" y="-0.4263">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.4452" height="0.1633" x="0.1056" y="0.1493"/></g></g><g class="legendContent"><g stroke-width="0.0118" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3899,0.2795 0.5221,0.2795"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="start"><text x="0.1276" y="0.2865">palette #2</text></g><g stroke-width="0.0118" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3899,0.2309 0.5221,0.2309"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="start"><text x="0.1276" y="0.2380">palette #1</text></g><g stroke-width="0.0118" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3899,0.1823 0.5221,0.1823"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="start"><text x="0.1276" y="0.1894">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0315" text-anchor="end"><text x="0.7142" y="0.4629">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.4990" height="0.9990" x="-0.7495" y="-0.4995"/></g></g></g><g class="glyphize"><g class="chart"><g class="line"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.1951" r="0.0050"/><circle cx="-0.1969" cy="0.1951" r="0.0050"/><circle cx="0.2428" cy="-0.3664" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.3355" r="0.0050"/><circle cx="0.5946" cy="-0.0857" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.4168" cy="-0.2261" r="0.0050"/><circle cx="-0.4168" cy="0.3355" r="0.0050"/></g></g><g class="datapadding"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.0229" cy="-0.0155" r="0.0050"/></g></g></g><g class="hud"><g class="frame"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.0196" cy="-0.0155" r="0.0050"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.0229" cy="0.3439" r="0.0050"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.3355" r="0.0050"/><circle cx="-0.6367" cy="-0.3664" r="0.0050"/><circle cx="-0.4168" cy="0.3355" r="0.0050"/><circle cx="-0.4168" cy="-0.3664" r="0.0050"/><circle cx="-0.1969" cy="0.3355" r="0.0050"/><circle cx="-0.1969" cy="-0.3664" r="0.0050"/><circle cx="0.0229" cy="0.3355" r="0.0050"/><circle cx="0.0229" cy="-0.3664" r="0.0050"/><circle cx="0.2428" cy="0.3355" r="0.0050"/><circle cx="0.2428" cy="-0.3664" r="0.0050"/><circle cx="0.4626" cy="0.3355" r="0.0050"/><circle cx="0.4626" cy="-0.3664" r="0.0050"/><circle cx="0.6825" cy="0.3355" r="0.0050"/><circle cx="0.6825" cy="-0.3664" r="0.0050"/></g></g><g class="tickglyph"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.3545" r="0.0050"/><circle cx="-0.4168" cy="0.3545" r="0.0050"/><circle cx="-0.1969" cy="0.3545" r="0.0050"/><circle cx="0.0229" cy="0.3545" r="0.0050"/><circle cx="0.2428" cy="0.3545" r="0.0050"/><circle cx="0.4626" cy="0.3545" r="0.0050"/><circle cx="0.6825" cy="0.3545" r="0.0050"/></g></g><g class="ticktext"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.4038" r="0.0050"/><circle cx="-0.4168" cy="0.4038" r="0.0050"/><circle cx="-0.1969" cy="0.4038" r="0.0050"/><circle cx="0.0229" cy="0.4038" r="0.0050"/><circle cx="0.2428" cy="0.4038" r="0.0050"/><circle cx="0.4626" cy="0.4038" r="0.0050"/><circle cx="0.6825" cy="0.4038" r="0.0050"/></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6472" cy="-0.0155" r="0.0050"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6367" cy="0.3355" r="0.0050"/><circle cx="0.6825" cy="0.3355" r="0.0050"/><circle cx="-0.6367" cy="0.1951" r="0.0050"/><circle cx="0.6825" cy="0.1951" r="0.0050"/><circle cx="-0.6367" cy="0.0547" r="0.0050"/><circle cx="0.6825" cy="0.0547" r="0.0050"/><circle cx="-0.6367" cy="-0.0857" r="0.0050"/><circle cx="0.6825" cy="-0.0857" r="0.0050"/><circle cx="-0.6367" cy="-0.2261" r="0.0050"/><circle cx="0.6825" cy="-0.2261" r="0.0050"/><circle cx="-0.6367" cy="-0.3664" r="0.0050"/><circle cx="0.6825" cy="-0.3664" r="0.0050"/></g></g><g class="tickglyph"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6605" cy="0.3355" r="0.0050"/><circle cx="-0.6605" cy="0.1951" r="0.0050"/><circle cx="-0.6605" cy="0.0547" r="0.0050"/><circle cx="-0.6605" cy="-0.0857" r="0.0050"/><circle cx="-0.6605" cy="-0.2261" r="0.0050"/><circle cx="-0.6605" cy="-0.3664" r="0.0050"/></g></g><g class="ticktext"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.6931" cy="0.3432" r="0.0050"/><circle cx="-0.6931" cy="0.2028" r="0.0050"/><circle cx="-0.6931" cy="0.0624" r="0.0050"/><circle cx="-0.6931" cy="-0.0779" r="0.0050"/><circle cx="-0.6931" cy="-0.2183" r="0.0050"/><circle cx="-0.6931" cy="-0.3587" r="0.0050"/></g></g></g></g><g class="title"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0" cy="-0.4263" r="0.0050"/></g></g><g class="legend"><g class="padding"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3282" cy="0.2309" r="0.0050"/></g></g><g class="padding"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3282" cy="0.2309" r="0.0050"/></g></g><g class="frame"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3282" cy="0.2309" r="0.0050"/></g></g><g class="legendContent"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3899" cy="0.2795" r="0.0050"/><circle cx="0.5221" cy="0.2795" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.1276" cy="0.2865" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3899" cy="0.2309" r="0.0050"/><circle cx="0.5221" cy="0.2309" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.1276" cy="0.2380" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.3899" cy="0.1823" r="0.0050"/><circle cx="0.5221" cy="0.1823" r="0.0050"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.1276" cy="0.1894" r="0.0050"/></g></g></g><g class="title"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.7142" cy="0.4629" r="0.0050"/></g></g><g class="frame"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0" cy="0" r="0.0050"/></g></g></g></g><g class="rectangularize"><g class="chart"><g class="line"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.8927" height="0.5721" x="-0.6433" y="-0.3717"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.2444" height="0.4317" x="-0.6433" y="-0.0910"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0132" height="0.5721" x="-0.4234" y="-0.2313"/></g></g><g class="datapadding"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3191" height="0.7019" x="-0.6367" y="-0.3664"/></g></g></g><g class="hud"><g class="frame"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3258" height="0.7125" x="-0.6433" y="-0.3717"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3227" height="0.0028" x="-0.6384" y="0.3425"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3236" height="0.7054" x="-0.6389" y="-0.3682"/></g></g><g class="tickglyph"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3262" height="0.0239" x="-0.6402" y="0.3425"/></g></g><g class="ticktext"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3826" height="0.0310" x="-0.6684" y="0.3812"/></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0035" height="0.7047" x="-0.6490" y="-0.3678"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.3236" height="0.7054" x="-0.6389" y="-0.3682"/></g></g><g class="tickglyph"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0300" height="0.7075" x="-0.6754" y="-0.3693"/></g></g><g class="ticktext"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0212" height="0.7329" x="-0.7142" y="-0.3812"/></g></g></g></g><g class="title"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.4232" height="0.0620" x="-0.2116" y="-0.4713"/></g></g><g class="legend"><g class="padding"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.4540" height="0.1704" x="0.1012" y="0.1457"/></g></g><g class="padding"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.4452" height="0.1633" x="0.1056" y="0.1493"/></g></g><g class="frame"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.4463" height="0.1642" x="0.1050" y="0.1488"/></g></g><g class="legendContent"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.1455" height="0.0106" x="0.3833" y="0.2742"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.2116" height="0.0310" x="0.1276" y="0.2640"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.1455" height="0.0106" x="0.3833" y="0.2256"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.2116" height="0.0310" x="0.1276" y="0.2154"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.1455" height="0.0106" x="0.3833" y="0.1771"/></g><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.2116" height="0.0310" x="0.1276" y="0.1669"/></g></g></g><g class="title"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.5290" height="0.0310" x="0.1853" y="0.4404"/></g></g><g class="frame"><g stroke-width="0.0010" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="1.4990" height="0.9990" x="-0.7495" y="-0.4995"/></g></g></g></g></g><g class="hud"></g></svg>
+ other/ellipse.svg view
@@ -0,0 +1,47 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="453" height="300" viewBox="-0.7627 -0.5 1.5127 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="ellipse"><g stroke-width="0.0050" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.1745,-0.0606 0.1727,-0.0463 0.1700,-0.0318 0.1666,-0.0173 0.1625,-0.0027 0.1576,0.0120 0.1519,0.0267 0.1455,0.0414 0.1383,0.0560 0.1305,0.0706 0.1220,0.0850 0.1128,0.0993 0.1029,0.1134 0.0924,0.1273 0.0814,0.1409 0.0697,0.1543 0.0575,0.1673 0.0448,0.1801 0.0315,0.1924 0.0178,0.2044 0.0037,0.2159 -0.0108,0.2270 -0.0257,0.2377 -0.0410,0.2478 -0.0565,0.2575 -0.0723,0.2665 -0.0883,0.2751 -0.1046,0.2830 -0.1210,0.2904 -0.1375,0.2971 -0.1541,0.3033 -0.1707,0.3087 -0.1874,0.3136 -0.2040,0.3177 -0.2206,0.3212 -0.2370,0.3240 -0.2533,0.3261 -0.2695,0.3276 -0.2854,0.3283 -0.3011,0.3283 -0.3165,0.3276 -0.3316,0.3263 -0.3463,0.3242 -0.3606,0.3215 -0.3745,0.3180 -0.3880,0.3139 -0.4010,0.3092 -0.4134,0.3038 -0.4254,0.2977 -0.4368,0.2910 -0.4475,0.2837 -0.4577,0.2758 -0.4672,0.2673 -0.4761,0.2583 -0.4843,0.2487 -0.4918,0.2386 -0.4986,0.2280 -0.5046,0.2169 -0.5099,0.2054 -0.5145,0.1934 -0.5182,0.1811 -0.5213,0.1684 -0.5235,0.1554 -0.5249,0.1420 -0.5256,0.1284 -0.5254,0.1146 -0.5245,0.1005 -0.5228,0.0862 -0.5203,0.0718 -0.5170,0.0573 -0.5129,0.0426 -0.5081,0.0280 -0.5026,0.0133 -0.4963,-0.0014 -0.4892,-0.0160 -0.4815,-0.0306 -0.4730,-0.0450 -0.4639,-0.0594 -0.4542,-0.0735 -0.4438,-0.0874 -0.4328,-0.1011 -0.4212,-0.1145 -0.4091,-0.1276 -0.3964,-0.1404 -0.3833,-0.1528 -0.3697,-0.1648 -0.3556,-0.1764 -0.3411,-0.1876 -0.3263,-0.1983 -0.3111,-0.2085 -0.2956,-0.2182 -0.2798,-0.2274 -0.2638,-0.2360 -0.2476,-0.2440 -0.2312,-0.2515 -0.2147,-0.2583 -0.1981,-0.2645 -0.1815,-0.2701 -0.1648,-0.2750 -0.1482,-0.2793 -0.1316,-0.2829"/></g><g stroke-width="0.0020" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0547,-0.2699 0.0376,-0.2763 0.0196,-0.2815 0.0009,-0.2856 -0.0185,-0.2884 -0.0385,-0.2901 -0.0590,-0.2905 -0.0800,-0.2897 -0.1014,-0.2877 -0.1231,-0.2845 -0.1450,-0.2800 -0.1670,-0.2744 -0.1890,-0.2677 -0.2110,-0.2598 -0.2328,-0.2508 -0.2544,-0.2407 -0.2757,-0.2297 -0.2966,-0.2176 -0.3170,-0.2046 -0.3369,-0.1907 -0.3561,-0.1760 -0.3746,-0.1605 -0.3923,-0.1444 -0.4092,-0.1275 -0.4251,-0.1101 -0.4400,-0.0922 -0.4539,-0.0739 -0.4667,-0.0551 -0.4783,-0.0361 -0.4888,-0.0169 -0.4980,0.0025 -0.5059,0.0219 -0.5125,0.0413 -0.5178,0.0607 -0.5218,0.0798 -0.5243,0.0988 -0.5255,0.1174 -0.5253,0.1356 -0.5238,0.1534 -0.5208,0.1706 -0.5165,0.1872 -0.5108,0.2032 -0.5038,0.2185 -0.4955,0.2329 -0.4860,0.2465 -0.4752,0.2592 -0.4632,0.2710 -0.4501,0.2818 -0.4359,0.2915 -0.4207,0.3002 -0.4045,0.3077 -0.3874,0.3141 -0.3695,0.3194 -0.3508,0.3234 -0.3314,0.3263 -0.3113,0.3279 -0.2908,0.3284 -0.2698,0.3276 -0.2484,0.3256 -0.2267,0.3223 -0.2048,0.3179 -0.1828,0.3123 -0.1608,0.3056 -0.1388,0.2977 -0.1170,0.2887 -0.0954,0.2786 -0.0741,0.2675 -0.0532,0.2555 -0.0328,0.2425 -0.0129,0.2286 0.0063,0.2139 0.0248,0.1984 0.0425,0.1822 0.0593,0.1654 0.0753,0.1480 0.0902,0.1301 0.1041,0.1117 0.1169,0.0930 0.1285,0.0740 0.1390,0.0548 0.1482,0.0354 0.1561,0.0160 0.1627,-0.0034 0.1680,-0.0228 0.1720,-0.0419 0.1745,-0.0609 0.1757,-0.0795 0.1755,-0.0977 0.1739,-0.1155 0.1710,-0.1327 0.1667,-0.1494 0.1610,-0.1653 0.1540,-0.1806 0.1457,-0.1950 0.1362,-0.2087 0.1254,-0.2214 0.1134,-0.2331 0.1003,-0.2439 0.0861,-0.2536 0.0709,-0.2623 0.0547,-0.2699"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.1749" cy="0.0189" r="0.0150"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.2"><circle cx="0.1745" cy="-0.0606" r="0.0150"/><circle cx="-0.1316" cy="-0.2829" r="0.0150"/></g><g stroke-width="0.0020" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(53%, 51%, 28%)" fill-opacity="0.00"><rect width="0.7001" height="0.6113" x="-0.5256" y="-0.2829"/></g><g stroke-width="0.0050" stroke="rgb(21%, 29%, 7%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.0547,-0.2699 -0.4045,0.3077"/></g><g stroke-width="0.0050" stroke="rgb(73%, 34%, 1%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="-0.4400,-0.0922 0.0902,0.1301"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.9184" height="0.7781" x="-0.5908" y="-0.3940"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.9208" height="0.0031" x="-0.5920" y="0.3918"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5908,0.3841 -0.5908,-0.3940"/><polyline points="-0.4378,0.3841 -0.4378,-0.3940"/><polyline points="-0.2847,0.3841 -0.2847,-0.3940"/><polyline points="-0.1316,0.3841 -0.1316,-0.3940"/><polyline points="0.0214,0.3841 0.0214,-0.3940"/><polyline points="0.1745,0.3841 0.1745,-0.3940"/><polyline points="0.3276,0.3841 0.3276,-0.3940"/></g></g><g class="tickglyph"><g stroke-width="0.0031" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5908,0.4167+-0.5908,0.3934"/><polyline points="-0.4378,0.4167+-0.4378,0.3934"/><polyline points="-0.2847,0.4167+-0.2847,0.3934"/><polyline points="-0.1316,0.4167+-0.1316,0.3934"/><polyline points="0.0214,0.4167+0.0214,0.3934"/><polyline points="0.1745,0.4167+0.1745,0.3934"/><polyline points="0.3276,0.4167+0.3276,0.3934"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.5908" y="0.4595">-2.0</text><text x="-0.4378" y="0.4595">-1.0</text><text x="-0.2847" y="0.4595">-0.5</text><text x="-0.1316" y="0.4595"> 0.0</text><text x="0.0214" y="0.4595"> 0.5</text><text x="0.1745" y="0.4595"> 1.0</text><text x="0.3276" y="0.4595"> 2.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0024" height="0.7812" x="-0.5994" y="-0.3956"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5908,0.3841 0.3276,0.3841"/><polyline points="-0.5908,0.2729 0.3276,0.2729"/><polyline points="-0.5908,0.1618 0.3276,0.1618"/><polyline points="-0.5908,0.0506 0.3276,0.0506"/><polyline points="-0.5908,-0.0606 0.3276,-0.0606"/><polyline points="-0.5908,-0.1717 0.3276,-0.1717"/><polyline points="-0.5908,-0.2829 0.3276,-0.2829"/><polyline points="-0.5908,-0.3940 0.3276,-0.3940"/></g></g><g class="tickglyph"><g stroke-width="0.0024" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6165,0.3841+-0.5982,0.3841"/><polyline points="-0.6165,0.2729+-0.5982,0.2729"/><polyline points="-0.6165,0.1618+-0.5982,0.1618"/><polyline points="-0.6165,0.0506+-0.5982,0.0506"/><polyline points="-0.6165,-0.0606+-0.5982,-0.0606"/><polyline points="-0.6165,-0.1717+-0.5982,-0.1717"/><polyline points="-0.6165,-0.2829+-0.5982,-0.2829"/><polyline points="-0.6165,-0.3940+-0.5982,-0.3940"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6667" y="0.3926">-2.0</text><text x="-0.6667" y="0.2815">-1.5</text><text x="-0.6667" y="0.1703">-1.0</text><text x="-0.6667" y="0.0592">-0.5</text><text x="-0.6667" y="-0.0520"> 0.0</text><text x="-0.6667" y="-0.1632"> 0.5</text><text x="-0.6667" y="-0.2743"> 1.0</text><text x="-0.6667" y="-0.3855"> 1.5</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0008" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.3306" height="0.4552" x="0.3918" y="-0.2326"/></g></g><g class="legendContent"><g stroke-width="0.0015" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(53%, 51%, 28%)" fill-opacity="0.00"><rect width="0.0153" height="0.0195" x="0.6742" y="0.1720"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="0.1915">Bounding Box</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.2"><rect width="0.0153" height="0.0153" x="0.6737" y="0.1119"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="0.1292">Endpoints</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0153" height="0.0153" x="0.6737" y="0.0496"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="0.0670">Centroid</text></g><g stroke-width="0.0031" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6750,-0.0050 0.7056,-0.0050"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="0.0047">Arc</text></g><g stroke-width="0.0012" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6741,-0.0672 0.7047,-0.0672"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="-0.0575">Full Ellipse</text></g><g stroke-width="0.0031" stroke="rgb(73%, 34%, 1%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.6750,-0.1295 0.7056,-0.1295"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="-0.1197">Minor Axis</text></g><g stroke-width="0.0031" stroke="rgb(21%, 29%, 7%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.6750,-0.1917 0.7056,-0.1917"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0306" text-anchor="start"><text x="0.4071" y="-0.1820">Major Axis</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0320" text-anchor="middle"><text x="0" y="-0.4490">ArcPosition (Point 1 0) (Point 0 1) (ArcInfo (Point 1.5 1) (pi / 3) True True)</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ other/ellipse2.svg view
@@ -0,0 +1,47 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="601" height="300" viewBox="-1.0038 -0.5 2.0038 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="ellipse"><g stroke-width="0.0050" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3062,-0.0606 0.3035,-0.0463 0.2996,-0.0318 0.2946,-0.0173 0.2885,-0.0027 0.2812,0.0120 0.2728,0.0267 0.2634,0.0414 0.2528,0.0560 0.2413,0.0706 0.2287,0.0850 0.2151,0.0993 0.2005,0.1134 0.1851,0.1273 0.1687,0.1409 0.1515,0.1543 0.1335,0.1673 0.1147,0.1801 0.0951,0.1924 0.0749,0.2044 0.0541,0.2159 0.0326,0.2270 0.0106,0.2377 -0.0119,0.2478 -0.0348,0.2575 -0.0582,0.2665 -0.0818,0.2751 -0.1058,0.2830 -0.1300,0.2904 -0.1544,0.2971 -0.1789,0.3033 -0.2035,0.3087 -0.2281,0.3136 -0.2526,0.3177 -0.2771,0.3212 -0.3014,0.3240 -0.3255,0.3261 -0.3493,0.3276 -0.3728,0.3283 -0.3960,0.3283 -0.4187,0.3276 -0.4409,0.3263 -0.4627,0.3242 -0.4838,0.3215 -0.5044,0.3180 -0.5243,0.3139 -0.5434,0.3092 -0.5619,0.3038 -0.5795,0.2977 -0.5963,0.2910 -0.6122,0.2837 -0.6272,0.2758 -0.6413,0.2673 -0.6544,0.2583 -0.6665,0.2487 -0.6775,0.2386 -0.6875,0.2280 -0.6965,0.2169 -0.7043,0.2054 -0.7110,0.1934 -0.7166,0.1811 -0.7210,0.1684 -0.7243,0.1554 -0.7264,0.1420 -0.7274,0.1284 -0.7272,0.1146 -0.7258,0.1005 -0.7233,0.0862 -0.7196,0.0718 -0.7147,0.0573 -0.7088,0.0426 -0.7016,0.0280 -0.6934,0.0133 -0.6841,-0.0014 -0.6737,-0.0160 -0.6623,-0.0306 -0.6498,-0.0450 -0.6364,-0.0594 -0.6220,-0.0735 -0.6067,-0.0874 -0.5904,-0.1011 -0.5733,-0.1145 -0.5554,-0.1276 -0.5367,-0.1404 -0.5173,-0.1528 -0.4972,-0.1648 -0.4764,-0.1764 -0.4551,-0.1876 -0.4331,-0.1983 -0.4107,-0.2085 -0.3878,-0.2182 -0.3645,-0.2274 -0.3409,-0.2360 -0.3170,-0.2440 -0.2928,-0.2515 -0.2684,-0.2583 -0.2439,-0.2645 -0.2194,-0.2701 -0.1948,-0.2750 -0.1702,-0.2793 -0.1458,-0.2829"/></g><g stroke-width="0.0020" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1293,-0.2699 0.1041,-0.2763 0.0776,-0.2815 0.0500,-0.2856 0.0213,-0.2884 -0.0082,-0.2901 -0.0386,-0.2905 -0.0696,-0.2897 -0.1012,-0.2877 -0.1332,-0.2845 -0.1655,-0.2800 -0.1980,-0.2744 -0.2305,-0.2677 -0.2629,-0.2598 -0.2952,-0.2508 -0.3271,-0.2407 -0.3585,-0.2297 -0.3894,-0.2176 -0.4195,-0.2046 -0.4488,-0.1907 -0.4772,-0.1760 -0.5045,-0.1605 -0.5306,-0.1444 -0.5555,-0.1275 -0.5790,-0.1101 -0.6011,-0.0922 -0.6216,-0.0739 -0.6405,-0.0551 -0.6577,-0.0361 -0.6731,-0.0169 -0.6867,0.0025 -0.6984,0.0219 -0.7082,0.0413 -0.7160,0.0607 -0.7218,0.0798 -0.7256,0.0988 -0.7273,0.1174 -0.7270,0.1356 -0.7247,0.1534 -0.7203,0.1706 -0.7140,0.1872 -0.7056,0.2032 -0.6953,0.2185 -0.6830,0.2329 -0.6689,0.2465 -0.6530,0.2592 -0.6353,0.2710 -0.6160,0.2818 -0.5950,0.2915 -0.5725,0.3002 -0.5486,0.3077 -0.5234,0.3141 -0.4969,0.3194 -0.4693,0.3234 -0.4406,0.3263 -0.4111,0.3279 -0.3807,0.3284 -0.3497,0.3276 -0.3181,0.3256 -0.2861,0.3223 -0.2538,0.3179 -0.2213,0.3123 -0.1888,0.3056 -0.1564,0.2977 -0.1241,0.2887 -0.0922,0.2786 -0.0608,0.2675 -0.0300,0.2555 0.0002,0.2425 0.0295,0.2286 0.0579,0.2139 0.0852,0.1984 0.1113,0.1822 0.1362,0.1654 0.1597,0.1480 0.1818,0.1301 0.2023,0.1117 0.2212,0.0930 0.2384,0.0740 0.2538,0.0548 0.2674,0.0354 0.2791,0.0160 0.2888,-0.0034 0.2967,-0.0228 0.3025,-0.0419 0.3063,-0.0609 0.3080,-0.0795 0.3077,-0.0977 0.3054,-0.1155 0.3010,-0.1327 0.2947,-0.1494 0.2863,-0.1653 0.2760,-0.1806 0.2637,-0.1950 0.2496,-0.2087 0.2337,-0.2214 0.2160,-0.2331 0.1967,-0.2439 0.1757,-0.2536 0.1532,-0.2623 0.1293,-0.2699"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-0.2097" cy="0.0189" r="0.0150"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.2"><circle cx="0.3062" cy="-0.0606" r="0.0150"/><circle cx="-0.1458" cy="-0.2829" r="0.0150"/></g><g stroke-width="0.0020" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(53%, 51%, 28%)" fill-opacity="0.00"><rect width="1.0337" height="0.6113" x="-0.7275" y="-0.2829"/></g><g stroke-width="0.0050" stroke="rgb(21%, 29%, 7%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.1293,-0.2699 -0.5486,0.3077"/></g><g stroke-width="0.0050" stroke="rgb(73%, 34%, 1%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="-0.6011,-0.0922 0.1818,0.1301"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.3559" height="0.7781" x="-0.8237" y="-0.3940"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.3586" height="0.0031" x="-0.8251" y="0.3918"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.8237,0.3841 -0.8237,-0.3940"/><polyline points="-0.5977,0.3841 -0.5977,-0.3940"/><polyline points="-0.3718,0.3841 -0.3718,-0.3940"/><polyline points="-0.1458,0.3841 -0.1458,-0.3940"/><polyline points="0.0802,0.3841 0.0802,-0.3940"/><polyline points="0.3062,0.3841 0.3062,-0.3940"/><polyline points="0.5322,0.3841 0.5322,-0.3940"/></g></g><g class="tickglyph"><g stroke-width="0.0031" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.8237,0.4167+-0.8237,0.3934"/><polyline points="-0.5977,0.4167+-0.5977,0.3934"/><polyline points="-0.3718,0.4167+-0.3718,0.3934"/><polyline points="-0.1458,0.4167+-0.1458,0.3934"/><polyline points="0.0802,0.4167+0.0802,0.3934"/><polyline points="0.3062,0.4167+0.3062,0.3934"/><polyline points="0.5322,0.4167+0.5322,0.3934"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.8237" y="0.4595">-2.0</text><text x="-0.5977" y="0.4595">-1.0</text><text x="-0.3718" y="0.4595">-0.5</text><text x="-0.1458" y="0.4595"> 0.0</text><text x="0.0802" y="0.4595"> 0.5</text><text x="0.3062" y="0.4595"> 1.0</text><text x="0.5322" y="0.4595"> 2.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0027" height="0.7812" x="-0.8332" y="-0.3956"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.8237,0.3841 0.5322,0.3841"/><polyline points="-0.8237,0.2729 0.5322,0.2729"/><polyline points="-0.8237,0.1618 0.5322,0.1618"/><polyline points="-0.8237,0.0506 0.5322,0.0506"/><polyline points="-0.8237,-0.0606 0.5322,-0.0606"/><polyline points="-0.8237,-0.1717 0.5322,-0.1717"/><polyline points="-0.8237,-0.2829 0.5322,-0.2829"/><polyline points="-0.8237,-0.3940 0.5322,-0.3940"/></g></g><g class="tickglyph"><g stroke-width="0.0027" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.8522,0.3841+-0.8319,0.3841"/><polyline points="-0.8522,0.2729+-0.8319,0.2729"/><polyline points="-0.8522,0.1618+-0.8319,0.1618"/><polyline points="-0.8522,0.0506+-0.8319,0.0506"/><polyline points="-0.8522,-0.0606+-0.8319,-0.0606"/><polyline points="-0.8522,-0.1717+-0.8319,-0.1717"/><polyline points="-0.8522,-0.2829+-0.8319,-0.2829"/><polyline points="-0.8522,-0.3940+-0.8319,-0.3940"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.9078" y="0.3926">-2.0</text><text x="-0.9078" y="0.2815">-1.5</text><text x="-0.9078" y="0.1703">-1.0</text><text x="-0.9078" y="0.0592">-0.5</text><text x="-0.9078" y="-0.0520"> 0.0</text><text x="-0.9078" y="-0.1632"> 0.5</text><text x="-0.9078" y="-0.2743"> 1.0</text><text x="-0.9078" y="-0.3855"> 1.5</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0008" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.3661" height="0.4552" x="0.6034" y="-0.2326"/></g></g><g class="legendContent"><g stroke-width="0.0017" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(53%, 51%, 28%)" fill-opacity="0.00"><rect width="0.0169" height="0.0195" x="0.9161" y="0.1720"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="0.1915">Bounding Box</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.2"><rect width="0.0169" height="0.0169" x="0.9155" y="0.1110"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="0.1292">Endpoints</text></g><g stroke-width="0.0005" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0169" height="0.0169" x="0.9155" y="0.0488"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="0.0670">Centroid</text></g><g stroke-width="0.0034" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.9169,-0.0050 0.9508,-0.0050"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="0.0047">Arc</text></g><g stroke-width="0.0014" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.9159,-0.0672 0.9498,-0.0672"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="-0.0575">Full Ellipse</text></g><g stroke-width="0.0034" stroke="rgb(73%, 34%, 1%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.9169,-0.1295 0.9508,-0.1295"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="-0.1197">Minor Axis</text></g><g stroke-width="0.0034" stroke="rgb(21%, 29%, 7%)" stroke-opacity="1.0" fill="none" stroke-linecap="round" stroke-dasharray="0.0300 0.0100"><polyline points="0.9169,-0.1917 0.9508,-0.1917"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0339" text-anchor="start"><text x="0.6203" y="-0.1820">Major Axis</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0320" text-anchor="middle"><text x="0" y="-0.4490">ArcPosition (Point 1 0) (Point 0 1) (ArcInfo (Point 1.5 1) (pi / 3) True True)</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="2.0" height="1.0" x="-1.0" y="-0.5"/></g></g></g></svg>
− other/glyph.svg
@@ -1,3 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.8250000000000001 -0.125 1.6500000000000001 0.2" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><circle cy="-0.0" r="5.0e-2" cx="-0.75"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><rect height="0.1" width="0.10000000000000009" x="-0.6125" y="-5.0e-2"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><rect height="7.500000000000001e-2" width="9.999999999999998e-2" x="-0.425" y="-3.7500000000000006e-2"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><rect height="7.500000000000001e-2" rx="1.0e-2" ry="1.0e-2" width="9.999999999999998e-2" x="-0.2375" y="-3.7500000000000006e-2"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="0.0" fill="#a6cee3"><ellipse rx="5.0e-2" ry="3.7500000000000006e-2" cy="-0.0" cx="0.0"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><polyline points="0.1875,5.0e-2-0.1875,-5.0e-2"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><polyline points="0.325,-0.0-0.425,-0.0"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><polygon transform="translate(0.5625, -0.0)" points="0.0,-0.0 0.1,-0.1 0.1,-0.0"/></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#a6cee3"><path transform="translate(0.75, -0.0)" d="M0.05,-0.03660254037844387 A0.1 0.1 0.0 0 1 0.0,0.05 0.1 0.1 0.0 0 1 -0.05,-0.03660254037844387 0.1 0.1 0.0 0 1 0.05,-0.03660254037844387 Z"/></g></svg>
+ other/glyphs.svg view
@@ -0,0 +1,34 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="607" height="50" viewBox="-5.9896 -0.4916 11.9793 0.9857"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="glyphs"><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="-5.5796" cy="0.0840" r="0.4"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.8000" height="0.8" x="-4.5847" y="-0.3160"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.8000" height="0.6000" x="-3.1898" y="-0.2160"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.8000" height="0.6000" x="-1.7949" y="-0.2160" rx="0.0100" ry="0.0100"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><ellipse cx="1.7763568394002505e-15" cy="8.40457922758524e-2" rx="0.4" ry="0.30000000000000004"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><polyline points="1.3949,0.4840+1.3949,-0.3160"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><polyline points="2.3898,0.0840+3.1898,0.0840"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><polygon transform="translate(4.1847, 0.0840)" points="0,-0.5657 -0.4000,0.3464 0.4000,0.3464"/></g><g stroke-width="0.0200" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><path d="M 0.5,-0.3660 A 1.0 1.0 -0.0 0 1 0,0.5 A 1.0 1.0 -0.0 0 1 -0.5,-0.3660 A 1.0 1.0 -0.0 0 1 0.5,-0.3660 L 0.5,-0.3660 Z" transform="translate(5.5796, 0.0840) scale(0.8)"/></g></g></g><g class="hud"></g></svg>
+ other/gradient.svg view
@@ -0,0 +1,32 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="599" height="100" viewBox="-3.0001 -0.5003 6.0001 1.0007"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}svg { shape-rendering: crispEdges; }+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="gradient"><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 26%, 38%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.9014" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 26%, 36%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.8433" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 26%, 34%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.7853" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 32%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.7273" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 30%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.6692" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 29%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.6112" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 27%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.5532" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 25%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.4952" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 27%, 23%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.4371" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 27%, 21%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.3791" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 27%, 18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.3211" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 28%, 16%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.2631" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 28%, 14%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.2050" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 29%, 11%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.1470" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 29%, 8%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.0890" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 30%, 5%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-2.0309" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 31%, 0%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.9729" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 31%, -4%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.9149" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 32%, -7%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.8569" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 33%, -10%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.7988" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 33%, -13%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.7408" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 34%, -15%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.6828" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 35%, -17%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.6248" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 36%, -18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.5667" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 36%, -18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.5087" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 37%, -19%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.4507" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 38%, -18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.3926" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 38%, -18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.3346" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 39%, -16%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.2766" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 40%, -15%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.2186" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 40%, -13%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.1605" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 41%, -10%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.1025" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 42%, -7%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-1.0445" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 42%, -3%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.9865" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 43%, 2%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.9284" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 43%, 6%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.8704" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 44%, 10%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.8124" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 44%, 13%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.7544" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 45%, 15%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.6963" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 45%, 18%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.6383" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 46%, 20%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.5803" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 46%, 22%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.5222" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 46%, 24%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.4642" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(5%, 46%, 26%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.4062" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-5%, 47%, 28%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.3482" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-14%, 47%, 30%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.2901" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-23%, 47%, 32%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.2321" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-30%, 47%, 34%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.1741" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-37%, 47%, 36%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.1161" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-43%, 47%, 38%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="-0.0580" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-48%, 47%, 40%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-52%, 47%, 42%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.0580" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-56%, 47%, 43%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.1161" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-58%, 47%, 45%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.1741" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-60%, 47%, 47%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.2321" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-60%, 46%, 49%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.2901" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-60%, 46%, 50%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.3482" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-59%, 46%, 52%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.4062" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-57%, 46%, 53%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.4642" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-54%, 45%, 54%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.5222" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-50%, 45%, 56%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.5803" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-46%, 44%, 57%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.6383" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-41%, 44%, 58%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.6963" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-35%, 44%, 59%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.7544" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-28%, 43%, 60%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.8124" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-20%, 43%, 61%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.8704" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-12%, 42%, 62%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.9284" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(-4%, 41%, 63%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="0.9865" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(6%, 41%, 64%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.0445" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 40%, 64%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.1025" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(15%, 40%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.1605" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 39%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.2186" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 38%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.2766" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 38%, 66%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.3346" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 37%, 66%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.3926" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 37%, 66%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.4507" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 36%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.5087" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 35%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.5667" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 35%, 65%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.6248" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 34%, 64%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.6828" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 34%, 64%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.7408" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 33%, 63%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.7988" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 32%, 63%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.8569" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 32%, 62%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.9149" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 31%, 61%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="1.9729" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 31%, 60%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.0309" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 30%, 59%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.0890" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 30%, 58%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.1470" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 29%, 56%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.2050" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 29%, 55%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.2631" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 28%, 54%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.3211" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 28%, 52%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.3791" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 28%, 51%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.4371" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 27%, 50%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.4952" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 27%, 48%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.5532" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 27%, 46%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.6112" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 26%, 45%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.6692" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 26%, 43%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.7273" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 26%, 41%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.7853" y="-0.3394"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 26%, 40%)" fill-opacity="1.0"><rect width="0.0580" height="0.6788" x="2.8433" y="-0.3394"/></g></g><g class="border"><g stroke-width="0.0200" stroke="rgb(94%, 94%, 94%)" stroke-opacity="1.0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2321" height="0.8145" x="-0.9703" y="-0.4073"/></g></g></g><g class="hud"><g class="frame"><g stroke-width="0.0040" stroke="rgb(99%, 99%, 99%)" stroke-opacity="1.0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="5.9961" height="0.9967" x="-2.9981" y="-0.4983"/></g></g></g></svg>
− other/hud.svg
@@ -1,45 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.87 -0.5532016310461191 1.6774999999999998 1.099451631046119" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="0.0" fill-opacity="2.5e-2" stroke="#000000" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="1.397450429327826" x="-0.6474504293278263" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247-0.7499999999999998,0.39988751406074247"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.30989876265466826-0.7499999999999998,0.30989876265466826"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.219910011248594-0.7499999999999998,0.219910011248594"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.12992125984251973-0.7499999999999998,0.12992125984251973"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,3.9932508436445524e-2-0.7499999999999998,3.9932508436445524e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-5.005624296962874e-2-0.7499999999999998,-5.005624296962874e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.14004499437570306-0.7499999999999998,-0.14004499437570306"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.23003374578177727-0.7499999999999998,-0.23003374578177727"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.3200224971878515-0.7499999999999998,-0.3200224971878515"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4100112485939257-0.7499999999999998,-0.4100112485939257"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4999999999999999-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.4129358830146232">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.32294713160854904">-0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.23295838020247478">-0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.14296962879640052">-0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="5.298087739032631e-2">-0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-3.700787401574801e-2">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.12699662542182233">0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.21698537682789654">0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.30697412823397063">0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.39696287964004495">0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.48695163104611905">0.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><g transform="rotate(-90.0, -0.7196520348430974, 0.39988751406074247)"><polyline points="-0.7196520348430974,0.4148875140607425--0.7196520348430974,0.38488751406074245"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.30989876265466826)"><polyline points="-0.7196520348430974,0.32489876265466827--0.7196520348430974,0.29489876265466825"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.219910011248594)"><polyline points="-0.7196520348430974,0.234910011248594--0.7196520348430974,0.20491001124859398"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.12992125984251973)"><polyline points="-0.7196520348430974,0.14492125984251975--0.7196520348430974,0.11492125984251973"/></g><g transform="rotate(-90.0, -0.7196520348430974, 3.9932508436445524e-2)"><polyline points="-0.7196520348430974,5.4932508436445524e-2--0.7196520348430974,2.4932508436445525e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, -5.005624296962874e-2)"><polyline points="-0.7196520348430974,-3.505624296962874e-2--0.7196520348430974,-6.505624296962874e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.14004499437570306)"><polyline points="-0.7196520348430974,-0.12504499437570304--0.7196520348430974,-0.15504499437570307"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.23003374578177727)"><polyline points="-0.7196520348430974,-0.21503374578177725--0.7196520348430974,-0.24503374578177728"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.3200224971878515)"><polyline points="-0.7196520348430974,-0.30502249718785146--0.7196520348430974,-0.3350224971878515"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4100112485939257)"><polyline points="-0.7196520348430974,-0.39501124859392567--0.7196520348430974,-0.4250112485939257"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4999999999999999)"><polyline points="-0.7196520348430974,-0.4849999999999999--0.7196520348430974,-0.5149999999999999"/></g></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="4.65816809775943e-3" x="-0.7080066145986988" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247--0.6474504293278263,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.5077053863950438,0.39988751406074247--0.5077053863950438,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.36796034346226103,0.39988751406074247--0.36796034346226103,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.22821530052947847,0.39988751406074247--0.22821530052947847,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-8.84702575966958e-2,0.39988751406074247--8.84702575966958e-2,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="5.127478533608665e-2,0.39988751406074247-5.127478533608665e-2,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.19101982826886943,0.39988751406074247-0.19101982826886943,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.33076487120165177,0.39988751406074247-0.33076487120165177,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.4705099141344349,0.39988751406074247-0.4705099141344349,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.6102549570672173,0.39988751406074247-0.6102549570672173,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.7499999999999998,0.39988751406074247-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.6474504293278263" y="0.5">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.5077053863950438" y="0.5">-0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.36796034346226103" y="0.5">-0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.22821530052947847" y="0.5">-0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-8.84702575966958e-2" y="0.5">-0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="5.127478533608665e-2" y="0.5">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.19101982826886943" y="0.5">0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.33076487120165177" y="0.5">0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.4705099141344349" y="0.5">0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.6102549570672173" y="0.5">0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.7499999999999998" y="0.5">0.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><polyline points="-0.6474504293278263,0.4396344206974129--0.6474504293278263,0.40963442069741285"/><polyline points="-0.5077053863950438,0.4396344206974129--0.5077053863950438,0.40963442069741285"/><polyline points="-0.36796034346226103,0.4396344206974129--0.36796034346226103,0.40963442069741285"/><polyline points="-0.22821530052947847,0.4396344206974129--0.22821530052947847,0.40963442069741285"/><polyline points="-8.84702575966958e-2,0.4396344206974129--8.84702575966958e-2,0.40963442069741285"/><polyline points="5.127478533608665e-2,0.4396344206974129-5.127478533608665e-2,0.40963442069741285"/><polyline points="0.19101982826886943,0.4396344206974129-0.19101982826886943,0.40963442069741285"/><polyline points="0.33076487120165177,0.4396344206974129-0.33076487120165177,0.40963442069741285"/><polyline points="0.4705099141344349,0.4396344206974129-0.4705099141344349,0.40963442069741285"/><polyline points="0.6102549570672173,0.4396344206974129-0.6102549570672173,0.40963442069741285"/><polyline points="0.7499999999999998,0.4396344206974129-0.7499999999999998,0.40963442069741285"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="4.499437570303688e-3" width="1.397450429327826" x="-0.6474504293278263" y="0.4088863892013499"/></g></svg>
+ other/hudoptions.svg view
@@ -0,0 +1,46 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.2584" height="0.8264" x="-0.5822" y="-0.4496"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2617" height="0.0033" x="-0.5839" y="0.3851"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5822,0.3769 -0.5822,-0.4496"/><polyline points="-0.3725,0.3769 -0.3725,-0.4496"/><polyline points="-0.1628,0.3769 -0.1628,-0.4496"/><polyline points="0.0470,0.3769 0.0470,-0.4496"/><polyline points="0.2567,0.3769 0.2567,-0.4496"/><polyline points="0.4664,0.3769 0.4664,-0.4496"/><polyline points="0.6762,0.3769 0.6762,-0.4496"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5822,0.4116+-0.5822,0.3868"/><polyline points="-0.3725,0.4116+-0.3725,0.3868"/><polyline points="-0.1628,0.4116+-0.1628,0.3868"/><polyline points="0.0470,0.4116+0.0470,0.3868"/><polyline points="0.2567,0.4116+0.2567,0.3868"/><polyline points="0.4664,0.4116+0.4664,0.3868"/><polyline points="0.6762,0.4116+0.6762,0.3868"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.5822" y="0.4570">-0.6</text><text x="-0.3725" y="0.4570">-0.4</text><text x="-0.1628" y="0.4570">-0.2</text><text x="0.0470" y="0.4570"> 0.0</text><text x="0.2567" y="0.4570"> 0.2</text><text x="0.4664" y="0.4570"> 0.4</text><text x="0.6762" y="0.4570"> 0.6</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0034" height="0.8298" x="-0.5940" y="-0.4512"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5822,0.3769 0.6762,0.3769"/><polyline points="-0.5822,0.2391 0.6762,0.2391"/><polyline points="-0.5822,0.1014 0.6762,0.1014"/><polyline points="-0.5822,-0.0364 0.6762,-0.0364"/><polyline points="-0.5822,-0.1741 0.6762,-0.1741"/><polyline points="-0.5822,-0.3118 0.6762,-0.3118"/><polyline points="-0.5822,-0.4496 0.6762,-0.4496"/></g></g><g class="tickglyph"><g stroke-width="0.0034" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6174,0.3769+-0.5923,0.3769"/><polyline points="-0.6174,0.2391+-0.5923,0.2391"/><polyline points="-0.6174,0.1014+-0.5923,0.1014"/><polyline points="-0.6174,-0.0364+-0.5923,-0.0364"/><polyline points="-0.6174,-0.1741+-0.5923,-0.1741"/><polyline points="-0.6174,-0.3118+-0.5923,-0.3118"/><polyline points="-0.6174,-0.4496+-0.5923,-0.4496"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6359" y="0.3860">-0.6</text><text x="-0.6359" y="0.2482">-0.4</text><text x="-0.6359" y="0.1105">-0.2</text><text x="-0.6359" y="-0.0273"> 0.0</text><text x="-0.6359" y="-0.1650"> 0.2</text><text x="-0.6359" y="-0.3028"> 0.4</text><text x="-0.6359" y="-0.4405"> 0.6</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
− other/legend.svg
@@ -1,46 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.87 -0.5532016310461191 1.6774999999999998 1.099451631046119" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="0.0" fill-opacity="2.5e-2" stroke="#000000" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="1.397450429327826" x="-0.6474504293278263" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247-0.7499999999999998,0.39988751406074247"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.30989876265466826-0.7499999999999998,0.30989876265466826"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.219910011248594-0.7499999999999998,0.219910011248594"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.12992125984251973-0.7499999999999998,0.12992125984251973"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,3.9932508436445524e-2-0.7499999999999998,3.9932508436445524e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-5.005624296962874e-2-0.7499999999999998,-5.005624296962874e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.14004499437570306-0.7499999999999998,-0.14004499437570306"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.23003374578177727-0.7499999999999998,-0.23003374578177727"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.3200224971878515-0.7499999999999998,-0.3200224971878515"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4100112485939257-0.7499999999999998,-0.4100112485939257"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4999999999999999-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.4129358830146232">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.32294713160854904">-0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.23295838020247478">-0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.14296962879640052">-0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="5.298087739032631e-2">-0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-3.700787401574801e-2">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.12699662542182233">0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.21698537682789654">0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.30697412823397063">0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.39696287964004495">0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.48695163104611905">0.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><g transform="rotate(-90.0, -0.7196520348430974, 0.39988751406074247)"><polyline points="-0.7196520348430974,0.4148875140607425--0.7196520348430974,0.38488751406074245"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.30989876265466826)"><polyline points="-0.7196520348430974,0.32489876265466827--0.7196520348430974,0.29489876265466825"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.219910011248594)"><polyline points="-0.7196520348430974,0.234910011248594--0.7196520348430974,0.20491001124859398"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.12992125984251973)"><polyline points="-0.7196520348430974,0.14492125984251975--0.7196520348430974,0.11492125984251973"/></g><g transform="rotate(-90.0, -0.7196520348430974, 3.9932508436445524e-2)"><polyline points="-0.7196520348430974,5.4932508436445524e-2--0.7196520348430974,2.4932508436445525e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, -5.005624296962874e-2)"><polyline points="-0.7196520348430974,-3.505624296962874e-2--0.7196520348430974,-6.505624296962874e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.14004499437570306)"><polyline points="-0.7196520348430974,-0.12504499437570304--0.7196520348430974,-0.15504499437570307"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.23003374578177727)"><polyline points="-0.7196520348430974,-0.21503374578177725--0.7196520348430974,-0.24503374578177728"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.3200224971878515)"><polyline points="-0.7196520348430974,-0.30502249718785146--0.7196520348430974,-0.3350224971878515"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4100112485939257)"><polyline points="-0.7196520348430974,-0.39501124859392567--0.7196520348430974,-0.4250112485939257"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4999999999999999)"><polyline points="-0.7196520348430974,-0.4849999999999999--0.7196520348430974,-0.5149999999999999"/></g></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="4.65816809775943e-3" x="-0.7080066145986988" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247--0.6474504293278263,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.5077053863950438,0.39988751406074247--0.5077053863950438,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.36796034346226103,0.39988751406074247--0.36796034346226103,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.22821530052947847,0.39988751406074247--0.22821530052947847,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-8.84702575966958e-2,0.39988751406074247--8.84702575966958e-2,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="5.127478533608665e-2,0.39988751406074247-5.127478533608665e-2,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.19101982826886943,0.39988751406074247-0.19101982826886943,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.33076487120165177,0.39988751406074247-0.33076487120165177,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.4705099141344349,0.39988751406074247-0.4705099141344349,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.6102549570672173,0.39988751406074247-0.6102549570672173,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.7499999999999998,0.39988751406074247-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.6474504293278263" y="0.5">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.5077053863950438" y="0.5">-0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.36796034346226103" y="0.5">-0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.22821530052947847" y="0.5">-0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-8.84702575966958e-2" y="0.5">-0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="5.127478533608665e-2" y="0.5">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.19101982826886943" y="0.5">0.1</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.33076487120165177" y="0.5">0.2</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.4705099141344349" y="0.5">0.3</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.6102549570672173" y="0.5">0.4</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.7499999999999998" y="0.5">0.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><polyline points="-0.6474504293278263,0.4396344206974129--0.6474504293278263,0.40963442069741285"/><polyline points="-0.5077053863950438,0.4396344206974129--0.5077053863950438,0.40963442069741285"/><polyline points="-0.36796034346226103,0.4396344206974129--0.36796034346226103,0.40963442069741285"/><polyline points="-0.22821530052947847,0.4396344206974129--0.22821530052947847,0.40963442069741285"/><polyline points="-8.84702575966958e-2,0.4396344206974129--8.84702575966958e-2,0.40963442069741285"/><polyline points="5.127478533608665e-2,0.4396344206974129-5.127478533608665e-2,0.40963442069741285"/><polyline points="0.19101982826886943,0.4396344206974129-0.19101982826886943,0.40963442069741285"/><polyline points="0.33076487120165177,0.4396344206974129-0.33076487120165177,0.40963442069741285"/><polyline points="0.4705099141344349,0.4396344206974129-0.4705099141344349,0.40963442069741285"/><polyline points="0.6102549570672173,0.4396344206974129-0.6102549570672173,0.40963442069741285"/><polyline points="0.7499999999999998,0.4396344206974129-0.7499999999999998,0.40963442069741285"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="4.499437570303688e-3" width="1.397450429327826" x="-0.6474504293278263" y="0.4088863892013499"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="6.0e-3" fill="#ffffff"><rect height="0.45138357705286847" width="0.676366007794668" x="2.332577674953007e-2" y="-0.4517660292463441"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-5.005624296962874e-2">blank</text></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-0.11700787401574797">abcdefghijklmnopqrst</text></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="3.0e-3" fill="#a6cee3"><rect height="3.599999999999999e-2" width="3.600000000000003e-2" x="0.553126345046038" y="-0.1456985376827896"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-0.1839595050618671">line</text></g><g stroke-opacity="0.3" stroke="#a6cee3" stroke-width="1.2e-2" fill="none"><polyline points="0.5543569398941042,-0.19465016872890883-0.6214345605018397,-0.19465016872890883"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-0.2509111361079863">text</text></g><g fill-opacity="1.0" font-size="3.6e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="0.5543569398941042" y="-0.2509111361079863">content</text></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-0.31786276715410555">rect</text></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="3.0e-3" fill="#1f78b4"><rect height="3.239595050618682e-2" width="3.353881030386763e-2" x="0.5543569398941042" y="-0.3502587176602924"/></g><g fill-opacity="1.0" font-size="4.8e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="start"><text x="5.127478533608665e-2" y="-0.3848143982002248">glyph</text></g><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="3.0e-3" fill="#a6cee3"><rect height="3.600000000000003e-2" width="3.600000000000003e-2" x="0.553126345046038" y="-0.41350506186726643"/></g></svg>
+ other/line.svg view
@@ -0,0 +1,45 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.75 -0.5 1.5000 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="line"><g stroke-width="0.0150" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6371,0.1953 -0.1971,0.1953 0.2429,-0.3668"/></g><g stroke-width="0.0150" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6371,0.3358 0.5949,-0.0858"/></g><g stroke-width="0.0150" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4171,-0.2263 -0.4171,0.3358"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.3266" height="0.7132" x="-0.6437" y="-0.3721"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.3236" height="0.0028" x="-0.6388" y="0.3428"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6371,0.3358 -0.6371,-0.3668"/><polyline points="-0.4171,0.3358 -0.4171,-0.3668"/><polyline points="-0.1971,0.3358 -0.1971,-0.3668"/><polyline points="0.0229,0.3358 0.0229,-0.3668"/><polyline points="0.2429,0.3358 0.2429,-0.3668"/><polyline points="0.4629,0.3358 0.4629,-0.3668"/><polyline points="0.6830,0.3358 0.6830,-0.3668"/></g></g><g class="tickglyph"><g stroke-width="0.0028" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6371,0.3654+-0.6371,0.3443"/><polyline points="-0.4171,0.3654+-0.4171,0.3443"/><polyline points="-0.1971,0.3654+-0.1971,0.3443"/><polyline points="0.0229,0.3654+0.0229,0.3443"/><polyline points="0.2429,0.3654+0.2429,0.3443"/><polyline points="0.4629,0.3654+0.4629,0.3443"/><polyline points="0.6830,0.3654+0.6830,0.3443"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6371" y="0.4042">0.0</text><text x="-0.4171" y="0.4042">0.5</text><text x="-0.1971" y="0.4042">1.0</text><text x="0.0229" y="0.4042">1.5</text><text x="0.2429" y="0.4042">2.0</text><text x="0.4629" y="0.4042">2.5</text><text x="0.6830" y="0.4042">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0035" height="0.7054" x="-0.6494" y="-0.3682"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6371,0.3358 0.6830,0.3358"/><polyline points="-0.6371,0.1953 0.6830,0.1953"/><polyline points="-0.6371,0.0548 0.6830,0.0548"/><polyline points="-0.6371,-0.0858 0.6830,-0.0858"/><polyline points="-0.6371,-0.2263 0.6830,-0.2263"/><polyline points="-0.6371,-0.3668 0.6830,-0.3668"/></g></g><g class="tickglyph"><g stroke-width="0.0035" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6741,0.3358+-0.6477,0.3358"/><polyline points="-0.6741,0.1953+-0.6477,0.1953"/><polyline points="-0.6741,0.0548+-0.6477,0.0548"/><polyline points="-0.6741,-0.0858+-0.6477,-0.0858"/><polyline points="-0.6741,-0.2263+-0.6477,-0.2263"/><polyline points="-0.6741,-0.3668+-0.6477,-0.3668"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6935" y="0.3436">0</text><text x="-0.6935" y="0.2030">1</text><text x="-0.6935" y="0.0625">2</text><text x="-0.6935" y="-0.0780">3</text><text x="-0.6935" y="-0.2185">4</text><text x="-0.6935" y="-0.3591">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0800" text-anchor="middle"><text x="0" y="-0.4267">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0011" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.4455" height="0.1635" x="0.1056" y="0.1494"/></g></g><g class="legendContent"><g stroke-width="0.0132" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3902,0.2798 0.5225,0.2798"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0353" text-anchor="start"><text x="0.1277" y="0.2868">palette #2</text></g><g stroke-width="0.0132" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3902,0.2311 0.5225,0.2311"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0353" text-anchor="start"><text x="0.1277" y="0.2382">palette #1</text></g><g stroke-width="0.0132" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3902,0.1825 0.5225,0.1825"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0353" text-anchor="start"><text x="0.1277" y="0.1896">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="0.7147" y="0.4634">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5000" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
− other/linehud.svg
@@ -1,49 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.87 -0.5532016310461191 1.6774999999999998 1.099451631046119" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="0.0" fill-opacity="2.5e-2" stroke="#000000" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="1.397450429327826" x="-0.6474504293278263" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247-0.7499999999999998,0.39988751406074247"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.32489688788901394-0.7499999999999998,0.32489688788901394"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.24990626171728542-0.7499999999999998,0.24990626171728542"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.1749156355455569-0.7499999999999998,0.1749156355455569"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,9.992500937382837e-2-0.7499999999999998,9.992500937382837e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,2.493438320209984e-2-0.7499999999999998,2.493438320209984e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-5.005624296962874e-2-0.7499999999999998,-5.005624296962874e-2"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.1250468691413572-0.7499999999999998,-0.1250468691413572"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.20003749531308568-0.7499999999999998,-0.20003749531308568"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.27502812148481426-0.7499999999999998,-0.27502812148481426"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.35001874765654284-0.7499999999999998,-0.35001874765654284"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4250093738282713-0.7499999999999998,-0.4250093738282713"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,-0.4999999999999999-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.4129358830146232">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.3379452568428947">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.2629546306711662">0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.18796400449943768">1.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="0.11297337832770915">1.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="3.798275215598057e-2">2.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-3.700787401574801e-2">2.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.11199850018747648">3.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.18698912635920495">3.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.2619797525309334">4.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.3369703787026621">4.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.4119610048743906">5.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="end"><text x="-0.75" y="-0.48695163104611905">5.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><g transform="rotate(-90.0, -0.7196520348430974, 0.39988751406074247)"><polyline points="-0.7196520348430974,0.4148875140607425--0.7196520348430974,0.38488751406074245"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.32489688788901394)"><polyline points="-0.7196520348430974,0.33989688788901395--0.7196520348430974,0.30989688788901393"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.24990626171728542)"><polyline points="-0.7196520348430974,0.26490626171728543--0.7196520348430974,0.2349062617172854"/></g><g transform="rotate(-90.0, -0.7196520348430974, 0.1749156355455569)"><polyline points="-0.7196520348430974,0.1899156355455569--0.7196520348430974,0.15991563554555688"/></g><g transform="rotate(-90.0, -0.7196520348430974, 9.992500937382837e-2)"><polyline points="-0.7196520348430974,0.11492500937382837--0.7196520348430974,8.492500937382837e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, 2.493438320209984e-2)"><polyline points="-0.7196520348430974,3.993438320209984e-2--0.7196520348430974,9.934383202099842e-3"/></g><g transform="rotate(-90.0, -0.7196520348430974, -5.005624296962874e-2)"><polyline points="-0.7196520348430974,-3.505624296962874e-2--0.7196520348430974,-6.505624296962874e-2"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.1250468691413572)"><polyline points="-0.7196520348430974,-0.11004686914135721--0.7196520348430974,-0.14004686914135722"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.20003749531308568)"><polyline points="-0.7196520348430974,-0.18503749531308566--0.7196520348430974,-0.2150374953130857"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.27502812148481426)"><polyline points="-0.7196520348430974,-0.26002812148481425--0.7196520348430974,-0.29002812148481427"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.35001874765654284)"><polyline points="-0.7196520348430974,-0.3350187476565428--0.7196520348430974,-0.36501874765654285"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4250093738282713)"><polyline points="-0.7196520348430974,-0.4100093738282713--0.7196520348430974,-0.4400093738282713"/></g><g transform="rotate(-90.0, -0.7196520348430974, -0.4999999999999999)"><polyline points="-0.7196520348430974,-0.4849999999999999--0.7196520348430974,-0.5149999999999999"/></g></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="0.8998875140607423" width="4.65816809775943e-3" x="-0.7080066145986988" y="-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.6474504293278263,0.39988751406074247--0.6474504293278263,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.47276912566184803,0.39988751406074247--0.47276912566184803,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.2980878219958698,0.39988751406074247--0.2980878219958698,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="-0.12340651832989158,0.39988751406074247--0.12340651832989158,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="5.127478533608665e-2,0.39988751406074247-5.127478533608665e-2,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.2259560890020651,0.39988751406074247-0.2259560890020651,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.4006373926680433,0.39988751406074247-0.4006373926680433,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.5753186963340216,0.39988751406074247-0.5753186963340216,-0.4999999999999999"/></g><g stroke-opacity="5.0e-2" stroke="#808080" stroke-width="5.0e-3" fill="none"><polyline points="0.7499999999999998,0.39988751406074247-0.7499999999999998,-0.4999999999999999"/></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.6474504293278263" y="0.5">-0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.47276912566184803" y="0.5">0.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.2980878219958698" y="0.5">0.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="-0.12340651832989158" y="0.5">1.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="5.127478533608665e-2" y="0.5">1.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.2259560890020651" y="0.5">2.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.4006373926680433" y="0.5">2.5</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.5753186963340216" y="0.5">3.0</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#808080" text-anchor="middle"><text x="0.7499999999999998" y="0.5">3.5</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="5.0e-3" fill="#808080"><polyline points="-0.6474504293278263,0.4396344206974129--0.6474504293278263,0.40963442069741285"/><polyline points="-0.47276912566184803,0.4396344206974129--0.47276912566184803,0.40963442069741285"/><polyline points="-0.2980878219958698,0.4396344206974129--0.2980878219958698,0.40963442069741285"/><polyline points="-0.12340651832989158,0.4396344206974129--0.12340651832989158,0.40963442069741285"/><polyline points="5.127478533608665e-2,0.4396344206974129-5.127478533608665e-2,0.40963442069741285"/><polyline points="0.2259560890020651,0.4396344206974129-0.2259560890020651,0.40963442069741285"/><polyline points="0.4006373926680433,0.4396344206974129-0.4006373926680433,0.40963442069741285"/><polyline points="0.5753186963340216,0.4396344206974129-0.5753186963340216,0.40963442069741285"/><polyline points="0.7499999999999998,0.4396344206974129-0.7499999999999998,0.40963442069741285"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#808080" stroke-width="0.0" fill="#808080"><rect height="4.499437570303688e-3" width="1.397450429327826" x="-0.6474504293278263" y="0.4088863892013499"/></g><g stroke-opacity="1.0" stroke="#a6cee3" stroke-width="1.5e-2" fill="none"><polyline points="-0.47276912566184803,0.1749156355455569--0.12340651832989158,0.1749156355455569-0.2259560890020651,-0.4250093738282713"/></g><g stroke-opacity="1.0" stroke="#1f78b4" stroke-width="3.0e-2" fill="none"><polyline points="-0.47276912566184803,0.32489688788901394-0.5753186963340216,-0.1250468691413571"/></g><g stroke-opacity="1.0" stroke="#e31a1c" stroke-width="1.0e-2" fill="none"><polyline points="-0.2980878219958698,-0.27502812148481426--0.2980878219958698,0.32489688788901394"/></g></svg>
− other/lines.svg
@@ -1,5 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.785 -0.5275 1.57 1.0625" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="1.0" stroke="#a6cee3" stroke-width="1.5e-2" fill="none"><polyline points="-0.75,0.3--0.25,0.3-0.25,-0.5"/></g><g stroke-opacity="1.0" stroke="#1f78b4" stroke-width="3.0e-2" fill="none"><polyline points="-0.75,0.5-0.75,-0.10000000000000009"/></g><g stroke-opacity="1.0" stroke="#e31a1c" stroke-width="1.0e-2" fill="none"><polyline points="-0.5,-0.30000000000000004--0.5,0.5"/></g></svg>
− other/mempty.svg
@@ -1,1 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.52 -0.52 1.04 1.04" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
+ other/path.svg view
@@ -0,0 +1,55 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="390" height="300" viewBox="-0.6369 -0.5 1.3025 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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;+}+++{+  .pathtext g {+    fill: rgb(5%, 5%, 5%);+  }+}+@media (prefers-color-scheme:dark) {+  .pathtext g {+    fill: rgb(94%, 94%, 94%);+  }+}+</style><g class="chart"><g class="path"><g stroke-width="0.0100" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.1"><path d="M -0.1205,0.3635 L 0.4216,0.3635 C -0.0121,0.3635 0.0150,-0.1786 0.4216,-0.1786 Q -0.6627,-0.7207 -0.1205,-0.1786 A 0.5421 0.5421 30.0 0 0 -0.1205,0.3635"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0300" height="0.0300" x="-0.1355" y="0.3485"/><rect width="0.0300" height="0.0300" x="0.4066" y="0.3485"/><rect width="0.0300" height="0.0300" x="0.4066" y="-0.1936"/><rect width="0.0300" height="0.0300" x="-0.1355" y="-0.1936"/><rect width="0.0300" height="0.0300" x="-0.1355" y="0.3485"/></g></g><g class="pathtext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0250" text-anchor="middle"><text x="-0.3103" y="0.3364">StartP (Point 0 0)</text><text x="0.1505" y="0.3364">LineP (Point 1 0)</text><text x="0.3131" y="0.0924">CubicP (Point 0.2 0) (Point 0.25 1) (Point 1 1)</text><text x="0.0963" y="-0.2328">QuadP (Point (-1) 2) (Point 0 1)</text><text x="-0.1205" y="0.1466">ArcP (ArcInfo (Point 1 1) (-pi / 6) False False) (Point 0 0)</text></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.0956" height="0.8309" x="-0.4917" y="-0.4538"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.7623" height="0.0033" x="-0.3390" y="0.3853"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.3374,0.3635 -0.3374,-0.4497"/><polyline points="-0.2290,0.3635 -0.2290,-0.4497"/><polyline points="-0.1205,0.3635 -0.1205,-0.4497"/><polyline points="-0.0121,0.3635 -0.0121,-0.4497"/><polyline points="0.0963,0.3635 0.0963,-0.4497"/><polyline points="0.2047,0.3635 0.2047,-0.4497"/><polyline points="0.3131,0.3635 0.3131,-0.4497"/><polyline points="0.4216,0.3635 0.4216,-0.4497"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.3374,0.4117+-0.3374,0.3870"/><polyline points="-0.2290,0.4117+-0.2290,0.3870"/><polyline points="-0.1205,0.4117+-0.1205,0.3870"/><polyline points="-0.0121,0.4117+-0.0121,0.3870"/><polyline points="0.0963,0.4117+0.0963,0.3870"/><polyline points="0.2047,0.4117+0.2047,0.3870"/><polyline points="0.3131,0.4117+0.3131,0.3870"/><polyline points="0.4216,0.4117+0.4216,0.3870"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.3374" y="0.4571">-0.4</text><text x="-0.2290" y="0.4571">-0.2</text><text x="-0.1205" y="0.4571"> 0.0</text><text x="-0.0121" y="0.4571"> 0.2</text><text x="0.0963" y="0.4571"> 0.4</text><text x="0.2047" y="0.4571"> 0.6</text><text x="0.3131" y="0.4571"> 0.8</text><text x="0.4216" y="0.4571"> 1.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0033" height="0.8165" x="-0.5033" y="-0.4513"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.3374,0.3635 0.4216,0.3635"/><polyline points="-0.3374,0.0924 0.4216,0.0924"/><polyline points="-0.3374,-0.1786 0.4216,-0.1786"/><polyline points="-0.3374,-0.4497 0.4216,-0.4497"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5264,0.3635+-0.5016,0.3635"/><polyline points="-0.5264,0.0924+-0.5016,0.0924"/><polyline points="-0.5264,-0.1786+-0.5016,-0.1786"/><polyline points="-0.5264,-0.4497+-0.5016,-0.4497"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.5445" y="0.3726">0.0</text><text x="-0.5445" y="0.1015">0.5</text><text x="-0.5445" y="-0.1696">1.0</text><text x="-0.5445" y="-0.4406">2.0</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.2738" height="1.0" x="-0.6369" y="-0.5"/></g></g></g></svg>
− other/pixel.svg

file too large to diff

+ other/priorityv1.svg view
@@ -0,0 +1,45 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7519 -0.5018 1.5038 1.0035"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="line"><g stroke-width="0.0150" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6298,0.1789 -0.3193,0.1789 -0.0088,-0.3360"/></g><g stroke-width="0.0150" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6298,0.3076 0.2396,-0.0786"/></g><g stroke-width="0.0150" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4746,-0.2073 -0.4746,0.3076"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0.0100" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.1"><rect width="0.9362" height="0.6533" x="-0.6345" y="-0.3409"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.9341" height="0.0026" x="-0.6311" y="0.3141"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6298,0.3076 -0.6298,-0.3360"/><polyline points="-0.4746,0.3076 -0.4746,-0.3360"/><polyline points="-0.3193,0.3076 -0.3193,-0.3360"/><polyline points="-0.1641,0.3076 -0.1641,-0.3360"/><polyline points="-0.0088,0.3076 -0.0088,-0.3360"/><polyline points="0.1465,0.3076 0.1465,-0.3360"/><polyline points="0.3017,0.3076 0.3017,-0.3360"/></g></g><g class="tickglyph"><g stroke-width="0.0026" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6298,0.3347+-0.6298,0.3154"/><polyline points="-0.4746,0.3347+-0.4746,0.3154"/><polyline points="-0.3193,0.3347+-0.3193,0.3154"/><polyline points="-0.1641,0.3347+-0.1641,0.3154"/><polyline points="-0.0088,0.3347+-0.0088,0.3154"/><polyline points="0.1465,0.3347+0.1465,0.3154"/><polyline points="0.3017,0.3347+0.3017,0.3154"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6298" y="0.3702">0.0</text><text x="-0.4746" y="0.3702">0.5</text><text x="-0.3193" y="0.3702">1.0</text><text x="-0.1641" y="0.3702">1.5</text><text x="-0.0088" y="0.3702">2.0</text><text x="0.1465" y="0.3702">2.5</text><text x="0.3017" y="0.3702">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0025" height="0.6462" x="-0.6386" y="-0.3373"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6298,0.3076 0.3017,0.3076"/><polyline points="-0.6298,0.1789 0.3017,0.1789"/><polyline points="-0.6298,0.0502 0.3017,0.0502"/><polyline points="-0.6298,-0.0786 0.3017,-0.0786"/><polyline points="-0.6298,-0.2073 0.3017,-0.2073"/><polyline points="-0.6298,-0.3360 0.3017,-0.3360"/></g></g><g class="tickglyph"><g stroke-width="0.0025" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6560,0.3076+-0.6373,0.3076"/><polyline points="-0.6560,0.1789+-0.6373,0.1789"/><polyline points="-0.6560,0.0502+-0.6373,0.0502"/><polyline points="-0.6560,-0.0786+-0.6373,-0.0786"/><polyline points="-0.6560,-0.2073+-0.6373,-0.2073"/><polyline points="-0.6560,-0.3360+-0.6373,-0.3360"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6697" y="0.3147">0</text><text x="-0.6697" y="0.1860">1</text><text x="-0.6697" y="0.0573">2</text><text x="-0.6697" y="-0.0715">3</text><text x="-0.6697" y="-0.2002">4</text><text x="-0.6697" y="-0.3289">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0800" text-anchor="middle"><text x="-0.1802" y="-0.3909">Line Chart</text></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="0.3241" y="0.4245">Made with 🧡 and chart-svg</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0008" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.3144" height="0.1498" x="0.3671" y="-0.0891"/></g></g><g class="legendContent"><g stroke-width="0.0093" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,0.0303 0.6613,0.0303"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="0.0368">palette #2</text></g><g stroke-width="0.0093" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,-0.0142 0.6613,-0.0142"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="-0.0077">palette #1</text></g><g stroke-width="0.0093" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,-0.0587 0.6613,-0.0587"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="-0.0523">palette #0</text></g></g></g><g class="frame"><g stroke-width="0.0100" stroke="rgb(100%, 71%, 35%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.05"><rect width="1.4938" height="0.9935" x="-0.7469" y="-0.4968"/></g></g></g></svg>
+ other/priorityv2.svg view
@@ -0,0 +1,45 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7519 -0.5018 1.5038 1.0035"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="line"><g stroke-width="0.0150" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6298,0.1789 -0.3193,0.1789 -0.0088,-0.3360"/></g><g stroke-width="0.0150" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6298,0.3076 0.2396,-0.0786"/></g><g stroke-width="0.0150" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4746,-0.2073 -0.4746,0.3076"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0.0100" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.1"><rect width="0.9362" height="0.6533" x="-0.6345" y="-0.3409"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.9341" height="0.0026" x="-0.6311" y="0.3141"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6298,0.3076 -0.6298,-0.3360"/><polyline points="-0.4746,0.3076 -0.4746,-0.3360"/><polyline points="-0.3193,0.3076 -0.3193,-0.3360"/><polyline points="-0.1641,0.3076 -0.1641,-0.3360"/><polyline points="-0.0088,0.3076 -0.0088,-0.3360"/><polyline points="0.1465,0.3076 0.1465,-0.3360"/><polyline points="0.3017,0.3076 0.3017,-0.3360"/></g></g><g class="tickglyph"><g stroke-width="0.0026" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6298,0.3347+-0.6298,0.3154"/><polyline points="-0.4746,0.3347+-0.4746,0.3154"/><polyline points="-0.3193,0.3347+-0.3193,0.3154"/><polyline points="-0.1641,0.3347+-0.1641,0.3154"/><polyline points="-0.0088,0.3347+-0.0088,0.3154"/><polyline points="0.1465,0.3347+0.1465,0.3154"/><polyline points="0.3017,0.3347+0.3017,0.3154"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6298" y="0.3702">0.0</text><text x="-0.4746" y="0.3702">0.5</text><text x="-0.3193" y="0.3702">1.0</text><text x="-0.1641" y="0.3702">1.5</text><text x="-0.0088" y="0.3702">2.0</text><text x="0.1465" y="0.3702">2.5</text><text x="0.3017" y="0.3702">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0025" height="0.6462" x="-0.6386" y="-0.3373"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6298,0.3076 0.3017,0.3076"/><polyline points="-0.6298,0.1789 0.3017,0.1789"/><polyline points="-0.6298,0.0502 0.3017,0.0502"/><polyline points="-0.6298,-0.0786 0.3017,-0.0786"/><polyline points="-0.6298,-0.2073 0.3017,-0.2073"/><polyline points="-0.6298,-0.3360 0.3017,-0.3360"/></g></g><g class="tickglyph"><g stroke-width="0.0025" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6560,0.3076+-0.6373,0.3076"/><polyline points="-0.6560,0.1789+-0.6373,0.1789"/><polyline points="-0.6560,0.0502+-0.6373,0.0502"/><polyline points="-0.6560,-0.0786+-0.6373,-0.0786"/><polyline points="-0.6560,-0.2073+-0.6373,-0.2073"/><polyline points="-0.6560,-0.3360+-0.6373,-0.3360"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6697" y="0.3147">0</text><text x="-0.6697" y="0.1860">1</text><text x="-0.6697" y="0.0573">2</text><text x="-0.6697" y="-0.0715">3</text><text x="-0.6697" y="-0.2002">4</text><text x="-0.6697" y="-0.3289">5</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0008" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.3144" height="0.1498" x="0.3671" y="-0.0891"/></g></g><g class="legendContent"><g stroke-width="0.0093" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,0.0303 0.6613,0.0303"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="0.0368">palette #2</text></g><g stroke-width="0.0093" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,-0.0142 0.6613,-0.0142"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="-0.0077">palette #1</text></g><g stroke-width="0.0093" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.5679,-0.0587 0.6613,-0.0587"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0249" text-anchor="start"><text x="0.3827" y="-0.0523">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0800" text-anchor="middle"><text x="0" y="-0.3909">Line Chart</text></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="0.6846" y="0.4245">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0.0100" stroke="rgb(100%, 71%, 35%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.05"><rect width="1.4938" height="0.9935" x="-0.7469" y="-0.4968"/></g></g></g></svg>
+ other/quad.svg view
@@ -0,0 +1,42 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="455" height="300" viewBox="-0.7700 -0.5 1.5200 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="quad"><g stroke-width="0.0100" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.2"><path d="M -0.6047,-0.0059 Q 0.2201,0.3824 -0.1923,-0.3942"/></g><g stroke-width="0.0020" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6047,-0.0059 -0.5883,0.0017 -0.5722,0.0091 -0.5563,0.0163 -0.5407,0.0233 -0.5253,0.0300 -0.5102,0.0365 -0.4953,0.0427 -0.4806,0.0488 -0.4663,0.0545 -0.4521,0.0601 -0.4382,0.0654 -0.4246,0.0705 -0.4112,0.0754 -0.3980,0.0800 -0.3851,0.0844 -0.3724,0.0885 -0.3600,0.0924 -0.3479,0.0961 -0.3359,0.0996 -0.3243,0.1028 -0.3128,0.1058 -0.3017,0.1085 -0.2907,0.1111 -0.2801,0.1134 -0.2696,0.1154 -0.2594,0.1172 -0.2495,0.1188 -0.2398,0.1202 -0.2304,0.1213 -0.2212,0.1222 -0.2122,0.1229 -0.2035,0.1233 -0.1951,0.1235 -0.1869,0.1235 -0.1789,0.1232 -0.1712,0.1227 -0.1637,0.1219 -0.1565,0.1210 -0.1495,0.1198 -0.1428,0.1183 -0.1364,0.1167 -0.1301,0.1148 -0.1241,0.1126 -0.1184,0.1103 -0.1129,0.1077 -0.1077,0.1048 -0.1027,0.1018 -0.0980,0.0985 -0.0935,0.0949 -0.0892,0.0912 -0.0852,0.0872 -0.0815,0.0829 -0.0780,0.0785 -0.0747,0.0738 -0.0717,0.0688 -0.0689,0.0637 -0.0664,0.0583 -0.0641,0.0526 -0.0621,0.0468 -0.0604,0.0407 -0.0588,0.0343 -0.0575,0.0278 -0.0565,0.0210 -0.0557,0.0140 -0.0552,0.0067 -0.0549,-0.0008 -0.0549,-0.0085 -0.0551,-0.0165 -0.0555,-0.0247 -0.0562,-0.0331 -0.0572,-0.0418 -0.0584,-0.0507 -0.0598,-0.0598 -0.0615,-0.0691 -0.0634,-0.0787 -0.0656,-0.0886 -0.0681,-0.0986 -0.0707,-0.1089 -0.0737,-0.1194 -0.0768,-0.1302 -0.0803,-0.1412 -0.0839,-0.1524 -0.0879,-0.1638 -0.0920,-0.1755 -0.0964,-0.1875 -0.1011,-0.1996 -0.1060,-0.2120 -0.1112,-0.2246 -0.1166,-0.2375 -0.1222,-0.2505 -0.1281,-0.2639 -0.1342,-0.2774 -0.1406,-0.2912 -0.1473,-0.3052 -0.1542,-0.3195 -0.1613,-0.3340 -0.1687,-0.3487 -0.1763,-0.3636 -0.1842,-0.3788 -0.1923,-0.3942"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0300" height="0.0300" x="-0.6197" y="-0.0209"/><rect width="0.0300" height="0.0300" x="-0.2073" y="-0.4092"/></g><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.2201" cy="0.3824" r="0.0150"/></g><g stroke-width="0.0020" stroke="rgb(40%, 40%, 40%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.5498" height="0.5177" x="-0.6047" y="-0.3942"/></g></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.8432" height="0.8026" x="-0.6139" y="-0.4072"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.8270" height="0.0032" x="-0.6058" y="0.3903"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6047,0.3824 -0.6047,-0.3942"/><polyline points="-0.3985,0.3824 -0.3985,-0.3942"/><polyline points="-0.1923,0.3824 -0.1923,-0.3942"/><polyline points="0.0139,0.3824 0.0139,-0.3942"/><polyline points="0.2201,0.3824 0.2201,-0.3942"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6047,0.4155+-0.6047,0.3919"/><polyline points="-0.3985,0.4155+-0.3985,0.3919"/><polyline points="-0.1923,0.4155+-0.1923,0.3919"/><polyline points="0.0139,0.4155+0.0139,0.3919"/><polyline points="0.2201,0.4155+0.2201,0.3919"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6047" y="0.4590">0.0</text><text x="-0.3985" y="0.4590">0.5</text><text x="-0.1923" y="0.4590">1.0</text><text x="0.0139" y="0.4590">1.5</text><text x="0.2201" y="0.4590">2.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0022" height="0.7798" x="-0.6125" y="-0.3958"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6047,0.3824 0.2201,0.3824"/><polyline points="-0.6047,0.1882 0.2201,0.1882"/><polyline points="-0.6047,-0.0059 0.2201,-0.0059"/><polyline points="-0.6047,-0.2001 0.2201,-0.2001"/><polyline points="-0.6047,-0.3942 0.2201,-0.3942"/></g></g><g class="tickglyph"><g stroke-width="0.0022" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6282,0.3824+-0.6114,0.3824"/><polyline points="-0.6282,0.1882+-0.6114,0.1882"/><polyline points="-0.6282,-0.0059+-0.6114,-0.0059"/><polyline points="-0.6282,-0.2001+-0.6114,-0.2001"/><polyline points="-0.6282,-0.3942+-0.6114,-0.3942"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6740" y="0.3911">-1.0</text><text x="-0.6740" y="0.1969">-0.5</text><text x="-0.6740" y="0.0028"> 0.0</text><text x="-0.6740" y="-0.1914"> 0.5</text><text x="-0.6740" y="-0.3855"> 1.0</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.4369" height="0.3842" x="0.2880" y="-0.1980"/></g></g><g class="legendContent"><g stroke-width="0.0014" stroke="rgb(40%, 40%, 40%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.05"><rect width="0.0279" height="0.0395" x="0.6464" y="0.1250"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0279" text-anchor="start"><text x="0.3019" y="0.1546">Bounding Box</text></g><g stroke-width="0.0004" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><circle cx="0.6599" cy="0.0816" r="0.0140"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0279" text-anchor="start"><text x="0.3019" y="0.0914">Path Control Point</text></g><g stroke-width="0.0004" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0279" height="0.0279" x="0.6459" y="0.0044"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0279" text-anchor="start"><text x="0.3019" y="0.0283">Path Endpoints</text></g><g stroke-width="0.0011" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6462,-0.0447 0.7021,-0.0447"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0279" text-anchor="start"><text x="0.3019" y="-0.0349">Path Chord</text></g><g stroke-width="0.0279" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.2"><path d="M 0.6596,-0.1191 Q 0.7155,-0.0796 0.6876,-0.1585"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0279" text-anchor="start"><text x="0.3019" y="-0.1224">Path Fill</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0300" text-anchor="middle"><text x="0" y="-0.4495">QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1))</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ other/rect.svg view
@@ -0,0 +1,39 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7507 -0.5 1.5015 1.0012"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="rect"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.4"><rect width="0.0242" height="0.0000" x="-0.6056" y="0.4017"/><rect width="0.0242" height="0.0000" x="-0.5814" y="0.4017"/><rect width="0.0242" height="0.0000" x="-0.5572" y="0.4017"/><rect width="0.0242" height="0.0001" x="-0.5329" y="0.4016"/><rect width="0.0242" height="0.0002" x="-0.5087" y="0.4015"/><rect width="0.0242" height="0.0005" x="-0.4845" y="0.4013"/><rect width="0.0242" height="0.0010" x="-0.4603" y="0.4007"/><rect width="0.0242" height="0.0020" x="-0.4360" y="0.3997"/><rect width="0.0242" height="0.0039" x="-0.4118" y="0.3978"/><rect width="0.0242" height="0.0074" x="-0.3876" y="0.3943"/><rect width="0.0242" height="0.0135" x="-0.3634" y="0.3882"/><rect width="0.0242" height="0.0237" x="-0.3391" y="0.3780"/><rect width="0.0242" height="0.0398" x="-0.3149" y="0.3619"/><rect width="0.0242" height="0.0643" x="-0.2907" y="0.3374"/><rect width="0.0242" height="0.0999" x="-0.2665" y="0.3018"/><rect width="0.0242" height="0.1491" x="-0.2422" y="0.2527"/><rect width="0.0242" height="0.2136" x="-0.2180" y="0.1881"/><rect width="0.0242" height="0.2942" x="-0.1938" y="0.1075"/><rect width="0.0242" height="0.3893" x="-0.1696" y="0.0124"/><rect width="0.0242" height="0.4949" x="-0.1453" y="-0.0932"/><rect width="0.0242" height="0.6044" x="-0.1211" y="-0.2027"/><rect width="0.0242" height="0.7093" x="-0.0969" y="-0.3076"/><rect width="0.0242" height="0.7997" x="-0.0727" y="-0.3980"/><rect width="0.0242" height="0.8664" x="-0.0484" y="-0.4646"/><rect width="0.0242" height="0.9017" x="-0.0242" y="-0.5"/><rect width="0.0242" height="0.9017" x="0" y="-0.5"/><rect width="0.0242" height="0.8664" x="0.0242" y="-0.4646"/><rect width="0.0242" height="0.7997" x="0.0484" y="-0.3980"/><rect width="0.0242" height="0.7093" x="0.0727" y="-0.3076"/><rect width="0.0242" height="0.6044" x="0.0969" y="-0.2027"/><rect width="0.0242" height="0.4949" x="0.1211" y="-0.0932"/><rect width="0.0242" height="0.3893" x="0.1453" y="0.0124"/><rect width="0.0242" height="0.2942" x="0.1696" y="0.1075"/><rect width="0.0242" height="0.2136" x="0.1938" y="0.1881"/><rect width="0.0242" height="0.1491" x="0.2180" y="0.2527"/><rect width="0.0242" height="0.0999" x="0.2422" y="0.3018"/><rect width="0.0242" height="0.0643" x="0.2665" y="0.3374"/><rect width="0.0242" height="0.0398" x="0.2907" y="0.3619"/><rect width="0.0242" height="0.0237" x="0.3149" y="0.3780"/><rect width="0.0242" height="0.0135" x="0.3391" y="0.3882"/><rect width="0.0242" height="0.0074" x="0.3634" y="0.3943"/><rect width="0.0242" height="0.0039" x="0.3876" y="0.3978"/><rect width="0.0242" height="0.0020" x="0.4118" y="0.3997"/><rect width="0.0242" height="0.0010" x="0.4360" y="0.4007"/><rect width="0.0242" height="0.0005" x="0.4603" y="0.4013"/><rect width="0.0242" height="0.0002" x="0.4845" y="0.4015"/><rect width="0.0242" height="0.0001" x="0.5087" y="0.4016"/><rect width="0.0242" height="0.0000" x="0.5329" y="0.4017"/><rect width="0.0242" height="0.0000" x="0.5572" y="0.4017"/><rect width="0.0242" height="0.0000" x="0.5814" y="0.4017"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.4"><rect width="0.0242" height="0.0225" x="-0.6056" y="0.3792"/><rect width="0.0242" height="0.0286" x="-0.5814" y="0.3731"/><rect width="0.0242" height="0.0360" x="-0.5572" y="0.3657"/><rect width="0.0242" height="0.0449" x="-0.5329" y="0.3568"/><rect width="0.0242" height="0.0554" x="-0.5087" y="0.3463"/><rect width="0.0242" height="0.0677" x="-0.4845" y="0.3340"/><rect width="0.0242" height="0.0819" x="-0.4603" y="0.3199"/><rect width="0.0242" height="0.0980" x="-0.4360" y="0.3037"/><rect width="0.0242" height="0.1162" x="-0.4118" y="0.2856"/><rect width="0.0242" height="0.1363" x="-0.3876" y="0.2654"/><rect width="0.0242" height="0.1584" x="-0.3634" y="0.2433"/><rect width="0.0242" height="0.1822" x="-0.3391" y="0.2196"/><rect width="0.0242" height="0.2075" x="-0.3149" y="0.1943"/><rect width="0.0242" height="0.2339" x="-0.2907" y="0.1678"/><rect width="0.0242" height="0.2611" x="-0.2665" y="0.1406"/><rect width="0.0242" height="0.2886" x="-0.2422" y="0.1132"/><rect width="0.0242" height="0.3157" x="-0.2180" y="0.0860"/><rect width="0.0242" height="0.3420" x="-0.1938" y="0.0597"/><rect width="0.0242" height="0.3668" x="-0.1696" y="0.0349"/><rect width="0.0242" height="0.3895" x="-0.1453" y="0.0122"/><rect width="0.0242" height="0.4095" x="-0.1211" y="-0.0078"/><rect width="0.0242" height="0.4262" x="-0.0969" y="-0.0245"/><rect width="0.0242" height="0.4392" x="-0.0727" y="-0.0375"/><rect width="0.0242" height="0.4480" x="-0.0484" y="-0.0463"/><rect width="0.0242" height="0.4526" x="-0.0242" y="-0.0508"/><rect width="0.0242" height="0.4526" x="0" y="-0.0508"/><rect width="0.0242" height="0.4480" x="0.0242" y="-0.0463"/><rect width="0.0242" height="0.4392" x="0.0484" y="-0.0375"/><rect width="0.0242" height="0.4262" x="0.0727" y="-0.0245"/><rect width="0.0242" height="0.4095" x="0.0969" y="-0.0078"/><rect width="0.0242" height="0.3895" x="0.1211" y="0.0122"/><rect width="0.0242" height="0.3668" x="0.1453" y="0.0349"/><rect width="0.0242" height="0.3420" x="0.1696" y="0.0597"/><rect width="0.0242" height="0.3157" x="0.1938" y="0.0860"/><rect width="0.0242" height="0.2886" x="0.2180" y="0.1132"/><rect width="0.0242" height="0.2611" x="0.2422" y="0.1406"/><rect width="0.0242" height="0.2339" x="0.2665" y="0.1678"/><rect width="0.0242" height="0.2075" x="0.2907" y="0.1943"/><rect width="0.0242" height="0.1822" x="0.3149" y="0.2196"/><rect width="0.0242" height="0.1584" x="0.3391" y="0.2433"/><rect width="0.0242" height="0.1363" x="0.3634" y="0.2654"/><rect width="0.0242" height="0.1162" x="0.3876" y="0.2856"/><rect width="0.0242" height="0.0980" x="0.4118" y="0.3037"/><rect width="0.0242" height="0.0819" x="0.4360" y="0.3199"/><rect width="0.0242" height="0.0677" x="0.4603" y="0.3340"/><rect width="0.0242" height="0.0554" x="0.4845" y="0.3463"/><rect width="0.0242" height="0.0449" x="0.5087" y="0.3568"/><rect width="0.0242" height="0.0360" x="0.5329" y="0.3657"/><rect width="0.0242" height="0.0286" x="0.5572" y="0.3731"/><rect width="0.0242" height="0.0225" x="0.5814" y="0.3792"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.4574" height="0.0036" x="-0.7287" y="0.4107"/></g></g><g class="ticks"><g class="tickglyph"><g stroke-width="0.0036" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7267,0.4396+-0.7267,0.4125"/><polyline points="-0.4845,0.4396+-0.4845,0.4125"/><polyline points="-0.2422,0.4396+-0.2422,0.4125"/><polyline points="0,0.4396+0,0.4125"/><polyline points="0.2422,0.4396+0.2422,0.4125"/><polyline points="0.4845,0.4396+0.4845,0.4125"/><polyline points="0.7267,0.4396+0.7267,0.4125"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.7267" y="0.4892">-6</text><text x="-0.4845" y="0.4892">-4</text><text x="-0.2422" y="0.4892">-2</text><text x="0" y="0.4892"> 0</text><text x="0.2422" y="0.4892"> 2</text><text x="0.4845" y="0.4892"> 4</text><text x="0.7267" y="0.4892"> 6</text></g></g></g></g></g></svg>
+ other/sbar.svg view
@@ -0,0 +1,42 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.7773 -0.5 1.5273 1.0189"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="barchart"><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.7"><rect width="0.1018" height="0.0436" x="-0.7258" y="0.2411"/><rect width="0.1018" height="0.0872" x="-0.6127" y="0.1539"/><rect width="0.1018" height="0.1308" x="-0.4996" y="0.0667"/><rect width="0.1018" height="0.2180" x="-0.3865" y="-0.0641"/><rect width="0.1018" height="0.3488" x="-0.2734" y="-0.2384"/><rect width="0.1018" height="0" x="-0.1603" y="0.0667"/><rect width="0.1018" height="0.0872" x="-0.0472" y="0.0231"/><rect width="0.1018" height="0.4795" x="0.0659" y="-0.5"/><rect width="0.1018" height="0.0872" x="0.1790" y="-0.1512"/><rect width="0.1018" height="0.0436" x="0.2921" y="-0.1512"/></g><g stroke-width="0" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.7"><rect width="0.1018" height="0.0436" x="-0.7258" y="0.2847"/><rect width="0.1018" height="0.0872" x="-0.6127" y="0.2411"/><rect width="0.1018" height="0.1308" x="-0.4996" y="0.1975"/><rect width="0.1018" height="0.1744" x="-0.3865" y="0.1539"/><rect width="0.1018" height="0.2180" x="-0.2734" y="0.1103"/><rect width="0.1018" height="0.2616" x="-0.1603" y="0.0667"/><rect width="0.1018" height="0.3052" x="-0.0472" y="0.0231"/><rect width="0.1018" height="0.3488" x="0.0659" y="-0.0205"/><rect width="0.1018" height="0.3923" x="0.1790" y="-0.0641"/><rect width="0.1018" height="0.4359" x="0.2921" y="-0.1077"/></g></g></g><g class="hud"><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.1227" height="0.0033" x="-0.7272" y="0.3366"/></g></g><g class="ticks"><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6698,0.3631+-0.6698,0.3382"/><polyline points="-0.5578,0.3631+-0.5578,0.3382"/><polyline points="-0.4458,0.3631+-0.4458,0.3382"/><polyline points="-0.3339,0.3631+-0.3339,0.3382"/><polyline points="-0.2219,0.3631+-0.2219,0.3382"/><polyline points="-0.1099,0.3631+-0.1099,0.3382"/><polyline points="0.0020,0.3631+0.0020,0.3382"/><polyline points="0.1140,0.3631+0.1140,0.3382"/><polyline points="0.2260,0.3631+0.2260,0.3382"/><polyline points="0.3380,0.3631+0.3380,0.3382"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6698" y="0.4086" transform="rotate(-45.0, -0.6698, 0.4086)">row 1</text><text x="-0.5578" y="0.4086" transform="rotate(-45.0, -0.5578, 0.4086)">row 2</text><text x="-0.4458" y="0.4086" transform="rotate(-45.0, -0.4458, 0.4086)">row 3</text><text x="-0.3339" y="0.4086" transform="rotate(-45.0, -0.3339, 0.4086)">row 4</text><text x="-0.2219" y="0.4086" transform="rotate(-45.0, -0.2219, 0.4086)">row 5</text><text x="-0.1099" y="0.4086" transform="rotate(-45.0, -0.1099, 0.4086)">row 6</text><text x="0.0020" y="0.4086" transform="rotate(-45.0, 0.0020, 0.4086)">row 7</text><text x="0.1140" y="0.4086" transform="rotate(-45.0, 0.1140, 0.4086)">row 8</text><text x="0.2260" y="0.4086" transform="rotate(-45.0, 0.2260, 0.4086)">row 9</text><text x="0.3380" y="0.4086" transform="rotate(-45.0, 0.3380, 0.4086)">row 10</text></g></g></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0009" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.2740" height="0.1864" x="0.4723" y="-0.1790"/></g></g><g class="legendContent"><g stroke-width="0" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.7"><rect width="0.0560" height="0.0621" x="0.6716" y="-0.0755"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0299" text-anchor="start"><text x="0.4910" y="-0.0362">column 2</text></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.7"><rect width="0.0560" height="0.0621" x="0.6716" y="-0.1583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0299" text-anchor="start"><text x="0.4910" y="-0.1190">column 1</text></g></g></g></g></svg>
+ other/stack.svg view
@@ -0,0 +1,357 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.4423 0.5691,0.4423 0.6531,0.3359"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.4689 0.7204,0.3891"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5271,0.3625 0.5271,0.4689"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.4838" y="0.3349"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.4847" y="0.4702"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.4689 0.4851,0.3359"/><polyline points="0.5271,0.4689 0.5271,0.3359"/><polyline points="0.5691,0.4689 0.5691,0.3359"/><polyline points="0.6111,0.4689 0.6111,0.3359"/><polyline points="0.6531,0.4689 0.6531,0.3359"/><polyline points="0.6952,0.4689 0.6952,0.3359"/><polyline points="0.7372,0.4689 0.7372,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4851,0.4748+0.4851,0.4703"/><polyline points="0.5271,0.4748+0.5271,0.4703"/><polyline points="0.5691,0.4748+0.5691,0.4703"/><polyline points="0.6111,0.4748+0.6111,0.4703"/><polyline points="0.6531,0.4748+0.6531,0.4703"/><polyline points="0.6952,0.4748+0.6952,0.4703"/><polyline points="0.7372,0.4748+0.7372,0.4703"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.4851" y="0.4819">0.0</text><text x="0.5271" y="0.4819">0.5</text><text x="0.5691" y="0.4819">1.0</text><text x="0.6111" y="0.4819">1.5</text><text x="0.6531" y="0.4819">2.0</text><text x="0.6952" y="0.4819">2.5</text><text x="0.7372" y="0.4819">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.4827" y="0.3356"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.4689 0.7372,0.4689"/><polyline points="0.4851,0.4423 0.7372,0.4423"/><polyline points="0.4851,0.4157 0.7372,0.4157"/><polyline points="0.4851,0.3891 0.7372,0.3891"/><polyline points="0.4851,0.3625 0.7372,0.3625"/><polyline points="0.4851,0.3359 0.7372,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4783,0.4689+0.4828,0.4689"/><polyline points="0.4783,0.4423+0.4828,0.4423"/><polyline points="0.4783,0.4157+0.4828,0.4157"/><polyline points="0.4783,0.3891+0.4828,0.3891"/><polyline points="0.4783,0.3625+0.4828,0.3625"/><polyline points="0.4783,0.3359+0.4828,0.3359"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4743" y="0.4704">0</text><text x="0.4743" y="0.4438">1</text><text x="0.4743" y="0.4172">2</text><text x="0.4743" y="0.3906">3</text><text x="0.4743" y="0.3640">4</text><text x="0.4743" y="0.3374">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.6067" y="0.3245">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.6269" y="0.4336"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.4583 0.7065,0.4583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.4596">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.4491 0.7065,0.4491"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.4504">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.4399 0.7065,0.4399"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.4412">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.7433" y="0.4931">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.4635" y="0.3107"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.4423 0.2657,0.4423 0.3498,0.3359"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.4689 0.4170,0.3891"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.2237,0.3625 0.2237,0.4689"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.1804" y="0.3349"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.1813" y="0.4702"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.4689 0.1817,0.3359"/><polyline points="0.2237,0.4689 0.2237,0.3359"/><polyline points="0.2657,0.4689 0.2657,0.3359"/><polyline points="0.3078,0.4689 0.3078,0.3359"/><polyline points="0.3498,0.4689 0.3498,0.3359"/><polyline points="0.3918,0.4689 0.3918,0.3359"/><polyline points="0.4338,0.4689 0.4338,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1817,0.4748+0.1817,0.4703"/><polyline points="0.2237,0.4748+0.2237,0.4703"/><polyline points="0.2657,0.4748+0.2657,0.4703"/><polyline points="0.3078,0.4748+0.3078,0.4703"/><polyline points="0.3498,0.4748+0.3498,0.4703"/><polyline points="0.3918,0.4748+0.3918,0.4703"/><polyline points="0.4338,0.4748+0.4338,0.4703"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.1817" y="0.4819">0.0</text><text x="0.2237" y="0.4819">0.5</text><text x="0.2657" y="0.4819">1.0</text><text x="0.3078" y="0.4819">1.5</text><text x="0.3498" y="0.4819">2.0</text><text x="0.3918" y="0.4819">2.5</text><text x="0.4338" y="0.4819">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.1793" y="0.3356"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.4689 0.4338,0.4689"/><polyline points="0.1817,0.4423 0.4338,0.4423"/><polyline points="0.1817,0.4157 0.4338,0.4157"/><polyline points="0.1817,0.3891 0.4338,0.3891"/><polyline points="0.1817,0.3625 0.4338,0.3625"/><polyline points="0.1817,0.3359 0.4338,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1749,0.4689+0.1794,0.4689"/><polyline points="0.1749,0.4423+0.1794,0.4423"/><polyline points="0.1749,0.4157+0.1794,0.4157"/><polyline points="0.1749,0.3891+0.1794,0.3891"/><polyline points="0.1749,0.3625+0.1794,0.3625"/><polyline points="0.1749,0.3359+0.1794,0.3359"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1709" y="0.4704">0</text><text x="0.1709" y="0.4438">1</text><text x="0.1709" y="0.4172">2</text><text x="0.1709" y="0.3906">3</text><text x="0.1709" y="0.3640">4</text><text x="0.1709" y="0.3374">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.3034" y="0.3245">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.3235" y="0.4336"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.4583 0.4032,0.4583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.4596">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.4491 0.4032,0.4491"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.4504">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.4399 0.4032,0.4399"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.4412">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4399" y="0.4931">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.1601" y="0.3107"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.4423 -0.0376,0.4423 0.0464,0.3359"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.4689 0.1136,0.3891"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.0797,0.3625 -0.0797,0.4689"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.1230" y="0.3349"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.1220" y="0.4702"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.4689 -0.1217,0.3359"/><polyline points="-0.0797,0.4689 -0.0797,0.3359"/><polyline points="-0.0376,0.4689 -0.0376,0.3359"/><polyline points="0.0044,0.4689 0.0044,0.3359"/><polyline points="0.0464,0.4689 0.0464,0.3359"/><polyline points="0.0884,0.4689 0.0884,0.3359"/><polyline points="0.1305,0.4689 0.1305,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1217,0.4748+-0.1217,0.4703"/><polyline points="-0.0797,0.4748+-0.0797,0.4703"/><polyline points="-0.0376,0.4748+-0.0376,0.4703"/><polyline points="0.0044,0.4748+0.0044,0.4703"/><polyline points="0.0464,0.4748+0.0464,0.4703"/><polyline points="0.0884,0.4748+0.0884,0.4703"/><polyline points="0.1305,0.4748+0.1305,0.4703"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.1217" y="0.4819">0.0</text><text x="-0.0797" y="0.4819">0.5</text><text x="-0.0376" y="0.4819">1.0</text><text x="0.0044" y="0.4819">1.5</text><text x="0.0464" y="0.4819">2.0</text><text x="0.0884" y="0.4819">2.5</text><text x="0.1305" y="0.4819">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.1240" y="0.3356"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.4689 0.1305,0.4689"/><polyline points="-0.1217,0.4423 0.1305,0.4423"/><polyline points="-0.1217,0.4157 0.1305,0.4157"/><polyline points="-0.1217,0.3891 0.1305,0.3891"/><polyline points="-0.1217,0.3625 0.1305,0.3625"/><polyline points="-0.1217,0.3359 0.1305,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1285,0.4689+-0.1240,0.4689"/><polyline points="-0.1285,0.4423+-0.1240,0.4423"/><polyline points="-0.1285,0.4157+-0.1240,0.4157"/><polyline points="-0.1285,0.3891+-0.1240,0.3891"/><polyline points="-0.1285,0.3625+-0.1240,0.3625"/><polyline points="-0.1285,0.3359+-0.1240,0.3359"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1325" y="0.4704">0</text><text x="-0.1325" y="0.4438">1</text><text x="-0.1325" y="0.4172">2</text><text x="-0.1325" y="0.3906">3</text><text x="-0.1325" y="0.3640">4</text><text x="-0.1325" y="0.3374">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0" y="0.3245">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.0202" y="0.4336"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.4583 0.0998,0.4583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.4596">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.4491 0.0998,0.4491"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.4504">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.4399 0.0998,0.4399"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.4412">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1365" y="0.4931">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.1433" y="0.3107"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.4423 -0.3410,0.4423 -0.2570,0.3359"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.4689 -0.1897,0.3891"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.3830,0.3625 -0.3830,0.4689"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.4263" y="0.3349"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.4254" y="0.4702"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.4689 -0.4251,0.3359"/><polyline points="-0.3830,0.4689 -0.3830,0.3359"/><polyline points="-0.3410,0.4689 -0.3410,0.3359"/><polyline points="-0.2990,0.4689 -0.2990,0.3359"/><polyline points="-0.2570,0.4689 -0.2570,0.3359"/><polyline points="-0.2149,0.4689 -0.2149,0.3359"/><polyline points="-0.1729,0.4689 -0.1729,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4251,0.4748+-0.4251,0.4703"/><polyline points="-0.3830,0.4748+-0.3830,0.4703"/><polyline points="-0.3410,0.4748+-0.3410,0.4703"/><polyline points="-0.2990,0.4748+-0.2990,0.4703"/><polyline points="-0.2570,0.4748+-0.2570,0.4703"/><polyline points="-0.2149,0.4748+-0.2149,0.4703"/><polyline points="-0.1729,0.4748+-0.1729,0.4703"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.4251" y="0.4819">0.0</text><text x="-0.3830" y="0.4819">0.5</text><text x="-0.3410" y="0.4819">1.0</text><text x="-0.2990" y="0.4819">1.5</text><text x="-0.2570" y="0.4819">2.0</text><text x="-0.2149" y="0.4819">2.5</text><text x="-0.1729" y="0.4819">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.4274" y="0.3356"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.4689 -0.1729,0.4689"/><polyline points="-0.4251,0.4423 -0.1729,0.4423"/><polyline points="-0.4251,0.4157 -0.1729,0.4157"/><polyline points="-0.4251,0.3891 -0.1729,0.3891"/><polyline points="-0.4251,0.3625 -0.1729,0.3625"/><polyline points="-0.4251,0.3359 -0.1729,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4319,0.4689+-0.4274,0.4689"/><polyline points="-0.4319,0.4423+-0.4274,0.4423"/><polyline points="-0.4319,0.4157+-0.4274,0.4157"/><polyline points="-0.4319,0.3891+-0.4274,0.3891"/><polyline points="-0.4319,0.3625+-0.4274,0.3625"/><polyline points="-0.4319,0.3359+-0.4274,0.3359"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4358" y="0.4704">0</text><text x="-0.4358" y="0.4438">1</text><text x="-0.4358" y="0.4172">2</text><text x="-0.4358" y="0.3906">3</text><text x="-0.4358" y="0.3640">4</text><text x="-0.4358" y="0.3374">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.3034" y="0.3245">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.2832" y="0.4336"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.4583 -0.2036,0.4583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.4596">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.4491 -0.2036,0.4491"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.4504">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.4399 -0.2036,0.4399"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.4412">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1669" y="0.4931">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.4466" y="0.3107"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.4423 -0.6444,0.4423 -0.5603,0.3359"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.4689 -0.4931,0.3891"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6864,0.3625 -0.6864,0.4689"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.7297" y="0.3349"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.7288" y="0.4702"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.4689 -0.7284,0.3359"/><polyline points="-0.6864,0.4689 -0.6864,0.3359"/><polyline points="-0.6444,0.4689 -0.6444,0.3359"/><polyline points="-0.6024,0.4689 -0.6024,0.3359"/><polyline points="-0.5603,0.4689 -0.5603,0.3359"/><polyline points="-0.5183,0.4689 -0.5183,0.3359"/><polyline points="-0.4763,0.4689 -0.4763,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7284,0.4748+-0.7284,0.4703"/><polyline points="-0.6864,0.4748+-0.6864,0.4703"/><polyline points="-0.6444,0.4748+-0.6444,0.4703"/><polyline points="-0.6024,0.4748+-0.6024,0.4703"/><polyline points="-0.5603,0.4748+-0.5603,0.4703"/><polyline points="-0.5183,0.4748+-0.5183,0.4703"/><polyline points="-0.4763,0.4748+-0.4763,0.4703"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.7284" y="0.4819">0.0</text><text x="-0.6864" y="0.4819">0.5</text><text x="-0.6444" y="0.4819">1.0</text><text x="-0.6024" y="0.4819">1.5</text><text x="-0.5603" y="0.4819">2.0</text><text x="-0.5183" y="0.4819">2.5</text><text x="-0.4763" y="0.4819">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.7308" y="0.3356"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.4689 -0.4763,0.4689"/><polyline points="-0.7284,0.4423 -0.4763,0.4423"/><polyline points="-0.7284,0.4157 -0.4763,0.4157"/><polyline points="-0.7284,0.3891 -0.4763,0.3891"/><polyline points="-0.7284,0.3625 -0.4763,0.3625"/><polyline points="-0.7284,0.3359 -0.4763,0.3359"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7352,0.4689+-0.7307,0.4689"/><polyline points="-0.7352,0.4423+-0.7307,0.4423"/><polyline points="-0.7352,0.4157+-0.7307,0.4157"/><polyline points="-0.7352,0.3891+-0.7307,0.3891"/><polyline points="-0.7352,0.3625+-0.7307,0.3625"/><polyline points="-0.7352,0.3359+-0.7307,0.3359"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.7392" y="0.4704">0</text><text x="-0.7392" y="0.4438">1</text><text x="-0.7392" y="0.4172">2</text><text x="-0.7392" y="0.3906">3</text><text x="-0.7392" y="0.3640">4</text><text x="-0.7392" y="0.3374">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.6067" y="0.3245">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.5866" y="0.4336"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.4583 -0.5069,0.4583"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.4596">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.4491 -0.5069,0.4491"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.4504">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.4399 -0.5069,0.4399"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.4412">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4702" y="0.4931">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.75" y="0.3107"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.2396 0.5691,0.2396 0.6531,0.1332"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.2662 0.7204,0.1864"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5271,0.1598 0.5271,0.2662"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.4838" y="0.1322"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.4847" y="0.2676"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.2662 0.4851,0.1332"/><polyline points="0.5271,0.2662 0.5271,0.1332"/><polyline points="0.5691,0.2662 0.5691,0.1332"/><polyline points="0.6111,0.2662 0.6111,0.1332"/><polyline points="0.6531,0.2662 0.6531,0.1332"/><polyline points="0.6952,0.2662 0.6952,0.1332"/><polyline points="0.7372,0.2662 0.7372,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4851,0.2721+0.4851,0.2676"/><polyline points="0.5271,0.2721+0.5271,0.2676"/><polyline points="0.5691,0.2721+0.5691,0.2676"/><polyline points="0.6111,0.2721+0.6111,0.2676"/><polyline points="0.6531,0.2721+0.6531,0.2676"/><polyline points="0.6952,0.2721+0.6952,0.2676"/><polyline points="0.7372,0.2721+0.7372,0.2676"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.4851" y="0.2792">0.0</text><text x="0.5271" y="0.2792">0.5</text><text x="0.5691" y="0.2792">1.0</text><text x="0.6111" y="0.2792">1.5</text><text x="0.6531" y="0.2792">2.0</text><text x="0.6952" y="0.2792">2.5</text><text x="0.7372" y="0.2792">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.4827" y="0.1330"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.2662 0.7372,0.2662"/><polyline points="0.4851,0.2396 0.7372,0.2396"/><polyline points="0.4851,0.2130 0.7372,0.2130"/><polyline points="0.4851,0.1864 0.7372,0.1864"/><polyline points="0.4851,0.1598 0.7372,0.1598"/><polyline points="0.4851,0.1332 0.7372,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4783,0.2662+0.4828,0.2662"/><polyline points="0.4783,0.2396+0.4828,0.2396"/><polyline points="0.4783,0.2130+0.4828,0.2130"/><polyline points="0.4783,0.1864+0.4828,0.1864"/><polyline points="0.4783,0.1598+0.4828,0.1598"/><polyline points="0.4783,0.1332+0.4828,0.1332"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4743" y="0.2677">0</text><text x="0.4743" y="0.2411">1</text><text x="0.4743" y="0.2145">2</text><text x="0.4743" y="0.1879">3</text><text x="0.4743" y="0.1613">4</text><text x="0.4743" y="0.1347">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.6067" y="0.1219">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.6269" y="0.2310"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.2556 0.7065,0.2556"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.2570">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.2464 0.7065,0.2464"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.2478">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.2372 0.7065,0.2372"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.2386">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.7433" y="0.2904">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.4635" y="0.1080"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.2396 0.2657,0.2396 0.3498,0.1332"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.2662 0.4170,0.1864"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.2237,0.1598 0.2237,0.2662"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.1804" y="0.1322"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.1813" y="0.2676"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.2662 0.1817,0.1332"/><polyline points="0.2237,0.2662 0.2237,0.1332"/><polyline points="0.2657,0.2662 0.2657,0.1332"/><polyline points="0.3078,0.2662 0.3078,0.1332"/><polyline points="0.3498,0.2662 0.3498,0.1332"/><polyline points="0.3918,0.2662 0.3918,0.1332"/><polyline points="0.4338,0.2662 0.4338,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1817,0.2721+0.1817,0.2676"/><polyline points="0.2237,0.2721+0.2237,0.2676"/><polyline points="0.2657,0.2721+0.2657,0.2676"/><polyline points="0.3078,0.2721+0.3078,0.2676"/><polyline points="0.3498,0.2721+0.3498,0.2676"/><polyline points="0.3918,0.2721+0.3918,0.2676"/><polyline points="0.4338,0.2721+0.4338,0.2676"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.1817" y="0.2792">0.0</text><text x="0.2237" y="0.2792">0.5</text><text x="0.2657" y="0.2792">1.0</text><text x="0.3078" y="0.2792">1.5</text><text x="0.3498" y="0.2792">2.0</text><text x="0.3918" y="0.2792">2.5</text><text x="0.4338" y="0.2792">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.1793" y="0.1330"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.2662 0.4338,0.2662"/><polyline points="0.1817,0.2396 0.4338,0.2396"/><polyline points="0.1817,0.2130 0.4338,0.2130"/><polyline points="0.1817,0.1864 0.4338,0.1864"/><polyline points="0.1817,0.1598 0.4338,0.1598"/><polyline points="0.1817,0.1332 0.4338,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1749,0.2662+0.1794,0.2662"/><polyline points="0.1749,0.2396+0.1794,0.2396"/><polyline points="0.1749,0.2130+0.1794,0.2130"/><polyline points="0.1749,0.1864+0.1794,0.1864"/><polyline points="0.1749,0.1598+0.1794,0.1598"/><polyline points="0.1749,0.1332+0.1794,0.1332"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1709" y="0.2677">0</text><text x="0.1709" y="0.2411">1</text><text x="0.1709" y="0.2145">2</text><text x="0.1709" y="0.1879">3</text><text x="0.1709" y="0.1613">4</text><text x="0.1709" y="0.1347">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.3034" y="0.1219">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.3235" y="0.2310"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.2556 0.4032,0.2556"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.2570">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.2464 0.4032,0.2464"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.2478">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.2372 0.4032,0.2372"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.2386">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4399" y="0.2904">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.1601" y="0.1080"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.2396 -0.0376,0.2396 0.0464,0.1332"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.2662 0.1136,0.1864"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.0797,0.1598 -0.0797,0.2662"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.1230" y="0.1322"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.1220" y="0.2676"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.2662 -0.1217,0.1332"/><polyline points="-0.0797,0.2662 -0.0797,0.1332"/><polyline points="-0.0376,0.2662 -0.0376,0.1332"/><polyline points="0.0044,0.2662 0.0044,0.1332"/><polyline points="0.0464,0.2662 0.0464,0.1332"/><polyline points="0.0884,0.2662 0.0884,0.1332"/><polyline points="0.1305,0.2662 0.1305,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1217,0.2721+-0.1217,0.2676"/><polyline points="-0.0797,0.2721+-0.0797,0.2676"/><polyline points="-0.0376,0.2721+-0.0376,0.2676"/><polyline points="0.0044,0.2721+0.0044,0.2676"/><polyline points="0.0464,0.2721+0.0464,0.2676"/><polyline points="0.0884,0.2721+0.0884,0.2676"/><polyline points="0.1305,0.2721+0.1305,0.2676"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.1217" y="0.2792">0.0</text><text x="-0.0797" y="0.2792">0.5</text><text x="-0.0376" y="0.2792">1.0</text><text x="0.0044" y="0.2792">1.5</text><text x="0.0464" y="0.2792">2.0</text><text x="0.0884" y="0.2792">2.5</text><text x="0.1305" y="0.2792">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.1240" y="0.1330"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.2662 0.1305,0.2662"/><polyline points="-0.1217,0.2396 0.1305,0.2396"/><polyline points="-0.1217,0.2130 0.1305,0.2130"/><polyline points="-0.1217,0.1864 0.1305,0.1864"/><polyline points="-0.1217,0.1598 0.1305,0.1598"/><polyline points="-0.1217,0.1332 0.1305,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1285,0.2662+-0.1240,0.2662"/><polyline points="-0.1285,0.2396+-0.1240,0.2396"/><polyline points="-0.1285,0.2130+-0.1240,0.2130"/><polyline points="-0.1285,0.1864+-0.1240,0.1864"/><polyline points="-0.1285,0.1598+-0.1240,0.1598"/><polyline points="-0.1285,0.1332+-0.1240,0.1332"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1325" y="0.2677">0</text><text x="-0.1325" y="0.2411">1</text><text x="-0.1325" y="0.2145">2</text><text x="-0.1325" y="0.1879">3</text><text x="-0.1325" y="0.1613">4</text><text x="-0.1325" y="0.1347">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0" y="0.1219">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.0202" y="0.2310"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.2556 0.0998,0.2556"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.2570">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.2464 0.0998,0.2464"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.2478">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.2372 0.0998,0.2372"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.2386">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1365" y="0.2904">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.1433" y="0.1080"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.2396 -0.3410,0.2396 -0.2570,0.1332"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.2662 -0.1897,0.1864"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.3830,0.1598 -0.3830,0.2662"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.4263" y="0.1322"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.4254" y="0.2676"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.2662 -0.4251,0.1332"/><polyline points="-0.3830,0.2662 -0.3830,0.1332"/><polyline points="-0.3410,0.2662 -0.3410,0.1332"/><polyline points="-0.2990,0.2662 -0.2990,0.1332"/><polyline points="-0.2570,0.2662 -0.2570,0.1332"/><polyline points="-0.2149,0.2662 -0.2149,0.1332"/><polyline points="-0.1729,0.2662 -0.1729,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4251,0.2721+-0.4251,0.2676"/><polyline points="-0.3830,0.2721+-0.3830,0.2676"/><polyline points="-0.3410,0.2721+-0.3410,0.2676"/><polyline points="-0.2990,0.2721+-0.2990,0.2676"/><polyline points="-0.2570,0.2721+-0.2570,0.2676"/><polyline points="-0.2149,0.2721+-0.2149,0.2676"/><polyline points="-0.1729,0.2721+-0.1729,0.2676"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.4251" y="0.2792">0.0</text><text x="-0.3830" y="0.2792">0.5</text><text x="-0.3410" y="0.2792">1.0</text><text x="-0.2990" y="0.2792">1.5</text><text x="-0.2570" y="0.2792">2.0</text><text x="-0.2149" y="0.2792">2.5</text><text x="-0.1729" y="0.2792">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.4274" y="0.1330"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.2662 -0.1729,0.2662"/><polyline points="-0.4251,0.2396 -0.1729,0.2396"/><polyline points="-0.4251,0.2130 -0.1729,0.2130"/><polyline points="-0.4251,0.1864 -0.1729,0.1864"/><polyline points="-0.4251,0.1598 -0.1729,0.1598"/><polyline points="-0.4251,0.1332 -0.1729,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4319,0.2662+-0.4274,0.2662"/><polyline points="-0.4319,0.2396+-0.4274,0.2396"/><polyline points="-0.4319,0.2130+-0.4274,0.2130"/><polyline points="-0.4319,0.1864+-0.4274,0.1864"/><polyline points="-0.4319,0.1598+-0.4274,0.1598"/><polyline points="-0.4319,0.1332+-0.4274,0.1332"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4358" y="0.2677">0</text><text x="-0.4358" y="0.2411">1</text><text x="-0.4358" y="0.2145">2</text><text x="-0.4358" y="0.1879">3</text><text x="-0.4358" y="0.1613">4</text><text x="-0.4358" y="0.1347">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.3034" y="0.1219">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.2832" y="0.2310"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.2556 -0.2036,0.2556"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.2570">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.2464 -0.2036,0.2464"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.2478">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.2372 -0.2036,0.2372"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.2386">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1669" y="0.2904">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.4466" y="0.1080"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.2396 -0.6444,0.2396 -0.5603,0.1332"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.2662 -0.4931,0.1864"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6864,0.1598 -0.6864,0.2662"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.7297" y="0.1322"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.7288" y="0.2676"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.2662 -0.7284,0.1332"/><polyline points="-0.6864,0.2662 -0.6864,0.1332"/><polyline points="-0.6444,0.2662 -0.6444,0.1332"/><polyline points="-0.6024,0.2662 -0.6024,0.1332"/><polyline points="-0.5603,0.2662 -0.5603,0.1332"/><polyline points="-0.5183,0.2662 -0.5183,0.1332"/><polyline points="-0.4763,0.2662 -0.4763,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7284,0.2721+-0.7284,0.2676"/><polyline points="-0.6864,0.2721+-0.6864,0.2676"/><polyline points="-0.6444,0.2721+-0.6444,0.2676"/><polyline points="-0.6024,0.2721+-0.6024,0.2676"/><polyline points="-0.5603,0.2721+-0.5603,0.2676"/><polyline points="-0.5183,0.2721+-0.5183,0.2676"/><polyline points="-0.4763,0.2721+-0.4763,0.2676"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.7284" y="0.2792">0.0</text><text x="-0.6864" y="0.2792">0.5</text><text x="-0.6444" y="0.2792">1.0</text><text x="-0.6024" y="0.2792">1.5</text><text x="-0.5603" y="0.2792">2.0</text><text x="-0.5183" y="0.2792">2.5</text><text x="-0.4763" y="0.2792">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.7308" y="0.1330"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.2662 -0.4763,0.2662"/><polyline points="-0.7284,0.2396 -0.4763,0.2396"/><polyline points="-0.7284,0.2130 -0.4763,0.2130"/><polyline points="-0.7284,0.1864 -0.4763,0.1864"/><polyline points="-0.7284,0.1598 -0.4763,0.1598"/><polyline points="-0.7284,0.1332 -0.4763,0.1332"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7352,0.2662+-0.7307,0.2662"/><polyline points="-0.7352,0.2396+-0.7307,0.2396"/><polyline points="-0.7352,0.2130+-0.7307,0.2130"/><polyline points="-0.7352,0.1864+-0.7307,0.1864"/><polyline points="-0.7352,0.1598+-0.7307,0.1598"/><polyline points="-0.7352,0.1332+-0.7307,0.1332"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.7392" y="0.2677">0</text><text x="-0.7392" y="0.2411">1</text><text x="-0.7392" y="0.2145">2</text><text x="-0.7392" y="0.1879">3</text><text x="-0.7392" y="0.1613">4</text><text x="-0.7392" y="0.1347">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.6067" y="0.1219">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.5866" y="0.2310"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.2556 -0.5069,0.2556"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.2570">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.2464 -0.5069,0.2464"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.2478">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.2372 -0.5069,0.2372"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.2386">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4702" y="0.2904">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.75" y="0.1080"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.0370 0.5691,0.0370 0.6531,-0.0694"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,0.0636 0.7204,-0.0162"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5271,-0.0428 0.5271,0.0636"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.4838" y="-0.0704"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.4847" y="0.0649"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.0636 0.4851,-0.0694"/><polyline points="0.5271,0.0636 0.5271,-0.0694"/><polyline points="0.5691,0.0636 0.5691,-0.0694"/><polyline points="0.6111,0.0636 0.6111,-0.0694"/><polyline points="0.6531,0.0636 0.6531,-0.0694"/><polyline points="0.6952,0.0636 0.6952,-0.0694"/><polyline points="0.7372,0.0636 0.7372,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4851,0.0694+0.4851,0.0649"/><polyline points="0.5271,0.0694+0.5271,0.0649"/><polyline points="0.5691,0.0694+0.5691,0.0649"/><polyline points="0.6111,0.0694+0.6111,0.0649"/><polyline points="0.6531,0.0694+0.6531,0.0649"/><polyline points="0.6952,0.0694+0.6952,0.0649"/><polyline points="0.7372,0.0694+0.7372,0.0649"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.4851" y="0.0765">0.0</text><text x="0.5271" y="0.0765">0.5</text><text x="0.5691" y="0.0765">1.0</text><text x="0.6111" y="0.0765">1.5</text><text x="0.6531" y="0.0765">2.0</text><text x="0.6952" y="0.0765">2.5</text><text x="0.7372" y="0.0765">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.4827" y="-0.0697"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,0.0636 0.7372,0.0636"/><polyline points="0.4851,0.0370 0.7372,0.0370"/><polyline points="0.4851,0.0104 0.7372,0.0104"/><polyline points="0.4851,-0.0162 0.7372,-0.0162"/><polyline points="0.4851,-0.0428 0.7372,-0.0428"/><polyline points="0.4851,-0.0694 0.7372,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4783,0.0636+0.4828,0.0636"/><polyline points="0.4783,0.0370+0.4828,0.0370"/><polyline points="0.4783,0.0104+0.4828,0.0104"/><polyline points="0.4783,-0.0162+0.4828,-0.0162"/><polyline points="0.4783,-0.0428+0.4828,-0.0428"/><polyline points="0.4783,-0.0694+0.4828,-0.0694"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4743" y="0.0650">0</text><text x="0.4743" y="0.0384">1</text><text x="0.4743" y="0.0118">2</text><text x="0.4743" y="-0.0148">3</text><text x="0.4743" y="-0.0414">4</text><text x="0.4743" y="-0.0680">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.6067" y="-0.0808">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.6269" y="0.0283"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.0530 0.7065,0.0530"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.0543">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.0438 0.7065,0.0438"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.0451">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,0.0346 0.7065,0.0346"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="0.0359">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.7433" y="0.0877">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.4635" y="-0.0947"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.0370 0.2657,0.0370 0.3498,-0.0694"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,0.0636 0.4170,-0.0162"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.2237,-0.0428 0.2237,0.0636"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.1804" y="-0.0704"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.1813" y="0.0649"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.0636 0.1817,-0.0694"/><polyline points="0.2237,0.0636 0.2237,-0.0694"/><polyline points="0.2657,0.0636 0.2657,-0.0694"/><polyline points="0.3078,0.0636 0.3078,-0.0694"/><polyline points="0.3498,0.0636 0.3498,-0.0694"/><polyline points="0.3918,0.0636 0.3918,-0.0694"/><polyline points="0.4338,0.0636 0.4338,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1817,0.0694+0.1817,0.0649"/><polyline points="0.2237,0.0694+0.2237,0.0649"/><polyline points="0.2657,0.0694+0.2657,0.0649"/><polyline points="0.3078,0.0694+0.3078,0.0649"/><polyline points="0.3498,0.0694+0.3498,0.0649"/><polyline points="0.3918,0.0694+0.3918,0.0649"/><polyline points="0.4338,0.0694+0.4338,0.0649"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.1817" y="0.0765">0.0</text><text x="0.2237" y="0.0765">0.5</text><text x="0.2657" y="0.0765">1.0</text><text x="0.3078" y="0.0765">1.5</text><text x="0.3498" y="0.0765">2.0</text><text x="0.3918" y="0.0765">2.5</text><text x="0.4338" y="0.0765">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.1793" y="-0.0697"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,0.0636 0.4338,0.0636"/><polyline points="0.1817,0.0370 0.4338,0.0370"/><polyline points="0.1817,0.0104 0.4338,0.0104"/><polyline points="0.1817,-0.0162 0.4338,-0.0162"/><polyline points="0.1817,-0.0428 0.4338,-0.0428"/><polyline points="0.1817,-0.0694 0.4338,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1749,0.0636+0.1794,0.0636"/><polyline points="0.1749,0.0370+0.1794,0.0370"/><polyline points="0.1749,0.0104+0.1794,0.0104"/><polyline points="0.1749,-0.0162+0.1794,-0.0162"/><polyline points="0.1749,-0.0428+0.1794,-0.0428"/><polyline points="0.1749,-0.0694+0.1794,-0.0694"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1709" y="0.0650">0</text><text x="0.1709" y="0.0384">1</text><text x="0.1709" y="0.0118">2</text><text x="0.1709" y="-0.0148">3</text><text x="0.1709" y="-0.0414">4</text><text x="0.1709" y="-0.0680">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.3034" y="-0.0808">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.3235" y="0.0283"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.0530 0.4032,0.0530"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.0543">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.0438 0.4032,0.0438"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.0451">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,0.0346 0.4032,0.0346"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="0.0359">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4399" y="0.0877">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.1601" y="-0.0947"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.0370 -0.0376,0.0370 0.0464,-0.0694"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,0.0636 0.1136,-0.0162"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.0797,-0.0428 -0.0797,0.0636"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.1230" y="-0.0704"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.1220" y="0.0649"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.0636 -0.1217,-0.0694"/><polyline points="-0.0797,0.0636 -0.0797,-0.0694"/><polyline points="-0.0376,0.0636 -0.0376,-0.0694"/><polyline points="0.0044,0.0636 0.0044,-0.0694"/><polyline points="0.0464,0.0636 0.0464,-0.0694"/><polyline points="0.0884,0.0636 0.0884,-0.0694"/><polyline points="0.1305,0.0636 0.1305,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1217,0.0694+-0.1217,0.0649"/><polyline points="-0.0797,0.0694+-0.0797,0.0649"/><polyline points="-0.0376,0.0694+-0.0376,0.0649"/><polyline points="0.0044,0.0694+0.0044,0.0649"/><polyline points="0.0464,0.0694+0.0464,0.0649"/><polyline points="0.0884,0.0694+0.0884,0.0649"/><polyline points="0.1305,0.0694+0.1305,0.0649"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.1217" y="0.0765">0.0</text><text x="-0.0797" y="0.0765">0.5</text><text x="-0.0376" y="0.0765">1.0</text><text x="0.0044" y="0.0765">1.5</text><text x="0.0464" y="0.0765">2.0</text><text x="0.0884" y="0.0765">2.5</text><text x="0.1305" y="0.0765">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.1240" y="-0.0697"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,0.0636 0.1305,0.0636"/><polyline points="-0.1217,0.0370 0.1305,0.0370"/><polyline points="-0.1217,0.0104 0.1305,0.0104"/><polyline points="-0.1217,-0.0162 0.1305,-0.0162"/><polyline points="-0.1217,-0.0428 0.1305,-0.0428"/><polyline points="-0.1217,-0.0694 0.1305,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1285,0.0636+-0.1240,0.0636"/><polyline points="-0.1285,0.0370+-0.1240,0.0370"/><polyline points="-0.1285,0.0104+-0.1240,0.0104"/><polyline points="-0.1285,-0.0162+-0.1240,-0.0162"/><polyline points="-0.1285,-0.0428+-0.1240,-0.0428"/><polyline points="-0.1285,-0.0694+-0.1240,-0.0694"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1325" y="0.0650">0</text><text x="-0.1325" y="0.0384">1</text><text x="-0.1325" y="0.0118">2</text><text x="-0.1325" y="-0.0148">3</text><text x="-0.1325" y="-0.0414">4</text><text x="-0.1325" y="-0.0680">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0" y="-0.0808">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.0202" y="0.0283"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.0530 0.0998,0.0530"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.0543">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.0438 0.0998,0.0438"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.0451">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,0.0346 0.0998,0.0346"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="0.0359">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1365" y="0.0877">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.1433" y="-0.0947"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.0370 -0.3410,0.0370 -0.2570,-0.0694"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,0.0636 -0.1897,-0.0162"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.3830,-0.0428 -0.3830,0.0636"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.4263" y="-0.0704"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.4254" y="0.0649"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.0636 -0.4251,-0.0694"/><polyline points="-0.3830,0.0636 -0.3830,-0.0694"/><polyline points="-0.3410,0.0636 -0.3410,-0.0694"/><polyline points="-0.2990,0.0636 -0.2990,-0.0694"/><polyline points="-0.2570,0.0636 -0.2570,-0.0694"/><polyline points="-0.2149,0.0636 -0.2149,-0.0694"/><polyline points="-0.1729,0.0636 -0.1729,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4251,0.0694+-0.4251,0.0649"/><polyline points="-0.3830,0.0694+-0.3830,0.0649"/><polyline points="-0.3410,0.0694+-0.3410,0.0649"/><polyline points="-0.2990,0.0694+-0.2990,0.0649"/><polyline points="-0.2570,0.0694+-0.2570,0.0649"/><polyline points="-0.2149,0.0694+-0.2149,0.0649"/><polyline points="-0.1729,0.0694+-0.1729,0.0649"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.4251" y="0.0765">0.0</text><text x="-0.3830" y="0.0765">0.5</text><text x="-0.3410" y="0.0765">1.0</text><text x="-0.2990" y="0.0765">1.5</text><text x="-0.2570" y="0.0765">2.0</text><text x="-0.2149" y="0.0765">2.5</text><text x="-0.1729" y="0.0765">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.4274" y="-0.0697"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,0.0636 -0.1729,0.0636"/><polyline points="-0.4251,0.0370 -0.1729,0.0370"/><polyline points="-0.4251,0.0104 -0.1729,0.0104"/><polyline points="-0.4251,-0.0162 -0.1729,-0.0162"/><polyline points="-0.4251,-0.0428 -0.1729,-0.0428"/><polyline points="-0.4251,-0.0694 -0.1729,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4319,0.0636+-0.4274,0.0636"/><polyline points="-0.4319,0.0370+-0.4274,0.0370"/><polyline points="-0.4319,0.0104+-0.4274,0.0104"/><polyline points="-0.4319,-0.0162+-0.4274,-0.0162"/><polyline points="-0.4319,-0.0428+-0.4274,-0.0428"/><polyline points="-0.4319,-0.0694+-0.4274,-0.0694"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4358" y="0.0650">0</text><text x="-0.4358" y="0.0384">1</text><text x="-0.4358" y="0.0118">2</text><text x="-0.4358" y="-0.0148">3</text><text x="-0.4358" y="-0.0414">4</text><text x="-0.4358" y="-0.0680">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.3034" y="-0.0808">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.2832" y="0.0283"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.0530 -0.2036,0.0530"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.0543">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.0438 -0.2036,0.0438"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.0451">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,0.0346 -0.2036,0.0346"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="0.0359">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1669" y="0.0877">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.4466" y="-0.0947"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.0370 -0.6444,0.0370 -0.5603,-0.0694"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,0.0636 -0.4931,-0.0162"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6864,-0.0428 -0.6864,0.0636"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.7297" y="-0.0704"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.7288" y="0.0649"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.0636 -0.7284,-0.0694"/><polyline points="-0.6864,0.0636 -0.6864,-0.0694"/><polyline points="-0.6444,0.0636 -0.6444,-0.0694"/><polyline points="-0.6024,0.0636 -0.6024,-0.0694"/><polyline points="-0.5603,0.0636 -0.5603,-0.0694"/><polyline points="-0.5183,0.0636 -0.5183,-0.0694"/><polyline points="-0.4763,0.0636 -0.4763,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7284,0.0694+-0.7284,0.0649"/><polyline points="-0.6864,0.0694+-0.6864,0.0649"/><polyline points="-0.6444,0.0694+-0.6444,0.0649"/><polyline points="-0.6024,0.0694+-0.6024,0.0649"/><polyline points="-0.5603,0.0694+-0.5603,0.0649"/><polyline points="-0.5183,0.0694+-0.5183,0.0649"/><polyline points="-0.4763,0.0694+-0.4763,0.0649"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.7284" y="0.0765">0.0</text><text x="-0.6864" y="0.0765">0.5</text><text x="-0.6444" y="0.0765">1.0</text><text x="-0.6024" y="0.0765">1.5</text><text x="-0.5603" y="0.0765">2.0</text><text x="-0.5183" y="0.0765">2.5</text><text x="-0.4763" y="0.0765">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.7308" y="-0.0697"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,0.0636 -0.4763,0.0636"/><polyline points="-0.7284,0.0370 -0.4763,0.0370"/><polyline points="-0.7284,0.0104 -0.4763,0.0104"/><polyline points="-0.7284,-0.0162 -0.4763,-0.0162"/><polyline points="-0.7284,-0.0428 -0.4763,-0.0428"/><polyline points="-0.7284,-0.0694 -0.4763,-0.0694"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7352,0.0636+-0.7307,0.0636"/><polyline points="-0.7352,0.0370+-0.7307,0.0370"/><polyline points="-0.7352,0.0104+-0.7307,0.0104"/><polyline points="-0.7352,-0.0162+-0.7307,-0.0162"/><polyline points="-0.7352,-0.0428+-0.7307,-0.0428"/><polyline points="-0.7352,-0.0694+-0.7307,-0.0694"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.7392" y="0.0650">0</text><text x="-0.7392" y="0.0384">1</text><text x="-0.7392" y="0.0118">2</text><text x="-0.7392" y="-0.0148">3</text><text x="-0.7392" y="-0.0414">4</text><text x="-0.7392" y="-0.0680">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.6067" y="-0.0808">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.5866" y="0.0283"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.0530 -0.5069,0.0530"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.0543">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.0438 -0.5069,0.0438"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.0451">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,0.0346 -0.5069,0.0346"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="0.0359">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4702" y="0.0877">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.75" y="-0.0947"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,-0.1657 0.5691,-0.1657 0.6531,-0.2721"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,-0.1391 0.7204,-0.2189"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5271,-0.2455 0.5271,-0.1391"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.4838" y="-0.2731"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.4847" y="-0.1378"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,-0.1391 0.4851,-0.2721"/><polyline points="0.5271,-0.1391 0.5271,-0.2721"/><polyline points="0.5691,-0.1391 0.5691,-0.2721"/><polyline points="0.6111,-0.1391 0.6111,-0.2721"/><polyline points="0.6531,-0.1391 0.6531,-0.2721"/><polyline points="0.6952,-0.1391 0.6952,-0.2721"/><polyline points="0.7372,-0.1391 0.7372,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4851,-0.1332+0.4851,-0.1377"/><polyline points="0.5271,-0.1332+0.5271,-0.1377"/><polyline points="0.5691,-0.1332+0.5691,-0.1377"/><polyline points="0.6111,-0.1332+0.6111,-0.1377"/><polyline points="0.6531,-0.1332+0.6531,-0.1377"/><polyline points="0.6952,-0.1332+0.6952,-0.1377"/><polyline points="0.7372,-0.1332+0.7372,-0.1377"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.4851" y="-0.1262">0.0</text><text x="0.5271" y="-0.1262">0.5</text><text x="0.5691" y="-0.1262">1.0</text><text x="0.6111" y="-0.1262">1.5</text><text x="0.6531" y="-0.1262">2.0</text><text x="0.6952" y="-0.1262">2.5</text><text x="0.7372" y="-0.1262">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.4827" y="-0.2724"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,-0.1391 0.7372,-0.1391"/><polyline points="0.4851,-0.1657 0.7372,-0.1657"/><polyline points="0.4851,-0.1923 0.7372,-0.1923"/><polyline points="0.4851,-0.2189 0.7372,-0.2189"/><polyline points="0.4851,-0.2455 0.7372,-0.2455"/><polyline points="0.4851,-0.2721 0.7372,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4783,-0.1391+0.4828,-0.1391"/><polyline points="0.4783,-0.1657+0.4828,-0.1657"/><polyline points="0.4783,-0.1923+0.4828,-0.1923"/><polyline points="0.4783,-0.2189+0.4828,-0.2189"/><polyline points="0.4783,-0.2455+0.4828,-0.2455"/><polyline points="0.4783,-0.2721+0.4828,-0.2721"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4743" y="-0.1376">0</text><text x="0.4743" y="-0.1642">1</text><text x="0.4743" y="-0.1908">2</text><text x="0.4743" y="-0.2174">3</text><text x="0.4743" y="-0.2440">4</text><text x="0.4743" y="-0.2706">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.6067" y="-0.2835">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.6269" y="-0.1744"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.1497 0.7065,-0.1497"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.1484">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.1589 0.7065,-0.1589"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.1576">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.1681 0.7065,-0.1681"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.1668">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.7433" y="-0.1149">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.4635" y="-0.2973"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,-0.1657 0.2657,-0.1657 0.3498,-0.2721"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,-0.1391 0.4170,-0.2189"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.2237,-0.2455 0.2237,-0.1391"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.1804" y="-0.2731"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.1813" y="-0.1378"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,-0.1391 0.1817,-0.2721"/><polyline points="0.2237,-0.1391 0.2237,-0.2721"/><polyline points="0.2657,-0.1391 0.2657,-0.2721"/><polyline points="0.3078,-0.1391 0.3078,-0.2721"/><polyline points="0.3498,-0.1391 0.3498,-0.2721"/><polyline points="0.3918,-0.1391 0.3918,-0.2721"/><polyline points="0.4338,-0.1391 0.4338,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1817,-0.1332+0.1817,-0.1377"/><polyline points="0.2237,-0.1332+0.2237,-0.1377"/><polyline points="0.2657,-0.1332+0.2657,-0.1377"/><polyline points="0.3078,-0.1332+0.3078,-0.1377"/><polyline points="0.3498,-0.1332+0.3498,-0.1377"/><polyline points="0.3918,-0.1332+0.3918,-0.1377"/><polyline points="0.4338,-0.1332+0.4338,-0.1377"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.1817" y="-0.1262">0.0</text><text x="0.2237" y="-0.1262">0.5</text><text x="0.2657" y="-0.1262">1.0</text><text x="0.3078" y="-0.1262">1.5</text><text x="0.3498" y="-0.1262">2.0</text><text x="0.3918" y="-0.1262">2.5</text><text x="0.4338" y="-0.1262">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.1793" y="-0.2724"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,-0.1391 0.4338,-0.1391"/><polyline points="0.1817,-0.1657 0.4338,-0.1657"/><polyline points="0.1817,-0.1923 0.4338,-0.1923"/><polyline points="0.1817,-0.2189 0.4338,-0.2189"/><polyline points="0.1817,-0.2455 0.4338,-0.2455"/><polyline points="0.1817,-0.2721 0.4338,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1749,-0.1391+0.1794,-0.1391"/><polyline points="0.1749,-0.1657+0.1794,-0.1657"/><polyline points="0.1749,-0.1923+0.1794,-0.1923"/><polyline points="0.1749,-0.2189+0.1794,-0.2189"/><polyline points="0.1749,-0.2455+0.1794,-0.2455"/><polyline points="0.1749,-0.2721+0.1794,-0.2721"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1709" y="-0.1376">0</text><text x="0.1709" y="-0.1642">1</text><text x="0.1709" y="-0.1908">2</text><text x="0.1709" y="-0.2174">3</text><text x="0.1709" y="-0.2440">4</text><text x="0.1709" y="-0.2706">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.3034" y="-0.2835">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.3235" y="-0.1744"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.1497 0.4032,-0.1497"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.1484">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.1589 0.4032,-0.1589"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.1576">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.1681 0.4032,-0.1681"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.1668">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4399" y="-0.1149">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.1601" y="-0.2973"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,-0.1657 -0.0376,-0.1657 0.0464,-0.2721"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,-0.1391 0.1136,-0.2189"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.0797,-0.2455 -0.0797,-0.1391"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.1230" y="-0.2731"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.1220" y="-0.1378"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,-0.1391 -0.1217,-0.2721"/><polyline points="-0.0797,-0.1391 -0.0797,-0.2721"/><polyline points="-0.0376,-0.1391 -0.0376,-0.2721"/><polyline points="0.0044,-0.1391 0.0044,-0.2721"/><polyline points="0.0464,-0.1391 0.0464,-0.2721"/><polyline points="0.0884,-0.1391 0.0884,-0.2721"/><polyline points="0.1305,-0.1391 0.1305,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1217,-0.1332+-0.1217,-0.1377"/><polyline points="-0.0797,-0.1332+-0.0797,-0.1377"/><polyline points="-0.0376,-0.1332+-0.0376,-0.1377"/><polyline points="0.0044,-0.1332+0.0044,-0.1377"/><polyline points="0.0464,-0.1332+0.0464,-0.1377"/><polyline points="0.0884,-0.1332+0.0884,-0.1377"/><polyline points="0.1305,-0.1332+0.1305,-0.1377"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.1217" y="-0.1262">0.0</text><text x="-0.0797" y="-0.1262">0.5</text><text x="-0.0376" y="-0.1262">1.0</text><text x="0.0044" y="-0.1262">1.5</text><text x="0.0464" y="-0.1262">2.0</text><text x="0.0884" y="-0.1262">2.5</text><text x="0.1305" y="-0.1262">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.1240" y="-0.2724"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,-0.1391 0.1305,-0.1391"/><polyline points="-0.1217,-0.1657 0.1305,-0.1657"/><polyline points="-0.1217,-0.1923 0.1305,-0.1923"/><polyline points="-0.1217,-0.2189 0.1305,-0.2189"/><polyline points="-0.1217,-0.2455 0.1305,-0.2455"/><polyline points="-0.1217,-0.2721 0.1305,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1285,-0.1391+-0.1240,-0.1391"/><polyline points="-0.1285,-0.1657+-0.1240,-0.1657"/><polyline points="-0.1285,-0.1923+-0.1240,-0.1923"/><polyline points="-0.1285,-0.2189+-0.1240,-0.2189"/><polyline points="-0.1285,-0.2455+-0.1240,-0.2455"/><polyline points="-0.1285,-0.2721+-0.1240,-0.2721"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1325" y="-0.1376">0</text><text x="-0.1325" y="-0.1642">1</text><text x="-0.1325" y="-0.1908">2</text><text x="-0.1325" y="-0.2174">3</text><text x="-0.1325" y="-0.2440">4</text><text x="-0.1325" y="-0.2706">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0" y="-0.2835">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.0202" y="-0.1744"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.1497 0.0998,-0.1497"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.1484">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.1589 0.0998,-0.1589"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.1576">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.1681 0.0998,-0.1681"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.1668">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1365" y="-0.1149">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.1433" y="-0.2973"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,-0.1657 -0.3410,-0.1657 -0.2570,-0.2721"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,-0.1391 -0.1897,-0.2189"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.3830,-0.2455 -0.3830,-0.1391"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.4263" y="-0.2731"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.4254" y="-0.1378"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,-0.1391 -0.4251,-0.2721"/><polyline points="-0.3830,-0.1391 -0.3830,-0.2721"/><polyline points="-0.3410,-0.1391 -0.3410,-0.2721"/><polyline points="-0.2990,-0.1391 -0.2990,-0.2721"/><polyline points="-0.2570,-0.1391 -0.2570,-0.2721"/><polyline points="-0.2149,-0.1391 -0.2149,-0.2721"/><polyline points="-0.1729,-0.1391 -0.1729,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4251,-0.1332+-0.4251,-0.1377"/><polyline points="-0.3830,-0.1332+-0.3830,-0.1377"/><polyline points="-0.3410,-0.1332+-0.3410,-0.1377"/><polyline points="-0.2990,-0.1332+-0.2990,-0.1377"/><polyline points="-0.2570,-0.1332+-0.2570,-0.1377"/><polyline points="-0.2149,-0.1332+-0.2149,-0.1377"/><polyline points="-0.1729,-0.1332+-0.1729,-0.1377"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.4251" y="-0.1262">0.0</text><text x="-0.3830" y="-0.1262">0.5</text><text x="-0.3410" y="-0.1262">1.0</text><text x="-0.2990" y="-0.1262">1.5</text><text x="-0.2570" y="-0.1262">2.0</text><text x="-0.2149" y="-0.1262">2.5</text><text x="-0.1729" y="-0.1262">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.4274" y="-0.2724"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,-0.1391 -0.1729,-0.1391"/><polyline points="-0.4251,-0.1657 -0.1729,-0.1657"/><polyline points="-0.4251,-0.1923 -0.1729,-0.1923"/><polyline points="-0.4251,-0.2189 -0.1729,-0.2189"/><polyline points="-0.4251,-0.2455 -0.1729,-0.2455"/><polyline points="-0.4251,-0.2721 -0.1729,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4319,-0.1391+-0.4274,-0.1391"/><polyline points="-0.4319,-0.1657+-0.4274,-0.1657"/><polyline points="-0.4319,-0.1923+-0.4274,-0.1923"/><polyline points="-0.4319,-0.2189+-0.4274,-0.2189"/><polyline points="-0.4319,-0.2455+-0.4274,-0.2455"/><polyline points="-0.4319,-0.2721+-0.4274,-0.2721"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4358" y="-0.1376">0</text><text x="-0.4358" y="-0.1642">1</text><text x="-0.4358" y="-0.1908">2</text><text x="-0.4358" y="-0.2174">3</text><text x="-0.4358" y="-0.2440">4</text><text x="-0.4358" y="-0.2706">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.3034" y="-0.2835">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.2832" y="-0.1744"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.1497 -0.2036,-0.1497"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.1484">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.1589 -0.2036,-0.1589"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.1576">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.1681 -0.2036,-0.1681"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.1668">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1669" y="-0.1149">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.4466" y="-0.2973"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,-0.1657 -0.6444,-0.1657 -0.5603,-0.2721"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,-0.1391 -0.4931,-0.2189"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6864,-0.2455 -0.6864,-0.1391"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.7297" y="-0.2731"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.7288" y="-0.1378"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,-0.1391 -0.7284,-0.2721"/><polyline points="-0.6864,-0.1391 -0.6864,-0.2721"/><polyline points="-0.6444,-0.1391 -0.6444,-0.2721"/><polyline points="-0.6024,-0.1391 -0.6024,-0.2721"/><polyline points="-0.5603,-0.1391 -0.5603,-0.2721"/><polyline points="-0.5183,-0.1391 -0.5183,-0.2721"/><polyline points="-0.4763,-0.1391 -0.4763,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7284,-0.1332+-0.7284,-0.1377"/><polyline points="-0.6864,-0.1332+-0.6864,-0.1377"/><polyline points="-0.6444,-0.1332+-0.6444,-0.1377"/><polyline points="-0.6024,-0.1332+-0.6024,-0.1377"/><polyline points="-0.5603,-0.1332+-0.5603,-0.1377"/><polyline points="-0.5183,-0.1332+-0.5183,-0.1377"/><polyline points="-0.4763,-0.1332+-0.4763,-0.1377"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.7284" y="-0.1262">0.0</text><text x="-0.6864" y="-0.1262">0.5</text><text x="-0.6444" y="-0.1262">1.0</text><text x="-0.6024" y="-0.1262">1.5</text><text x="-0.5603" y="-0.1262">2.0</text><text x="-0.5183" y="-0.1262">2.5</text><text x="-0.4763" y="-0.1262">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.7308" y="-0.2724"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,-0.1391 -0.4763,-0.1391"/><polyline points="-0.7284,-0.1657 -0.4763,-0.1657"/><polyline points="-0.7284,-0.1923 -0.4763,-0.1923"/><polyline points="-0.7284,-0.2189 -0.4763,-0.2189"/><polyline points="-0.7284,-0.2455 -0.4763,-0.2455"/><polyline points="-0.7284,-0.2721 -0.4763,-0.2721"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7352,-0.1391+-0.7307,-0.1391"/><polyline points="-0.7352,-0.1657+-0.7307,-0.1657"/><polyline points="-0.7352,-0.1923+-0.7307,-0.1923"/><polyline points="-0.7352,-0.2189+-0.7307,-0.2189"/><polyline points="-0.7352,-0.2455+-0.7307,-0.2455"/><polyline points="-0.7352,-0.2721+-0.7307,-0.2721"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.7392" y="-0.1376">0</text><text x="-0.7392" y="-0.1642">1</text><text x="-0.7392" y="-0.1908">2</text><text x="-0.7392" y="-0.2174">3</text><text x="-0.7392" y="-0.2440">4</text><text x="-0.7392" y="-0.2706">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.6067" y="-0.2835">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.5866" y="-0.1744"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.1497 -0.5069,-0.1497"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.1484">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.1589 -0.5069,-0.1589"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.1576">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.1681 -0.5069,-0.1681"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.1668">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4702" y="-0.1149">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.75" y="-0.2973"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,-0.3684 0.5691,-0.3684 0.6531,-0.4748"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.4851,-0.3418 0.7204,-0.4216"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.5271,-0.4482 0.5271,-0.3418"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.4838" y="-0.4758"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.4847" y="-0.3404"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,-0.3418 0.4851,-0.4748"/><polyline points="0.5271,-0.3418 0.5271,-0.4748"/><polyline points="0.5691,-0.3418 0.5691,-0.4748"/><polyline points="0.6111,-0.3418 0.6111,-0.4748"/><polyline points="0.6531,-0.3418 0.6531,-0.4748"/><polyline points="0.6952,-0.3418 0.6952,-0.4748"/><polyline points="0.7372,-0.3418 0.7372,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4851,-0.3359+0.4851,-0.3404"/><polyline points="0.5271,-0.3359+0.5271,-0.3404"/><polyline points="0.5691,-0.3359+0.5691,-0.3404"/><polyline points="0.6111,-0.3359+0.6111,-0.3404"/><polyline points="0.6531,-0.3359+0.6531,-0.3404"/><polyline points="0.6952,-0.3359+0.6952,-0.3404"/><polyline points="0.7372,-0.3359+0.7372,-0.3404"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.4851" y="-0.3288">0.0</text><text x="0.5271" y="-0.3288">0.5</text><text x="0.5691" y="-0.3288">1.0</text><text x="0.6111" y="-0.3288">1.5</text><text x="0.6531" y="-0.3288">2.0</text><text x="0.6952" y="-0.3288">2.5</text><text x="0.7372" y="-0.3288">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.4827" y="-0.4751"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.4851,-0.3418 0.7372,-0.3418"/><polyline points="0.4851,-0.3684 0.7372,-0.3684"/><polyline points="0.4851,-0.3950 0.7372,-0.3950"/><polyline points="0.4851,-0.4216 0.7372,-0.4216"/><polyline points="0.4851,-0.4482 0.7372,-0.4482"/><polyline points="0.4851,-0.4748 0.7372,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.4783,-0.3418+0.4828,-0.3418"/><polyline points="0.4783,-0.3684+0.4828,-0.3684"/><polyline points="0.4783,-0.3950+0.4828,-0.3950"/><polyline points="0.4783,-0.4216+0.4828,-0.4216"/><polyline points="0.4783,-0.4482+0.4828,-0.4482"/><polyline points="0.4783,-0.4748+0.4828,-0.4748"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4743" y="-0.3403">0</text><text x="0.4743" y="-0.3669">1</text><text x="0.4743" y="-0.3935">2</text><text x="0.4743" y="-0.4201">3</text><text x="0.4743" y="-0.4467">4</text><text x="0.4743" y="-0.4733">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.6067" y="-0.4861">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.6269" y="-0.3771"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.3524 0.7065,-0.3524"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.3510">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.3616 0.7065,-0.3616"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.3602">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.6813,-0.3708 0.7065,-0.3708"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.6311" y="-0.3694">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.7433" y="-0.3176">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.4635" y="-0.5"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,-0.3684 0.2657,-0.3684 0.3498,-0.4748"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.1817,-0.3418 0.4170,-0.4216"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.2237,-0.4482 0.2237,-0.3418"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="0.1804" y="-0.4758"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="0.1813" y="-0.3404"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,-0.3418 0.1817,-0.4748"/><polyline points="0.2237,-0.3418 0.2237,-0.4748"/><polyline points="0.2657,-0.3418 0.2657,-0.4748"/><polyline points="0.3078,-0.3418 0.3078,-0.4748"/><polyline points="0.3498,-0.3418 0.3498,-0.4748"/><polyline points="0.3918,-0.3418 0.3918,-0.4748"/><polyline points="0.4338,-0.3418 0.4338,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1817,-0.3359+0.1817,-0.3404"/><polyline points="0.2237,-0.3359+0.2237,-0.3404"/><polyline points="0.2657,-0.3359+0.2657,-0.3404"/><polyline points="0.3078,-0.3359+0.3078,-0.3404"/><polyline points="0.3498,-0.3359+0.3498,-0.3404"/><polyline points="0.3918,-0.3359+0.3918,-0.3404"/><polyline points="0.4338,-0.3359+0.4338,-0.3404"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="0.1817" y="-0.3288">0.0</text><text x="0.2237" y="-0.3288">0.5</text><text x="0.2657" y="-0.3288">1.0</text><text x="0.3078" y="-0.3288">1.5</text><text x="0.3498" y="-0.3288">2.0</text><text x="0.3918" y="-0.3288">2.5</text><text x="0.4338" y="-0.3288">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="0.1793" y="-0.4751"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="0.1817,-0.3418 0.4338,-0.3418"/><polyline points="0.1817,-0.3684 0.4338,-0.3684"/><polyline points="0.1817,-0.3950 0.4338,-0.3950"/><polyline points="0.1817,-0.4216 0.4338,-0.4216"/><polyline points="0.1817,-0.4482 0.4338,-0.4482"/><polyline points="0.1817,-0.4748 0.4338,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.1749,-0.3418+0.1794,-0.3418"/><polyline points="0.1749,-0.3684+0.1794,-0.3684"/><polyline points="0.1749,-0.3950+0.1794,-0.3950"/><polyline points="0.1749,-0.4216+0.1794,-0.4216"/><polyline points="0.1749,-0.4482+0.1794,-0.4482"/><polyline points="0.1749,-0.4748+0.1794,-0.4748"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1709" y="-0.3403">0</text><text x="0.1709" y="-0.3669">1</text><text x="0.1709" y="-0.3935">2</text><text x="0.1709" y="-0.4201">3</text><text x="0.1709" y="-0.4467">4</text><text x="0.1709" y="-0.4733">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0.3034" y="-0.4861">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.3235" y="-0.3771"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.3524 0.4032,-0.3524"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.3510">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.3616 0.4032,-0.3616"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.3602">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.3779,-0.3708 0.4032,-0.3708"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.3278" y="-0.3694">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.4399" y="-0.3176">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="0.1601" y="-0.5"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,-0.3684 -0.0376,-0.3684 0.0464,-0.4748"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.1217,-0.3418 0.1136,-0.4216"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.0797,-0.4482 -0.0797,-0.3418"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.1230" y="-0.4758"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.1220" y="-0.3404"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,-0.3418 -0.1217,-0.4748"/><polyline points="-0.0797,-0.3418 -0.0797,-0.4748"/><polyline points="-0.0376,-0.3418 -0.0376,-0.4748"/><polyline points="0.0044,-0.3418 0.0044,-0.4748"/><polyline points="0.0464,-0.3418 0.0464,-0.4748"/><polyline points="0.0884,-0.3418 0.0884,-0.4748"/><polyline points="0.1305,-0.3418 0.1305,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1217,-0.3359+-0.1217,-0.3404"/><polyline points="-0.0797,-0.3359+-0.0797,-0.3404"/><polyline points="-0.0376,-0.3359+-0.0376,-0.3404"/><polyline points="0.0044,-0.3359+0.0044,-0.3404"/><polyline points="0.0464,-0.3359+0.0464,-0.3404"/><polyline points="0.0884,-0.3359+0.0884,-0.3404"/><polyline points="0.1305,-0.3359+0.1305,-0.3404"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.1217" y="-0.3288">0.0</text><text x="-0.0797" y="-0.3288">0.5</text><text x="-0.0376" y="-0.3288">1.0</text><text x="0.0044" y="-0.3288">1.5</text><text x="0.0464" y="-0.3288">2.0</text><text x="0.0884" y="-0.3288">2.5</text><text x="0.1305" y="-0.3288">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.1240" y="-0.4751"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.1217,-0.3418 0.1305,-0.3418"/><polyline points="-0.1217,-0.3684 0.1305,-0.3684"/><polyline points="-0.1217,-0.3950 0.1305,-0.3950"/><polyline points="-0.1217,-0.4216 0.1305,-0.4216"/><polyline points="-0.1217,-0.4482 0.1305,-0.4482"/><polyline points="-0.1217,-0.4748 0.1305,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.1285,-0.3418+-0.1240,-0.3418"/><polyline points="-0.1285,-0.3684+-0.1240,-0.3684"/><polyline points="-0.1285,-0.3950+-0.1240,-0.3950"/><polyline points="-0.1285,-0.4216+-0.1240,-0.4216"/><polyline points="-0.1285,-0.4482+-0.1240,-0.4482"/><polyline points="-0.1285,-0.4748+-0.1240,-0.4748"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1325" y="-0.3403">0</text><text x="-0.1325" y="-0.3669">1</text><text x="-0.1325" y="-0.3935">2</text><text x="-0.1325" y="-0.4201">3</text><text x="-0.1325" y="-0.4467">4</text><text x="-0.1325" y="-0.4733">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="0" y="-0.4861">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="0.0202" y="-0.3771"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.3524 0.0998,-0.3524"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.3510">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.3616 0.0998,-0.3616"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.3602">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="0.0745,-0.3708 0.0998,-0.3708"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="0.0244" y="-0.3694">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="0.1365" y="-0.3176">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.1433" y="-0.5"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,-0.3684 -0.3410,-0.3684 -0.2570,-0.4748"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4251,-0.3418 -0.1897,-0.4216"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.3830,-0.4482 -0.3830,-0.3418"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.4263" y="-0.4758"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.4254" y="-0.3404"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,-0.3418 -0.4251,-0.4748"/><polyline points="-0.3830,-0.3418 -0.3830,-0.4748"/><polyline points="-0.3410,-0.3418 -0.3410,-0.4748"/><polyline points="-0.2990,-0.3418 -0.2990,-0.4748"/><polyline points="-0.2570,-0.3418 -0.2570,-0.4748"/><polyline points="-0.2149,-0.3418 -0.2149,-0.4748"/><polyline points="-0.1729,-0.3418 -0.1729,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4251,-0.3359+-0.4251,-0.3404"/><polyline points="-0.3830,-0.3359+-0.3830,-0.3404"/><polyline points="-0.3410,-0.3359+-0.3410,-0.3404"/><polyline points="-0.2990,-0.3359+-0.2990,-0.3404"/><polyline points="-0.2570,-0.3359+-0.2570,-0.3404"/><polyline points="-0.2149,-0.3359+-0.2149,-0.3404"/><polyline points="-0.1729,-0.3359+-0.1729,-0.3404"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.4251" y="-0.3288">0.0</text><text x="-0.3830" y="-0.3288">0.5</text><text x="-0.3410" y="-0.3288">1.0</text><text x="-0.2990" y="-0.3288">1.5</text><text x="-0.2570" y="-0.3288">2.0</text><text x="-0.2149" y="-0.3288">2.5</text><text x="-0.1729" y="-0.3288">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.4274" y="-0.4751"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.4251,-0.3418 -0.1729,-0.3418"/><polyline points="-0.4251,-0.3684 -0.1729,-0.3684"/><polyline points="-0.4251,-0.3950 -0.1729,-0.3950"/><polyline points="-0.4251,-0.4216 -0.1729,-0.4216"/><polyline points="-0.4251,-0.4482 -0.1729,-0.4482"/><polyline points="-0.4251,-0.4748 -0.1729,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.4319,-0.3418+-0.4274,-0.3418"/><polyline points="-0.4319,-0.3684+-0.4274,-0.3684"/><polyline points="-0.4319,-0.3950+-0.4274,-0.3950"/><polyline points="-0.4319,-0.4216+-0.4274,-0.4216"/><polyline points="-0.4319,-0.4482+-0.4274,-0.4482"/><polyline points="-0.4319,-0.4748+-0.4274,-0.4748"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4358" y="-0.3403">0</text><text x="-0.4358" y="-0.3669">1</text><text x="-0.4358" y="-0.3935">2</text><text x="-0.4358" y="-0.4201">3</text><text x="-0.4358" y="-0.4467">4</text><text x="-0.4358" y="-0.4733">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.3034" y="-0.4861">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.2832" y="-0.3771"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.3524 -0.2036,-0.3524"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.3510">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.3616 -0.2036,-0.3616"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.3602">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.2288,-0.3708 -0.2036,-0.3708"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.2790" y="-0.3694">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.1669" y="-0.3176">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.4466" y="-0.5"/></g></g></g><g class="chart"><g class="line"><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,-0.3684 -0.6444,-0.3684 -0.5603,-0.4748"/></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.7284,-0.3418 -0.4931,-0.4216"/></g><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6864,-0.4482 -0.6864,-0.3418"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.2534" height="0.1350" x="-0.7297" y="-0.4758"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.2528" height="0.0005" x="-0.7288" y="-0.3404"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,-0.3418 -0.7284,-0.4748"/><polyline points="-0.6864,-0.3418 -0.6864,-0.4748"/><polyline points="-0.6444,-0.3418 -0.6444,-0.4748"/><polyline points="-0.6024,-0.3418 -0.6024,-0.4748"/><polyline points="-0.5603,-0.3418 -0.5603,-0.4748"/><polyline points="-0.5183,-0.3418 -0.5183,-0.4748"/><polyline points="-0.4763,-0.3418 -0.4763,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7284,-0.3359+-0.7284,-0.3404"/><polyline points="-0.6864,-0.3359+-0.6864,-0.3404"/><polyline points="-0.6444,-0.3359+-0.6444,-0.3404"/><polyline points="-0.6024,-0.3359+-0.6024,-0.3404"/><polyline points="-0.5603,-0.3359+-0.5603,-0.3404"/><polyline points="-0.5183,-0.3359+-0.5183,-0.3404"/><polyline points="-0.4763,-0.3359+-0.4763,-0.3404"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="middle"><text x="-0.7284" y="-0.3288">0.0</text><text x="-0.6864" y="-0.3288">0.5</text><text x="-0.6444" y="-0.3288">1.0</text><text x="-0.6024" y="-0.3288">1.5</text><text x="-0.5603" y="-0.3288">2.0</text><text x="-0.5183" y="-0.3288">2.5</text><text x="-0.4763" y="-0.3288">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0007" height="0.1336" x="-0.7308" y="-0.4751"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0007" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.7284,-0.3418 -0.4763,-0.3418"/><polyline points="-0.7284,-0.3684 -0.4763,-0.3684"/><polyline points="-0.7284,-0.3950 -0.4763,-0.3950"/><polyline points="-0.7284,-0.4216 -0.4763,-0.4216"/><polyline points="-0.7284,-0.4482 -0.4763,-0.4482"/><polyline points="-0.7284,-0.4748 -0.4763,-0.4748"/></g></g><g class="tickglyph"><g stroke-width="0.0006" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.7352,-0.3418+-0.7307,-0.3418"/><polyline points="-0.7352,-0.3684+-0.7307,-0.3684"/><polyline points="-0.7352,-0.3950+-0.7307,-0.3950"/><polyline points="-0.7352,-0.4216+-0.7307,-0.4216"/><polyline points="-0.7352,-0.4482+-0.7307,-0.4482"/><polyline points="-0.7352,-0.4748+-0.7307,-0.4748"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.7392" y="-0.3403">0</text><text x="-0.7392" y="-0.3669">1</text><text x="-0.7392" y="-0.3935">2</text><text x="-0.7392" y="-0.4201">3</text><text x="-0.7392" y="-0.4467">4</text><text x="-0.7392" y="-0.4733">5</text></g></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0120" text-anchor="middle"><text x="-0.6067" y="-0.4861">Line Chart</text></g></g><g class="legend"><g class="padding"></g><g class="padding"></g><g class="frame"><g stroke-width="0.0002" stroke="rgb(5%, 5%, 5%)" stroke-opacity="1.0" fill="rgb(5%, 5%, 5%)" fill-opacity="0"><rect width="0.0851" height="0.0310" x="-0.5866" y="-0.3771"/></g></g><g class="legendContent"><g stroke-width="0.0022" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.3524 -0.5069,-0.3524"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.3510">palette #2</text></g><g stroke-width="0.0022" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.3616 -0.5069,-0.3616"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.3602">palette #1</text></g><g stroke-width="0.0022" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.5322,-0.3708 -0.5069,-0.3708"/></g><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="start"><text x="-0.5823" y="-0.3694">palette #0</text></g></g></g><g class="title"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0060" text-anchor="end"><text x="-0.4702" y="-0.3176">Made with 🧡 and chart-svg</text></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="0.2865" height="0.1893" x="-0.75" y="-0.5"/></g></g></g></g><g class="hud"></g></svg>
+ other/surface.svg view
@@ -0,0 +1,35 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.75 -0.5 1.4999 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}svg { shape-rendering: crispEdges; }+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 stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 52%, 59%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(13%, 49%, 63%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(22%, 47%, 66%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(39%, 39%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(60%, 27%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 19%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 23%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 27%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 37%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(8%, 46%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-82%, 52%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-85%, 54%, 51%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-60%, 54%, 43%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-46%, 54%, 40%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-59%, 54%, 43%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-85%, 54%, 51%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-83%, 52%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 46%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 37%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.75" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(14%, 49%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(23%, 46%, 67%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(43%, 38%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 25%, 69%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 20%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 24%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(61%, 31%, 63%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(31%, 42%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-66%, 50%, 68%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-84%, 54%, 51%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-26%, 54%, 36%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(19%, 53%, 26%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(25%, 52%, 21%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(21%, 52%, 24%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-10%, 54%, 33%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-75%, 54%, 47%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-81%, 52%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(22%, 44%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(55%, 33%, 69%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6972" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(24%, 46%, 67%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(44%, 37%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 23%, 68%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 20%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 25%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(54%, 33%, 70%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(14%, 45%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 53%, 59%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-40%, 54%, 38%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(26%, 52%, 21%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(40%, 49%, 5%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(44%, 48%, -6%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(43%, 48%, -4%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(36%, 50%, 11%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(16%, 53%, 27%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-72%, 54%, 46%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-71%, 51%, 67%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(34%, 41%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.6444" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(43%, 38%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 24%, 69%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 20%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 25%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(51%, 35%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-16%, 47%, 74%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-87%, 54%, 52%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(13%, 53%, 28%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(41%, 49%, 2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(52%, 45%, -17%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(56%, 43%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(57%, 42%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(44%, 48%, -5%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(23%, 52%, 23%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-74%, 54%, 47%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-53%, 50%, 70%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(43%, 38%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5917" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(61%, 27%, 71%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 19%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 24%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(51%, 35%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-25%, 48%, 73%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-80%, 54%, 49%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(26%, 52%, 21%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(49%, 46%, -14%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 41%, -16%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -4%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -3%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 41%, -16%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(49%, 46%, -14%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(27%, 52%, 20%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-78%, 54%, 48%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-30%, 48%, 73%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(51%, 35%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.5389" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(72%, 18%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 23%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(57%, 32%, 68%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-4%, 47%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-81%, 54%, 49%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(29%, 51%, 18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -5%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -4%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(30%, 51%, 18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-79%, 54%, 49%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-9%, 47%, 74%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(56%, 33%, 69%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4861" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 22%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 26%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(25%, 43%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 54%, 55%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(25%, 52%, 22%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(57%, 42%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(34%, 50%, 14%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-78%, 54%, 48%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(1%, 46%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 32%, 66%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.4333" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 24%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(45%, 37%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-76%, 51%, 66%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-3%, 53%, 32%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(49%, 46%, -15%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(60%, 40%, -13%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(39%, 49%, 6%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-69%, 54%, 45%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-6%, 47%, 74%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 31%, 65%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 27%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3806" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 26%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(17%, 45%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-78%, 54%, 48%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(38%, 49%, 7%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(61%, 39%, -11%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 47%, -9%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-46%, 54%, 40%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-31%, 48%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(57%, 32%, 68%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 27%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.3278" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(52%, 34%, 71%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-62%, 50%, 69%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-3%, 53%, 32%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(3%, 53%, 31%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-66%, 50%, 68%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(51%, 35%, 72%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2750" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(42%, 38%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 53%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(29%, 51%, 19%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(60%, 40%, -14%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(60%, 40%, -13%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(30%, 51%, 17%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 53%, 59%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(40%, 39%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.2222" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(35%, 41%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-89%, 54%, 54%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(38%, 50%, 8%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 38%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 47%, -10%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-68%, 54%, 45%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(19%, 45%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1694" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(35%, 41%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-88%, 54%, 53%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(41%, 49%, 2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 41%, -16%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(20%, 52%, 25%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-70%, 51%, 67%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 34%, 71%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.1167" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(41%, 39%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-91%, 53%, 56%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(38%, 49%, 8%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(47%, 47%, -11%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-74%, 54%, 47%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(27%, 43%, 77%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0639" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 27%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(52%, 34%, 71%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-80%, 52%, 65%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(29%, 51%, 19%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -6%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 38%, -4%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(30%, 51%, 17%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-83%, 52%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="-0.0111" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 25%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-7%, 47%, 74%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-18%, 54%, 34%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(57%, 42%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(58%, 42%, -18%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-11%, 54%, 33%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0417" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 23%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(42%, 38%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 54%, 55%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(43%, 48%, -4%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(52%, 45%, -17%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.0944" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 19%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 25%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-5%, 47%, 74%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-9%, 54%, 33%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(59%, 41%, -16%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.1472" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(62%, 26%, 71%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 21%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 26%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(54%, 33%, 70%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-81%, 52%, 64%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(34%, 50%, 13%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2000" y="-0.5"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(40%, 39%, 76%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.45"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 22%, 67%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 22%, 61%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.3"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(44%, 38%, 75%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 54%, 54%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.2"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 47%, -9%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="0"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, 0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -0%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -1%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.4000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.0528" height="0.0500" x="0.2528" y="-0.5"/></g><g class="chart"><g class="grid reference"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 52%, 59%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0050"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(2%, 52%, 59%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0100"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(3%, 51%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0150"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(4%, 51%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0200"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(6%, 51%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0250"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(7%, 51%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0300"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(8%, 50%, 62%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0350"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(10%, 50%, 62%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0400"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(11%, 50%, 63%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0450"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(12%, 50%, 63%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(13%, 49%, 63%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0550"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(14%, 49%, 64%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0600"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(15%, 49%, 64%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0650"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(16%, 48%, 64%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0700"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(17%, 48%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0750"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(19%, 48%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0800"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(20%, 48%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0850"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(21%, 47%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0900"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(21%, 47%, 66%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.0950"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(22%, 47%, 66%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(24%, 46%, 67%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1050"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(25%, 45%, 69%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1100"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(27%, 45%, 70%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1150"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(29%, 44%, 72%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.12"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(31%, 43%, 73%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.125"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(34%, 42%, 74%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.13"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(37%, 41%, 75%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.135"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(39%, 39%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.14"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(42%, 38%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1450"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(45%, 37%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(47%, 35%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1550"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(50%, 34%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1600"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 32%, 75%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1650"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(56%, 30%, 74%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1700"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(58%, 29%, 73%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1750"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(61%, 27%, 72%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1800"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 25%, 70%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1850"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 23%, 68%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1900"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 21%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.1950"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 18%, 62%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(72%, 17%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2050"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(72%, 18%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2100"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 19%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2150"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(71%, 20%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2200"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 20%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2250"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 21%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2300"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 22%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2350"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 23%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.24"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 23%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.245"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 24%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.25"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 24%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.255"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 25%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.26"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 26%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.265"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 26%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.27"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 27%, 61%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.275"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 27%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.28"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 28%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2850"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 28%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2900"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 29%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.2950"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(63%, 29%, 60%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3000"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(61%, 31%, 63%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3050"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(55%, 33%, 69%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3100"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(49%, 36%, 73%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3150"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(42%, 38%, 76%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3200"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(33%, 41%, 77%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3250"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(21%, 44%, 77%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3300"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-7%, 47%, 74%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3350"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-49%, 49%, 71%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3400"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-78%, 51%, 65%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.345"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-90%, 53%, 59%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-87%, 54%, 52%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.355"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-66%, 54%, 44%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.36"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(-30%, 54%, 36%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.365"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(14%, 53%, 28%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3700"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(28%, 51%, 19%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.375"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(38%, 49%, 7%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3800"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(46%, 47%, -10%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.385"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(53%, 44%, -18%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.3900"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(58%, 42%, -17%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.395"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(62%, 39%, -8%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -0%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.405"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(64%, 37%, -1%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4100"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4150"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 37%, -1%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4200"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(65%, 36%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4250"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4300"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 36%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4350"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(66%, 35%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4400"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4450"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4500"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(67%, 35%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4550"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4600"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4650"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(68%, 34%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4700"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4750"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.48"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(69%, 33%, -2%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.4850"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.49"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -1%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.495"/></g><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(70%, 32%, -0%)" fill-opacity="1.0"><rect width="0.1077" height="0.0050" x="0.5167" y="-0.5"/></g></g></g><g class="hud"><g class="axis"><g class="ticks"><g class="tickglyph"><g stroke-width="0.0022" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="0.6308,-0.0796+0.6470,-0.0796"/><polyline points="0.6308,-0.2265+0.6470,-0.2265"/><polyline points="0.6308,-0.3734+0.6470,-0.3734"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="start"><text x="0.7019" y="-0.0741">-6</text><text x="0.7019" y="-0.2210">-4</text><text x="0.7019" y="-0.3679">-2</text></g></g></g></g></g></g><g class="hud"></g></svg>
− other/svgoptions.svg
@@ -1,5 +0,0 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.385 -0.5275 0.77 1.0625" width="210.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="1.0" stroke="#a6cee3" stroke-width="1.5e-2" fill="none"><polyline points="-0.35,0.3--0.11666666666666667,0.3-0.11666666666666664,-0.5"/></g><g stroke-opacity="1.0" stroke="#1f78b4" stroke-width="3.0e-2" fill="none"><polyline points="-0.35,0.5-0.35,-0.10000000000000009"/></g><g stroke-opacity="1.0" stroke="#e31a1c" stroke-width="1.0e-2" fill="none"><polyline points="-0.23333333333333334,-0.30000000000000004--0.23333333333333334,0.5"/></g></svg>
other/text.svg view
@@ -1,1 +1,55 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.7825 -0.56625 1.5649999999999997 1.1125" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-0.75" y="0.5">a</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-0.6001859947935978" y="0.4583333333333333">b</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-0.45186888160529204" y="0.4166666666666667">c</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-0.30653059600294075" y="0.375">d</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-0.16562331009383302" y="0.33333333333333337">e</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="-3.0554922901016357e-2" y="0.2916666666666667">f</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="9.732500689835133e-2" y="0.25">g</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.21673874531719906" y="0.20833333333333337">h</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.32649314975417987" y="0.16666666666666669">i</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.42549159048014196" y="0.125">j</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.5127449077998854" y="8.333333333333337e-2">k</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.5873812954088633" y="4.1666666666666685e-2">l</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.648655011193596" y="-0.0">m</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.6959538284403604" y="-4.166666666666663e-2">n</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.7288051530021371" y="-8.333333333333326e-2">o</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.7468807453031086" y="-0.125">p</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.7499999999999998" y="-0.16666666666666663">q</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.7381317505309688" y="-0.20833333333333326">r</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.711394580521588" y="-0.25">s</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.6700556389364576" y="-0.29166666666666663">t</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.6145279708150593" y="-0.33333333333333326">u</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.545366390262255" y="-0.375">v</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.4632619369291493" y="-0.41666666666666663">w</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.369034971373323" y="-0.45833333333333326">x</text></g><g fill-opacity="1.0" font-size="5.0e-2" stroke="none" stroke-width="0.0" fill="#333333" text-anchor="middle"><text x="0.26362697828731596" y="-0.5">y</text></g></svg>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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;+}+++{+  .text g {+    fill: rgb(5%, 5%, 5%);+  }+}+@media (prefers-color-scheme:dark) {+  .text g {+    fill: rgb(94%, 94%, 94%);+  }+}+</style><g class="chart"><g class="text"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.1" text-anchor="middle"><text x="-0.6113" y="0.3822">a</text><text x="-0.4823" y="0.3507">b</text><text x="-0.3546" y="0.3192">c</text><text x="-0.2295" y="0.2877">d</text><text x="-0.1082" y="0.2562">e</text><text x="0.0081" y="0.2247">f</text><text x="0.1182" y="0.1932">g</text><text x="0.2210" y="0.1617">h</text><text x="0.3155" y="0.1302">i</text><text x="0.4007" y="0.0988">j</text><text x="0.4758" y="0.0673">k</text><text x="0.5401" y="0.0358">l</text><text x="0.5928" y="0.0043">m</text><text x="0.6336" y="-0.0272">n</text><text x="0.6618" y="-0.0587">o</text><text x="0.6774" y="-0.0902">p</text><text x="0.6801" y="-0.1217">q</text><text x="0.6699" y="-0.1532">r</text><text x="0.6469" y="-0.1847">s</text><text x="0.6113" y="-0.2162">t</text><text x="0.5635" y="-0.2477">u</text><text x="0.5039" y="-0.2791">v</text><text x="0.4332" y="-0.3106">w</text><text x="0.3521" y="-0.3421">x</text><text x="0.2614" y="-0.3736">y</text><text x="0.1619" y="-0.4051">z</text></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.3461" height="0.8743" x="-0.6387" y="-0.4684"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2956" height="0.0032" x="-0.6131" y="0.3901"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6113,0.3822 -0.6113,-0.4051"/><polyline points="-0.3529,0.3822 -0.3529,-0.4051"/><polyline points="-0.0945,0.3822 -0.0945,-0.4051"/><polyline points="0.1639,0.3822 0.1639,-0.4051"/><polyline points="0.4223,0.3822 0.4223,-0.4051"/><polyline points="0.6806,0.3822 0.6806,-0.4051"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6113,0.4154+-0.6113,0.3917"/><polyline points="-0.3529,0.4154+-0.3529,0.3917"/><polyline points="-0.0945,0.4154+-0.0945,0.3917"/><polyline points="0.1639,0.4154+0.1639,0.3917"/><polyline points="0.4223,0.4154+0.4223,0.3917"/><polyline points="0.6806,0.4154+0.6806,0.3917"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6113" y="0.4589">0.0</text><text x="-0.3529" y="0.4589">0.2</text><text x="-0.0945" y="0.4589">0.4</text><text x="0.1639" y="0.4589">0.6</text><text x="0.4223" y="0.4589">0.8</text><text x="0.6806" y="0.4589">1.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0037" height="0.7905" x="-0.6241" y="-0.4067"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6113,0.3822 0.6806,0.3822"/><polyline points="-0.6113,0.2247 0.6806,0.2247"/><polyline points="-0.6113,0.0673 0.6806,0.0673"/><polyline points="-0.6113,-0.0902 0.6806,-0.0902"/><polyline points="-0.6113,-0.2477 0.6806,-0.2477"/><polyline points="-0.6113,-0.4051 0.6806,-0.4051"/></g></g><g class="tickglyph"><g stroke-width="0.0037" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6496,0.3822+-0.6222,0.3822"/><polyline points="-0.6496,0.2247+-0.6222,0.2247"/><polyline points="-0.6496,0.0673+-0.6222,0.0673"/><polyline points="-0.6496,-0.0902+-0.6222,-0.0902"/><polyline points="-0.6496,-0.2477+-0.6222,-0.2477"/><polyline points="-0.6496,-0.4051+-0.6222,-0.4051"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6697" y="0.3909"> 0</text><text x="-0.6697" y="0.2334"> 5</text><text x="-0.6697" y="0.0760">10</text><text x="-0.6697" y="-0.0815">15</text><text x="-0.6697" y="-0.2390">20</text><text x="-0.6697" y="-0.3964">25</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
other/unit.svg view
@@ -1,1 +1,46 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-0.775 -0.525 1.55 1.05" width="450.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke-opacity="0.8" fill-opacity="0.3" stroke="#1f78b4" stroke-width="1.0e-2" fill="#1f78b4"><rect height="1.0" width="1.5" x="-0.75" y="-0.5"/></g></svg>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="unit"><g stroke-width="0.0100" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.1"><rect width="1.0487" height="0.6887" x="-0.4773" y="-0.3807"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.2584" height="0.8264" x="-0.5822" y="-0.4496"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2617" height="0.0033" x="-0.5839" y="0.3851"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5822,0.3769 -0.5822,-0.4496"/><polyline points="-0.3725,0.3769 -0.3725,-0.4496"/><polyline points="-0.1628,0.3769 -0.1628,-0.4496"/><polyline points="0.0470,0.3769 0.0470,-0.4496"/><polyline points="0.2567,0.3769 0.2567,-0.4496"/><polyline points="0.4664,0.3769 0.4664,-0.4496"/><polyline points="0.6762,0.3769 0.6762,-0.4496"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5822,0.4116+-0.5822,0.3868"/><polyline points="-0.3725,0.4116+-0.3725,0.3868"/><polyline points="-0.1628,0.4116+-0.1628,0.3868"/><polyline points="0.0470,0.4116+0.0470,0.3868"/><polyline points="0.2567,0.4116+0.2567,0.3868"/><polyline points="0.4664,0.4116+0.4664,0.3868"/><polyline points="0.6762,0.4116+0.6762,0.3868"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.5822" y="0.4570">-0.6</text><text x="-0.3725" y="0.4570">-0.4</text><text x="-0.1628" y="0.4570">-0.2</text><text x="0.0470" y="0.4570"> 0.0</text><text x="0.2567" y="0.4570"> 0.2</text><text x="0.4664" y="0.4570"> 0.4</text><text x="0.6762" y="0.4570"> 0.6</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0034" height="0.8298" x="-0.5940" y="-0.4512"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5822,0.3769 0.6762,0.3769"/><polyline points="-0.5822,0.2391 0.6762,0.2391"/><polyline points="-0.5822,0.1014 0.6762,0.1014"/><polyline points="-0.5822,-0.0364 0.6762,-0.0364"/><polyline points="-0.5822,-0.1741 0.6762,-0.1741"/><polyline points="-0.5822,-0.3118 0.6762,-0.3118"/><polyline points="-0.5822,-0.4496 0.6762,-0.4496"/></g></g><g class="tickglyph"><g stroke-width="0.0034" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6174,0.3769+-0.5923,0.3769"/><polyline points="-0.6174,0.2391+-0.5923,0.2391"/><polyline points="-0.6174,0.1014+-0.5923,0.1014"/><polyline points="-0.6174,-0.0364+-0.5923,-0.0364"/><polyline points="-0.6174,-0.1741+-0.5923,-0.1741"/><polyline points="-0.6174,-0.3118+-0.5923,-0.3118"/><polyline points="-0.6174,-0.4496+-0.5923,-0.4496"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6359" y="0.3860">-0.6</text><text x="-0.6359" y="0.2482">-0.4</text><text x="-0.6359" y="0.1105">-0.2</text><text x="-0.6359" y="-0.0273"> 0.0</text><text x="-0.6359" y="-0.1650"> 0.2</text><text x="-0.6359" y="-0.3028"> 0.4</text><text x="-0.6359" y="-0.4405"> 0.6</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ other/usage.svg view
@@ -0,0 +1,18 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.75 -0.5 1.5000 1.0"><style>svg {color-scheme: light dark;} {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: rgb(5%, 5%, 5%);} .ticklines g, .tickglyph g, .legendBorder g {stroke: rgb(5%, 5%, 5%);} .legendBorder g {fill: rgb(94%, 94%, 94%);}} @media (prefers-color-scheme:dark) {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: rgb(94%, 94%, 94%);} .ticklines g, .tickglyph g, .legendBorder g {stroke: rgb(94%, 94%, 94%);} .legendBorder g {fill: rgb(5%, 5%, 5%);}}+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="line"><g stroke-width="0.0150" stroke="rgb(2%, 73%, 80%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6371,0.2114 -0.1971,0.2114 0.2429,-0.4495"/></g><g stroke-width="0.0150" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="none"><polyline points="-0.6371,0.3766 0.5949,-0.1191"/></g><g stroke-width="0.0150" stroke="rgb(66%, 7%, 55%)" stroke-opacity="1.0" fill="none"><polyline points="-0.4171,-0.2843 -0.4171,0.3766"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.3266" height="0.8384" x="-0.6437" y="-0.4557"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.3236" height="0.0033" x="-0.6388" y="0.3848"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6371,0.3766 -0.6371,-0.4495"/><polyline points="-0.4171,0.3766 -0.4171,-0.4495"/><polyline points="-0.1971,0.3766 -0.1971,-0.4495"/><polyline points="0.0229,0.3766 0.0229,-0.4495"/><polyline points="0.2429,0.3766 0.2429,-0.4495"/><polyline points="0.4629,0.3766 0.4629,-0.4495"/><polyline points="0.6830,0.3766 0.6830,-0.4495"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6371,0.4114+-0.6371,0.3865"/><polyline points="-0.4171,0.4114+-0.4171,0.3865"/><polyline points="-0.1971,0.4114+-0.1971,0.3865"/><polyline points="0.0229,0.4114+0.0229,0.3865"/><polyline points="0.2429,0.4114+0.2429,0.3865"/><polyline points="0.4629,0.4114+0.4629,0.3865"/><polyline points="0.6830,0.4114+0.6830,0.3865"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.6371" y="0.4569">0.0</text><text x="-0.4171" y="0.4569">0.5</text><text x="-0.1971" y="0.4569">1.0</text><text x="0.0229" y="0.4569">1.5</text><text x="0.2429" y="0.4569">2.0</text><text x="0.4629" y="0.4569">2.5</text><text x="0.6830" y="0.4569">3.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0035" height="0.8293" x="-0.6494" y="-0.4511"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.6371,0.3766 0.6830,0.3766"/><polyline points="-0.6371,0.2114 0.6830,0.2114"/><polyline points="-0.6371,0.0461 0.6830,0.0461"/><polyline points="-0.6371,-0.1191 0.6830,-0.1191"/><polyline points="-0.6371,-0.2843 0.6830,-0.2843"/><polyline points="-0.6371,-0.4495 0.6830,-0.4495"/></g></g><g class="tickglyph"><g stroke-width="0.0035" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6741,0.3766+-0.6477,0.3766"/><polyline points="-0.6741,0.2114+-0.6477,0.2114"/><polyline points="-0.6741,0.0461+-0.6477,0.0461"/><polyline points="-0.6741,-0.1191+-0.6477,-0.1191"/><polyline points="-0.6741,-0.2843+-0.6477,-0.2843"/><polyline points="-0.6741,-0.4495+-0.6477,-0.4495"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6935" y="0.3857">0</text><text x="-0.6935" y="0.2205">1</text><text x="-0.6935" y="0.0553">2</text><text x="-0.6935" y="-0.1099">3</text><text x="-0.6935" y="-0.2751">4</text><text x="-0.6935" y="-0.4403">5</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5000" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
other/venn.svg view
@@ -1,1 +1,46 @@-<svg xmlns="http://www.w3.org/2000/svg" height="300.0" viewBox="-1.52 -1.52 3.04 3.04" width="300.0" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill-opacity="1.0" font-size="0.8" stroke="none" stroke-width="0.0" fill="#1a0033" text-anchor="middle"><text transform="rotate(0.0, 0.0, 0.2)" x="0.0" y="0.2">λ</text></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#0ea194"><path transform="translate(0.0, -0.0)" d="M0.0,-1.2320508075688774 A0.5 0.5 0.0 1 1 1.0,0.5 1.0 1.0 0.0 0 0 0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 0.0,-1.2320508075688774 Z"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#0a865a"><path transform="translate(0.0, -0.0)" d="M-1.0,0.5 A0.5 0.5 0.0 1 0 1.0,0.5 1.0 1.0 0.0 0 1 0.0,0.5 1.0 1.0 0.0 0 1 -1.0,0.5 Z"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#9d1102"><path transform="translate(0.0, -0.0)" d="M-1.0,0.5 A0.5 0.5 0.0 1 1 0.0,-1.2320508075688774 1.0 1.0 0.0 0 0 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 -1.0,0.5 Z"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#f8a631"><path transform="translate(0.0, -0.0)" d="M0.0,-1.2320508075688774 A1.0 1.0 0.0 0 1 0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 1 0.0,-1.2320508075688774 Z"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#695b1e"><path transform="translate(0.0, -0.0)" d="M0.5,-0.3660254037844387 A1.0 1.0 0.0 0 1 1.0,0.5 1.0 1.0 0.0 0 1 0.0,0.5 1.0 1.0 0.0 0 0 0.5,-0.3660254037844387 Z"/></g><g stroke-opacity="1.0" fill-opacity="1.0" stroke="#ffffff" stroke-width="6.0e-2" fill="#31331c"><path transform="translate(0.0, -0.0)" d="M0.0,0.5 A1.0 1.0 0.0 0 1 -1.0,0.5 1.0 1.0 0.0 0 1 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 0.0,0.5 Z"/></g></svg>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="299" height="300" viewBox="-0.5 -0.5 1.0000 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="venn"><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><path d="M 0.0608,-0.3820 A 0.1335 0.1308 0 1 1 0.3277,0.0709 A 0.2669 0.2615 0 0 0 0.1942,-0.1555 A 0.2669 0.2615 0 0 0 0.0608,-0.3820 L 0.0608,-0.3820"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="0.2"><path d="M -0.2061,0.0709 A 0.1335 0.1308 0 1 0 0.3277,0.0709 A 0.2669 0.2615 0 0 1 0.0608,0.0709 A 0.2669 0.2615 0 0 1 -0.2061,0.0709 L -0.2061,0.0709"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="0.2"><path d="M -0.2061,0.0709 A 0.1335 0.1308 0 1 1 0.0608,-0.3820 A 0.2669 0.2615 0 0 0 -0.0727,-0.1555 A 0.2669 0.2615 0 0 0 -0.2061,0.0709 L -0.2061,0.0709"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(96%, 60%, 92%)" fill-opacity="0.2"><path d="M 0.1942,-0.1555 A 0.2669 0.2615 0 0 1 0.3277,0.0709 A 0.2669 0.2615 0 0 1 0.0608,0.0709 A 0.2669 0.2615 0 0 0 0.1942,-0.1555 L 0.1942,-0.1555"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="0.2"><path d="M 0.0608,0.0709 A 0.2669 0.2615 0 0 1 -0.2061,0.0709 A 0.2669 0.2615 0 0 1 -0.0727,-0.1555 A 0.2669 0.2615 0 0 0 0.0608,0.0709 L 0.0608,0.0709"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(73%, 34%, 1%)" fill-opacity="0.2"><path d="M 0.0608,-0.3820 A 0.2669 0.2615 0 0 1 0.1942,-0.1555 A 0.2669 0.2615 0 0 0 -0.0727,-0.1555 A 0.2669 0.2615 0 0 1 0.0608,-0.3820 L 0.0608,-0.3820"/></g><g stroke-width="0.0050" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 29%, 7%)" fill-opacity="0.2"><path d="M 0.1942,-0.1555 A 0.2669 0.2615 0 0 1 0.0608,0.0709 A 0.2669 0.2615 0 0 1 -0.0727,-0.1555 A 0.2669 0.2615 0 0 1 0.1942,-0.1555 L 0.1942,-0.1555"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="0.8047" height="0.7865" x="-0.3416" y="-0.4521"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.8039" height="0.0031" x="-0.3412" y="0.3403"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.3396,0.3325 -0.3396,-0.4521"/><polyline points="-0.2061,0.3325 -0.2061,-0.4521"/><polyline points="-0.0727,0.3325 -0.0727,-0.4521"/><polyline points="0.0608,0.3325 0.0608,-0.4521"/><polyline points="0.1942,0.3325 0.1942,-0.4521"/><polyline points="0.3277,0.3325 0.3277,-0.4521"/><polyline points="0.4611,0.3325 0.4611,-0.4521"/></g></g><g class="tickglyph"><g stroke-width="0.0031" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.3396,0.3654+-0.3396,0.3419"/><polyline points="-0.2061,0.3654+-0.2061,0.3419"/><polyline points="-0.0727,0.3654+-0.0727,0.3419"/><polyline points="0.0608,0.3654+0.0608,0.3419"/><polyline points="0.1942,0.3654+0.1942,0.3419"/><polyline points="0.3277,0.3654+0.3277,0.3419"/><polyline points="0.4611,0.3654+0.4611,0.3419"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.3396" y="0.4086" transform="rotate(-45.0, -0.3396, 0.4086)">-2.0</text><text x="-0.2061" y="0.4086" transform="rotate(-45.0, -0.2061, 0.4086)">-1.0</text><text x="-0.0727" y="0.4086" transform="rotate(-45.0, -0.0727, 0.4086)">-0.5</text><text x="0.0608" y="0.4086" transform="rotate(-45.0, 0.0608, 0.4086)"> 0.0</text><text x="0.1942" y="0.4086" transform="rotate(-45.0, 0.1942, 0.4086)"> 0.5</text><text x="0.3277" y="0.4086" transform="rotate(-45.0, 0.3277, 0.4086)"> 1.0</text><text x="0.4611" y="0.4086" transform="rotate(-45.0, 0.4611, 0.4086)"> 2.0</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0032" height="0.7877" x="-0.3508" y="-0.4537"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.3396,0.3325 0.4611,0.3325"/><polyline points="-0.3396,0.2017 0.4611,0.2017"/><polyline points="-0.3396,0.0709 0.4611,0.0709"/><polyline points="-0.3396,-0.0598 0.4611,-0.0598"/><polyline points="-0.3396,-0.1906 0.4611,-0.1906"/><polyline points="-0.3396,-0.3213 0.4611,-0.3213"/><polyline points="-0.3396,-0.4521 0.4611,-0.4521"/></g></g><g class="tickglyph"><g stroke-width="0.0032" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.3733,0.3325+-0.3492,0.3325"/><polyline points="-0.3733,0.2017+-0.3492,0.2017"/><polyline points="-0.3733,0.0709+-0.3492,0.0709"/><polyline points="-0.3733,-0.0598+-0.3492,-0.0598"/><polyline points="-0.3733,-0.1906+-0.3492,-0.1906"/><polyline points="-0.3733,-0.3213+-0.3492,-0.3213"/><polyline points="-0.3733,-0.4521+-0.3492,-0.4521"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.3909" y="0.3411">-2.0</text><text x="-0.3909" y="0.2103">-1.0</text><text x="-0.3909" y="0.0796">-0.5</text><text x="-0.3909" y="-0.0512"> 0.0</text><text x="-0.3909" y="-0.1819"> 0.5</text><text x="-0.3909" y="-0.3127"> 1.0</text><text x="-0.3909" y="-0.4435"> 2.0</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.0000" height="1.0" x="-0.5" y="-0.5"/></g></g></g></svg>
+ other/wave.svg view
@@ -0,0 +1,45 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449" height="300" viewBox="-0.75 -0.5 1.5000 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="wave"><g stroke-width="0.0030" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="0.2"><rect width="0.0300" height="0.0300" x="-0.5934" y="-0.0517"/><rect width="0.0300" height="0.0300" x="-0.5550" y="-0.1374"/><rect width="0.0300" height="0.0300" x="-0.5166" y="-0.2194"/><rect width="0.0300" height="0.0300" x="-0.4782" y="-0.2941"/><rect width="0.0300" height="0.0300" x="-0.4398" y="-0.3582"/><rect width="0.0300" height="0.0300" x="-0.4014" y="-0.4089"/><rect width="0.0300" height="0.0300" x="-0.3630" y="-0.4439"/><rect width="0.0300" height="0.0300" x="-0.3245" y="-0.4619"/><rect width="0.0300" height="0.0300" x="-0.2861" y="-0.4619"/><rect width="0.0300" height="0.0300" x="-0.2477" y="-0.4439"/><rect width="0.0300" height="0.0300" x="-0.2093" y="-0.4089"/><rect width="0.0300" height="0.0300" x="-0.1709" y="-0.3582"/><rect width="0.0300" height="0.0300" x="-0.1325" y="-0.2941"/><rect width="0.0300" height="0.0300" x="-0.0941" y="-0.2194"/><rect width="0.0300" height="0.0300" x="-0.0557" y="-0.1374"/><rect width="0.0300" height="0.0300" x="-0.0172" y="-0.0517"/><rect width="0.0300" height="0.0300" x="0.0212" y="0.0341"/><rect width="0.0300" height="0.0300" x="0.0596" y="0.1161"/><rect width="0.0300" height="0.0300" x="0.0980" y="0.1907"/><rect width="0.0300" height="0.0300" x="0.1364" y="0.2548"/><rect width="0.0300" height="0.0300" x="0.1748" y="0.3055"/><rect width="0.0300" height="0.0300" x="0.2132" y="0.3406"/><rect width="0.0300" height="0.0300" x="0.2516" y="0.3585"/><rect width="0.0300" height="0.0300" x="0.2900" y="0.3585"/><rect width="0.0300" height="0.0300" x="0.3285" y="0.3406"/><rect width="0.0300" height="0.0300" x="0.3669" y="0.3055"/><rect width="0.0300" height="0.0300" x="0.4053" y="0.2548"/><rect width="0.0300" height="0.0300" x="0.4437" y="0.1907"/><rect width="0.0300" height="0.0300" x="0.4821" y="0.1161"/><rect width="0.0300" height="0.0300" x="0.5205" y="0.0341"/><rect width="0.0300" height="0.0300" x="0.5589" y="-0.0517"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.2980" height="0.8479" x="-0.5926" y="-0.4606"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2872" height="0.0033" x="-0.5801" y="0.3841"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5784,0.3757 -0.5784,-0.4491"/><polyline points="-0.3950,0.3757 -0.3950,-0.4491"/><polyline points="-0.2116,0.3757 -0.2116,-0.4491"/><polyline points="-0.0282,0.3757 -0.0282,-0.4491"/><polyline points="0.1552,0.3757 0.1552,-0.4491"/><polyline points="0.3386,0.3757 0.3386,-0.4491"/><polyline points="0.5220,0.3757 0.5220,-0.4491"/><polyline points="0.7054,0.3757 0.7054,-0.4491"/></g></g><g class="tickglyph"><g stroke-width="0.0033" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5784,0.4108+-0.5784,0.3857"/><polyline points="-0.3950,0.4108+-0.3950,0.3857"/><polyline points="-0.2116,0.4108+-0.2116,0.3857"/><polyline points="-0.0282,0.4108+-0.0282,0.3857"/><polyline points="0.1552,0.4108+0.1552,0.3857"/><polyline points="0.3386,0.4108+0.3386,0.3857"/><polyline points="0.5220,0.4108+0.5220,0.3857"/><polyline points="0.7054,0.4108+0.7054,0.3857"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="middle"><text x="-0.5784" y="0.4566">0</text><text x="-0.3950" y="0.4566">1</text><text x="-0.2116" y="0.4566">2</text><text x="-0.0282" y="0.4566">3</text><text x="0.1552" y="0.4566">4</text><text x="0.3386" y="0.4566">5</text><text x="0.5220" y="0.4566">6</text><text x="0.7054" y="0.4566">7</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0034" height="0.8282" x="-0.5904" y="-0.4508"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5784,0.3757 0.7054,0.3757"/><polyline points="-0.5784,0.1695 0.7054,0.1695"/><polyline points="-0.5784,-0.0367 0.7054,-0.0367"/><polyline points="-0.5784,-0.2429 0.7054,-0.2429"/><polyline points="-0.5784,-0.4491 0.7054,-0.4491"/></g></g><g class="tickglyph"><g stroke-width="0.0034" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6145,0.3757+-0.5887,0.3757"/><polyline points="-0.6145,0.1695+-0.5887,0.1695"/><polyline points="-0.6145,-0.0367+-0.5887,-0.0367"/><polyline points="-0.6145,-0.2429+-0.5887,-0.2429"/><polyline points="-0.6145,-0.4491+-0.5887,-0.4491"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6333" y="0.3849">-1.0</text><text x="-0.6333" y="0.1787">-0.5</text><text x="-0.6333" y="-0.0275"> 0.0</text><text x="-0.6333" y="-0.2337"> 0.5</text><text x="-0.6333" y="-0.4400"> 1.0</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5000" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ other/wheel.svg view
@@ -0,0 +1,47 @@+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300" viewBox="-0.75 -0.5 1.5 1.0"><style>svg {+  color-scheme: light dark;+}+{+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(5%, 5%, 5%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(5%, 5%, 5%);+  }+  .legendBorder g {+    fill: rgb(94%, 94%, 94%);+  }+}+@media (prefers-color-scheme:dark) {+  .canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {+    fill: rgb(94%, 94%, 94%);+  }+  .ticklines g, .tickglyph g, .legendBorder g {+    stroke: rgb(94%, 94%, 94%);+  }+  .legendBorder g {+    fill: rgb(5%, 5%, 5%);+  }+}+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="dots"><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(2%, 73%, 80%)" fill-opacity="1.0"><circle cx="-0.4481" cy="-0.0565" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(2%, 29%, 48%)" fill-opacity="1.0"><circle cx="-0.2264" cy="-0.0015" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 55%)" fill-opacity="1.0"><circle cx="0.5305" cy="-0.0212" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(96%, 60%, 92%)" fill-opacity="1.0"><circle cx="0.3262" cy="-0.0304" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(100%, 71%, 35%)" fill-opacity="1.0"><circle cx="0.0550" cy="-0.3441" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(73%, 34%, 1%)" fill-opacity="1.0"><circle cx="0.2144" cy="-0.3210" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(21%, 29%, 7%)" fill-opacity="1.0"><circle cx="-0.2639" cy="-0.2467" r="0.0400"/></g><g stroke-width="0.0030" stroke="rgb(50%, 50%, 50%)" stroke-opacity="1.0" fill="rgb(53%, 51%, 28%)" fill-opacity="1.0"><circle cx="-0.1579" cy="-0.2632" r="0.0400"/></g></g><g class="wheel"><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 39%)" fill-opacity="1.0"><circle cx="-0.0956" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 39%)" fill-opacity="1.0"><circle cx="-0.0635" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 38%)" fill-opacity="1.0"><circle cx="-0.0637" cy="-0.1449" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 38%)" fill-opacity="1.0"><circle cx="-0.0645" cy="-0.1469" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 38%)" fill-opacity="1.0"><circle cx="-0.0657" cy="-0.1487" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 38%)" fill-opacity="1.0"><circle cx="-0.0675" cy="-0.1505" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 37%)" fill-opacity="1.0"><circle cx="-0.0696" cy="-0.1521" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 37%)" fill-opacity="1.0"><circle cx="-0.0722" cy="-0.1536" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 37%)" fill-opacity="1.0"><circle cx="-0.0751" cy="-0.1549" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 37%)" fill-opacity="1.0"><circle cx="-0.0784" cy="-0.1561" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 37%)" fill-opacity="1.0"><circle cx="-0.0820" cy="-0.1570" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.0857" cy="-0.1577" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 36%)" fill-opacity="1.0"><circle cx="-0.0896" cy="-0.1582" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 36%)" fill-opacity="1.0"><circle cx="-0.0936" cy="-0.1585" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 36%)" fill-opacity="1.0"><circle cx="-0.0977" cy="-0.1585" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 36%)" fill-opacity="1.0"><circle cx="-0.1017" cy="-0.1582" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.1056" cy="-0.1577" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.1093" cy="-0.1570" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.1129" cy="-0.1561" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.1161" cy="-0.1549" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 37%)" fill-opacity="1.0"><circle cx="-0.1191" cy="-0.1536" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 40%, 37%)" fill-opacity="1.0"><circle cx="-0.1217" cy="-0.1521" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 38%)" fill-opacity="1.0"><circle cx="-0.1238" cy="-0.1505" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 38%)" fill-opacity="1.0"><circle cx="-0.1255" cy="-0.1487" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 38%)" fill-opacity="1.0"><circle cx="-0.1268" cy="-0.1469" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 39%)" fill-opacity="1.0"><circle cx="-0.1276" cy="-0.1449" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 39%)" fill-opacity="1.0"><circle cx="-0.1278" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 39%)" fill-opacity="1.0"><circle cx="-0.1276" cy="-0.1411" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1268" cy="-0.1392" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1255" cy="-0.1373" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1238" cy="-0.1355" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1217" cy="-0.1339" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1191" cy="-0.1324" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1161" cy="-0.1311" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1129" cy="-0.1299" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1093" cy="-0.1290" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1056" cy="-0.1283" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.1017" cy="-0.1278" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.0977" cy="-0.1275" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.0936" cy="-0.1275" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.0896" cy="-0.1278" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 41%)" fill-opacity="1.0"><circle cx="-0.0857" cy="-0.1283" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 38%, 41%)" fill-opacity="1.0"><circle cx="-0.0820" cy="-0.1290" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 38%, 41%)" fill-opacity="1.0"><circle cx="-0.0784" cy="-0.1299" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 41%)" fill-opacity="1.0"><circle cx="-0.0751" cy="-0.1311" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 40%)" fill-opacity="1.0"><circle cx="-0.0722" cy="-0.1324" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 40%)" fill-opacity="1.0"><circle cx="-0.0696" cy="-0.1339" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 40%)" fill-opacity="1.0"><circle cx="-0.0675" cy="-0.1355" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 40%)" fill-opacity="1.0"><circle cx="-0.0657" cy="-0.1373" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 39%)" fill-opacity="1.0"><circle cx="-0.0645" cy="-0.1392" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 39%)" fill-opacity="1.0"><circle cx="-0.0637" cy="-0.1411" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 39%)" fill-opacity="1.0"><circle cx="-0.0313" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 38%)" fill-opacity="1.0"><circle cx="-0.0318" cy="-0.1469" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 37%)" fill-opacity="1.0"><circle cx="-0.0334" cy="-0.1507" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 37%)" fill-opacity="1.0"><circle cx="-0.0358" cy="-0.1544" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 36%)" fill-opacity="1.0"><circle cx="-0.0393" cy="-0.1579" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 36%)" fill-opacity="1.0"><circle cx="-0.0436" cy="-0.1612" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 35%)" fill-opacity="1.0"><circle cx="-0.0488" cy="-0.1642" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 35%)" fill-opacity="1.0"><circle cx="-0.0547" cy="-0.1669" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 35%)" fill-opacity="1.0"><circle cx="-0.0612" cy="-0.1692" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 38%, 34%)" fill-opacity="1.0"><circle cx="-0.0683" cy="-0.1710" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 38%, 34%)" fill-opacity="1.0"><circle cx="-0.0758" cy="-0.1725" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 34%)" fill-opacity="1.0"><circle cx="-0.0836" cy="-0.1734" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 39%, 34%)" fill-opacity="1.0"><circle cx="-0.0916" cy="-0.1739" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 34%)" fill-opacity="1.0"><circle cx="-0.0997" cy="-0.1739" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 34%)" fill-opacity="1.0"><circle cx="-0.1077" cy="-0.1734" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 39%, 34%)" fill-opacity="1.0"><circle cx="-0.1155" cy="-0.1725" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 40%, 34%)" fill-opacity="1.0"><circle cx="-0.1230" cy="-0.1710" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 40%, 35%)" fill-opacity="1.0"><circle cx="-0.1301" cy="-0.1692" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 35%)" fill-opacity="1.0"><circle cx="-0.1366" cy="-0.1669" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 36%)" fill-opacity="1.0"><circle cx="-0.1425" cy="-0.1642" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 40%, 36%)" fill-opacity="1.0"><circle cx="-0.1477" cy="-0.1612" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 40%, 37%)" fill-opacity="1.0"><circle cx="-0.1520" cy="-0.1579" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 40%, 37%)" fill-opacity="1.0"><circle cx="-0.1554" cy="-0.1544" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 40%, 38%)" fill-opacity="1.0"><circle cx="-0.1579" cy="-0.1507" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 40%, 38%)" fill-opacity="1.0"><circle cx="-0.1595" cy="-0.1469" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 39%)" fill-opacity="1.0"><circle cx="-0.1600" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1595" cy="-0.1391" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 40%)" fill-opacity="1.0"><circle cx="-0.1579" cy="-0.1353" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 41%)" fill-opacity="1.0"><circle cx="-0.1554" cy="-0.1316" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 41%)" fill-opacity="1.0"><circle cx="-0.1520" cy="-0.1281" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 42%)" fill-opacity="1.0"><circle cx="-0.1477" cy="-0.1248" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 40%, 42%)" fill-opacity="1.0"><circle cx="-0.1425" cy="-0.1218" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 40%, 43%)" fill-opacity="1.0"><circle cx="-0.1366" cy="-0.1191" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 40%, 43%)" fill-opacity="1.0"><circle cx="-0.1301" cy="-0.1169" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 39%, 43%)" fill-opacity="1.0"><circle cx="-0.1230" cy="-0.1150" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 39%, 43%)" fill-opacity="1.0"><circle cx="-0.1155" cy="-0.1135" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 39%, 43%)" fill-opacity="1.0"><circle cx="-0.1077" cy="-0.1126" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 44%)" fill-opacity="1.0"><circle cx="-0.0997" cy="-0.1121" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 44%)" fill-opacity="1.0"><circle cx="-0.0916" cy="-0.1121" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 38%, 43%)" fill-opacity="1.0"><circle cx="-0.0836" cy="-0.1126" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 38%, 43%)" fill-opacity="1.0"><circle cx="-0.0758" cy="-0.1135" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 38%, 43%)" fill-opacity="1.0"><circle cx="-0.0683" cy="-0.1150" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 43%)" fill-opacity="1.0"><circle cx="-0.0612" cy="-0.1169" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 38%, 42%)" fill-opacity="1.0"><circle cx="-0.0547" cy="-0.1191" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 38%, 42%)" fill-opacity="1.0"><circle cx="-0.0488" cy="-0.1218" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 37%, 41%)" fill-opacity="1.0"><circle cx="-0.0436" cy="-0.1248" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 41%)" fill-opacity="1.0"><circle cx="-0.0393" cy="-0.1281" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 40%)" fill-opacity="1.0"><circle cx="-0.0358" cy="-0.1316" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 40%)" fill-opacity="1.0"><circle cx="-0.0334" cy="-0.1353" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 39%)" fill-opacity="1.0"><circle cx="-0.0318" cy="-0.1391" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 39%)" fill-opacity="1.0"><circle cx="0.0008" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 38%)" fill-opacity="1.0"><circle cx="0.0001" cy="-0.1488" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 37%)" fill-opacity="1.0"><circle cx="-0.0022" cy="-0.1546" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 36%)" fill-opacity="1.0"><circle cx="-0.0059" cy="-0.1601" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 37%, 35%)" fill-opacity="1.0"><circle cx="-0.0111" cy="-0.1654" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 37%, 34%)" fill-opacity="1.0"><circle cx="-0.0176" cy="-0.1703" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 37%, 34%)" fill-opacity="1.0"><circle cx="-0.0253" cy="-0.1748" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 37%, 33%)" fill-opacity="1.0"><circle cx="-0.0342" cy="-0.1788" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 37%, 32%)" fill-opacity="1.0"><circle cx="-0.0440" cy="-0.1822" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 38%, 32%)" fill-opacity="1.0"><circle cx="-0.0546" cy="-0.1850" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 32%)" fill-opacity="1.0"><circle cx="-0.0658" cy="-0.1872" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 31%)" fill-opacity="1.0"><circle cx="-0.0776" cy="-0.1886" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 39%, 31%)" fill-opacity="1.0"><circle cx="-0.0896" cy="-0.1894" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 39%, 31%)" fill-opacity="1.0"><circle cx="-0.1017" cy="-0.1894" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 39%, 32%)" fill-opacity="1.0"><circle cx="-0.1137" cy="-0.1886" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 40%, 32%)" fill-opacity="1.0"><circle cx="-0.1255" cy="-0.1872" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 40%, 32%)" fill-opacity="1.0"><circle cx="-0.1367" cy="-0.1850" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 40%, 33%)" fill-opacity="1.0"><circle cx="-0.1473" cy="-0.1822" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 33%)" fill-opacity="1.0"><circle cx="-0.1571" cy="-0.1788" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 41%, 34%)" fill-opacity="1.0"><circle cx="-0.1660" cy="-0.1748" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 41%, 35%)" fill-opacity="1.0"><circle cx="-0.1737" cy="-0.1703" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 41%, 36%)" fill-opacity="1.0"><circle cx="-0.1802" cy="-0.1654" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 41%, 36%)" fill-opacity="1.0"><circle cx="-0.1853" cy="-0.1601" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 41%, 37%)" fill-opacity="1.0"><circle cx="-0.1891" cy="-0.1546" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 41%, 38%)" fill-opacity="1.0"><circle cx="-0.1914" cy="-0.1488" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 41%, 39%)" fill-opacity="1.0"><circle cx="-0.1921" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 41%, 40%)" fill-opacity="1.0"><circle cx="-0.1914" cy="-0.1372" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 41%, 41%)" fill-opacity="1.0"><circle cx="-0.1891" cy="-0.1315" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 41%, 42%)" fill-opacity="1.0"><circle cx="-0.1853" cy="-0.1259" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 41%, 42%)" fill-opacity="1.0"><circle cx="-0.1802" cy="-0.1206" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 41%, 43%)" fill-opacity="1.0"><circle cx="-0.1737" cy="-0.1157" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 41%, 44%)" fill-opacity="1.0"><circle cx="-0.1660" cy="-0.1112" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 40%, 44%)" fill-opacity="1.0"><circle cx="-0.1571" cy="-0.1072" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 40%, 45%)" fill-opacity="1.0"><circle cx="-0.1473" cy="-0.1038" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 40%, 45%)" fill-opacity="1.0"><circle cx="-0.1367" cy="-0.1010" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 39%, 46%)" fill-opacity="1.0"><circle cx="-0.1255" cy="-0.0988" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 39%, 46%)" fill-opacity="1.0"><circle cx="-0.1137" cy="-0.0974" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 39%, 46%)" fill-opacity="1.0"><circle cx="-0.1017" cy="-0.0966" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 39%, 46%)" fill-opacity="1.0"><circle cx="-0.0896" cy="-0.0966" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 38%, 46%)" fill-opacity="1.0"><circle cx="-0.0776" cy="-0.0974" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 38%, 45%)" fill-opacity="1.0"><circle cx="-0.0658" cy="-0.0988" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 38%, 45%)" fill-opacity="1.0"><circle cx="-0.0546" cy="-0.1010" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 37%, 45%)" fill-opacity="1.0"><circle cx="-0.0440" cy="-0.1038" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 37%, 44%)" fill-opacity="1.0"><circle cx="-0.0342" cy="-0.1072" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 43%)" fill-opacity="1.0"><circle cx="-0.0253" cy="-0.1112" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 43%)" fill-opacity="1.0"><circle cx="-0.0176" cy="-0.1157" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 37%, 42%)" fill-opacity="1.0"><circle cx="-0.0111" cy="-0.1206" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 36%, 41%)" fill-opacity="1.0"><circle cx="-0.0059" cy="-0.1259" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 36%, 40%)" fill-opacity="1.0"><circle cx="-0.0022" cy="-0.1315" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 39%)" fill-opacity="1.0"><circle cx="0.0001" cy="-0.1372" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 35%, 38%)" fill-opacity="1.0"><circle cx="0.0330" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 35%, 37%)" fill-opacity="1.0"><circle cx="0.0320" cy="-0.1508" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 35%, 36%)" fill-opacity="1.0"><circle cx="0.0289" cy="-0.1584" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 35%, 35%)" fill-opacity="1.0"><circle cx="0.0240" cy="-0.1658" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 36%, 34%)" fill-opacity="1.0"><circle cx="0.0171" cy="-0.1729" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 36%, 33%)" fill-opacity="1.0"><circle cx="0.0084" cy="-0.1794" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 36%, 32%)" fill-opacity="1.0"><circle cx="-0.0019" cy="-0.1854" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 36%, 31%)" fill-opacity="1.0"><circle cx="-0.0137" cy="-0.1907" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 37%, 30%)" fill-opacity="1.0"><circle cx="-0.0267" cy="-0.1953" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 37%, 30%)" fill-opacity="1.0"><circle cx="-0.0409" cy="-0.1991" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 38%, 29%)" fill-opacity="1.0"><circle cx="-0.0559" cy="-0.2019" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 38%, 29%)" fill-opacity="1.0"><circle cx="-0.0715" cy="-0.2039" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 38%, 29%)" fill-opacity="1.0"><circle cx="-0.0876" cy="-0.2048" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 39%, 29%)" fill-opacity="1.0"><circle cx="-0.1037" cy="-0.2048" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 39%, 29%)" fill-opacity="1.0"><circle cx="-0.1198" cy="-0.2039" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 40%, 29%)" fill-opacity="1.0"><circle cx="-0.1354" cy="-0.2019" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 40%, 30%)" fill-opacity="1.0"><circle cx="-0.1504" cy="-0.1991" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 40%, 31%)" fill-opacity="1.0"><circle cx="-0.1646" cy="-0.1953" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 41%, 31%)" fill-opacity="1.0"><circle cx="-0.1776" cy="-0.1907" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 41%, 32%)" fill-opacity="1.0"><circle cx="-0.1894" cy="-0.1854" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 41%, 33%)" fill-opacity="1.0"><circle cx="-0.1997" cy="-0.1794" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 42%, 34%)" fill-opacity="1.0"><circle cx="-0.2084" cy="-0.1729" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 42%, 36%)" fill-opacity="1.0"><circle cx="-0.2152" cy="-0.1658" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 42%, 37%)" fill-opacity="1.0"><circle cx="-0.2202" cy="-0.1584" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 42%, 38%)" fill-opacity="1.0"><circle cx="-0.2233" cy="-0.1508" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 42%, 39%)" fill-opacity="1.0"><circle cx="-0.2243" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 42%, 40%)" fill-opacity="1.0"><circle cx="-0.2233" cy="-0.1352" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 42%, 42%)" fill-opacity="1.0"><circle cx="-0.2202" cy="-0.1276" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 42%, 43%)" fill-opacity="1.0"><circle cx="-0.2152" cy="-0.1202" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 42%, 44%)" fill-opacity="1.0"><circle cx="-0.2084" cy="-0.1132" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 41%, 45%)" fill-opacity="1.0"><circle cx="-0.1997" cy="-0.1066" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 41%, 46%)" fill-opacity="1.0"><circle cx="-0.1894" cy="-0.1006" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 41%, 46%)" fill-opacity="1.0"><circle cx="-0.1776" cy="-0.0953" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 40%, 47%)" fill-opacity="1.0"><circle cx="-0.1646" cy="-0.0907" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 40%, 47%)" fill-opacity="1.0"><circle cx="-0.1504" cy="-0.0870" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 40%, 48%)" fill-opacity="1.0"><circle cx="-0.1354" cy="-0.0841" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 39%, 48%)" fill-opacity="1.0"><circle cx="-0.1198" cy="-0.0822" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 39%, 48%)" fill-opacity="1.0"><circle cx="-0.1037" cy="-0.0812" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 38%, 48%)" fill-opacity="1.0"><circle cx="-0.0876" cy="-0.0812" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 38%, 48%)" fill-opacity="1.0"><circle cx="-0.0715" cy="-0.0822" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 38%, 48%)" fill-opacity="1.0"><circle cx="-0.0559" cy="-0.0841" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 37%, 47%)" fill-opacity="1.0"><circle cx="-0.0409" cy="-0.0870" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 37%, 46%)" fill-opacity="1.0"><circle cx="-0.0267" cy="-0.0907" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 37%, 46%)" fill-opacity="1.0"><circle cx="-0.0137" cy="-0.0953" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 36%, 45%)" fill-opacity="1.0"><circle cx="-0.0019" cy="-0.1006" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 36%, 44%)" fill-opacity="1.0"><circle cx="0.0084" cy="-0.1066" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 36%, 43%)" fill-opacity="1.0"><circle cx="0.0171" cy="-0.1132" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 36%, 42%)" fill-opacity="1.0"><circle cx="0.0240" cy="-0.1202" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 35%, 41%)" fill-opacity="1.0"><circle cx="0.0289" cy="-0.1276" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 35%, 40%)" fill-opacity="1.0"><circle cx="0.0320" cy="-0.1352" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 34%, 38%)" fill-opacity="1.0"><circle cx="0.0651" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 34%, 37%)" fill-opacity="1.0"><circle cx="0.0639" cy="-0.1527" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 34%, 35%)" fill-opacity="1.0"><circle cx="0.0601" cy="-0.1623" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 35%, 34%)" fill-opacity="1.0"><circle cx="0.0539" cy="-0.1715" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 35%, 33%)" fill-opacity="1.0"><circle cx="0.0453" cy="-0.1803" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 35%, 31%)" fill-opacity="1.0"><circle cx="0.0344" cy="-0.1885" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 35%, 30%)" fill-opacity="1.0"><circle cx="0.0216" cy="-0.1960" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 36%, 29%)" fill-opacity="1.0"><circle cx="0.0068" cy="-0.2027" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 36%, 28%)" fill-opacity="1.0"><circle cx="-0.0095" cy="-0.2084" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 37%, 27%)" fill-opacity="1.0"><circle cx="-0.0272" cy="-0.2131" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 37%, 26%)" fill-opacity="1.0"><circle cx="-0.0460" cy="-0.2167" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 38%, 26%)" fill-opacity="1.0"><circle cx="-0.0655" cy="-0.2191" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 38%, 26%)" fill-opacity="1.0"><circle cx="-0.0856" cy="-0.2203" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 39%, 26%)" fill-opacity="1.0"><circle cx="-0.1057" cy="-0.2203" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 39%, 26%)" fill-opacity="1.0"><circle cx="-0.1258" cy="-0.2191" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 40%, 27%)" fill-opacity="1.0"><circle cx="-0.1453" cy="-0.2167" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 40%, 27%)" fill-opacity="1.0"><circle cx="-0.1641" cy="-0.2131" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 41%, 28%)" fill-opacity="1.0"><circle cx="-0.1818" cy="-0.2084" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 41%, 29%)" fill-opacity="1.0"><circle cx="-0.1981" cy="-0.2027" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 42%, 31%)" fill-opacity="1.0"><circle cx="-0.2129" cy="-0.1960" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 42%, 32%)" fill-opacity="1.0"><circle cx="-0.2257" cy="-0.1885" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 42%, 33%)" fill-opacity="1.0"><circle cx="-0.2366" cy="-0.1803" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 42%, 35%)" fill-opacity="1.0"><circle cx="-0.2451" cy="-0.1715" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 43%, 36%)" fill-opacity="1.0"><circle cx="-0.2514" cy="-0.1623" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 43%, 38%)" fill-opacity="1.0"><circle cx="-0.2552" cy="-0.1527" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 43%, 39%)" fill-opacity="1.0"><circle cx="-0.2564" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 43%, 41%)" fill-opacity="1.0"><circle cx="-0.2552" cy="-0.1333" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 43%, 42%)" fill-opacity="1.0"><circle cx="-0.2514" cy="-0.1237" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 42%, 44%)" fill-opacity="1.0"><circle cx="-0.2451" cy="-0.1145" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 42%, 45%)" fill-opacity="1.0"><circle cx="-0.2366" cy="-0.1057" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 42%, 46%)" fill-opacity="1.0"><circle cx="-0.2257" cy="-0.0975" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 41%, 47%)" fill-opacity="1.0"><circle cx="-0.2129" cy="-0.0900" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 41%, 48%)" fill-opacity="1.0"><circle cx="-0.1981" cy="-0.0833" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 41%, 49%)" fill-opacity="1.0"><circle cx="-0.1818" cy="-0.0776" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 40%, 49%)" fill-opacity="1.0"><circle cx="-0.1641" cy="-0.0729" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 40%, 50%)" fill-opacity="1.0"><circle cx="-0.1453" cy="-0.0694" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 39%, 50%)" fill-opacity="1.0"><circle cx="-0.1258" cy="-0.0669" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 39%, 50%)" fill-opacity="1.0"><circle cx="-0.1057" cy="-0.0657" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 38%, 50%)" fill-opacity="1.0"><circle cx="-0.0856" cy="-0.0657" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(37%, 38%, 50%)" fill-opacity="1.0"><circle cx="-0.0655" cy="-0.0669" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 37%, 50%)" fill-opacity="1.0"><circle cx="-0.0460" cy="-0.0694" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 37%, 49%)" fill-opacity="1.0"><circle cx="-0.0272" cy="-0.0729" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 36%, 48%)" fill-opacity="1.0"><circle cx="-0.0095" cy="-0.0776" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 36%, 47%)" fill-opacity="1.0"><circle cx="0.0068" cy="-0.0833" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 36%, 46%)" fill-opacity="1.0"><circle cx="0.0216" cy="-0.0900" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 35%, 45%)" fill-opacity="1.0"><circle cx="0.0344" cy="-0.0975" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 35%, 44%)" fill-opacity="1.0"><circle cx="0.0453" cy="-0.1057" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 35%, 43%)" fill-opacity="1.0"><circle cx="0.0539" cy="-0.1145" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 34%, 41%)" fill-opacity="1.0"><circle cx="0.0601" cy="-0.1237" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 34%, 40%)" fill-opacity="1.0"><circle cx="0.0639" cy="-0.1333" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 33%, 38%)" fill-opacity="1.0"><circle cx="0.0973" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 33%, 37%)" fill-opacity="1.0"><circle cx="0.0958" cy="-0.1547" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 33%, 35%)" fill-opacity="1.0"><circle cx="0.0912" cy="-0.1661" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 34%, 33%)" fill-opacity="1.0"><circle cx="0.0838" cy="-0.1772" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 34%, 31%)" fill-opacity="1.0"><circle cx="0.0734" cy="-0.1878" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 34%, 30%)" fill-opacity="1.0"><circle cx="0.0605" cy="-0.1976" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 35%, 28%)" fill-opacity="1.0"><circle cx="0.0450" cy="-0.2066" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 35%, 27%)" fill-opacity="1.0"><circle cx="0.0273" cy="-0.2146" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 36%, 25%)" fill-opacity="1.0"><circle cx="0.0077" cy="-0.2215" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 36%, 24%)" fill-opacity="1.0"><circle cx="-0.0135" cy="-0.2271" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 37%, 24%)" fill-opacity="1.0"><circle cx="-0.0360" cy="-0.2314" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 37%, 23%)" fill-opacity="1.0"><circle cx="-0.0595" cy="-0.2343" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 38%, 23%)" fill-opacity="1.0"><circle cx="-0.0835" cy="-0.2357" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 39%, 23%)" fill-opacity="1.0"><circle cx="-0.1078" cy="-0.2357" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 39%, 23%)" fill-opacity="1.0"><circle cx="-0.1318" cy="-0.2343" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 40%, 24%)" fill-opacity="1.0"><circle cx="-0.1553" cy="-0.2314" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 41%, 25%)" fill-opacity="1.0"><circle cx="-0.1778" cy="-0.2271" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 41%, 26%)" fill-opacity="1.0"><circle cx="-0.1990" cy="-0.2215" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 42%, 27%)" fill-opacity="1.0"><circle cx="-0.2186" cy="-0.2146" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 42%, 29%)" fill-opacity="1.0"><circle cx="-0.2363" cy="-0.2066" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 43%, 30%)" fill-opacity="1.0"><circle cx="-0.2517" cy="-0.1976" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 43%, 32%)" fill-opacity="1.0"><circle cx="-0.2647" cy="-0.1878" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 43%, 34%)" fill-opacity="1.0"><circle cx="-0.2750" cy="-0.1772" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 43%, 36%)" fill-opacity="1.0"><circle cx="-0.2825" cy="-0.1661" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 43%, 38%)" fill-opacity="1.0"><circle cx="-0.2871" cy="-0.1547" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 43%, 39%)" fill-opacity="1.0"><circle cx="-0.2886" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 43%, 41%)" fill-opacity="1.0"><circle cx="-0.2871" cy="-0.1314" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 43%, 43%)" fill-opacity="1.0"><circle cx="-0.2825" cy="-0.1199" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 43%, 45%)" fill-opacity="1.0"><circle cx="-0.2750" cy="-0.1088" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 43%, 46%)" fill-opacity="1.0"><circle cx="-0.2647" cy="-0.0982" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 42%, 47%)" fill-opacity="1.0"><circle cx="-0.2517" cy="-0.0884" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(23%, 42%, 49%)" fill-opacity="1.0"><circle cx="-0.2363" cy="-0.0794" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 41%, 50%)" fill-opacity="1.0"><circle cx="-0.2186" cy="-0.0714" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 41%, 51%)" fill-opacity="1.0"><circle cx="-0.1990" cy="-0.0645" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 40%, 52%)" fill-opacity="1.0"><circle cx="-0.1778" cy="-0.0589" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 40%, 52%)" fill-opacity="1.0"><circle cx="-0.1553" cy="-0.0546" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 39%, 52%)" fill-opacity="1.0"><circle cx="-0.1318" cy="-0.0517" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 39%, 53%)" fill-opacity="1.0"><circle cx="-0.1078" cy="-0.0503" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 38%, 52%)" fill-opacity="1.0"><circle cx="-0.0835" cy="-0.0503" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 37%, 52%)" fill-opacity="1.0"><circle cx="-0.0595" cy="-0.0517" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 37%, 52%)" fill-opacity="1.0"><circle cx="-0.0360" cy="-0.0546" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 36%, 51%)" fill-opacity="1.0"><circle cx="-0.0135" cy="-0.0589" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 36%, 50%)" fill-opacity="1.0"><circle cx="0.0077" cy="-0.0645" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 35%, 49%)" fill-opacity="1.0"><circle cx="0.0273" cy="-0.0714" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 35%, 48%)" fill-opacity="1.0"><circle cx="0.0450" cy="-0.0794" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 34%, 47%)" fill-opacity="1.0"><circle cx="0.0605" cy="-0.0884" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 34%, 45%)" fill-opacity="1.0"><circle cx="0.0734" cy="-0.0982" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 34%, 44%)" fill-opacity="1.0"><circle cx="0.0838" cy="-0.1088" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 33%, 42%)" fill-opacity="1.0"><circle cx="0.0912" cy="-0.1199" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 33%, 40%)" fill-opacity="1.0"><circle cx="0.0958" cy="-0.1314" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 32%, 38%)" fill-opacity="1.0"><circle cx="0.1295" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 32%, 36%)" fill-opacity="1.0"><circle cx="0.1277" cy="-0.1566" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 32%, 34%)" fill-opacity="1.0"><circle cx="0.1224" cy="-0.1700" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 32%, 32%)" fill-opacity="1.0"><circle cx="0.1137" cy="-0.1829" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 33%, 30%)" fill-opacity="1.0"><circle cx="0.1016" cy="-0.1952" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 33%, 28%)" fill-opacity="1.0"><circle cx="0.0865" cy="-0.2067" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 34%, 26%)" fill-opacity="1.0"><circle cx="0.0684" cy="-0.2172" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 34%, 24%)" fill-opacity="1.0"><circle cx="0.0478" cy="-0.2265" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 35%, 23%)" fill-opacity="1.0"><circle cx="0.0250" cy="-0.2345" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 36%, 21%)" fill-opacity="1.0"><circle cx="0.0002" cy="-0.2411" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 36%, 20%)" fill-opacity="1.0"><circle cx="-0.0261" cy="-0.2461" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 37%, 20%)" fill-opacity="1.0"><circle cx="-0.0535" cy="-0.2495" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 38%, 19%)" fill-opacity="1.0"><circle cx="-0.0815" cy="-0.2512" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 39%, 19%)" fill-opacity="1.0"><circle cx="-0.1098" cy="-0.2512" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 39%, 20%)" fill-opacity="1.0"><circle cx="-0.1378" cy="-0.2495" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 40%, 21%)" fill-opacity="1.0"><circle cx="-0.1652" cy="-0.2461" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 41%, 22%)" fill-opacity="1.0"><circle cx="-0.1915" cy="-0.2411" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 41%, 23%)" fill-opacity="1.0"><circle cx="-0.2163" cy="-0.2345" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 42%, 25%)" fill-opacity="1.0"><circle cx="-0.2391" cy="-0.2265" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 43%, 27%)" fill-opacity="1.0"><circle cx="-0.2597" cy="-0.2172" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 43%, 29%)" fill-opacity="1.0"><circle cx="-0.2778" cy="-0.2067" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 43%, 31%)" fill-opacity="1.0"><circle cx="-0.2929" cy="-0.1952" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 44%, 33%)" fill-opacity="1.0"><circle cx="-0.3049" cy="-0.1829" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 44%, 35%)" fill-opacity="1.0"><circle cx="-0.3137" cy="-0.1700" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(20%, 44%, 37%)" fill-opacity="1.0"><circle cx="-0.3190" cy="-0.1566" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 44%, 39%)" fill-opacity="1.0"><circle cx="-0.3208" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(17%, 44%, 42%)" fill-opacity="1.0"><circle cx="-0.3190" cy="-0.1294" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 44%, 44%)" fill-opacity="1.0"><circle cx="-0.3137" cy="-0.1160" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 44%, 45%)" fill-opacity="1.0"><circle cx="-0.3049" cy="-0.1031" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 43%, 47%)" fill-opacity="1.0"><circle cx="-0.2929" cy="-0.0908" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(17%, 43%, 49%)" fill-opacity="1.0"><circle cx="-0.2778" cy="-0.0793" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 42%, 50%)" fill-opacity="1.0"><circle cx="-0.2597" cy="-0.0688" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 42%, 52%)" fill-opacity="1.0"><circle cx="-0.2391" cy="-0.0595" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(23%, 41%, 53%)" fill-opacity="1.0"><circle cx="-0.2163" cy="-0.0515" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 41%, 54%)" fill-opacity="1.0"><circle cx="-0.1915" cy="-0.0449" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 40%, 54%)" fill-opacity="1.0"><circle cx="-0.1652" cy="-0.0399" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 39%, 55%)" fill-opacity="1.0"><circle cx="-0.1378" cy="-0.0365" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 38%, 55%)" fill-opacity="1.0"><circle cx="-0.1098" cy="-0.0348" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 38%, 55%)" fill-opacity="1.0"><circle cx="-0.0815" cy="-0.0348" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 37%, 54%)" fill-opacity="1.0"><circle cx="-0.0535" cy="-0.0365" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 36%, 54%)" fill-opacity="1.0"><circle cx="-0.0261" cy="-0.0399" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 36%, 53%)" fill-opacity="1.0"><circle cx="0.0002" cy="-0.0449" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 35%, 52%)" fill-opacity="1.0"><circle cx="0.0250" cy="-0.0515" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 35%, 51%)" fill-opacity="1.0"><circle cx="0.0478" cy="-0.0595" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 34%, 49%)" fill-opacity="1.0"><circle cx="0.0684" cy="-0.0688" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 33%, 48%)" fill-opacity="1.0"><circle cx="0.0865" cy="-0.0793" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 33%, 46%)" fill-opacity="1.0"><circle cx="0.1016" cy="-0.0908" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 33%, 44%)" fill-opacity="1.0"><circle cx="0.1137" cy="-0.1031" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 32%, 42%)" fill-opacity="1.0"><circle cx="0.1224" cy="-0.1160" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 32%, 40%)" fill-opacity="1.0"><circle cx="0.1277" cy="-0.1294" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 31%, 38%)" fill-opacity="1.0"><circle cx="0.1616" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 31%, 36%)" fill-opacity="1.0"><circle cx="0.1596" cy="-0.1585" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 31%, 33%)" fill-opacity="1.0"><circle cx="0.1535" cy="-0.1738" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 31%, 31%)" fill-opacity="1.0"><circle cx="0.1436" cy="-0.1886" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 32%, 28%)" fill-opacity="1.0"><circle cx="0.1298" cy="-0.2027" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 32%, 26%)" fill-opacity="1.0"><circle cx="0.1125" cy="-0.2158" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 33%, 24%)" fill-opacity="1.0"><circle cx="0.0919" cy="-0.2278" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 33%, 22%)" fill-opacity="1.0"><circle cx="0.0683" cy="-0.2385" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 34%, 20%)" fill-opacity="1.0"><circle cx="0.0422" cy="-0.2476" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 35%, 18%)" fill-opacity="1.0"><circle cx="0.0139" cy="-0.2551" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 36%, 17%)" fill-opacity="1.0"><circle cx="-0.0161" cy="-0.2608" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 37%, 16%)" fill-opacity="1.0"><circle cx="-0.0474" cy="-0.2647" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 38%, 15%)" fill-opacity="1.0"><circle cx="-0.0795" cy="-0.2667" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 38%, 16%)" fill-opacity="1.0"><circle cx="-0.1118" cy="-0.2667" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 39%, 16%)" fill-opacity="1.0"><circle cx="-0.1439" cy="-0.2647" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 40%, 17%)" fill-opacity="1.0"><circle cx="-0.1751" cy="-0.2608" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 41%, 19%)" fill-opacity="1.0"><circle cx="-0.2052" cy="-0.2551" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 42%, 21%)" fill-opacity="1.0"><circle cx="-0.2335" cy="-0.2476" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 42%, 23%)" fill-opacity="1.0"><circle cx="-0.2596" cy="-0.2385" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 43%, 25%)" fill-opacity="1.0"><circle cx="-0.2832" cy="-0.2278" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 44%, 27%)" fill-opacity="1.0"><circle cx="-0.3038" cy="-0.2158" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 44%, 30%)" fill-opacity="1.0"><circle cx="-0.3211" cy="-0.2027" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 44%, 32%)" fill-opacity="1.0"><circle cx="-0.3348" cy="-0.1886" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 45%, 35%)" fill-opacity="1.0"><circle cx="-0.3448" cy="-0.1738" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(15%, 45%, 37%)" fill-opacity="1.0"><circle cx="-0.3509" cy="-0.1585" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(12%, 45%, 40%)" fill-opacity="1.0"><circle cx="-0.3529" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(10%, 45%, 42%)" fill-opacity="1.0"><circle cx="-0.3509" cy="-0.1275" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(8%, 44%, 44%)" fill-opacity="1.0"><circle cx="-0.3448" cy="-0.1122" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(8%, 44%, 46%)" fill-opacity="1.0"><circle cx="-0.3348" cy="-0.0974" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(9%, 44%, 48%)" fill-opacity="1.0"><circle cx="-0.3211" cy="-0.0833" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 43%, 50%)" fill-opacity="1.0"><circle cx="-0.3038" cy="-0.0702" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(14%, 43%, 52%)" fill-opacity="1.0"><circle cx="-0.2832" cy="-0.0582" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 42%, 53%)" fill-opacity="1.0"><circle cx="-0.2596" cy="-0.0475" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 41%, 55%)" fill-opacity="1.0"><circle cx="-0.2335" cy="-0.0384" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 41%, 56%)" fill-opacity="1.0"><circle cx="-0.2052" cy="-0.0309" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 40%, 56%)" fill-opacity="1.0"><circle cx="-0.1751" cy="-0.0252" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 39%, 57%)" fill-opacity="1.0"><circle cx="-0.1439" cy="-0.0213" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 38%, 57%)" fill-opacity="1.0"><circle cx="-0.1118" cy="-0.0193" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 38%, 57%)" fill-opacity="1.0"><circle cx="-0.0795" cy="-0.0193" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(36%, 37%, 56%)" fill-opacity="1.0"><circle cx="-0.0474" cy="-0.0213" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 36%, 56%)" fill-opacity="1.0"><circle cx="-0.0161" cy="-0.0252" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 35%, 55%)" fill-opacity="1.0"><circle cx="0.0139" cy="-0.0309" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 34%, 54%)" fill-opacity="1.0"><circle cx="0.0422" cy="-0.0384" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 34%, 52%)" fill-opacity="1.0"><circle cx="0.0683" cy="-0.0475" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 33%, 51%)" fill-opacity="1.0"><circle cx="0.0919" cy="-0.0582" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 33%, 49%)" fill-opacity="1.0"><circle cx="0.1125" cy="-0.0702" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 32%, 47%)" fill-opacity="1.0"><circle cx="0.1298" cy="-0.0833" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 32%, 45%)" fill-opacity="1.0"><circle cx="0.1436" cy="-0.0974" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 31%, 43%)" fill-opacity="1.0"><circle cx="0.1535" cy="-0.1122" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 31%, 41%)" fill-opacity="1.0"><circle cx="0.1596" cy="-0.1275" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 30%, 38%)" fill-opacity="1.0"><circle cx="0.1938" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 30%, 35%)" fill-opacity="1.0"><circle cx="0.1915" cy="-0.1605" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 30%, 33%)" fill-opacity="1.0"><circle cx="0.1847" cy="-0.1777" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 30%, 30%)" fill-opacity="1.0"><circle cx="0.1735" cy="-0.1943" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 31%, 27%)" fill-opacity="1.0"><circle cx="0.1580" cy="-0.2102" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 31%, 24%)" fill-opacity="1.0"><circle cx="0.1385" cy="-0.2249" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 32%, 22%)" fill-opacity="1.0"><circle cx="0.1153" cy="-0.2384" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 32%, 19%)" fill-opacity="1.0"><circle cx="0.0888" cy="-0.2504" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 33%, 17%)" fill-opacity="1.0"><circle cx="0.0594" cy="-0.2607" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 34%, 15%)" fill-opacity="1.0"><circle cx="0.0276" cy="-0.2691" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 35%, 13%)" fill-opacity="1.0"><circle cx="-0.0062" cy="-0.2756" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 36%, 11%)" fill-opacity="1.0"><circle cx="-0.0414" cy="-0.2799" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 37%, 11%)" fill-opacity="1.0"><circle cx="-0.0775" cy="-0.2821" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 38%, 11%)" fill-opacity="1.0"><circle cx="-0.1138" cy="-0.2821" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 39%, 12%)" fill-opacity="1.0"><circle cx="-0.1499" cy="-0.2799" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 40%, 13%)" fill-opacity="1.0"><circle cx="-0.1851" cy="-0.2756" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 41%, 15%)" fill-opacity="1.0"><circle cx="-0.2189" cy="-0.2691" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 42%, 17%)" fill-opacity="1.0"><circle cx="-0.2507" cy="-0.2607" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 43%, 20%)" fill-opacity="1.0"><circle cx="-0.2801" cy="-0.2504" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 44%, 23%)" fill-opacity="1.0"><circle cx="-0.3066" cy="-0.2384" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 44%, 26%)" fill-opacity="1.0"><circle cx="-0.3298" cy="-0.2249" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 45%, 28%)" fill-opacity="1.0"><circle cx="-0.3493" cy="-0.2102" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 45%, 31%)" fill-opacity="1.0"><circle cx="-0.3647" cy="-0.1943" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(14%, 45%, 34%)" fill-opacity="1.0"><circle cx="-0.3760" cy="-0.1777" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(8%, 45%, 37%)" fill-opacity="1.0"><circle cx="-0.3828" cy="-0.1605" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(1%, 45%, 40%)" fill-opacity="1.0"><circle cx="-0.3851" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(5%, 43%, 54%)" fill-opacity="1.0"><circle cx="-0.3066" cy="-0.0476" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 42%, 55%)" fill-opacity="1.0"><circle cx="-0.2801" cy="-0.0356" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(15%, 42%, 57%)" fill-opacity="1.0"><circle cx="-0.2507" cy="-0.0253" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 41%, 58%)" fill-opacity="1.0"><circle cx="-0.2189" cy="-0.0169" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(23%, 40%, 58%)" fill-opacity="1.0"><circle cx="-0.1851" cy="-0.0104" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 39%, 59%)" fill-opacity="1.0"><circle cx="-0.1499" cy="-0.0061" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 38%, 59%)" fill-opacity="1.0"><circle cx="-0.1138" cy="-0.0039" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(33%, 37%, 59%)" fill-opacity="1.0"><circle cx="-0.0775" cy="-0.0039" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 36%, 59%)" fill-opacity="1.0"><circle cx="-0.0414" cy="-0.0061" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 35%, 58%)" fill-opacity="1.0"><circle cx="-0.0062" cy="-0.0104" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 35%, 57%)" fill-opacity="1.0"><circle cx="0.0276" cy="-0.0169" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 34%, 56%)" fill-opacity="1.0"><circle cx="0.0594" cy="-0.0253" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 33%, 54%)" fill-opacity="1.0"><circle cx="0.0888" cy="-0.0356" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 32%, 52%)" fill-opacity="1.0"><circle cx="0.1153" cy="-0.0476" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 32%, 50%)" fill-opacity="1.0"><circle cx="0.1385" cy="-0.0611" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 31%, 48%)" fill-opacity="1.0"><circle cx="0.1580" cy="-0.0759" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 31%, 46%)" fill-opacity="1.0"><circle cx="0.1735" cy="-0.0917" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 30%, 43%)" fill-opacity="1.0"><circle cx="0.1847" cy="-0.1083" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 30%, 41%)" fill-opacity="1.0"><circle cx="0.1915" cy="-0.1255" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 29%, 38%)" fill-opacity="1.0"><circle cx="0.2259" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 29%, 35%)" fill-opacity="1.0"><circle cx="0.2234" cy="-0.1624" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 29%, 32%)" fill-opacity="1.0"><circle cx="0.2158" cy="-0.1815" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 29%, 29%)" fill-opacity="1.0"><circle cx="0.2034" cy="-0.2000" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 29%, 26%)" fill-opacity="1.0"><circle cx="0.1862" cy="-0.2176" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 30%, 22%)" fill-opacity="1.0"><circle cx="0.1645" cy="-0.2340" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 31%, 19%)" fill-opacity="1.0"><circle cx="0.1388" cy="-0.2490" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 32%, 16%)" fill-opacity="1.0"><circle cx="0.1093" cy="-0.2623" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 33%, 13%)" fill-opacity="1.0"><circle cx="0.0767" cy="-0.2738" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 34%, 10%)" fill-opacity="1.0"><circle cx="0.0413" cy="-0.2831" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 35%, 7%)" fill-opacity="1.0"><circle cx="0.0037" cy="-0.2903" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 36%, 4%)" fill-opacity="1.0"><circle cx="-0.0354" cy="-0.2951" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 37%, 3%)" fill-opacity="1.0"><circle cx="-0.0755" cy="-0.2976" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 38%, 3%)" fill-opacity="1.0"><circle cx="-0.1158" cy="-0.2976" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 39%, 5%)" fill-opacity="1.0"><circle cx="-0.1559" cy="-0.2951" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 40%, 8%)" fill-opacity="1.0"><circle cx="-0.1950" cy="-0.2903" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 41%, 11%)" fill-opacity="1.0"><circle cx="-0.2326" cy="-0.2831" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 42%, 14%)" fill-opacity="1.0"><circle cx="-0.2680" cy="-0.2738" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 43%, 17%)" fill-opacity="1.0"><circle cx="-0.3006" cy="-0.2623" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 44%, 20%)" fill-opacity="1.0"><circle cx="-0.3301" cy="-0.2490" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 45%, 24%)" fill-opacity="1.0"><circle cx="-0.3558" cy="-0.2340" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 45%, 27%)" fill-opacity="1.0"><circle cx="-0.3775" cy="-0.2176" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(14%, 46%, 30%)" fill-opacity="1.0"><circle cx="-0.3946" cy="-0.2000" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(6%, 46%, 33%)" fill-opacity="1.0"><circle cx="-0.4071" cy="-0.1815" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(0%, 43%, 57%)" fill-opacity="1.0"><circle cx="-0.3006" cy="-0.0237" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(10%, 42%, 58%)" fill-opacity="1.0"><circle cx="-0.2680" cy="-0.0122" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 41%, 60%)" fill-opacity="1.0"><circle cx="-0.2326" cy="-0.0029" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 40%, 61%)" fill-opacity="1.0"><circle cx="-0.1950" cy="0.0043" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 39%, 61%)" fill-opacity="1.0"><circle cx="-0.1559" cy="0.0091" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 38%, 61%)" fill-opacity="1.0"><circle cx="-0.1158" cy="0.0116" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(32%, 37%, 61%)" fill-opacity="1.0"><circle cx="-0.0755" cy="0.0116" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 36%, 61%)" fill-opacity="1.0"><circle cx="-0.0354" cy="0.0091" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 35%, 60%)" fill-opacity="1.0"><circle cx="0.0037" cy="0.0043" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 34%, 59%)" fill-opacity="1.0"><circle cx="0.0413" cy="-0.0029" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 33%, 57%)" fill-opacity="1.0"><circle cx="0.0767" cy="-0.0122" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 32%, 56%)" fill-opacity="1.0"><circle cx="0.1093" cy="-0.0237" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 31%, 54%)" fill-opacity="1.0"><circle cx="0.1388" cy="-0.0370" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 31%, 51%)" fill-opacity="1.0"><circle cx="0.1645" cy="-0.0520" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 30%, 49%)" fill-opacity="1.0"><circle cx="0.1862" cy="-0.0684" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 29%, 46%)" fill-opacity="1.0"><circle cx="0.2034" cy="-0.0860" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 29%, 44%)" fill-opacity="1.0"><circle cx="0.2158" cy="-0.1045" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 29%, 41%)" fill-opacity="1.0"><circle cx="0.2234" cy="-0.1236" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 27%, 38%)" fill-opacity="1.0"><circle cx="0.2581" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 27%, 35%)" fill-opacity="1.0"><circle cx="0.2553" cy="-0.1644" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 27%, 31%)" fill-opacity="1.0"><circle cx="0.2470" cy="-0.1854" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 28%, 28%)" fill-opacity="1.0"><circle cx="0.2333" cy="-0.2057" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 28%, 24%)" fill-opacity="1.0"><circle cx="0.2143" cy="-0.2251" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 29%, 21%)" fill-opacity="1.0"><circle cx="0.1905" cy="-0.2431" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 30%, 17%)" fill-opacity="1.0"><circle cx="0.1622" cy="-0.2596" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 31%, 13%)" fill-opacity="1.0"><circle cx="0.1298" cy="-0.2743" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 32%, 8%)" fill-opacity="1.0"><circle cx="0.0939" cy="-0.2869" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 33%, 2%)" fill-opacity="1.0"><circle cx="0.0550" cy="-0.2972" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 42%, 4%)" fill-opacity="1.0"><circle cx="-0.2463" cy="-0.2972" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 43%, 9%)" fill-opacity="1.0"><circle cx="-0.2852" cy="-0.2869" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 44%, 14%)" fill-opacity="1.0"><circle cx="-0.3211" cy="-0.2743" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 44%, 18%)" fill-opacity="1.0"><circle cx="-0.3535" cy="-0.2596" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 45%, 22%)" fill-opacity="1.0"><circle cx="-0.3818" cy="-0.2431" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 46%, 26%)" fill-opacity="1.0"><circle cx="-0.4056" cy="-0.2251" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(7%, 46%, 29%)" fill-opacity="1.0"><circle cx="-0.4245" cy="-0.2057" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(0%, 42%, 60%)" fill-opacity="1.0"><circle cx="-0.2852" cy="0.0008" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(12%, 41%, 62%)" fill-opacity="1.0"><circle cx="-0.2463" cy="0.0111" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 40%, 63%)" fill-opacity="1.0"><circle cx="-0.2050" cy="0.0190" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(23%, 39%, 63%)" fill-opacity="1.0"><circle cx="-0.1619" cy="0.0243" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 38%, 63%)" fill-opacity="1.0"><circle cx="-0.1179" cy="0.0270" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 36%, 63%)" fill-opacity="1.0"><circle cx="-0.0734" cy="0.0270" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 35%, 63%)" fill-opacity="1.0"><circle cx="-0.0294" cy="0.0243" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 34%, 62%)" fill-opacity="1.0"><circle cx="0.0137" cy="0.0190" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 33%, 61%)" fill-opacity="1.0"><circle cx="0.0550" cy="0.0111" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 32%, 59%)" fill-opacity="1.0"><circle cx="0.0939" cy="0.0008" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 31%, 57%)" fill-opacity="1.0"><circle cx="0.1298" cy="-0.0117" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 30%, 55%)" fill-opacity="1.0"><circle cx="0.1622" cy="-0.0264" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 30%, 53%)" fill-opacity="1.0"><circle cx="0.1905" cy="-0.0429" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 29%, 50%)" fill-opacity="1.0"><circle cx="0.2143" cy="-0.0609" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 28%, 47%)" fill-opacity="1.0"><circle cx="0.2333" cy="-0.0803" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 28%, 44%)" fill-opacity="1.0"><circle cx="0.2470" cy="-0.1006" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 27%, 41%)" fill-opacity="1.0"><circle cx="0.2553" cy="-0.1217" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 26%, 38%)" fill-opacity="1.0"><circle cx="0.2903" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 26%, 34%)" fill-opacity="1.0"><circle cx="0.2872" cy="-0.1663" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 30%)" fill-opacity="1.0"><circle cx="0.2781" cy="-0.1892" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 26%, 27%)" fill-opacity="1.0"><circle cx="0.2632" cy="-0.2114" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 27%, 23%)" fill-opacity="1.0"><circle cx="0.2425" cy="-0.2325" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 27%, 18%)" fill-opacity="1.0"><circle cx="0.2166" cy="-0.2522" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 28%, 14%)" fill-opacity="1.0"><circle cx="0.1857" cy="-0.2702" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 29%, 8%)" fill-opacity="1.0"><circle cx="0.1503" cy="-0.2862" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 31%, 0%)" fill-opacity="1.0"><circle cx="0.1111" cy="-0.2999" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 43%, 2%)" fill-opacity="1.0"><circle cx="-0.3024" cy="-0.2999" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 44%, 10%)" fill-opacity="1.0"><circle cx="-0.3416" cy="-0.2862" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 45%, 15%)" fill-opacity="1.0"><circle cx="-0.3770" cy="-0.2702" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 46%, 20%)" fill-opacity="1.0"><circle cx="-0.4078" cy="-0.2522" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 46%, 24%)" fill-opacity="1.0"><circle cx="-0.4338" cy="-0.2325" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(6%, 41%, 64%)" fill-opacity="1.0"><circle cx="-0.2600" cy="0.0252" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(15%, 40%, 65%)" fill-opacity="1.0"><circle cx="-0.2149" cy="0.0338" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 38%, 65%)" fill-opacity="1.0"><circle cx="-0.1680" cy="0.0396" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 37%, 66%)" fill-opacity="1.0"><circle cx="-0.1199" cy="0.0425" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(31%, 36%, 65%)" fill-opacity="1.0"><circle cx="-0.0714" cy="0.0425" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 35%, 65%)" fill-opacity="1.0"><circle cx="-0.0233" cy="0.0396" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 34%, 64%)" fill-opacity="1.0"><circle cx="0.0236" cy="0.0338" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 32%, 63%)" fill-opacity="1.0"><circle cx="0.0687" cy="0.0252" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 31%, 61%)" fill-opacity="1.0"><circle cx="0.1111" cy="0.0139" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 30%, 59%)" fill-opacity="1.0"><circle cx="0.1503" cy="0.0002" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 29%, 56%)" fill-opacity="1.0"><circle cx="0.1857" cy="-0.0158" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 28%, 54%)" fill-opacity="1.0"><circle cx="0.2166" cy="-0.0338" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 28%, 51%)" fill-opacity="1.0"><circle cx="0.2425" cy="-0.0535" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 27%, 48%)" fill-opacity="1.0"><circle cx="0.2632" cy="-0.0746" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 26%, 45%)" fill-opacity="1.0"><circle cx="0.2781" cy="-0.0968" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 26%, 41%)" fill-opacity="1.0"><circle cx="0.2872" cy="-0.1197" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 24%, 38%)" fill-opacity="1.0"><circle cx="0.3224" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 24%, 34%)" fill-opacity="1.0"><circle cx="0.3191" cy="-0.1682" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 24%, 30%)" fill-opacity="1.0"><circle cx="0.3093" cy="-0.1931" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 25%, 25%)" fill-opacity="1.0"><circle cx="0.2931" cy="-0.2171" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 25%, 21%)" fill-opacity="1.0"><circle cx="0.2707" cy="-0.2400" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 26%, 16%)" fill-opacity="1.0"><circle cx="0.2426" cy="-0.2614" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 27%, 10%)" fill-opacity="1.0"><circle cx="0.2091" cy="-0.2808" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 28%, 1%)" fill-opacity="1.0"><circle cx="0.1708" cy="-0.2981" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 44%, 3%)" fill-opacity="1.0"><circle cx="-0.3621" cy="-0.2981" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 45%, 12%)" fill-opacity="1.0"><circle cx="-0.4004" cy="-0.2808" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(17%, 46%, 18%)" fill-opacity="1.0"><circle cx="-0.4339" cy="-0.2614" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(4%, 47%, 23%)" fill-opacity="1.0"><circle cx="-0.4620" cy="-0.2400" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(12%, 40%, 67%)" fill-opacity="1.0"><circle cx="-0.2248" cy="0.0485" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(20%, 38%, 67%)" fill-opacity="1.0"><circle cx="-0.1740" cy="0.0548" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(25%, 37%, 68%)" fill-opacity="1.0"><circle cx="-0.1219" cy="0.0579" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 36%, 68%)" fill-opacity="1.0"><circle cx="-0.0694" cy="0.0579" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 34%, 67%)" fill-opacity="1.0"><circle cx="-0.0173" cy="0.0548" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 33%, 66%)" fill-opacity="1.0"><circle cx="0.0335" cy="0.0485" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 32%, 64%)" fill-opacity="1.0"><circle cx="0.0824" cy="0.0392" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 30%, 63%)" fill-opacity="1.0"><circle cx="0.1284" cy="0.0270" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 29%, 60%)" fill-opacity="1.0"><circle cx="0.1708" cy="0.0121" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 28%, 58%)" fill-opacity="1.0"><circle cx="0.2091" cy="-0.0052" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 27%, 55%)" fill-opacity="1.0"><circle cx="0.2426" cy="-0.0247" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 26%, 52%)" fill-opacity="1.0"><circle cx="0.2707" cy="-0.0460" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 26%, 49%)" fill-opacity="1.0"><circle cx="0.2931" cy="-0.0689" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 25%, 45%)" fill-opacity="1.0"><circle cx="0.3093" cy="-0.0929" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 24%, 41%)" fill-opacity="1.0"><circle cx="0.3191" cy="-0.1178" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 22%, 38%)" fill-opacity="1.0"><circle cx="0.3546" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 22%, 33%)" fill-opacity="1.0"><circle cx="0.3510" cy="-0.1702" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 22%, 29%)" fill-opacity="1.0"><circle cx="0.3404" cy="-0.1969" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 23%, 24%)" fill-opacity="1.0"><circle cx="0.3230" cy="-0.2228" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 23%, 19%)" fill-opacity="1.0"><circle cx="0.2989" cy="-0.2475" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 24%, 14%)" fill-opacity="1.0"><circle cx="0.2686" cy="-0.2705" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 26%, 6%)" fill-opacity="1.0"><circle cx="0.2325" cy="-0.2914" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 46%, 8%)" fill-opacity="1.0"><circle cx="-0.4238" cy="-0.2914" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(13%, 46%, 15%)" fill-opacity="1.0"><circle cx="-0.4599" cy="-0.2705" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(7%, 39%, 69%)" fill-opacity="1.0"><circle cx="-0.2348" cy="0.0632" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 38%, 70%)" fill-opacity="1.0"><circle cx="-0.1800" cy="0.0700" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(24%, 36%, 70%)" fill-opacity="1.0"><circle cx="-0.1239" cy="0.0734" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(30%, 35%, 70%)" fill-opacity="1.0"><circle cx="-0.0674" cy="0.0734" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 34%, 69%)" fill-opacity="1.0"><circle cx="-0.0113" cy="0.0700" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 32%, 68%)" fill-opacity="1.0"><circle cx="0.0435" cy="0.0632" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 31%, 66%)" fill-opacity="1.0"><circle cx="0.0960" cy="0.0532" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 30%, 64%)" fill-opacity="1.0"><circle cx="0.1456" cy="0.0401" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 28%, 62%)" fill-opacity="1.0"><circle cx="0.1913" cy="0.0241" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 27%, 59%)" fill-opacity="1.0"><circle cx="0.2325" cy="0.0054" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 26%, 56%)" fill-opacity="1.0"><circle cx="0.2686" cy="-0.0156" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 25%, 53%)" fill-opacity="1.0"><circle cx="0.2989" cy="-0.0385" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 24%, 49%)" fill-opacity="1.0"><circle cx="0.3230" cy="-0.0632" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 23%, 46%)" fill-opacity="1.0"><circle cx="0.3404" cy="-0.0891" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 23%, 42%)" fill-opacity="1.0"><circle cx="0.3510" cy="-0.1158" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 21%, 38%)" fill-opacity="1.0"><circle cx="0.3867" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 20%, 33%)" fill-opacity="1.0"><circle cx="0.3829" cy="-0.1721" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 20%, 28%)" fill-opacity="1.0"><circle cx="0.3716" cy="-0.2008" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 21%, 23%)" fill-opacity="1.0"><circle cx="0.3529" cy="-0.2285" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 22%, 17%)" fill-opacity="1.0"><circle cx="0.3271" cy="-0.2549" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 23%, 11%)" fill-opacity="1.0"><circle cx="0.2946" cy="-0.2796" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(20%, 46%, 1%)" fill-opacity="1.0"><circle cx="-0.4473" cy="-0.3020" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(9%, 47%, 13%)" fill-opacity="1.0"><circle cx="-0.4859" cy="-0.2796" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 38%, 72%)" fill-opacity="1.0"><circle cx="-0.1860" cy="0.0852" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(23%, 36%, 72%)" fill-opacity="1.0"><circle cx="-0.1259" cy="0.0889" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 34%, 72%)" fill-opacity="1.0"><circle cx="-0.0654" cy="0.0889" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 33%, 71%)" fill-opacity="1.0"><circle cx="-0.0053" cy="0.0852" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 31%, 70%)" fill-opacity="1.0"><circle cx="0.0534" cy="0.0779" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 30%, 68%)" fill-opacity="1.0"><circle cx="0.1097" cy="0.0672" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 29%, 66%)" fill-opacity="1.0"><circle cx="0.1628" cy="0.0531" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 27%, 64%)" fill-opacity="1.0"><circle cx="0.2118" cy="0.0360" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 26%, 61%)" fill-opacity="1.0"><circle cx="0.2560" cy="0.0160" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 25%, 57%)" fill-opacity="1.0"><circle cx="0.2946" cy="-0.0065" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 24%, 54%)" fill-opacity="1.0"><circle cx="0.3271" cy="-0.0311" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 23%, 50%)" fill-opacity="1.0"><circle cx="0.3529" cy="-0.0575" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 22%, 46%)" fill-opacity="1.0"><circle cx="0.3716" cy="-0.0852" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 21%, 42%)" fill-opacity="1.0"><circle cx="0.3829" cy="-0.1139" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 18%, 37%)" fill-opacity="1.0"><circle cx="0.4189" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 18%, 33%)" fill-opacity="1.0"><circle cx="0.4148" cy="-0.1741" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 18%, 27%)" fill-opacity="1.0"><circle cx="0.4027" cy="-0.2046" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 19%, 22%)" fill-opacity="1.0"><circle cx="0.3828" cy="-0.2342" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 20%, 16%)" fill-opacity="1.0"><circle cx="0.3552" cy="-0.2624" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 21%, 7%)" fill-opacity="1.0"><circle cx="0.3206" cy="-0.2887" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(2%, 47%, 9%)" fill-opacity="1.0"><circle cx="-0.5119" cy="-0.2887" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(13%, 37%, 74%)" fill-opacity="1.0"><circle cx="-0.1921" cy="0.1004" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(22%, 35%, 74%)" fill-opacity="1.0"><circle cx="-0.1280" cy="0.1043" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(29%, 34%, 74%)" fill-opacity="1.0"><circle cx="-0.0633" cy="0.1043" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 32%, 73%)" fill-opacity="1.0"><circle cx="0.0008" cy="0.1004" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(38%, 30%, 72%)" fill-opacity="1.0"><circle cx="0.0634" cy="0.0927" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 29%, 70%)" fill-opacity="1.0"><circle cx="0.1234" cy="0.0812" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 27%, 68%)" fill-opacity="1.0"><circle cx="0.1801" cy="0.0662" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 26%, 65%)" fill-opacity="1.0"><circle cx="0.2323" cy="0.0479" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 25%, 62%)" fill-opacity="1.0"><circle cx="0.2794" cy="0.0266" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 23%, 59%)" fill-opacity="1.0"><circle cx="0.3206" cy="0.0027" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 22%, 55%)" fill-opacity="1.0"><circle cx="0.3552" cy="-0.0236" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 21%, 51%)" fill-opacity="1.0"><circle cx="0.3828" cy="-0.0518" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 20%, 47%)" fill-opacity="1.0"><circle cx="0.4027" cy="-0.0814" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 19%, 42%)" fill-opacity="1.0"><circle cx="0.4148" cy="-0.1119" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 16%, 37%)" fill-opacity="1.0"><circle cx="0.4510" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 16%, 32%)" fill-opacity="1.0"><circle cx="0.4467" cy="-0.1760" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 16%, 27%)" fill-opacity="1.0"><circle cx="0.4339" cy="-0.2085" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(69%, 16%, 21%)" fill-opacity="1.0"><circle cx="0.4127" cy="-0.2399" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(69%, 17%, 13%)" fill-opacity="1.0"><circle cx="0.3834" cy="-0.2698" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 19%, 1%)" fill-opacity="1.0"><circle cx="0.3466" cy="-0.2978" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(11%, 37%, 76%)" fill-opacity="1.0"><circle cx="-0.1981" cy="0.1156" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(21%, 35%, 76%)" fill-opacity="1.0"><circle cx="-0.1300" cy="0.1198" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 33%, 76%)" fill-opacity="1.0"><circle cx="-0.0613" cy="0.1198" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 31%, 75%)" fill-opacity="1.0"><circle cx="0.0068" cy="0.1156" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 30%, 74%)" fill-opacity="1.0"><circle cx="0.0733" cy="0.1074" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 28%, 72%)" fill-opacity="1.0"><circle cx="0.1371" cy="0.0952" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 26%, 70%)" fill-opacity="1.0"><circle cx="0.1973" cy="0.0793" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 25%, 67%)" fill-opacity="1.0"><circle cx="0.2528" cy="0.0599" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 23%, 63%)" fill-opacity="1.0"><circle cx="0.3029" cy="0.0372" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 22%, 60%)" fill-opacity="1.0"><circle cx="0.3466" cy="0.0118" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 20%, 56%)" fill-opacity="1.0"><circle cx="0.3834" cy="-0.0162" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 19%, 52%)" fill-opacity="1.0"><circle cx="0.4127" cy="-0.0461" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 18%, 47%)" fill-opacity="1.0"><circle cx="0.4339" cy="-0.0775" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 17%, 42%)" fill-opacity="1.0"><circle cx="0.4467" cy="-0.1100" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 13%, 37%)" fill-opacity="1.0"><circle cx="0.4832" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(69%, 12%, 32%)" fill-opacity="1.0"><circle cx="0.4786" cy="-0.1779" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(70%, 12%, 26%)" fill-opacity="1.0"><circle cx="0.4650" cy="-0.2123" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(70%, 13%, 19%)" fill-opacity="1.0"><circle cx="0.4426" cy="-0.2456" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(70%, 14%, 11%)" fill-opacity="1.0"><circle cx="0.4116" cy="-0.2773" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(8%, 36%, 78%)" fill-opacity="1.0"><circle cx="-0.2041" cy="0.1308" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(20%, 34%, 78%)" fill-opacity="1.0"><circle cx="-0.1320" cy="0.1352" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(28%, 32%, 78%)" fill-opacity="1.0"><circle cx="-0.0593" cy="0.1352" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 30%, 77%)" fill-opacity="1.0"><circle cx="0.0128" cy="0.1308" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 29%, 76%)" fill-opacity="1.0"><circle cx="0.0832" cy="0.1221" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(43%, 27%, 74%)" fill-opacity="1.0"><circle cx="0.1508" cy="0.1092" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 25%, 71%)" fill-opacity="1.0"><circle cx="0.2145" cy="0.0924" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 23%, 68%)" fill-opacity="1.0"><circle cx="0.2733" cy="0.0718" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 22%, 65%)" fill-opacity="1.0"><circle cx="0.3263" cy="0.0478" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 20%, 61%)" fill-opacity="1.0"><circle cx="0.3727" cy="0.0209" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 18%, 57%)" fill-opacity="1.0"><circle cx="0.4116" cy="-0.0087" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 17%, 52%)" fill-opacity="1.0"><circle cx="0.4426" cy="-0.0404" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 15%, 47%)" fill-opacity="1.0"><circle cx="0.4650" cy="-0.0737" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 14%, 42%)" fill-opacity="1.0"><circle cx="0.4786" cy="-0.1081" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(69%, 9%, 37%)" fill-opacity="1.0"><circle cx="0.5154" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(70%, 8%, 31%)" fill-opacity="1.0"><circle cx="0.5105" cy="-0.1799" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(71%, 8%, 25%)" fill-opacity="1.0"><circle cx="0.4962" cy="-0.2162" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(72%, 9%, 18%)" fill-opacity="1.0"><circle cx="0.4725" cy="-0.2513" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(72%, 10%, 8%)" fill-opacity="1.0"><circle cx="0.4398" cy="-0.2848" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(3%, 36%, 80%)" fill-opacity="1.0"><circle cx="-0.2101" cy="0.1461" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(19%, 34%, 81%)" fill-opacity="1.0"><circle cx="-0.1340" cy="0.1507" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 32%, 80%)" fill-opacity="1.0"><circle cx="-0.0573" cy="0.1507" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 29%, 79%)" fill-opacity="1.0"><circle cx="0.0188" cy="0.1461" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 27%, 78%)" fill-opacity="1.0"><circle cx="0.0932" cy="0.1369" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 25%, 76%)" fill-opacity="1.0"><circle cx="0.1645" cy="0.1233" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 24%, 73%)" fill-opacity="1.0"><circle cx="0.2317" cy="0.1055" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 22%, 70%)" fill-opacity="1.0"><circle cx="0.2938" cy="0.0837" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 20%, 66%)" fill-opacity="1.0"><circle cx="0.3498" cy="0.0584" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 18%, 62%)" fill-opacity="1.0"><circle cx="0.3987" cy="0.0300" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 16%, 58%)" fill-opacity="1.0"><circle cx="0.4398" cy="-0.0012" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 14%, 53%)" fill-opacity="1.0"><circle cx="0.4725" cy="-0.0347" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 12%, 48%)" fill-opacity="1.0"><circle cx="0.4962" cy="-0.0698" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 11%, 43%)" fill-opacity="1.0"><circle cx="0.5105" cy="-0.1061" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(70%, 2%, 37%)" fill-opacity="1.0"><circle cx="0.5475" cy="-0.1430" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(72%, 0%, 31%)" fill-opacity="1.0"><circle cx="0.5424" cy="-0.1818" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(73%, 1%, 17%)" fill-opacity="1.0"><circle cx="0.5024" cy="-0.2570" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(73%, 5%, 4%)" fill-opacity="1.0"><circle cx="0.4680" cy="-0.2922" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(18%, 33%, 83%)" fill-opacity="1.0"><circle cx="-0.1360" cy="0.1661" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 31%, 82%)" fill-opacity="1.0"><circle cx="-0.0553" cy="0.1661" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 28%, 81%)" fill-opacity="1.0"><circle cx="0.0249" cy="0.1613" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 26%, 80%)" fill-opacity="1.0"><circle cx="0.1031" cy="0.1516" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 24%, 78%)" fill-opacity="1.0"><circle cx="0.1782" cy="0.1373" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(48%, 22%, 75%)" fill-opacity="1.0"><circle cx="0.2490" cy="0.1185" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(52%, 20%, 71%)" fill-opacity="1.0"><circle cx="0.3143" cy="0.0957" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(56%, 18%, 68%)" fill-opacity="1.0"><circle cx="0.3732" cy="0.0690" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 16%, 63%)" fill-opacity="1.0"><circle cx="0.4247" cy="0.0391" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 13%, 59%)" fill-opacity="1.0"><circle cx="0.4680" cy="0.0062" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(65%, 11%, 54%)" fill-opacity="1.0"><circle cx="0.5024" cy="-0.0290" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(67%, 8%, 48%)" fill-opacity="1.0"><circle cx="0.5273" cy="-0.0660" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(69%, 6%, 43%)" fill-opacity="1.0"><circle cx="0.5424" cy="-0.1042" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(17%, 32%, 85%)" fill-opacity="1.0"><circle cx="-0.1381" cy="0.1816" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(27%, 30%, 84%)" fill-opacity="1.0"><circle cx="-0.0532" cy="0.1816" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 27%, 83%)" fill-opacity="1.0"><circle cx="0.0309" cy="0.1765" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(39%, 25%, 82%)" fill-opacity="1.0"><circle cx="0.1130" cy="0.1663" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(44%, 22%, 79%)" fill-opacity="1.0"><circle cx="0.1919" cy="0.1513" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 20%, 76%)" fill-opacity="1.0"><circle cx="0.2662" cy="0.1316" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 18%, 73%)" fill-opacity="1.0"><circle cx="0.3348" cy="0.1076" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 15%, 69%)" fill-opacity="1.0"><circle cx="0.3966" cy="0.0796" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(60%, 13%, 64%)" fill-opacity="1.0"><circle cx="0.4507" cy="0.0482" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(63%, 10%, 60%)" fill-opacity="1.0"><circle cx="0.4961" cy="0.0137" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(66%, 7%, 54%)" fill-opacity="1.0"><circle cx="0.5323" cy="-0.0233" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(68%, 2%, 49%)" fill-opacity="1.0"><circle cx="0.5585" cy="-0.0621" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 31%, 87%)" fill-opacity="1.0"><circle cx="-0.1401" cy="0.1971" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 29%, 87%)" fill-opacity="1.0"><circle cx="-0.0512" cy="0.1971" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 26%, 86%)" fill-opacity="1.0"><circle cx="0.0369" cy="0.1917" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 23%, 84%)" fill-opacity="1.0"><circle cx="0.1230" cy="0.1810" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 21%, 81%)" fill-opacity="1.0"><circle cx="0.2056" cy="0.1653" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(49%, 18%, 78%)" fill-opacity="1.0"><circle cx="0.2834" cy="0.1447" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(53%, 16%, 75%)" fill-opacity="1.0"><circle cx="0.3553" cy="0.1195" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(57%, 13%, 70%)" fill-opacity="1.0"><circle cx="0.4201" cy="0.0902" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(61%, 10%, 66%)" fill-opacity="1.0"><circle cx="0.4767" cy="0.0573" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(64%, 5%, 60%)" fill-opacity="1.0"><circle cx="0.5243" cy="0.0211" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(16%, 30%, 89%)" fill-opacity="1.0"><circle cx="-0.1421" cy="0.2125" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 27%, 89%)" fill-opacity="1.0"><circle cx="-0.0492" cy="0.2125" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 24%, 88%)" fill-opacity="1.0"><circle cx="0.0429" cy="0.2069" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 22%, 86%)" fill-opacity="1.0"><circle cx="0.1329" cy="0.1958" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(45%, 19%, 83%)" fill-opacity="1.0"><circle cx="0.2193" cy="0.1793" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 16%, 80%)" fill-opacity="1.0"><circle cx="0.3007" cy="0.1578" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(54%, 13%, 76%)" fill-opacity="1.0"><circle cx="0.3758" cy="0.1315" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(58%, 9%, 72%)" fill-opacity="1.0"><circle cx="0.4435" cy="0.1008" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(62%, 4%, 67%)" fill-opacity="1.0"><circle cx="0.5027" cy="0.0664" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(15%, 29%, 91%)" fill-opacity="1.0"><circle cx="-0.1441" cy="0.2280" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 26%, 91%)" fill-opacity="1.0"><circle cx="-0.0472" cy="0.2280" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 23%, 90%)" fill-opacity="1.0"><circle cx="0.0490" cy="0.2221" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 20%, 88%)" fill-opacity="1.0"><circle cx="0.1429" cy="0.2105" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 16%, 85%)" fill-opacity="1.0"><circle cx="0.2330" cy="0.1933" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(50%, 13%, 82%)" fill-opacity="1.0"><circle cx="0.3179" cy="0.1708" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 9%, 78%)" fill-opacity="1.0"><circle cx="0.3963" cy="0.1434" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(59%, 3%, 73%)" fill-opacity="1.0"><circle cx="0.4670" cy="0.1114" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(14%, 28%, 93%)" fill-opacity="1.0"><circle cx="-0.1461" cy="0.2434" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 24%, 93%)" fill-opacity="1.0"><circle cx="-0.0452" cy="0.2434" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 21%, 92%)" fill-opacity="1.0"><circle cx="0.0550" cy="0.2373" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(40%, 17%, 90%)" fill-opacity="1.0"><circle cx="0.1528" cy="0.2252" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 14%, 87%)" fill-opacity="1.0"><circle cx="0.2467" cy="0.2073" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 9%, 83%)" fill-opacity="1.0"><circle cx="0.3351" cy="0.1839" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(55%, 3%, 79%)" fill-opacity="1.0"><circle cx="0.4168" cy="0.1553" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(13%, 27%, 96%)" fill-opacity="1.0"><circle cx="-0.1481" cy="0.2589" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 23%, 95%)" fill-opacity="1.0"><circle cx="-0.0431" cy="0.2589" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 19%, 94%)" fill-opacity="1.0"><circle cx="0.0610" cy="0.2525" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 15%, 92%)" fill-opacity="1.0"><circle cx="0.1627" cy="0.2400" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(46%, 10%, 89%)" fill-opacity="1.0"><circle cx="0.2604" cy="0.2214" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(51%, 3%, 85%)" fill-opacity="1.0"><circle cx="0.3524" cy="0.1970" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(13%, 25%, 98%)" fill-opacity="1.0"><circle cx="-0.1502" cy="0.2743" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 21%, 97%)" fill-opacity="1.0"><circle cx="-0.0411" cy="0.2743" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(34%, 16%, 96%)" fill-opacity="1.0"><circle cx="0.0671" cy="0.2678" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(41%, 11%, 94%)" fill-opacity="1.0"><circle cx="0.1727" cy="0.2547" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(47%, 4%, 91%)" fill-opacity="1.0"><circle cx="0.2740" cy="0.2354" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(12%, 23%, 100%)" fill-opacity="1.0"><circle cx="-0.1522" cy="0.2898" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(26%, 19%, 99%)" fill-opacity="1.0"><circle cx="-0.0391" cy="0.2898" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(35%, 13%, 98%)" fill-opacity="1.0"><circle cx="0.0731" cy="0.2830" r="0.0050"/></g><g stroke-width="0" stroke="rgb(2%, 29%, 48%)" stroke-opacity="1.0" fill="rgb(42%, 6%, 96%)" fill-opacity="1.0"><circle cx="0.1826" cy="0.2694" r="0.0050"/></g></g><g class="datapadding"></g></g><g class="hud"><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(100%, 100%, 100%)" fill-opacity="0.02"><rect width="1.2863" height="0.7744" x="-0.5780" y="-0.4528"/></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="1.2898" height="0.0031" x="-0.5797" y="0.3294"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5780,0.3216 -0.5780,-0.4528"/><polyline points="-0.4172,0.3216 -0.4172,-0.4528"/><polyline points="-0.2564,0.3216 -0.2564,-0.4528"/><polyline points="-0.0956,0.3216 -0.0956,-0.4528"/><polyline points="0.0651,0.3216 0.0651,-0.4528"/><polyline points="0.2259,0.3216 0.2259,-0.4528"/><polyline points="0.3867,0.3216 0.3867,-0.4528"/><polyline points="0.5475,0.3216 0.5475,-0.4528"/><polyline points="0.7083,0.3216 0.7083,-0.4528"/></g></g><g class="tickglyph"><g stroke-width="0.0031" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.5780,0.3542+-0.5780,0.3309"/><polyline points="-0.4172,0.3542+-0.4172,0.3309"/><polyline points="-0.2564,0.3542+-0.2564,0.3309"/><polyline points="-0.0956,0.3542+-0.0956,0.3309"/><polyline points="0.0651,0.3542+0.0651,0.3309"/><polyline points="0.2259,0.3542+0.2259,0.3309"/><polyline points="0.3867,0.3542+0.3867,0.3309"/><polyline points="0.5475,0.3542+0.5475,0.3309"/><polyline points="0.7083,0.3542+0.7083,0.3309"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.5780" y="0.3967" transform="rotate(-45.0, -0.5780, 0.3967)">-0.15</text><text x="-0.4172" y="0.3967" transform="rotate(-45.0, -0.4172, 0.3967)">-0.10</text><text x="-0.2564" y="0.3967" transform="rotate(-45.0, -0.2564, 0.3967)">-0.05</text><text x="-0.0956" y="0.3967" transform="rotate(-45.0, -0.0956, 0.3967)"> 0.00</text><text x="0.0651" y="0.3967" transform="rotate(-45.0, 0.0651, 0.3967)"> 0.05</text><text x="0.2259" y="0.3967" transform="rotate(-45.0, 0.2259, 0.3967)"> 0.10</text><text x="0.3867" y="0.3967" transform="rotate(-45.0, 0.3867, 0.3967)"> 0.15</text><text x="0.5475" y="0.3967" transform="rotate(-45.0, 0.5475, 0.3967)"> 0.20</text><text x="0.7083" y="0.3967" transform="rotate(-45.0, 0.7083, 0.3967)"> 0.25</text></g></g></g></g><g class="axis"><g class="axisbar"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><rect width="0.0034" height="0.7775" x="-0.5901" y="-0.4543"/></g></g><g class="ticks"><g class="ticklines"><g stroke-width="0.0050" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.05" fill="none"><polyline points="-0.5780,0.3216 0.7083,0.3216"/><polyline points="-0.5780,0.1668 0.7083,0.1668"/><polyline points="-0.5780,0.0119 0.7083,0.0119"/><polyline points="-0.5780,-0.1430 0.7083,-0.1430"/><polyline points="-0.5780,-0.2979 0.7083,-0.2979"/><polyline points="-0.5780,-0.4528 0.7083,-0.4528"/></g></g><g class="tickglyph"><g stroke-width="0.0034" stroke="rgb(5%, 5%, 5%)" stroke-opacity="0.4" fill="rgb(5%, 5%, 5%)" fill-opacity="0.4"><polyline points="-0.6141,0.3216+-0.5883,0.3216"/><polyline points="-0.6141,0.1668+-0.5883,0.1668"/><polyline points="-0.6141,0.0119+-0.5883,0.0119"/><polyline points="-0.6141,-0.1430+-0.5883,-0.1430"/><polyline points="-0.6141,-0.2979+-0.5883,-0.2979"/><polyline points="-0.6141,-0.4528+-0.5883,-0.4528"/></g></g><g class="ticktext"><g stroke-width="0.0" stroke="none" fill="rgb(5%, 5%, 5%)" fill-opacity="1.0" font-size="0.0400" text-anchor="end"><text x="-0.6331" y="0.3301">-0.3</text><text x="-0.6331" y="0.1753">-0.2</text><text x="-0.6331" y="0.0204">-0.1</text><text x="-0.6331" y="-0.1345"> 0.0</text><text x="-0.6331" y="-0.2894"> 0.1</text><text x="-0.6331" y="-0.4442"> 0.2</text></g></g></g></g><g class="frame"><g stroke-width="0" stroke="rgb(0%, 0%, 0%)" stroke-opacity="0" fill="rgb(0%, 0%, 0%)" fill-opacity="0"><rect width="1.5" height="1.0" x="-0.75" y="-0.5"/></g></g></g></svg>
+ readme.md view
@@ -0,0 +1,30 @@++[![img](https://img.shields.io/hackage/v/chart-svg.svg)](https://hackage.haskell.org/package/chart-svg) [![img](https://github.com/tonyday567/chart-svg/workflows/haskell-ci/badge.svg)](https://github.com/tonyday567/chart-svg/actions)++![img](other/banner.svg)++A charting library targetting SVG.++# Usage++    :r+    :set -XOverloadedLabels+    :set -XOverloadedStrings+    import Chart+    import Optics.Core+    lines = [[Point 0.0 1.0, Point 1.0 1.0, Point 2.0 5.0],[Point 0.0 0.0, Point 2.8 3.0],[Point 0.5 4.0, Point 0.5 0]]+    styles = (\c -> defaultLineStyle & #color .~ palette c & #size .~ 0.015) <$> [0..2]+    cs = zipWith (\s x -> LineChart s [x]) styles lines+    lineExample = mempty & #chartTree .~ named "line" cs & #hudOptions .~ defaultHudOptions :: ChartOptions+    writeChartOptions "other/usage.svg" lineExample++![img](other/usage.svg)++See the haddock documentation for a detailed overview.++To redraw all the examples in Chart.Examples++    import Chart.Examples+    writeAllExamples++
src/Chart.hs view
@@ -1,201 +1,211 @@-{-# LANGUAGE PatternSynonyms #-}-{-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# OPTIONS_HADDOCK prune #-} --- | A haskell Charting library targetting SVG+-- | A haskell Charting library targetting SVG. module Chart-  ( -- $overview-    Chart (..),-    Annotation (..),-    annotationText,-    padRect,-    RectStyle (..),-    defaultRectStyle,-    blob,-    clear,-    border,-    TextStyle (..),-    defaultTextStyle,-    Anchor (..),-    fromAnchor,-    toAnchor,-    GlyphStyle (..),-    defaultGlyphStyle,-    GlyphShape (..),-    glyphText,-    LineStyle (..),-    defaultLineStyle,-    PixelStyle (..),-    defaultPixelStyle,-    Direction (..),-    fromDirection,-    toDirection,-    SvgAspect (..),-    toSvgAspect,-    fromSvgAspect,-    EscapeText (..),-    CssOptions (..),-    ScaleCharts (..),-    SvgOptions (..),-    defaultSvgOptions,-    defaultSvgFrame,-    ChartDims (..),-    HudT (..),-    Hud,-    HudOptions (..),-    defaultHudOptions,-    defaultCanvas,-    AxisOptions (..),-    defaultAxisOptions,-    Place (..),-    placeText,-    Bar (..),-    defaultBar,-    Title (..),-    defaultTitle,-    Tick (..),-    defaultGlyphTick,-    defaultTextTick,-    defaultLineTick,-    defaultTick,-    TickStyle (..),-    defaultTickStyle,-    tickStyleText,-    TickExtend (..),-    Adjustments (..),-    defaultAdjustments,-    LegendOptions (..),-    defaultLegendOptions,+  ( -- * Usage -    -- $core-    dataBox,-    toAspect,-    scaleAnn,-    moveChart,+    --+    -- $usage +    -- * Design+    -- $design++    -- * What is a chart?++    --+    -- $overview++    -- * What is style and what is data?++    --+    -- $fancy++    -- * What is a hud?++    --     -- $hud-    runHudWith,-    runHud,-    makeHud,-    freezeTicks,-    flipAxis,-    canvas,-    title,-    tick,-    adjustTick,-    makeTickDates,-    makeTickDatesContinuous,-    legendHud,-    legendEntry,-    legendChart,-    legendFromChart, -    -- $svg-    svg,-    svgt,-    chartDef,-    chartDefs,-    styleBox,-    styleBoxes,-    noStyleBoxes,-    styleBoxText,-    styleBoxGlyph,-    padChart,-    frameChart,-    hori,-    vert,-    stack,-    addChartBox,-    addChartBoxes,+    -- * The primitives -    -- * re-exports-    module Chart.Page,-    module Chart.Render,+    --+    -- $primitives++    -- * Optics Usage++    --+    -- $optics++    -- * Ecosystem++    --+    -- $ecosystem++    -- * Re-exports+    module Chart.Primitive,+    module Chart.Data,+    module Chart.Hud,+    module Chart.Style,+    module Chart.Markup,+    module Chart.Compound,     module Chart.Bar,-    module Chart.Pixel,+    module Chart.Surface,     module Data.Colour,     module Data.FormatN,-    module NumHask.Space,+    module Data.Path,+    module Data.Path.Parser,   ) where  import Chart.Bar-import Data.FormatN-import Chart.Page-import Chart.Pixel-import Chart.Render-import Chart.Types+import Chart.Compound+import Chart.Data+import Chart.Hud+import Chart.Markup+import Chart.Primitive+import Chart.Style+import Chart.Surface import Data.Colour-import NumHask.Space+import Data.FormatN+import Data.Path+import Data.Path.Parser  -- $setup -- -- >>> :set -XOverloadedLabels--- >>> :set -XNoImplicitPrelude--- >>> -- import NumHask.Prelude--- >>> import Control.Lens+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core +-- $usage+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core+-- >>> let lines = [[Point 0.0 1.0, Point 1.0 1.0, Point 2.0 5.0],[Point 0.0 0.0, Point 2.8 3.0],[Point 0.5 4.0, Point 0.5 0]]+-- >>> let styles = (\c -> defaultLineStyle & set #color (palette c) & set #size 0.015) <$> [0..2]+-- >>> let cs = zipWith (\s x -> LineChart s [x]) styles lines+-- >>> let lineExample = mempty & set #chartTree (named "line" cs) & set #hudOptions defaultHudOptions :: ChartOptions+-- >>> writeChartOptions "other/usage.svg" lineExample++-- $design+--+-- The library could be cleaved into two parts:+--+-- - An abstract syntax tree (AST) that describes a chart,+--+-- - Functionality that makes a chart given an AST.+--+-- The majority of /work/ from a user perspective is in describing the chart. The library design reflects this and preference has been given to:+--+-- - making the representation concrete,finite and non-recursive. 'ChartOptions' is the broadest type representing a chart and this has a Show instance.+--+-- - providing ease of specification of what can be long trails of lenses leading to a chart component.+--+-- With these design preferences in mind, the complete tree of non-trivial types (in base or IsString instances, say) is contained in the chart below:+-- ![AST](other/AST.svg)+--+-- The underlying SVG is clickable and contains links to the relevant haddocks:  [ChartOptions AST](https://hackage.haskell.org/package/chart-svg/docs/other/ast.svg)+--+-- The labels on the chart arrows represent lenses between components that are container types (eg lists or maybes). Otherwise, arrows represent either generic lenses (such as #chartTree) or lenses supplied by the library (suffixed with a single quote, such as lineData'). As an example, to move all lines contained in line charts left by 1 (in data terms), you could say:+--+-- > lineExample & over (#chartTree % charts' % each % #chartData % lineData' % _Just % each % each % _x) (+1)+ -- $overview ----- A chart consists of related conceptual layers:+-- Charting consists of three tightly-coupled domains: ----- 1. the data to be represented--- 2. the manifestation of the data on the screen--- 3. visual aids to help interpret the data, such as axes, gridlines and titles.+-- 1. /the data domain/: the data to be represented.+-- 2. /the screen syntax/: the syntactics of the data. How and where data is to be represented on a screen (or page), and.+-- 3. /the hud/: visual aids that help interpret the screened data; such as axes, gridlines and titles. ----- >>> :t Chart--- Chart :: Annotation -> [XY a] -> Chart a+-- A 'Chart' in this library consists of a specification of the first two items in the above list; data and its syntax. ----- A 'Chart' in this library specifically consists of+-- Here's some data; three lists of points that form lines to be charted: ----- - a list of values, either 2D points or rectangles (unified as a 'XY')+-- >>> let lines = [[Point 0.0 1.0, Point 1.0 1.0, Point 2.0 5.0],[Point 0.0 0.0, Point 2.8 3.0],[Point 0.5 4.0, Point 0.5 0]] ----- - an 'Annotation', which describes the way that the data should be represented on a 2-dimensional plane.+-- and some line styles with different colors in order to distinguish the data: ----- What exactly is annotation and what is data is highly variant within charting practice. This construction treats position on a plane differently from other quantitative manifestations such as color and size. The chief advantage of priveliging XY position is that scaling and integrating data with other chart elements becomes much easier. The disadvantage is that, to use quantitative tools such as size, data needs to be consciously separated into that which is position orientated, and that which is defined as 'Annotation'.+-- >>> let styles = (\c -> defaultLineStyle & #color .~ palette c & #size .~ 0.015) <$> [0..2]+-- >>> styles+-- [Style {size = 1.5e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph},Style {size = 1.5e-2, borderSize = 1.0e-2, color = Colour 0.02 0.29 0.48 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph},Style {size = 1.5e-2, borderSize = 1.0e-2, color = Colour 0.66 0.07 0.55 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}] --+-- This is enough to create the charts. ----- Here's some data:+-- >>> let cs = zipWith (\s x -> LineChart s [x]) styles lines+-- >>> let lineExample = mempty & #chartTree .~ named "line" cs & #hudOptions .~ defaultHudOptions :: ChartOptions+-- >>> :t lineExample+-- lineExample :: ChartOptions ----- >>> :{---  let ls = fmap (uncurry P) <$>---           [ [(0.0, 1.0), (1.0, 1.0), (2.0, 5.0 :: Double)],---             [(0.0, 0.0), (3.0, 3.0)],---             [(0.5, 4.0), (0.5, 0)] ]---  :}+-- > writeChartOptions "other/usage.svg" lineExample ----- >>> :t ls--- ls :: [[XY Double]]+-- ![usage example](other/usage.svg)++-- $fancy ----- and an Annotation to describe representation of this data.+-- The division between what is data and what is style is an arbitrary one, in this library and elsewhere.  Hofstadter mused that "content is just fancy form" and this very much applies to charting. Color and glyph shape are just two examples of style used to represent data (See 'Chart.Examples.surfaceExample' and 'Chart.Examples.arrowExample'). ----- >>> :{---  let anns = LineA <$>---             [ defaultLineStyle & #color .~ (palette1 !! 0) & #width .~ 0.015,---               defaultLineStyle & #color .~ (palette1 !! 1) & #width .~ 0.03,---               defaultLineStyle & #color .~ (palette1 !! 5) & #width .~ 0.01---             ]---  :}+-- If pushed, the canvas of a chart represents the interactions of two domains: a data domain and a physical space (a screen or a html element or a piece of paper). What is 'ChartData' is practically the data domain represented by the xy-plane that is the canvas. Thus it is a point, a rectangle, a path or some text. Everything else; color, shape, finish and polish, is designated 'Style'.++-- $hud ----- and this is enough to put together a Chart.+-- A 'Hud' is a type whose lower-case interpretation is as a collective noun for axes, titles, tick marks, grid lines and legends for a 'Chart'. Formally, a 'Hud': ----- >>> let lines = zipWith Chart anns ls--- >>> :t lines--- lines :: [Chart Double]+-- - is a 'Priority' helping to order the drawing of hud elements, and ----- Most charts will, in reality, be a list of charts, and much of the library API is designed for this.+-- - a function with the signature: 'HudChart' -> 'ChartTree'. Given a tree of charts and huds, provide a 'ChartTree' that represents the hud component. ----- > writeCharts "other/lines.svg" lines+-- A hud does not explicitly represent the data but, instead, exists to provide references to help explain the data being represented. Hud elements can usually be distinguished from data syntax, but need information from the chart domain (data domain and style domain) to function. A tick mark and tick value on an axis need to know the range of the data to be placed properly on the screen. A chart border needs to know the syntactic range of the entire data representation inclusive of representational artifacts that might extend beyond the data domain. A glyph representing a one-dimensional point exists in 2 dimensions, or we wouldn't be able to see it. ----- ![lines example](other/lines.svg)+-- Apart from this functional usage, however, hud elements are pretty much the same as data elements. They are typically composed of the same stuff; rectangles and lines and text and colors. ----- Physical, on-the-page representations of data is separate to need to be considered separately to the domain of the data itself but their concerns bleed into each other. An axis on a chart needs to know the range of the data to render a tick value.+-- Given this similarity, the library process for chart creation is roughly: ----- > writeHudOptionsChart "other/linehud.svg" defaultSvgOptions defaultHudOptions [] lines+-- - collect the chart data and syntax (or style) into a collection of charts (a list or a tree). See 'Chart' and 'ChartTree' ----- ![hud example](other/linehud.svg)+-- - measure the range of the data values ----- chart-svg takes inspiration from gaming heads-up display aesthetics. Chart decorations such as titles and axes are tools to interpret the landscape of data being viewed, should be readily transparent, have sane defaults but be fully configurable.+-- - fold hud elements into a chart, creating new 'ChartTree's from the hud, keeping track of chart dimensions: ----- The library considers a hud to be a recipe for the creation of a 'Chart' list, in the domain of the viewbox of an svg file or similar conception.+--   1. across the domain of the underlying data ----- Being charts all the way down creates a direct mapping between a chart and its representation. The best way to understand this would be to run the example app, which serves a websocket receiving chart options and updating a chart.+--   2. across the domain of the physical chart, inclusive of Hud or decorative elements.+--+-- This protocol is reified in 'runHudWith'. The most common Hud concepts, such as axes and titles, have been collected into the 'HudOptions' type.+--+-- An important quality of 'runHudWith' (and conversion of charts to svg in general) is that this is the point at which chart data is converted from the data domain to the page domain, and is destructive. Typically, at that point of the pipeline, information about the data disappears, so that we no longer can tell what is chart and what is hud.++-- $primitives+--+-- A trick of the library is that huds become processed into charts, and complex charts are just compositions of simpler charts. There are exactly six primitive chart types represented by these patterns:+--+-- - 'RectChart': (list of) rectangles+-- - 'LineChart': (list of list of) points+-- - 'TextChart': (list of) text, point tuples+-- - 'GlyphChart': (list of) points (and 'glyphShape' from 'chartStyle')+-- - 'PathChart': (list of) 'PathData'+-- - 'BlankChart': (list of) rectangles with no stylistic manifestation.++-- $optics+--+-- Usage suggests the use of optics-core and OverloadedLabels, but this is not required. 'Chart', 'HudOptions' and associated chart configuration types are big and sometimes deep syntax trees, and simple optics; getting, setting and modding, makes manipulation more pleasant. Lens works as well, and the library is perfectly capable of being used with records.+--+-- Lenses are supplied, for the optics-core library, but can be easily modified for lens. The chart-svg convention is that lenses are either OverloadedLabels, and thus prefixed with a #, or suffixed with a single quote /'/.++-- $ecosystem+--+-- Charting is a broad concern and several upstream libraries provide aspects of charting that are used within and in conjunction with this library:+--+-- - [numhask-space](https://hackage.haskell.org/package/numhask-space): provides abstract mathematics for the 'Space' domain, including representations of points ('Point') and rectangles ('Rect').+--+-- - [markup-parse](https://hackage.haskell.org/package/markup-parse): provides conversion to and from SVG, HTML and any other XML-like text-based representations.+--+-- - [formatn](https://hackage.haskell.org/package/formatn): provides significant figure and rounding compoutations for Doubles.+--+-- Downstream tools for this library include:+--+-- - [prettychart](https://hackage.haskell.org/package/prettychart): live creation of charts.+--+-- - [dotparse](https://hackage.haskell.org/package/dotparse): creation of charts using graphviz and the dot language.
src/Chart/Bar.hs view
@@ -1,57 +1,86 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-} --- | bar charts+-- | Bar charts module Chart.Bar   ( BarOptions (..),     defaultBarOptions,     BarData (..),-    barDataLowerUpper,     barRange,     bars,     barChart,+    barRects,+    barTextCharts,   ) where -import Chart.Types-import Control.Lens+import Chart.Data+import Chart.Hud+import Chart.Markup+import Chart.Primitive+import Chart.Style+import Data.Bool import Data.Colour+import Data.Data+import Data.Foldable import Data.FormatN-import Data.Generics.Labels ()-import qualified Data.List.NonEmpty as NonEmpty-import NumHask.Prelude-import NumHask.Space+import Data.List (transpose)+import Data.Maybe+import Data.Text (Text, pack)+import GHC.Generics+import Optics.Core+import Prelude hiding (abs)  -- $setup -- -- >>> :set -XOverloadedLabels--- >>> :set -XNoImplicitPrelude--- >>> -- import NumHask.Prelude--- >>> import Control.Lens+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core+-- >>> import Data.Text (pack) --- | the usual bar chart eye-candy+-- | Typical bar chart options. --+-- The internal model for a bar chart (across the x-axis for a vertical bar chart) is:+--+-- - half the outerGap at the start and the end.+--+-- - each row collection of bars, including the outerGap and innerGaps has a value of 1.+--+-- - the entire x range of the chart isequal to the number of rows in the bar data.+--+-- - The value of inner and outer gaps are relative to this model.+--+-- >>> let barDataExample = BarData [[1, 2, 3, 5, 8, 0, -2, 11, 2, 1], [1 .. 10]] (("row " <>) . pack . show <$> [1 .. 11]) (("column " <>) . pack . show <$> [1 .. 2])+-- >>> let barExample = barChart defaultBarOptions barDataExample+--+-- > writeChartOptions "other/bar.svg" barExample+-- -- ![bar chart example](other/bar.svg)-data BarOptions-  = BarOptions-      { barRectStyles :: [RectStyle],-        barTextStyles :: [TextStyle],-        outerGap :: Double,-        innerGap :: Double,-        textGap :: Double,-        textGapNegative :: Double,-        displayValues :: Bool,-        valueFormatN :: FormatN,-        accumulateValues :: Bool,-        barOrientation :: Direction,-        barHudOptions :: HudOptions-      }-  deriving (Show, Eq, Generic)+data BarOptions = BarOptions+  { barRectStyles :: [Style],+    barTextStyles :: [Style],+    -- | gap between each bar collection row.+    outerGap :: Double,+    -- | gap between bars within a row collection. Negative numbers represent bar overlaps.+    innerGap :: Double,+    -- | gap between top of a bar and text representation of the bar value+    -- as a proportion of the highest absolute bar value+    textGap :: Double,+    -- | gap between top of a bar and text representation of the bar value,+    -- if the value is negative+    -- as a proportion of the highest absolute bar value+    textGapNegative :: Double,+    -- | A nudge to help text align for horizontal bar charts.+    textShiftVert :: Double,+    -- | Whether to display text values above bars.+    displayValues :: Bool,+    valueFormatN :: FormatN,+    barOrientation :: Orientation,+    barStacked :: Stacked,+    barLegendOptions :: LegendOptions+  }+  deriving (Eq, Show, Generic, Data)  -- | The official bar options. defaultBarOptions :: BarOptions@@ -61,191 +90,173 @@     ts     0.1     0-    0.04-    0.1+    0.03+    0.05+    (-0.008)     True-    (FormatComma (Just 2))-    False-    Hori-    ( defaultHudOptions-        & #hudAxes-          .~ [ defaultAxisOptions-                 & #atick . #ltick .~ Nothing,-               defaultAxisOptions & #place .~ PlaceLeft-             ]-        & #hudTitles .~ []-        & #hudLegend-          .~ Just-            ( defaultLegendOptions-                & #lplace .~ PlaceRight-                & #lsize .~ 0.12-                & #vgap .~ 0.4-                & #hgap .~ 0.14-                & #ltext . #size .~ 0.12-                & #lscale .~ 0.4,-              []-            )-    )+    (FormatN FSCommaPrec (Just 2) 4 True True)+    Vert+    NonStacked+    defaultLegendOptions   where-    gs = (\x -> RectStyle 0.002 x x) <$> palette1-    ts = (\x -> defaultTextStyle & #color .~ x & #size .~ 0.04) <$> palette1+    gs = (\x -> defaultRectStyle & set #borderSize 0.005 & set #borderColor (palette x) & set #color (paletteO x 0.7)) <$> [1, 2, 6, 7, 5, 3, 4, 0]+    ts = (\x -> defaultTextStyle & set #color (palette x) & set #size 0.03) <$> [1, 2, 6, 7, 5, 3, 4, 0] --- | imagine a dataframe you get in other languages:------ - definietly some [[Double]]------ - maybe some row names------ - maybe some column names-data BarData-  = BarData-      { barData :: [[Double]],-        barRowLabels :: Maybe [Text],-        barColumnLabels :: Maybe [Text]-      }-  deriving (Show, Eq, Generic)+-- | Number of bars per row of data+cols :: Stacked -> [[Double]] -> Int+cols Stacked _ = 1+cols NonStacked xs = length xs --- | Convert BarData to rectangles+-- | Number of rows+rows :: [[Double]] -> Int+rows xs = maximum $ (0 :) $ length <$> xs++-- | Width of each bar+barWidth :: BarOptions -> [[Double]] -> Double+barWidth o xs = ((1 - outerGap o) / c) - (innerGap o * (c - 1))+  where+    c = fromIntegral $ cols (barStacked o) xs++-- | Placement for the ith row jth column bar (x axis for vertical bars)+barX0 :: BarOptions -> [[Double]] -> Int -> Int -> Double+barX0 o xs i j = outerGap o / 2 + fromIntegral i + fromIntegral j * (barWidth o xs + innerGap o)++-- | Make bars from the double list values, normalizing to one :: Rect. -- -- >>> barRects defaultBarOptions [[1,2],[2,3]]--- [[Rect 5.0e-2 0.45 0.0 1.0,Rect 1.05 1.4500000000000002 0.0 2.0],[Rect 0.45 0.8500000000000001 0.0 2.0,Rect 1.4500000000000002 1.85 0.0 3.0]]+-- [[Rect (-0.5) (-0.26315789473684215) (-0.5) (-0.16666666666666669),Rect 2.631578947368418e-2 0.26315789473684204 (-0.5) 0.16666666666666663],[Rect (-0.26315789473684215) (-2.6315789473684292e-2) (-0.5) 0.16666666666666663,Rect 0.26315789473684204 0.4999999999999999 (-0.5) 0.5]] ----- FIXME: slows!-barRects ::-  BarOptions ->-  [[Double]] ->-  [[Rect Double]]-barRects (BarOptions _ _ ogap igap _ _ _ _ add orient _) bs = rects'' orient+-- >>> barRects defaultBarOptions [[]]+-- []+barRects :: BarOptions -> [[Double]] -> [[Rect Double]]+barRects o xs = rects'   where-    bs' = bool bs (appendZero bs) add-    rects'' Hori = rects'-    rects'' Vert = fmap (\(Rect x z y w) -> Rect y w x z) <$> rects'-    rects' = zipWith batSet [0 ..] (barDataLowerUpper add bs')-    batSet z ys =-      zipWith-        ( \x (yl, yh) ->-            abs-              ( Rect-                  (x + (ogap / 2) + z * bstep)-                  (x + (ogap / 2) + z * bstep + bstep - igap')-                  yl-                  yh-              )-        )-        [0 ..]-        ys-    n = fromIntegral (length bs')-    bstep = (1 - (1 + 1) * ogap + (n - 1) * igap') / n-    igap' = igap * (1 - (1 + 1) * ogap)+    rects' = fmap (fmap (projectOnR one sb)) rects+    rects = fmap (fmap (flipRect (barOrientation o))) $ accVals $ zip2With (\y x0 -> abs (Rect x0 (x0 + barWidth o xs') 0 y)) xs' (barX0s o xs')+    sb = fromMaybe one $ foldRect (mconcat rects)+    xs' = appendZeros xs+    accVals = bool id accRectYs (barStacked o == Stacked)+    accRectYs xss = foldr addLast [] xss+    addLast rs [] = [rs]+    addLast rs res@(l : _) = zipWith addW rs l : res+    addW (Rect x z y w) (Rect _ _ _ w') = Rect x z (y + w') (w + w') --- | convert data to a range assuming a zero bound--- a very common but implicit assumption in a lot of bar charts+zip2With :: (a -> b -> c) -> [[a]] -> [[b]] -> [[c]]+zip2With f = zipWith (zipWith f)++-- outer product on functors+iter2 :: (Functor f, Functor g) => (a -> b -> c) -> f a -> g b -> f (g c)+iter2 f xs ys = f <$> xs <&> flip fmap ys -- or (\a -> f a <$> ys) <$> xs++-- | Placements for the bars (x axis for vertical bars)+barX0s :: BarOptions -> [[Double]] -> [[Double]]+barX0s o xs = transpose $ iter2 (barX0 o xs) [0 .. (rows xs - 1)] (bool (replicate (length xs) 0) [0 .. (length xs - 1)] (barStacked o == NonStacked))++flipRect :: Orientation -> Rect Double -> Rect Double+flipRect Vert r = r+flipRect Hori (Rect x z y w) = Rect y w x z++appendZeros :: [[Double]] -> [[Double]]+appendZeros xs =+  ( \x ->+      take+        (rows xs)+        (x <> repeat 0)+  )+    <$> xs++-- | A bar chart. ----- >>> barDataLowerUpper False [[1,2],[2,3]]--- [[(0.0,1.0),(0.0,2.0)],[(0.0,2.0),(0.0,3.0)]]-barDataLowerUpper :: Bool -> [[Double]] -> [[(Double, Double)]]-barDataLowerUpper add bs =-  case add of-    False -> fmap (0,) <$> bs-    True -> fmap (0,) <$> accRows bs+-- >>> emptyBar = barChart defaultBarOptions (BarData [] [] [])+-- >>> foldOf (#chartTree % charts') emptyBar+-- []+barChart :: BarOptions -> BarData -> ChartOptions+barChart bo bd =+  mempty+    & set #hudOptions (barHudOptions bo bd)+    & set+      #chartTree+      ( named+          "barchart"+          ( bars bo bd+              <> bool [] (barTextCharts bo bd) (view #displayValues bo)+          )+      ) --- | calculate the Rect range of a bar data set.+barHudOptions :: BarOptions -> BarData -> HudOptions+barHudOptions bo bd =+  mempty+    & set #axes [Priority 1 axis1]+    & set #legends [Priority 10 (o & set #legendCharts (barLegendContent bo bd))]+  where+    o = view #barLegendOptions bo+    axis1 = bool defaultXAxisOptions defaultYAxisOptions (barOrientation bo == Hori) & set (#ticks % #lineTick) Nothing & set (#ticks % #tick) (barTicks bd)++-- | Two dimensional data, maybe with row and column labels.+data BarData = BarData+  { barData :: [[Double]],+    barRowLabels :: [Text],+    barColumnLabels :: [Text]+  }+  deriving (Eq, Show, Generic, Data)++-- | Calculate the Rect range of a bar data set. -- -- >>> barRange [[1,2],[2,3]] -- Rect 0.0 2.0 0.0 3.0+--+-- >>> barRange [[]]+-- Rect (-0.5) 0.5 (-0.5) 0.5 barRange ::   [[Double]] -> Rect Double-barRange [] = Rect 0 0 0 0-barRange ys'@(y : ys) = Rect 0 (fromIntegral $ maximum (length <$> ys')) (min 0 l) u+barRange ys = padSingletons $ Rect 0 (fromIntegral $ rows ys) (min 0 l) u   where-    (Range l u) = sconcat $ space1 <$> (y NonEmpty.:| ys)+    (Range l u) = fromMaybe one $ space1 $ mconcat ys  -- | A bar chart without hud trimmings. ----- >>> bars defaultBarOptions (BarData [[1,2],[2,3]] Nothing Nothing)--- [Chart {annotation = RectA (RectStyle {borderSize = 2.0e-3, borderColor = RGBA 0.65 0.81 0.89 1.00, color = RGBA 0.65 0.81 0.89 1.00}), xys = [RectXY Rect 5.0e-2 0.45 0.0 1.0,RectXY Rect 1.05 1.4500000000000002 0.0 2.0]},Chart {annotation = RectA (RectStyle {borderSize = 2.0e-3, borderColor = RGBA 0.12 0.47 0.71 1.00, color = RGBA 0.12 0.47 0.71 1.00}), xys = [RectXY Rect 0.45 0.8500000000000001 0.0 2.0,RectXY Rect 1.4500000000000002 1.85 0.0 3.0]},Chart {annotation = BlankA, xys = [RectXY Rect -5.0e-2 1.9500000000000002 0.0 3.0]}]-bars :: BarOptions -> BarData -> [Chart Double]-bars bo bd =-  zipWith (\o d -> Chart (RectA o) d) (bo ^. #barRectStyles) (fmap RectXY <$> barRects bo (bd ^. #barData)) <> [Chart BlankA [RectXY (Rect (x - (bo ^. #outerGap)) (z + (bo ^. #outerGap)) y w)]]+-- >>> bars defaultBarOptions (BarData [[1,2],[2,3]] [] [])+-- [Chart {chartStyle = Style {size = 6.0e-2, borderSize = 5.0e-3, color = Colour 0.02 0.29 0.48 0.70, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, chartData = RectData [Rect (-0.5) (-0.26315789473684215) (-0.5) (-0.16666666666666669),Rect 2.631578947368418e-2 0.26315789473684204 (-0.5) 0.16666666666666663]},Chart {chartStyle = Style {size = 6.0e-2, borderSize = 5.0e-3, color = Colour 0.66 0.07 0.55 0.70, borderColor = Colour 0.66 0.07 0.55 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, chartData = RectData [Rect (-0.26315789473684215) (-2.6315789473684292e-2) (-0.5) 0.16666666666666663,Rect 0.26315789473684204 0.4999999999999999 (-0.5) 0.5]}]+--+-- >>> bars defaultBarOptions (BarData [[]] [] [])+-- []+bars :: BarOptions -> BarData -> [Chart]+bars bo bd = bool cs [] (null $ mconcat $ view #barData bd)   where-    (Rect x z y w) = fromMaybe one $ foldRect $ catMaybes $ foldRect <$> barRects bo (bd ^. #barData)--maxRows :: [[Double]] -> Int-maxRows [] = 0-maxRows xs = maximum $ length <$> xs--appendZero :: [[Double]] -> [[Double]]-appendZero xs = (\x -> take (maxRows xs) (x <> repeat 0)) <$> xs--accRows :: [[Double]] -> [[Double]]-accRows xs = transpose $ drop 1 . scanl' (+) 0 <$> transpose xs+    cs =+      zipWith+        (\o d -> RectChart o d)+        (view #barRectStyles bo <> repeat defaultRectStyle)+        (barRects bo (view #barData bd)) --- | sensible ticks-barTicks :: BarData -> TickStyle+-- | Sensible ticks for a bar chart.+barTicks :: BarData -> Tick barTicks bd-  | bd ^. #barData == [] = TickNone-  | isNothing (bd ^. #barRowLabels) =-    TickLabels $ pack . show <$> [0 .. (maxRows (bd ^. #barData) - 1)]+  | null (view #barData bd) = TickNone+  | null (view #barRowLabels bd) =+      TickLabels $ pack . show <$> [0 .. (rows (view #barData bd) - 1)]   | otherwise =-    TickLabels $ take (maxRows (bd ^. #barData)) $-      fromMaybe [] (bd ^. #barRowLabels) <> repeat ""--tickFirstAxis :: BarData -> [AxisOptions] -> [AxisOptions]-tickFirstAxis _ [] = []-tickFirstAxis bd (x : xs) = (x & #atick . #tstyle .~ barTicks bd) : xs---- | bar legend-barLegend :: BarData -> BarOptions -> [(Annotation, Text)]-barLegend bd bo-  | bd ^. #barData == [] = []-  | isNothing (bd ^. #barColumnLabels) = []-  | otherwise = zip (RectA <$> bo ^. #barRectStyles) $ take (length (bd ^. #barData)) $ fromMaybe [] (bd ^. #barColumnLabels) <> repeat ""---- | A bar chart with hud trimmings.------ By convention only, the first axis (if any) is the bar axis.-barChart :: BarOptions -> BarData -> (HudOptions, [Chart Double])-barChart bo bd =-  ( bo ^. #barHudOptions & #hudLegend %~ fmap (second (const (barLegend bd bo))) & #hudAxes %~ tickFirstAxis bd . flipAllAxes (barOrientation bo),-    bars bo bd <> bool [] (barTextCharts bo bd) (bo ^. #displayValues)-  )--flipAllAxes :: Direction -> [AxisOptions] -> [AxisOptions]-flipAllAxes o = fmap (bool id flipAxis (o == Vert))+      TickLabels $+        take (rows (view #barData bd)) $+          view #barRowLabels bd <> repeat "" -barDataTP :: Bool -> FormatN -> Double -> Double -> [[Double]] -> [[(Text, Double)]]-barDataTP add fn d negd bs =-  zipWith (zipWith (\x y' -> (formatN fn x, drop' y'))) bs' (bool bs' (accRows bs') add)-  where-    drop' x = bool (x - (negd * (w - y))) (x + (d * (w - y))) (x >= 0)-    bs' = appendZero bs-    (Rect _ _ y w) = barRange bs'+-- | A bar legend+barLegendContent :: BarOptions -> BarData -> [(Text, [Chart])]+barLegendContent bo bd+  | null (view #barData bd) = []+  | null (view #barColumnLabels bd) = []+  | otherwise =+      zip+        (view #barColumnLabels bd <> repeat "")+        ((\s -> [Chart s (RectData [one])]) <$> take (length (view #barData bd)) (view #barRectStyles bo)) --- | Convert BarData to text-barTexts ::-  BarOptions ->-  [[Double]] ->-  [[(Text, Point Double)]]-barTexts (BarOptions _ _ ogap igap tgap tgapneg _ fn add orient _) bs = zipWith zip (fmap fst <$> barDataTP add fn tgap tgapneg bs') (txs'' orient)+barTexts :: BarOptions -> [[Double]] -> [[(Text, Point Double)]]+barTexts o xs = zip2With (\x r -> (formatN (valueFormatN o) x, gapt (barOrientation o) r x)) xs (barRects o xs)   where-    bs' = bool bs (appendZero bs) add-    txs'' Hori = txs'-    txs'' Vert = fmap (\(Point x y) -> Point y x) <$> txs'-    txs' = zipWith addX [0 ..] (fmap snd <$> barDataTP add fn tgap tgapneg bs')-    addX z y =-      zipWith-        ( \x y' ->-            Point-              (x + (ogap / 2) + z * bstep + bstep / 2 - igap' / 2)-              y'-        )-        [0 ..]-        y-    n = fromIntegral (length bs')-    bstep = (1 - (1 + 1) * ogap + (n - 1) * igap') / n-    igap' = igap * (1 - (1 + 1) * ogap)+    gapt Vert (Rect x z y w) x' = Point ((x + z) / 2) (bool (w + textGap o) (y - textGapNegative o) (x' < 0))+    gapt Hori (Rect x z y w) x' = Point (bool (z + textGap o) (x - textGapNegative o) (x' < 0)) ((y + w) / 2 + textShiftVert o) --- | text, hold the bars-barTextCharts :: BarOptions -> BarData -> [Chart Double]+-- | Placed text, hold the bars.+barTextCharts :: BarOptions -> BarData -> [Chart] barTextCharts bo bd =-  zipWith (\o d -> Chart (TextA o (fst <$> d)) (PointXY . snd <$> d)) (bo ^. #barTextStyles) (barTexts bo (bd ^. #barData))+  zipWith TextChart (view #barTextStyles bo <> repeat defaultTextStyle & set (each % #scaleP) ScalePArea) (barTexts bo (view #barData bd))
+ src/Chart/Compound.hs view
@@ -0,0 +1,118 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}++-- | Combine charts that share a common canvas.+module Chart.Compound+  ( runHudCompoundWith,+    addHudCompound,+    compoundMerge,+    writeChartOptionsCompound,+    encodeChartOptionsCompound,+    markupChartOptionsCompound,+  )+where++import Chart.Hud+import Chart.Markup+import Chart.Primitive+import Chart.Style+import Data.Bool+import Data.ByteString.Char8 qualified as C+import Data.Foldable+import Data.List qualified as List+import Data.Maybe+import MarkupParse+import Optics.Core+import Prelude++-- | Write multiple charts to a single file sharing the canvas.+writeChartOptionsCompound :: FilePath -> [ChartOptions] -> IO ()+writeChartOptionsCompound fp cs = C.writeFile fp (encodeChartOptionsCompound cs)++-- | Encode multiple charts.+encodeChartOptionsCompound :: [ChartOptions] -> C.ByteString+encodeChartOptionsCompound [] = mempty+encodeChartOptionsCompound cs@(c0 : _) =+  markdown_ (view (#markupOptions % #renderStyle) c0) Xml (markupChartOptionsCompound cs)++-- | Create Markup representing multiple charts sharing a common canvas.+markupChartOptionsCompound :: [ChartOptions] -> Markup+markupChartOptionsCompound [] = mempty+markupChartOptionsCompound cs@(co0 : _) =+  header+    (view (#markupOptions % #markupHeight) co0)+    viewbox+    ( markupCssOptions (view (#markupOptions % #cssOptions) co0)+        <> markupChartTree ctFinal+    )+  where+    viewbox = view safeStyleBox' ctFinal+    ctFinal =+      projectChartCompoundWith+        (view (#markupOptions % #chartAspect) co0)+        (zip (view #hudOptions <$> cs) (view #chartTree <$> cs))++projectChartCompoundWith :: ChartAspect -> [(HudOptions, ChartTree)] -> ChartTree+projectChartCompoundWith asp css = ctFinal+  where+    csAndHud = addHudCompound asp css+    viewbox = finalCanvas asp (Just csAndHud)+    ctFinal = set styleBox' (Just viewbox) csAndHud++-- | Merge a list of ChartOptions, treating each element as charts to be merged. Note that this routine mempties the hud options and converts them to charts.+compoundMerge :: [ChartOptions] -> ChartOptions+compoundMerge [] = mempty+compoundMerge cs@(c0 : _) =+  ChartOptions+    (view #markupOptions c0)+    mempty+    (addHudCompound (view (#markupOptions % #chartAspect) c0) (zip (view #hudOptions <$> cs) (view #chartTree <$> cs)))++-- | Decorate a ChartTree with HudOptions, merging the individual hud options.+addHudCompound :: ChartAspect -> [(HudOptions, ChartTree)] -> ChartTree+addHudCompound _ [] = mempty+addHudCompound asp ts@((_, cs0) : _) =+  runHudCompoundWith+    (initialCanvas asp (Just cs0))+    (zip3 dbs' hss css')+  where+    css :: [ChartTree]+    css = snd <$> ts+    hos = fst <$> ts+    dbs = view safeBox' <$> css+    huds = zipWith toHuds hos dbs+    mdbs = fst <$> huds+    hss = snd <$> huds+    dbs' = zipWith fromMaybe dbs mdbs+    css' :: [ChartTree]+    css' = zipWith3 (\cs mdb db -> cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb) css mdbs dbs++-- | Combine a collection of chart trees that share a canvas box.+runHudCompoundWith ::+  -- | initial canvas+  ChartBox ->+  -- | databox-huds-chart tuples representing independent chart trees occupying the same canvas space+  [(DataBox, [Hud], ChartTree)] ->+  -- | integrated chart tree+  ChartTree+runHudCompoundWith cb ts = hss+  where+    hss =+      ts+        & fmap (\(_, hs, _) -> hs)+        & mconcat+        & prioritizeHuds+        & fmap (fmap (view (#phud % #item)))+        & foldl' (\x a -> makeHuds a x) hc0+        & fromHudChart+    css =+      ts+        & fmap (\(db, _, ct) -> over chart' (projectWith cb db) ct)+        & mconcat+    hc0 = HudChart (css & set styleBox' (Just cb)) mempty++prioritizeHuds :: [Hud] -> [[Hud]]+prioritizeHuds hss =+  hss+    & List.sortOn (view (#phud % #priority))+    & List.groupBy (\a b -> view (#phud % #priority) a == view (#phud % #priority) b)
+ src/Chart/Data.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RebindableSyntax #-}++-- | Data primitives and utilities+--+-- Whilst the library makes use of <https://hackage.haskell.org/package/numhask numhask>, it does not re-export, to avoid clashes with Prelude, with the exception of 'zero', 'one', 'angle' & 'abs'.+--+-- 'Rect' and 'Point', from <https://hackage.haskell.org/package/numhask-space numhask-space>, make up the base elements of many chart primitives.+module Chart.Data+  ( -- * Data Primitives+    Rect (..),+    pattern Rect,+    mid,+    foldRect,+    addPoint,+    projectOnP,+    projectOnR,+    space1,+    padRect,+    padSingletons,+    isSingleton,+    Point (..),+    addp,+    Range (..),++    -- * NumHask Exports+    Multiplicative (one),+    Additive (zero),+    abs,+    Direction (..),+    Basis (..),+  )+where++import NumHask.Prelude+import NumHask.Space++-- $setup+--+-- >>> import Chart+-- >>> import NumHask.Space++-- | Additive pad (or frame or buffer) a Rect.+--+-- >>> padRect 1 one+-- Rect (-1.5) 1.5 (-1.5) 1.5+padRect :: (Subtractive a) => a -> Rect a -> Rect a+padRect p (Rect x z y w) = Rect (x - p) (z + p) (y - p) (w + p)++-- | Pad a Rect to remove singleton dimensions.+--+-- Attempting to scale a singleton dimension of a Rect is a common bug.+--+-- Due to the use of scaling, and thus zero dividing, this is a common exception to guard against.+--+-- >>> project (Rect 0 0 0 1) one (Point 0 0)+-- Point NaN (-0.5)+--+-- >>> project (padSingletons (Rect 0 0 0 1)) one (Point 0 0)+-- Point 0.0 (-0.5)+padSingletons :: Rect Double -> Rect Double+padSingletons (Rect x z y w)+  | x == z && y == w = Rect (x - 0.5) (x + 0.5) (y - 0.5) (y + 0.5)+  | x == z = Rect (x - 0.5) (x + 0.5) y w+  | y == w = Rect x z (y - 0.5) (y + 0.5)+  | otherwise = Rect x z y w++-- | is any dimension singular?+isSingleton :: Rect Double -> Bool+isSingleton (Rect x z y w) = x == z || y == w++-- | add Points, dimension-wise+--+-- >>> Point 1 1 `addp` Point 0 2+-- Point 1.0 3.0+addp :: Point Double -> Point Double -> Point Double+addp = (+)
src/Chart/Examples.hs view
@@ -1,356 +1,743 @@-{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-type-defaults #-} -module Chart.Examples where+-- | Examples of chart construction.+module Chart.Examples+  ( -- * Unit & Hud+    unitExample,+    hudOptionsExample, -import Chart-import Control.Lens-import Data.List ((!!))-import qualified Data.Text as Text-import NumHask.Prelude-import Web.Rep+    -- * Iconic primitives.+    lineExample,+    rectExample,+    textExample,+    glyphsExample,+    pathExample, -data Ex-  = Ex-      { excss :: SvgOptions,-        exhc :: HudOptions,-        exmaxcs :: Int,-        exanns :: [Annotation],-        exxys :: [[XY Double]]-      }-  deriving (Eq, Show, Generic)+    -- * Compounds+    barExample,+    barDataExample,+    sbarExample,+    waveExample,+    surfaceExample,+    rosenbrock,+    arcFlagsExample,+    ellipseExample,+    quadExample,+    cubicExample,+    vennExample,+    arrowExample,+    dateExample, -makeExample :: HudOptions -> [Chart Double] -> Ex-makeExample hs cs = Ex defaultSvgOptions hs (length cs) (view #annotation <$> cs) (fmap (fmap realToFrac) . view #xys <$> cs)+    -- * Colour+    gradientExample,+    wheelExample, -repEx :: (Monad m) => Ex -> SharedRep m (Text, Text)-repEx (Ex css hc maxcs anns xs) =-  repChartsWithStaticData css hc maxcs (zipWith Chart anns xs)+    -- * Debugging+    debugExample, -writeChartExample :: FilePath -> Ex -> IO ()-writeChartExample fp (Ex css' hc' _ anns' xys') =-  writeHudOptionsChart fp css' hc' [] (zipWith Chart anns' xys')+    -- * Compound Charts+    compoundExample,+    stackExample, --- | minimal example-memptyExample :: Ex-memptyExample = Ex defaultSvgOptions mempty 1 [] []+    -- * Priority+    priorityv1Example,+    priorityv2Example, +    -- * Writing to file+    pathChartOptions,+    writeAllExamples,+    writeAllExamplesDark,+  )+where++import Chart+import Data.Bifunctor+import Data.Bool+import Data.ByteString (ByteString)+import Data.Function+import Data.Maybe+import Data.Text (Text)+import Data.Text qualified as Text+import Data.Time+import NumHask.Space+import Optics.Core+import Prelude hiding (abs)+ -- | unit example-unitExample :: Ex-unitExample = Ex defaultSvgOptions mempty 1 [RectA defaultRectStyle] [[one]]+--+-- ![unit example](other/unit.svg)+unitExample :: ChartOptions+unitExample =+  mempty+    & set #chartTree (named "unit" [Chart defaultRectStyle (RectData [one])])+    & set #hudOptions defaultHudOptions --- | hud example-hudExample :: Ex-hudExample = Ex defaultSvgOptions defaultHudOptions 1 [] []+-- | A 'BlankChart', 'defaultHudOptions' example.+--+-- ![hudoptions example](other/hudoptions.svg)+hudOptionsExample :: ChartOptions+hudOptionsExample =+  mempty+    & set #hudOptions defaultHudOptions+    & set #chartTree (blank one)  -- | rect example-rectExample :: Ex+--+-- ![rect example](other/rect.svg)+rectExample :: ChartOptions rectExample =-  Ex-    defaultSvgOptions-    (defaultHudOptions & set #hudAxes [defaultAxisOptions])-    2-    (RectA <$> ropts)-    (fmap RectXY <$> rss)+  mempty+    & set #hudOptions (mempty & set #axes [Priority 5 (defaultXAxisOptions & set (#ticks % #lineTick) Nothing)])+    & set #chartTree (named "rect" (zipWith (\s x -> Chart s (RectData x)) ropts rss))  rss :: [[Rect Double]] rss =-  [ gridR (\x -> exp (- (x ** 2) / 2)) (Range (-5) 5) 50,-    gridR (\x -> 0.5 * exp (- (x ** 2) / 8)) (Range (-5) 5) 50+  [ gridR (\x -> exp (-(x ** 2 / 2))) (Range (-5) 5) 50,+    gridR (\x -> 0.5 * exp (-(x ** 2 / 8))) (Range (-5) 5) 50   ] -ropts :: [RectStyle]+ropts :: [Style] ropts =-  [ blob (fromRGB (palette !! 0) 0.4),-    blob (fromRGB (palette !! 5) 0.4)+  [ blob (paletteO 1 0.4),+    blob (paletteO 2 0.4)   ]  -- | line example-lineExample :: Ex+--+-- ![line example](other/line.svg)+lineExample :: ChartOptions lineExample =-  Ex-    defaultSvgOptions-    ( exampleLineHudOptions-        "Line Chart"-        (Just "An example from chart-svg")-        (Just (legopts, zip (LineA <$> lopts) ["hockey", "line", "vertical"]))-    )-    3-    (LineA <$> lopts)-    (fmap PointXY <$> ls)--ls :: [[Point Double]]-ls =-  fmap (uncurry Point)-    <$> [ [(0.0, 1.0), (1.0, 1.0), (2.0, 5.0)],-          [(0.0, 0.0), (2.8, 3.0)],-          [(0.5, 4.0), (0.5, 0)]-        ]--lopts :: [LineStyle]-lopts =-  [ defaultLineStyle & #color .~ (palette1 !! 0) & #width .~ 0.015,-    defaultLineStyle & #color .~ (palette1 !! 1) & #width .~ 0.03,-    defaultLineStyle & #color .~ (palette1 !! 5) & #width .~ 0.01-  ]+  mempty & set #hudOptions ho & set #chartTree (named "line" cs)+  where+    ho =+      defaultHudOptions+        & set+          #titles+          [ Priority 6 (defaultTitleOptions "Line Chart" & set (#style % #size) 0.08),+            Priority 13 $+              defaultTitleOptions "Made with 🧡 and chart-svg"+                & set (#style % #size) 0.04+                & set #place PlaceBottom+                & set #anchoring 0.5+          ]+        & set+          #legends+          [ Priority 12 $+              defaultLegendOptions+                & set #scaleP ScalePX+                & set #place (PlaceAbsolute (Point 0.35 (-0.35)))+                & set #legendCharts (zipWith (\t c -> (t, [c])) ["palette #0", "palette #1", "palette #2"] cs)+          ]+    cs =+      zipWith+        ( \c l ->+            LineChart+              ( defaultLineStyle+                  & set #color (palette c)+                  & set #size 0.015+              )+              [l]+        )+        [0 ..]+        ls+    ls =+      [ [Point 0.0 1.0, Point 1.0 1.0, Point 2.0 5.0],+        [Point 0.0 0.0, Point 2.8 3.0],+        [Point 0.5 4.0, Point 0.5 0]+      ] -legopts :: LegendOptions-legopts =-  defaultLegendOptions-    & #lsize .~ 0.2-    & #ltext . #size .~ 0.25-    & #innerPad .~ 0.05-    & #lscale .~ 0.25-    & #lplace .~ PlaceAbsolute (Point 0.5 (-0.3))+-- | priority Version 1 example+--+-- ![priorityv1 example](other/priorityv1.svg)+priorityv1Example :: ChartOptions+priorityv1Example =+  lineExample+    & set+      (#hudOptions % #frames)+      [ Priority 1 (FrameOptions (Just defaultRectStyle) CanvasStyleSection 0),+        Priority 100 (FrameOptions (Just (defaultRectStyle & set #color (palette 4 & set opac' 0.05) & set #borderColor (palette 4))) HudStyleSection 0.1)+      ]+    & set (#hudOptions % #legends % each % #priority) 50+    & set (#hudOptions % #legends % each % #item % #place) PlaceRight -exampleLineHudOptions :: Text -> Maybe Text -> Maybe (LegendOptions, [(Annotation, Text)]) -> HudOptions-exampleLineHudOptions t1 t2 legends' =-  defaultHudOptions-    & #hudTitles-      .~ ( [ defaultTitle t1-               & #style . #size .~ 0.08-           ]-             <> maybe-               []-               ( \x ->-                   [ defaultTitle x-                       & #style . #size .~ 0.05-                       & #place .~ PlaceBottom-                       & #anchor .~ AnchorEnd-                   ]-               )-               t2-         )-    & #hudLegend .~ legends'+-- | priority Version 2 example+--+-- ![priorityv2 example](other/priorityv2.svg)+priorityv2Example :: ChartOptions+priorityv2Example =+  priorityv1Example+    & set (#hudOptions % #titles % each % #priority) 51  -- | text example-textExample :: Ex+--+-- ![text example](other/text.svg)+textExample :: ChartOptions textExample =-  Ex-    defaultSvgOptions-    defaultHudOptions-    26-    (TextA (defaultTextStyle & (#size .~ (0.05 :: Double))) . (: []) . fst <$> ts)-    ((: []) . PointXY . snd <$> ts)+  mempty+    & set #chartTree (named "text" [TextChart (defaultTextStyle & set #color dark & set #size 0.1) ts])+    & set #hudOptions defaultHudOptions+    & set (#markupOptions % #cssOptions % #preferColorScheme) PreferHud+    & set (#markupOptions % #cssOptions % #cssExtra) (fillSwitch (dark, light) "dark" "text")   where     ts :: [(Text, Point Double)]     ts =       zip-        (fmap Text.singleton ['a' .. 'y'])-        [Point (sin (x * 0.1)) x | x <- [0 .. 25]]---- | glyph example-glyphExample :: Ex-glyphExample = makeExample mempty glyphs+        (fmap Text.singleton ['a' .. 'z'])+        ((\x -> Point (sin (x * 0.1)) x) <$> [0 .. 25]) -glyphs :: [Chart Double]-glyphs =-  zipWith-    ( \(sh, bs) p ->-        Chart-          ( GlyphA-              ( defaultGlyphStyle-                  & #size .~ (0.1 :: Double)-                  & #borderSize .~ bs-                  & #shape .~ sh-              )-          )-          [p]-    )-    [ (CircleGlyph, 0.01 :: Double),-      (SquareGlyph, 0.01),-      (RectSharpGlyph 0.75, 0.01),-      (RectRoundedGlyph 0.75 0.01 0.01, 0.01),-      (EllipseGlyph 0.75, 0),-      (VLineGlyph 0.005, 0.01),-      (HLineGlyph 0.005, 0.01),-      (TriangleGlyph (Point 0.0 0.0) (Point 1 1) (Point 1 0), 0.01),-      (PathGlyph "M0.05,-0.03660254037844387 A0.1 0.1 0.0 0 1 0.0,0.05 0.1 0.1 0.0 0 1 -0.05,-0.03660254037844387 0.1 0.1 0.0 0 1 0.05,-0.03660254037844387 Z", 0.01)-    ]-    [P x 0 | x <- [0 .. (8 :: Double)]]+-- | glyphs example+--+-- ![glyphs example](other/glyphs.svg)+glyphsExample :: ChartOptions+glyphsExample =+  mempty+    & set (#markupOptions % #markupHeight) (Just 50)+    & set (#markupOptions % #chartAspect) (FixedAspect 12)+    & set+      #chartTree+      ( named "glyphs" $+          zipWith+            ( \(sh, bs) p ->+                GlyphChart+                  ( defaultGlyphStyle+                      & set #glyphShape sh+                      & set #size (0.8 :: Double)+                      & set #borderSize bs+                  )+                  [p]+            )+            [ (CircleGlyph, 0.02 :: Double),+              (SquareGlyph, 0.02),+              (RectSharpGlyph 0.75, 0.02),+              (RectRoundedGlyph 0.75 0.01 0.01, 0.02),+              (EllipseGlyph 0.75, 0.02),+              (VLineGlyph, 0.02),+              (HLineGlyph, 0.02),+              (TriangleGlyph (Point 0.0 (0.5 * sqrt 2)) (Point (-(cos (pi / 3))) (-(sin (pi / 3) / 2))) (Point (cos (pi / 3)) (-(sin (pi / 3) / 2))), 0.02),+              (PathGlyph "M 0.5,-0.3660 A 1.0 1.0 -0.0 0 1 0,0.5 A 1.0 1.0 -0.0 0 1 -0.5,-0.3660 A 1.0 1.0 -0.0 0 1 0.5,-0.3660 L 0.5,-0.3660 Z", 0.02)+            ]+            (fmap (\x -> Point x 0) [0 ..])+      ) --- | bar example+-- | Example data for Bar chart barDataExample :: BarData barDataExample =   BarData     [[1, 2, 3, 5, 8, 0, -2, 11, 2, 1], [1 .. 10]]-    (Just (("row " <>) . pack . show <$> [1 .. 11]))-    (Just (("column " <>) . pack . show <$> [1 .. 2]))+    (("row " <>) . Text.pack . show <$> [1 .. 11 :: Int])+    (("column " <>) . Text.pack . show <$> [1 .. 2 :: Int]) -barExample :: Ex-barExample = makeExample hc cs-  where-    (hc, cs) = barChart defaultBarOptions barDataExample+-- | Bar chart example.+--+-- ![bar example](other/bar.svg)+barExample :: ChartOptions+barExample =+  barChart defaultBarOptions barDataExample+    & set (#hudOptions % #frames) [Priority 101 (defaultFrameOptions & set #buffer 0.02)] --- | pixel example-pixelEx :: ([Chart Double], [Hud Double])-pixelEx = pixelfl f1 (defaultPixelOptions & #poGrain .~ Point 100 100 & #poRange .~ Rect 1 2 1 2) (defaultPixelLegendOptions "pixel test")+-- | Stacked bar chart example.+--+-- ![sbar example](other/sbar.svg)+sbarExample :: ChartOptions+sbarExample = barChart (defaultBarOptions & set #barOrientation Vert & set #barStacked Stacked & set #displayValues False & set (#barRectStyles % each % #borderSize) 0) barDataExample -f1 :: (TrigField a) => Point a -> a-f1 (Point x y) = sin (cos (tan x)) * sin (cos (tan y))+-- | wave example+--+-- ![wave example](other/wave.svg)+waveExample :: ChartOptions+waveExample = mempty & set #chartTree (named "wave" [GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) (gridP sin (Range 0 (2 * pi)) 30)]) & set #hudOptions defaultHudOptions --- * stuff+-- | venn diagram+--+-- ![venn diagram](other/venn.svg)+vennExample :: ChartOptions+vennExample =+  mempty+    & set #chartTree (named "venn" (zipWith (\c x -> PathChart (defaultPathStyle & set #borderSize 0.005 & set #color (paletteO c 0.2) & over #borderColor (set opac' 1)) x) [0 ..] (svgToPathData <$> vennSegs)))+    & set #hudOptions defaultHudOptions+    & set (#markupOptions % #chartAspect) (FixedAspect 1) -boundTextBug :: [Chart Double]-boundTextBug =-  [ t1,-    t2,-    Chart BlankA [R 0 0.1 (-0.5) 0.5],-    Chart (RectA defaultRectStyle) [RectXY (fixRect $ styleBox t1)],-    Chart (RectA defaultRectStyle) [RectXY (fixRect $ styleBox t2)]+{-+These were originally based on:++    [ ("origin", Point 0 0), -- origin+      ("circle1", Point 0.5 (-0.5 + cos (pi / 6))), -- center of circle 1+      ("circle2", Point 0 -0.5), -- center of circle 2+      ("circle3", Point -0.5 (-0.5 + cos (pi / 6))), -- center of circle 3+      ("corner1", Point 0 (-0.5 + 2 * cos (pi / 6))), -- corner 1+      ("corner2", Point 1 -0.5), -- corner 2+      ("corner3", Point -1 -0.5) -- corner 3+    ]+-}+vennSegs :: [ByteString]+vennSegs =+  [ "M0.0,-1.2320508075688774 A0.5 0.5 0.0 1 1 1.0,0.5 1.0 1.0 0.0 0 0 0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 0.0,-1.2320508075688774 Z",+    "M-1.0,0.5 A0.5 0.5 0.0 1 0 1.0,0.5 1.0 1.0 0.0 0 1 0.0,0.5 1.0 1.0 0.0 0 1 -1.0,0.5 Z",+    "M-1.0,0.5 A0.5 0.5 0.0 1 1 0.0,-1.2320508075688774 1.0 1.0 0.0 0 0 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 -1.0,0.5 Z",+    "M0.5,-0.3660254037844387 A1.0 1.0 0.0 0 1 1.0,0.5 1.0 1.0 0.0 0 1 0.0,0.5 1.0 1.0 0.0 0 0 0.5,-0.3660254037844387 Z",+    "M0.0,0.5 A1.0 1.0 0.0 0 1 -1.0,0.5 1.0 1.0 0.0 0 1 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 0.0,0.5 Z",+    "M0.0,-1.2320508075688774 A1.0 1.0 0.0 0 1 0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 1 0.0,-1.2320508075688774 Z",+    "M0.5,-0.3660254037844387 A1.0 1.0 0.0 0 1 0.0,0.5 1.0 1.0 0.0 0 1 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 1 0.5,-0.3660254037844387 Z"   ]++-- | Compound path example.+--+-- ![path test](other/path.svg)+pathExample :: ChartOptions+pathExample =+  mempty+    & set #chartTree (named "path" [path', c0] <> named "pathtext" [t0])+    & set #hudOptions defaultHudOptions+    & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #anchorTo) CanvasStyleSection+    & set (#hudOptions % #axes % each % #item % #axisBar %? #anchorTo) CanvasStyleSection+    & set (#markupOptions % #chartAspect) ChartAspect+    & set (#markupOptions % #cssOptions % #preferColorScheme) PreferHud+    & set (#markupOptions % #cssOptions % #cssExtra) (fillSwitch (dark, light) "dark" "pathtext")   where-    t1 =-      Chart-        ( TextA-            (defaultTextStyle & #anchor .~ AnchorStart & #hsize .~ 0.45 & #size .~ 0.08)-            ["a pretty long piece of text"]-        )-        [zero]-    t2 =-      Chart-        ( TextA-            (defaultTextStyle & #anchor .~ AnchorStart & #hsize .~ 0.45 & #size .~ 0.08)-            ["another pretty long piece of text"]-        )-        [P 1 1]+    ps =+      [ StartP (Point 0 0),+        LineP (Point 1 0),+        CubicP (Point 0.2 0) (Point 0.25 1) (Point 1 1),+        QuadP (Point (-1) 2) (Point 0 1),+        ArcP (ArcInfo (Point 1 1) (-(pi / 6)) False False) (Point 0 0)+      ]+    ts =+      [ "StartP (Point 0 0)",+        "LineP (Point 1 0)",+        "CubicP (Point 0.2 0) (Point 0.25 1) (Point 1 1)",+        "QuadP (Point (-1) 2) (Point 0 1)",+        "ArcP (ArcInfo (Point 1 1) (-pi / 6) False False) (Point 0 0)"+      ]+    path' = PathChart (defaultPathStyle & set #color (paletteO 0 0.1) & set #borderColor (paletteO 1 1)) ps+    c0 = GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) (pointPath <$> ps)+    midp = Point 0 0 : zipWith (\(Point x y) (Point x' y') -> Point ((x + x') / 2) ((y + y') / 2)) (drop 1 (pointPath <$> ps)) (pointPath <$> ps)+    offp = [Point (-0.35) 0.05, Point 0 0.05, Point (-0.2) 0, Point (-0.1) 0.1, Point 0 (-0.1)]+    t0 = TextChart (defaultTextStyle & set #size 0.025) (zip ts (zipWith addp offp midp)) --- | compound chart-gopts3 :: [GlyphStyle]-gopts3 =-  zipWith-    ( \x y ->-        (#color .~ x)-          . (#borderColor .~ x)-          . (#borderSize .~ 0.005)-          . (#shape .~ y)-          . (#size .~ 0.08)-          $ defaultGlyphStyle-    )-    palette1-    [EllipseGlyph 1.5, SquareGlyph, CircleGlyph]+-- | ellipse example+--+-- Under scaling, angles are not invariant, and this effects the glyphShape of ellipses and thus SVG arc paths. Compare the effect of aspect changes to the axes of this ellipse:+--+-- ![ellipse example](other/ellipse.svg)+--+-- Below is the same ellipse with FixedAspect 2. Points scale exactly, but the original points that represent the end points of the axes are no longer on the new axes of the ellipse.+--+-- ![ellipse2 example](other/ellipse2.svg)+ellipseExample :: ChartAspect -> ChartOptions+ellipseExample a =+  mempty+    & set #chartTree (named "ellipse" [ell, ellFull, c0, c1, bbox, xradii, yradii])+    & set #hudOptions defaultHudOptions+    & set (#markupOptions % #chartAspect) a+    & set (#hudOptions % #legends) [Priority 10 (defaultLegendOptions & set #legendCharts lrows & set (#textStyle % #size) 0.2 & set #legendSize 0.1 & set #vgap 0.3)]+    & set (#hudOptions % #titles) [Priority 11 (defaultTitleOptions "ArcPosition (Point 1 0) (Point 0 1) (ArcInfo (Point 1.5 1) (pi / 3) True True)" & set (#style % #size) 0.032)]+    & set (#hudOptions % #axes % ix 1 % #item % #ticks % #textTick %? #buffer) 0.04+    & set (#hudOptions % #axes % ix 1 % #item % #ticks % #glyphTick %? #buffer) 0.01+  where+    p@(ArcPosition p1 p2 _) = ArcPosition (Point 1 0) (Point 0 1) (ArcInfo (Point 1.5 1) (pi / 3) True True)+    (ArcCentroid c r phi' ang0' angd) = arcCentroid p+    ellFull = LineChart fullels [ellipse c r phi' . (\x -> 2 * pi * x / 100.0) <$> [0 .. 100]]+    ell = LineChart els [ellipse c r phi' . (\x -> ang0' + angd * x / 100.0) <$> [0 .. 100]]+    g0 = defaultGlyphStyle & set #glyphShape CircleGlyph+    c0 = GlyphChart g0 [c]+    g1 = defaultGlyphStyle & set #color (paletteO 4 0.2) & set #glyphShape CircleGlyph+    c1 = GlyphChart g1 [p1, p2]+    bbox = RectChart bbs [arcBox p]+    bbs = defaultRectStyle & set #borderSize 0.002 & set #color (paletteO 7 0.005) & set #borderColor (grey 0.5 1)+    xradii = LineChart xals [[ellipse c r phi' 0, ellipse c r phi' pi]]+    yradii = LineChart yals [[ellipse c r phi' (pi / 2), ellipse c r phi' (3 / 2 * pi)]]+    xals = defaultLineStyle & set #color (palette 6) & set #size 0.005 & set #dasharray (Just [0.03, 0.01]) & set #lineCap (Just LineCapRound)+    yals = defaultLineStyle & set #color (palette 5) & set #size 0.005 & set #dasharray (Just [0.03, 0.01]) & set #lineCap (Just LineCapRound)+    fullels = defaultLineStyle & set #size 0.002 & set #color (palette 1)+    els = defaultLineStyle & set #size 0.005 & set #color (palette 2)+    lrows =+      second (: [])+        <$> [ ("Major Axis", LineChart xals [[zero]]),+              ("Minor Axis", LineChart yals [[zero]]),+              ("Full Ellipse", LineChart fullels [[zero]]),+              ("Arc", LineChart els [[zero]]),+              ("Centroid", GlyphChart (g0 & set #size 0.01 & set #glyphShape SquareGlyph) [zero]),+              ("Endpoints", GlyphChart (g1 & set #size 0.01 & set #glyphShape SquareGlyph) [zero]),+              ("Bounding Box", RectChart (bbs & set #borderSize 0.01) [fmap (2 *) one])+            ] -glines :: [Chart Double]-glines = cs <> gs+-- | Reproduction of the flag explanation chart in <https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths>+--+-- ![arc flags example](other/arcflags.svg)+arcFlagsExample :: ChartOptions+arcFlagsExample =+  mempty+    & set+      #chartTree+      ( vert+          AlignLeft+          0.02+          [ hori AlignMid 0.02 [colSweep, colSweep2, colLargeFalse, colLargeTrue],+            rowLarge+          ]+      )+    & set (#markupOptions % #chartAspect) UnscaledAspect+    & set (#markupOptions % #cssOptions % #preferColorScheme) PreferHud+    & set+      (#markupOptions % #cssOptions % #cssExtra)+      ("{.chart g {stroke: " <> showRGBA dark <> ";} .chart g text {fill: " <> showRGBA dark <> ";}} @media (prefers-color-scheme:dark) {.chart g {stroke: " <> showRGBA light <> ";} .chart g text {fill: " <> showRGBA light <> ";}}")   where-    cs = zipWith (\d s -> Chart (LineA s) (PointXY <$> d)) ls lopts-    gs = zipWith (\d s -> Chart (GlyphA s) (PointXY <$> d)) ls gopts3+    rowLarge =+      unnamed+        [ blankChart1 (Rect 0 9 (-2.75) (-3.25)),+          TextChart (defaultTextStyle & set #size 0.6) [("Large", Point 5.5 (-3.0))]+        ]+    colLargeFalse =+      vert+        AlignLeft+        0.02+        [ unnamed (checkFlags False True (set opac' 0.3 dark)),+          unnamed (checkFlags False False (set opac' 0.3 dark)),+          unnamed+            [ blankChart1 (Rect (-1) 2 (-0.25) 0.25),+              TextChart (defaultTextStyle & set #size 0.4) [("False", Point 0.5 (-0.1))]+            ]+        ]+    colLargeTrue =+      vert+        AlignLeft+        0.02+        [ unnamed (checkFlags True True (set opac' 0.3 dark)),+          unnamed (checkFlags True False (set opac' 0.3 dark)),+          unnamed+            [ blankChart1 (Rect (-1) 2 (-0.25) 0.25),+              TextChart (defaultTextStyle & set #size 0.4) [("True", Point 0.5 (-0.1))]+            ]+        ]+    colSweep =+      unnamed+        [ blankChart1 (Rect (-0.4) 0.4 (-1) 5),+          TextChart+            (defaultTextStyle & set #size 0.6 & set #rotation (Just (pi / 2)))+            [("Sweep", Point 0.1 2)]+        ]+    colSweep2 =+      vert+        AlignLeft+        0.02+        [ unnamed+            [ blankChart1 (Rect (-0.25) 0.25 (-1) 2),+              TextChart+                (defaultTextStyle & set #size 0.4 & set #rotation (Just (pi / 2)))+                [("True", Point 0.1 0.5)]+            ],+          unnamed+            [ blankChart1 (Rect (-0.25) 0.25 (-1) 2),+              TextChart+                (defaultTextStyle & set #size 0.4 & set #rotation (Just (pi / 2)))+                [("False", Point 0.1 0.5)]+            ]+        ] -lgdata :: [(Text, Point Double)]-lgdata =-  (\p@(Point x y) -> (pack (show x <> "," <> show y), fromIntegral <$> p))-    <$> (Point <$> [0 .. 5] <*> [0 .. 5] :: [Point Int])+checkFlags :: Bool -> Bool -> Colour -> [Chart]+checkFlags large' sweep co = [c1, c2, ell, arc1]+  where+    c = Point 1.0 1.0+    p1 = ArcPosition (Point 0.0 1.0) (Point 1.0 0.0) (ArcInfo (Point 1.0 1.0) 0 large' sweep)+    ps1 = singletonPie c p1+    (ArcCentroid c' r phi' ang0' angd) = arcCentroid p1+    arc1 = PathChart (defaultPathStyle & set #color co & set #borderColor (set opac' 0.5 dark)) ps1+    c1 = LineChart (defaultLineStyle & set #size 0.02 & set #color (set opac' 0.2 dark)) [ellipse (Point 1.0 1.0) (Point 1.0 1.0) 0 . (\x -> 0 + 2 * pi * x / 100.0) <$> [0 .. 100]]+    c2 = LineChart (defaultLineStyle & set #size 0.02 & set #color (set opac' 0.2 dark)) [ellipse (Point 0.0 0.0) (Point 1.0 1.0) 0 . (\x -> 0 + 2 * pi * x / 100.0) <$> [0 .. 100]]+    ell = LineChart (defaultLineStyle & set #size 0.05 & set #color (set opac' 0.5 co)) [ellipse c' r phi' . (\x -> ang0' + angd * x / 100.0) <$> [0 .. 100]] -lglyph :: [Chart Double]-lglyph = txt <> gly+-- | quad example+--+-- ![quad example](other/quad.svg)+quadExample :: ChartOptions+quadExample =+  mempty+    & set #chartTree (named "quad" [path', curve, c0, c1, bbox])+    & set #hudOptions defaultHudOptions+    & set (#markupOptions % #chartAspect) (FixedAspect 1.5)+    & set (#hudOptions % #legends) [Priority 10 (defaultLegendOptions & set #legendCharts lrows & set (#textStyle % #size) 0.2 & set #legendSize 0.2 & set #vgap 0.3)]+    & set (#hudOptions % #titles) [Priority 11 (defaultTitleOptions "QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1))" & set (#style % #size) 0.03)]+    & set (#hudOptions % #axes % ix 1 % #item % #ticks % #textTick %? #buffer) 0.04+    & set (#hudOptions % #axes % ix 1 % #item % #ticks % #glyphTick %? #buffer) 0.01   where-    txt =-      ( \(t, p) ->-          Chart-            ( TextA-                ( defaultTextStyle-                    & #translate ?~ Point 0 0.04-                    & #color %~ setOpac 0.2-                )-                [t]-            )-            (PointXY <$> [p])-      )-        <$> lgdata-    gly =-      ( \d ->-          Chart-            ( GlyphA-                ( defaultGlyphStyle-                    & #size .~ 0.01-                    & #borderSize .~ 0-                    & #color .~ black-                )-            )-            (PointXY <$> [d])-      )-        <$> (snd <$> lgdata)+    p@(QuadPosition start end control) = QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1))+    ps = singletonQuad p+    path' = PathChart pathStyle ps+    curve = LineChart curveStyle [quadBezier p . (/ 100.0) <$> [0 .. 100]]+    curveStyle = defaultLineStyle & set #size 0.002 & set #color (palette 1)+    c0 = GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) [start, end]+    c1 = GlyphChart (controlStyle & set #glyphShape CircleGlyph) [control]+    bbox = RectChart bbs [quadBox p]+    bbs = defaultRectStyle & set #borderSize 0.002 & set #color (paletteO 0 0.05) & set #borderColor (grey 0.4 1)+    pathStyle = defaultPathStyle & set #color (paletteO 2 0.2) & set #borderColor transparent+    controlStyle = defaultGlyphStyle & set #glyphShape CircleGlyph+    lrows =+      second (: [])+        <$> [ ("Path Fill", PathChart pathStyle [StartP zero]),+              ("Path Chord", LineChart curveStyle [[zero]]),+              ("Path Endpoints", GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) [zero]),+              ("Path Control Point", GlyphChart (controlStyle & set #glyphShape CircleGlyph) [zero]),+              ("Bounding Box", RectChart (bbs & set #borderSize 0.01) [one])+            ] --- | label example-labelExample :: Ex-labelExample =-  Ex-    defaultSvgOptions-    defaultHudOptions-    1-    (annotation <$> label)-    (xys <$> label)+-- | cubic example+--+-- ![cubic example](other/cubic.svg)+cubicExample :: ChartOptions+cubicExample =+  mempty+    & set #chartTree (named "cubic" [path', curve, c0, c1, bbox])+    & set #hudOptions mempty+    & set (#markupOptions % #chartAspect) (FixedAspect 1.5)+    & set (#hudOptions % #legends) [Priority 10 (defaultLegendOptions & set #legendCharts lrows & set (#textStyle % #size) 0.2 & set #legendSize 0.2 & set #vgap 0.3)]+    & set (#hudOptions % #titles) [Priority 11 (defaultTitleOptions "CubicPosition (Point 0 0) (Point 1 1) (Point 1 0) (Point 0 1)" & set (#style % #size) 0.03)]+  where+    p@(CubicPosition start end control1 control2) = CubicPosition (Point 0 0) (Point 1 1) (Point 1 0) (Point 0 1)+    ps = singletonCubic p+    path' = PathChart pathStyle ps+    curve = LineChart curveStyle [cubicBezier p . (/ 100.0) <$> [0 .. 100]]+    c0 = GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) [start, end]+    c1 = GlyphChart (controlStyle & set #glyphShape CircleGlyph) [control1, control2]+    bbox = RectChart bbs [cubicBox p]+    bbs = defaultRectStyle & set #borderSize 0.002 & set #color (paletteO 0 0.05) & set #borderColor (grey 0.4 1)+    pathStyle = defaultPathStyle & set #color (paletteO 3 0.2) & set #borderColor transparent+    controlStyle = defaultGlyphStyle+    curveStyle = defaultLineStyle & set #size 0.002 & set #color (palette 7)+    lrows =+      second (: [])+        <$> [ ("Path Fill", PathChart pathStyle [StartP zero]),+              ("Path Chord", LineChart curveStyle [[zero]]),+              ("Path Endpoints", GlyphChart (defaultGlyphStyle & set #glyphShape SquareGlyph) [zero]),+              ("Path Control Point", GlyphChart (controlStyle & set #glyphShape CircleGlyph) [zero]),+              ("Bounding Box", RectChart (bbs & set #borderSize 0.01) [one])+            ] -placedLabel :: (Real a) => Point a -> a -> Text -> Chart a-placedLabel p d t =-  Chart (TextA (defaultTextStyle & #rotation ?~ realToFrac d) [t]) [PointXY p]+-- | The common way to create a surface chart (or contour chart or heat map) is usually a grid over a function, a process reified in 'surfacef'.+--+-- This is also an example of 'mix' and 'mixes'. In this example, colors with the same lightness have been chosen in the gradient and the result should appear a fairly uniform lightness across the surface.+--+-- ![surface example](other/surface.svg)+surfaceExample :: ChartOptions+surfaceExample = mempty & set #chartTree cs' & set #markupOptions (defaultMarkupOptions & set (#cssOptions % #shapeRendering) UseCssCrisp)+  where+    grain = Point 20 20+    r = one+    f = fst . bimap ((-1.0) *) (fmap ((-1.0) *)) . rosenbrock 1 10+    evenColors = trimColour . over lightness' (const 0.55) . palette <$> [0 .. 5]+    so = defaultSurfaceOptions & set #soGrain grain & set #soRange r & set (#soStyle % #surfaceColors) evenColors+    (cs, rangef) = surfacef f so+    slo = defaultSurfaceLegendOptions & set (#sloSurfaceStyle % #surfaceColors) evenColors & set #sloDataRange rangef+    cs' = addSurfaceLegend slo (unnamed cs) -label :: [Chart Double]-label =-  [placedLabel (Point (1.0 :: Double) 1.0) (45.0 :: Double) "text at (1,1) rotated by 45 degrees"]+-- | arrow example+--+-- Which happens to be the gradient of the surface example.+--+-- ![arrow example](other/arrow.svg)+arrowExample :: ChartOptions+arrowExample =+  mempty+    & set #hudOptions (defaultHudOptions & set (#axes % each % #item % #ticks % #lineTick) Nothing)+    & set #chartTree (named "arrow" ((\p -> gchart (tail' . f $ p) (angle . f $ p) p) <$> ps))+    & set (#markupOptions % #cssOptions % #preferColorScheme) PreferHud+    & set+      (#markupOptions % #cssOptions % #cssExtra)+      ("{.arrow g {fill: " <> showRGBA dark <> "; stroke: " <> showRGBA dark <> ";}} @media (prefers-color-scheme:dark) {.arrow g {fill: " <> showRGBA light <> "; stroke: " <> showRGBA light <> ";}}")+  where+    f = snd . bimap ((-1.0) *) (fmap ((-1.0) *)) . rosenbrock 1 10+    ps = grid MidPos (one :: Rect Double) (Point 10 10 :: Point Int) :: [Point Double]+    arrow = PathGlyph "M -1 0 L 1 0 M 1 0 L 0.4 0.3 M 1 0 L 0.4 -0.3"+    gs s r' =+      defaultGlyphStyle+        & set #borderSize 0.05+        & set #size s+        & set #borderColor dark+        & set #rotation (Just r')+        & set #glyphShape arrow+    gchart s r' p = GlyphChart (gs s r') [p] --- | legend test-legendTest :: HudOptions-legendTest =-  defaultHudOptions-    & #hudLegend-    .~ Just-      ( defaultLegendOptions-          & #lscale .~ 0.3-          & #lplace .~ PlaceAbsolute (Point 0.0 0.0)-          & #lsize .~ 0.12-          & #ltext . #size .~ 0.16,-        l1+    tail' :: Point Double -> Double+    tail' = max 0.05 . min 0.02 . (* 0.01) . (/ avmag) . magnitude++    avmag = sum (magnitude . f <$> ps) / fromIntegral (length ps)++-- | function for testing+--+-- > f(x,y) = (a-x)^2 + b * (y - x^2)^2+-- >        = a^2 - 2ax + x^2 + b * y^2 - b * 2 * y * x^2 + b * x ^ 4+-- > f'x = -2a + 2 * x - b * 4 * y * x + 4 * b * x ^ 3+-- > f'y = 2 * b * y - 2 * b * x^2+-- > f a b (Point x y) = (a^2 - 2ax + x^2 + b * y^2 - b * 2 * y * x^2 + b * x^4, Point (-2a + 2 * x - b * 4 * y * x + 4 * b * x ^ 3), 2 * b * y - 2 * b * x^2)+rosenbrock :: Double -> Double -> Point Double -> (Double, Point Double)+rosenbrock a b (Point x y) = (a ** 2 - 2 * a * x + x ** 2 + b * y ** 2 - b * 2 * y * x ** 2 + b * x ** 4, Point ((-2) * a + 2 * x - b * 4 * y * x + 4 * b * x ** 3) (2 * b * y - 2 * b * x ** 2))++-- | date example+--+-- A hud that has date as the x-axis, and time as the y-axis. See 'placedTimeLabelContinuous'.+--+-- ![date example](other/date.svg)+dateExample :: ChartOptions+dateExample =+  mempty+    & set #chartTree (blank (Rect 0 1 0 1))+    & set (#markupOptions % #chartAspect) (FixedAspect 1.5)+    & over (#hudOptions % #frames) (<> [Priority 100 (defaultFrameOptions & set #buffer 0.05)])+    & set (#hudOptions % #axes) [Priority 5 (defaultYAxisOptions & set (#ticks % #tick) (TickPlaced tsTime)), Priority 6 (defaultXAxisOptions & set (#ticks % #tick) (TickPlaced tsDate))]+  where+    tsTime = placedTimeLabelContinuous PosIncludeBoundaries Nothing 12 (Range (UTCTime (fromGregorian 2021 12 6) (toDiffTime 0)) (UTCTime (fromGregorian 2021 12 7) (toDiffTime 0)))+    tsDate = placedTimeLabelContinuous PosIncludeBoundaries (Just (Text.pack "%d %b")) 2 (Range (UTCTime (fromGregorian 2021 12 6) (toDiffTime 0)) (UTCTime (fromGregorian 2022 3 13) (toDiffTime 0)))++-- | gradient example+--+-- Mixing Colours using the <https://bottosson.github.io/posts/oklab/ oklch> color model.+--+-- ![gradient example](other/gradient.svg)+gradientExample :: ChartOptions+gradientExample = gradient (Just (orig / 360)) 100 6 100 c0 c1+  where+    ok = LCHA 0.5 0.12 127 1+    c0 = ok & set (lch' % hLCH') 0.001+    c1 = ok & set (lch' % hLCH') 360+    orig = view (lch' % hLCH') ok++gradientChart_ :: Int -> LCHA -> LCHA -> [Chart]+gradientChart_ grain c0 c1 =+  (\(r, c) -> RectChart (defaultRectStyle & set #color c & set #borderSize 0) [r])+    . (\x -> (Rect x (x + d) 0 1, view lcha2colour' (mixLCHA x c0 c1)))+    <$> grid LowerPos (Range 0 1) grain+  where+    d = 1 / fromIntegral grain++gradient :: Maybe Double -> Double -> Double -> Int -> LCHA -> LCHA -> ChartOptions+gradient marker h fa grain ok0 ok1 =+  mempty+    & set (#markupOptions % #markupHeight) (Just h)+    & set (#markupOptions % #cssOptions % #shapeRendering) UseCssCrisp+    & set (#markupOptions % #chartAspect) (FixedAspect fa)+    & set+      #hudOptions+      ( mempty+          & set #frames [Priority 1 (FrameOptions (Just (border 0.004 white)) CanvasStyleSection 0.1)]       )+    & set #chartTree (named "gradient" (gradientChart_ grain ok0 ok1) <> strip)   where-    l1 =-      [ (GlyphA defaultGlyphStyle, "glyph"),-        (RectA defaultRectStyle, "rect"),-        (TextA (defaultTextStyle & #anchor .~ AnchorStart) ["content"], "text"),-        (LineA defaultLineStyle, "line"),-        (GlyphA defaultGlyphStyle, "abcdefghijklmnopqrst"),-        (BlankA, "blank")-      ]+    strip = case marker of+      Nothing -> mempty+      Just marker' ->+        named+          "border"+          [borderStrip 0.02 light (Rect (marker' - 0.02) (marker' + 0.02) (-0.1) 1.1)] --- | main example-mainExample :: Ex-mainExample =-  makeExample-    defaultHudOptions-    [Chart (GlyphA defaultGlyphStyle) (PointXY <$> gridP sin (Range 0 (2 * pi)) 30)]+borderStrip :: Double -> Colour -> Rect Double -> Chart+borderStrip w c r = RectChart (defaultRectStyle & set #color transparent & set #borderSize w & set #borderColor c) [r] +-- | Color wheel displaying palette choices+--+-- ![wheel example](other/wheel.svg)+wheelExample :: ChartOptions+wheelExample = dotMap 0.01 50 0.5 0.5 (palette <$> [0 .. 7])++-- | The dotMap+--+-- > dotMap 0.01 20 0.8 0.3+dotMap :: Double -> Int -> Double -> Double -> [Colour] -> ChartOptions+dotMap s grain l maxchroma cs =+  mempty+    & set #hudOptions defaultHudOptions+    & set #chartTree (named "dots" (dot_ <$> cs) <> named "wheel" ((\(p, c) -> GlyphChart (defaultGlyphStyle & set #size s & set #color c & set #borderSize 0 & set #glyphShape CircleGlyph) [p]) <$> filter (validColour . snd) (wheelPoints grain l maxchroma)))++dot_ :: Colour -> Chart+dot_ x = (\(p, c) -> GlyphChart (defaultGlyphStyle & set #size 0.08 & set #color c & set #borderColor (Colour 0.5 0.5 0.5 1) & set #glyphShape CircleGlyph) [p]) (colour2Point x, x)+  where+    colour2Point c = review lcha2colour' c & (\(LCHA _ ch h _) -> uncurry Point (review xy2ch' (ch, h)))++wheelPoints :: Int -> Double -> Double -> [(Point Double, Colour)]+wheelPoints grain l maxchroma =+  (\(Point c h) -> (uncurry Point $ view (re xy2ch') (c, h), view lcha2colour' (LCHA l c h 1)))+    <$> grid LowerPos (Rect 0 maxchroma 0 360) (Point grain grain)++-- | Adding reference points and bounding boxes to visualize chart alignment for use in debugging charts.+--+-- ![debug example](other/debug.svg)+debugExample :: ChartOptions -> ChartOptions+debugExample cs =+  mempty+    & set #markupOptions (view #markupOptions cs)+    & set (#markupOptions % #chartAspect) asp+    & set #chartTree (e1 <> e2 <> e3)+  where+    asp = view (#markupOptions % #chartAspect) cs+    e1 = view #chartTree (forgetHud cs)+    e2 = glyphize (defaultGlyphStyle & set #size 0.01 & set #glyphShape CircleGlyph) e1+    e3 = rectangularize (defaultRectStyle & set #borderColor dark & set #borderSize 0.001 & set (#color % opac') 0.05) e1++-- | A merge of two rect charts with different data ranges.+--+-- ![compound example](other/compound.svg)+compoundExample :: ChartOptions+compoundExample = compoundMerge [c1, c2]+  where+    ho1 = (mempty :: HudOptions) & set #titles [Priority 3 (defaultTitleOptions "chart1")] & set #axes [Priority 2 defaultXAxisOptions, Priority 2 defaultYAxisOptions] & colourHudOptions (const (palette 0))+    c1 = (mempty :: ChartOptions) & set #hudOptions ho1 & set #chartTree (named "c1" [Chart defaultRectStyle (RectData [fmap (2 *) one])])+    ho2 = (mempty :: HudOptions) & set #titles [Priority 3.1 (defaultTitleOptions "chart2")] & set #axes [Priority 2 (defaultXAxisOptions & set #place PlaceTop), Priority 2 (defaultYAxisOptions & set #place PlaceRight)] & colourHudOptions (const (palette 3))+    c2 = (mempty :: ChartOptions) & set #hudOptions ho2 & set #chartTree (named "c2" [Chart (blob (set opac' 0.3 $ palette 3)) (RectData [fmap (* 0.8) one]), BlankChart defaultStyle [one]])++-- | Usage of stack.+--+-- ![stack example](other/stack.svg)+stackExample :: ChartOptions+stackExample = mempty & set #chartTree (stack 5 AlignLeft AlignMid 0.1 (replicate 25 (asChartTree lineExample)))++-- | All the examples and the associated filepaths+pathChartOptions :: [(FilePath, ChartOptions)]+pathChartOptions =+  [ ("other/unit.svg", unitExample),+    ("other/rect.svg", rectExample),+    ("other/text.svg", textExample),+    ("other/glyphs.svg", glyphsExample),+    ("other/line.svg", lineExample),+    ("other/hudoptions.svg", hudOptionsExample),+    ("other/bar.svg", barExample),+    ("other/sbar.svg", sbarExample),+    ("other/surface.svg", surfaceExample),+    ("other/wave.svg", waveExample),+    ("other/venn.svg", vennExample),+    ("other/path.svg", pathExample),+    ("other/arcflags.svg", arcFlagsExample),+    ("other/ellipse.svg", ellipseExample (FixedAspect 1.5)),+    ("other/ellipse2.svg", ellipseExample (FixedAspect 2)),+    ("other/quad.svg", quadExample),+    ("other/cubic.svg", cubicExample),+    ("other/arrow.svg", arrowExample),+    ("other/date.svg", dateExample),+    ("other/gradient.svg", gradientExample),+    ("other/wheel.svg", wheelExample),+    ("other/debug.svg", debugExample lineExample),+    ("other/priorityv1.svg", priorityv1Example),+    ("other/priorityv2.svg", priorityv2Example),+    ("other/compound.svg", compoundExample),+    ("other/stack.svg", stackExample)+  ]++-- | Run this to refresh example SVG's. writeAllExamples :: IO () writeAllExamples = do-  -- haddocks-  let ls' =-        fmap (PointXY . uncurry Point)-          <$> [ [(0.0, 1.0), (1.0, 1.0), (2.0, 5.0 :: Double)],-                [(0.0, 0.0), (3.0, 3.0)],-                [(0.5, 4.0), (0.5, 0)]-              ]-  let anns =-        LineA-          <$> [ defaultLineStyle & #color .~ (palette1 !! 0) & #width .~ 0.015,-                defaultLineStyle & #color .~ (palette1 !! 1) & #width .~ 0.03,-                defaultLineStyle & #color .~ (palette1 !! 5) & #width .~ 0.01-              ]-  let lines' = zipWith Chart anns ls'-  writeCharts "other/lines.svg" lines'-  writeHudOptionsChart "other/linehud.svg" defaultSvgOptions defaultHudOptions [] lines'-  writeCharts "other/unit.svg" [Chart (RectA defaultRectStyle) [one]]-  let t = zipWith (\x y -> Chart (TextA (defaultTextStyle & (#size .~ (0.05 :: Double))) [x]) [PointXY y]) (fmap Text.singleton ['a' .. 'y']) [Point (sin (x * 0.1)) x | x <- [0 .. 25]]-  writeCharts "other/text.svg" t-  writeCharts "other/glyph.svg" glyphs-  writeHudOptionsChart "other/pixel.svg" defaultSvgOptions defaultHudOptions (snd pixelEx) (fst pixelEx)-  writeChartsWith "other/svgoptions.svg" (defaultSvgOptions & #svgAspect .~ ManualAspect 0.7) lines'-  writeHudOptionsChart "other/hud.svg" defaultSvgOptions defaultHudOptions [] []-  -- basics-  writeCharts "other/mempty.svg" []-  writeChartExample "other/bar.svg" barExample-  writeCharts "other/boundText.svg" boundTextBug-  writeHudOptionsChart "other/legend.svg" defaultSvgOptions legendTest [] []-  putStrLn (" 👍" :: Text)+  mapM_ (uncurry writeChartOptions) pathChartOptions+  putStrLn "ok"++-- | Version of charts with a dark-friendly hud+writeAllExamplesDark :: IO ()+writeAllExamplesDark = do+  mapM_+    ( uncurry writeChartOptions+        . bimap+          ((<> "d.svg") . reverse . drop 4 . reverse)+          ( \x ->+              x+                & over #hudOptions (colourHudOptions (rgb light))+                & set (#markupOptions % #cssOptions % #preferColorScheme) PreferDark+          )+    )+    pathChartOptions+  putStrLn "dark version, ok"
+ src/Chart/Hud.hs view
@@ -0,0 +1,1095 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RebindableSyntax #-}++-- | A hud stands for <https://en.wikipedia.org/wiki/Head-up_display head-up display>, and is a collective noun used to name chart elements that assist in data interpretation or otherwise annotate and decorate data.+--+-- This includes axes, titles, borders, frames, background canvaii, tick marks and tick value labels.+module Chart.Hud+  ( -- * Hud+    Hud (..),+    Priority (..),+    ChartBox,+    DataBox,+    HudChart (..),+    HudChartSection (..),+    hudChartBox',++    -- * HudOptions+    HudOptions (..),+    defaultHudOptions,+    colourHudOptions,++    -- * Hud Processing+    toHuds,+    appendHud,+    makeHuds,+    fromHudChart,+    runHudWith,+    projectChartTreeWith,+    projectWithAspect,+    addHud,+    initialCanvas,+    finalCanvas,++    -- * Hud options+    AxisOptions (..),+    defaultXAxisOptions,+    defaultYAxisOptions,+    FrameOptions (..),+    defaultFrameOptions,+    Place (..),+    flipPlace,+    AxisBar (..),+    defaultAxisBar,+    TitleOptions (..),+    defaultTitleOptions,+    Ticks (..),+    TickStyle (..),+    defaultGlyphTickStyleX,+    defaultGlyphTickStyleY,+    defaultTextTick,+    defaultLineTick,+    defaultXTicks,+    defaultYTicks,+    Tick (..),+    defaultTick,+    TickExtend (..),+    formatN',+    numTicks',+    tickExtend',+    adjustTicks,+    Adjustments (..),+    defaultAdjustments,+    computeRangeTick,+    LegendOptions (..),+    defaultLegendOptions,++    -- * Convert Hud elements to charts+    axisHud,+    titleHud,+    frameHud,+    legendHud,+    legendChart,+    legendEntry,+    legendFrame,+    freezeAxes,+    freezeTicks,+  )+where++import Chart.Data+import Chart.Primitive+import Chart.Style+import Data.Bifunctor+import Data.Bool+import Data.Colour+import Data.Data+import Data.Foldable hiding (sum)+import Data.FormatN+import Data.List qualified as List+import Data.Maybe+import Data.Path+import Data.Text (Text)+import Data.Text qualified as Text+import Data.Tuple+import GHC.Generics hiding (to)+import NumHask.Prelude hiding (to)+import NumHask.Space+import Optics.Core++-- $setup+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core++-- * Hud++-- | The priority of a Hud element or transformation, lower value means higher priority.+--+-- Lower priority (higher values) huds will tend to be placed on the outside of a chart.+--+-- Hud elements are rendered in order from high to low priority and the positioning of hud elements can depend on the positioning of elements that have already been included. Equal priority values will be placed in the same process step.+--+-- The first example below, based in 'Chart.Examples.lineExample' but with the legend placed on the right and coloured frames to help accentuate effects, includes (in order of priority):+--+-- - an inner frame, representing the core data area of the chart (Priority 1)+--+-- - the axes (5)+--+-- - the titles (Priority 12)+--+-- - the legend (Priority 50)+--+-- - an outer frame which is transparent and used to pad out the chart (Priority 100).+--+-- > priorityv1Example = lineExample & (#hudOptions % #frames) .~ [(1, FrameOptions (Just defaultRectStyle) 0), (100, FrameOptions (Just (defaultRectStyle & #color .~ (palette1 4 & opac' .~ 0.05) & #borderColor .~ palette1 4)) 0.1)] & over (#hudOptions % #legends) (fmap (first (const (Priority 50)))) & #hudOptions % #legends %~ fmap (second (set #place PlaceRight))+--+-- ![priorityv1 example](other/priorityv1.svg)+--+-- The second variation below drops the title priorities to below the legend:+--+-- > priorityv2Example = priorityv1Example & #hudOptions % #titles %~ fmap (first (const (Priority 51)))+--+-- ![priorityv2 example](other/priorityv2.svg)+data Priority a+  = Priority {priority :: Double, item :: a}+  deriving (Eq, Ord, Show, Generic, Data, Functor)++-- | Heads-up display additions to charts+newtype Hud = Hud {phud :: Priority (HudChart -> ChartTree)} deriving (Generic)++-- | Named pair type to track the split of Chart elements into Hud and Canvas+--+-- - charts: charts that form the canvas or data elements of the chart; the rectangular dimension which is considered to be the data representation space.+--+-- - hud: charts that form the Hud.+data HudChart = HudChart+  { chartSection :: ChartTree,+    hudSection :: ChartTree+  }+  deriving (Eq, Show, Generic, Data)++-- | A type for Rect to represent the bounding box of a chart.+type ChartBox = Rect Double++-- | A type for Rect to represent the bounding box of the data.+type DataBox = Rect Double++-- | A section of a 'HudChart'+data HudChartSection+  = -- | The canvas without any style allowances+    CanvasSection+  | -- | The canvas portion including style boundaries.+    CanvasStyleSection+  | -- | The hud and canvas sections, not including style.+    HudSection+  | -- | The hud and canvas sections, including style+    HudStyleSection+  deriving (Eq, Show, Generic, Data)++-- | The 'Rect' of a particular 'HudChartSection' of a 'HudChart'+hudChartBox' :: HudChartSection -> Getter HudChart (Maybe (Rect Double))+hudChartBox' CanvasSection = to (boxes . foldOf (#chartSection % charts'))+hudChartBox' CanvasStyleSection = to (styleBoxes . foldOf (#chartSection % charts'))+hudChartBox' HudSection = to (boxes . (\x -> foldOf (#chartSection % charts') x <> foldOf (#hudSection % charts') x))+hudChartBox' HudStyleSection = to (styleBoxes . (\x -> foldOf (#chartSection % charts') x <> foldOf (#hudSection % charts') x))++-- | Append a 'ChartTree' to the hud section of a 'HudChart'.+appendHud :: ChartTree -> HudChart -> HudChart+appendHud cs x =+  x & over #hudSection (<> cs)++-- | Add huds to the hud section of a 'HudChart', given a list of hud makers.+makeHuds :: [HudChart -> ChartTree] -> HudChart -> HudChart+makeHuds hs hc = over #hudSection (<> mconcat (fmap ($ hc) hs)) hc++-- | Convert a 'HudChart' to a 'ChartTree' labelling the hud and chart sections.+fromHudChart :: HudChart -> ChartTree+fromHudChart hc = group (Just "chart") [view #chartSection hc] <> group (Just "hud") [view #hudSection hc]++-- | Combine huds and charts to form a new Chart using the supplied initial canvas and data dimensions. Note that chart data is transformed by this computation (a linear type might be useful here).+runHudWith ::+  -- | initial canvas+  ChartBox ->+  -- | huds to add+  [Hud] ->+  -- | underlying chart+  ChartTree ->+  -- | integrated chart tree+  ChartTree+runHudWith cb hs cs =+  hs+    & List.sortOn (view (#phud % #priority))+    & List.groupBy (\a b -> view (#phud % #priority) a == view (#phud % #priority) b)+    & fmap (fmap (view (#phud % #item)))+    & foldl' (flip makeHuds) hc0+    & fromHudChart+  where+    hc0 =+      HudChart+        (cs & set styleBox' (Just cb))+        mempty++-- | Decorate a ChartTree with HudOptions+addHud :: ChartAspect -> HudOptions -> ChartTree -> ChartTree+addHud asp ho cs =+  runHudWith+    (initialCanvas asp (Just cs'))+    hs+    cs'+  where+    db = view safeBox' cs+    (mdb, hs) = toHuds ho db+    cs' = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb++-- | Compute a Rect representing the initial chart canvas from a 'ChartAspect' and maybe a 'ChartTree', before the addition of style and hud elements.+--+-- >>> initialCanvas (FixedAspect 1.5) (Just $ unnamed [RectChart defaultRectStyle [one]])+-- Rect (-0.75) 0.75 (-0.5) 0.5+initialCanvas :: ChartAspect -> Maybe ChartTree -> Rect Double+initialCanvas (FixedAspect a) _ = aspect a+initialCanvas (CanvasAspect a) _ = aspect a+initialCanvas ChartAspect cs = maybe one (aspect . ratio . view safeStyleBox') cs+initialCanvas UnscaledAspect cs = maybe one (view safeStyleBox') cs++-- | Compute a Rect representing the final chart canvas from a 'ChartAspect' and maybe a 'ChartTree'. The difference between 'initialCanvas' and finalCanvas is using the actual chart canvas for CanvasAspect.+--+-- >>> finalCanvas (CanvasAspect 1.5) (Just $ unnamed [RectChart defaultRectStyle [one]])+-- Rect (-0.5) 0.5 (-0.5) 0.5+finalCanvas :: ChartAspect -> Maybe ChartTree -> Rect Double+finalCanvas (FixedAspect a) _ = aspect a+finalCanvas (CanvasAspect a) Nothing = aspect a+finalCanvas (CanvasAspect _) cs = finalCanvas ChartAspect cs+finalCanvas ChartAspect cs = maybe one (aspect . ratio . view safeStyleBox') cs+finalCanvas UnscaledAspect cs = maybe one (view safeStyleBox') cs++-- | Add 'HudOptions' to a 'ChartTree' and scale to the 'ChartAspect'.+projectChartTreeWith :: ChartAspect -> HudOptions -> ChartTree -> ChartTree+projectChartTreeWith asp ho ct = ctFinal+  where+    csAndHud = addHud asp ho ct+    viewbox = finalCanvas asp (Just csAndHud)+    ctFinal = set styleBox' (Just viewbox) csAndHud++-- | Scale a 'ChartTree' with a specific 'ChartAspect'.+projectWithAspect :: ChartAspect -> ChartTree -> ChartTree+projectWithAspect asp ct = set styleBox' (Just (finalCanvas asp (Just ct))) ct++-- | Typical, configurable hud elements. Anything else can be hand-coded as a 'Hud'.+--+-- ![hud example](other/hudoptions.svg)+data HudOptions = HudOptions+  { axes :: [Priority AxisOptions],+    frames :: [Priority FrameOptions],+    legends :: [Priority LegendOptions],+    titles :: [Priority TitleOptions]+  }+  deriving (Eq, Show, Generic, Data)++instance Semigroup HudOptions where+  (<>) (HudOptions a c l t) (HudOptions a' c' l' t') =+    HudOptions (a <> a') (c <> c') (l <> l') (t <> t')++instance Monoid HudOptions where+  mempty = HudOptions [] [] [] []++-- | The official hud options.+--+-- - A fixed chart aspect (width:height) of 1.5+--+-- - An x axis at the bottom and y axis at the left.+--+-- - The default tick style for each axis of an axis bar, tick glyphs (or marks), automated tick labels, and tick (or grid) lines.+--+-- - A high 'Priority' (and thus inner), low-opacity frame, representing the data area of the chart.+--+-- - A low priority (outer), transparent frame, providing some padding around the chart.+defaultHudOptions :: HudOptions+defaultHudOptions =+  HudOptions+    [ Priority 5 defaultXAxisOptions,+      Priority 5 defaultYAxisOptions+    ]+    [ Priority 1 (defaultFrameOptions & set #anchorTo CanvasStyleSection),+      Priority 20 (defaultFrameOptions & set #buffer 0.04 & set #frame (Just clear))+    ]+    []+    []++-- | alter a colour with a function+colourHudOptions :: (Colour -> Colour) -> HudOptions -> HudOptions+colourHudOptions f o =+  o+    & over (#frames % each % #item) fFrame+    & over (#titles % each % #item % #style % #color) f+    & over (#axes % each % #item) fAxis+    & over (#legends % each % #item) fLegend+  where+    fAxis :: AxisOptions -> AxisOptions+    fAxis a =+      a+        & over (#axisBar %? #style % #color) f+        & over (#ticks % #glyphTick %? #style % #color) f+        & over (#ticks % #glyphTick %? #style % #borderColor) f+        & over (#ticks % #textTick %? #style % #color) f+        & over+          (#ticks % #lineTick %? #style % #color)+          f+    fLegend :: LegendOptions -> LegendOptions+    fLegend a =+      a+        & over #textStyle (over #color f)+        & over #frame (fmap (over #color f . over #borderColor f))+    fFrame :: FrameOptions -> FrameOptions+    fFrame a =+      a+        & over (#frame % _Just) (over #color f . over #borderColor f)++-- | axis options+data AxisOptions = AxisOptions+  { axisBar :: Maybe AxisBar,+    adjustments :: Maybe Adjustments,+    ticks :: Ticks,+    place :: Place+  }+  deriving (Eq, Show, Generic, Data)++-- | The official X-axis+defaultXAxisOptions :: AxisOptions+defaultXAxisOptions = AxisOptions (Just defaultAxisBar) (Just defaultAdjustments) defaultXTicks PlaceBottom++-- | The official Y-axis+defaultYAxisOptions :: AxisOptions+defaultYAxisOptions = AxisOptions (Just defaultAxisBar) (Just defaultAdjustments) defaultYTicks PlaceLeft++-- | The bar on an axis representing the x or y plane.+--+-- >>> defaultAxisBar+-- AxisBar {style = Style {size = 6.0e-2, borderSize = 0.0, color = Colour 0.05 0.05 0.05 0.40, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, size = 4.0e-3, buffer = 1.0e-2, overhang = 2.0e-3, anchorTo = CanvasSection}+data AxisBar = AxisBar+  { style :: Style,+    size :: Double,+    buffer :: Double,+    -- | extension over the edges of the axis range+    overhang :: Double,+    -- | Which hud-chart section to anchor to+    anchorTo :: HudChartSection+  }+  deriving (Eq, Show, Generic, Data)++-- | The official axis bar+defaultAxisBar :: AxisBar+defaultAxisBar = AxisBar (defaultRectStyle & set #borderSize 0 & set #borderColor transparent & set #color (set opac' 0.4 dark)) 0.004 0.01 0.002 CanvasSection++-- | Options for titles.  Defaults to center aligned, and placed at Top of the hud+--+-- >>> defaultTitleOptions "title"+-- TitleOptions {text = "title", style = Style {size = 0.12, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, place = PlaceTop, anchoring = 0.0, buffer = 4.0e-2}+data TitleOptions = TitleOptions+  { text :: Text,+    style :: Style,+    place :: Place,+    anchoring :: Double,+    buffer :: Double+  }+  deriving (Eq, Show, Generic, Data)++-- | The official hud title+defaultTitleOptions :: Text -> TitleOptions+defaultTitleOptions txt =+  TitleOptions+    txt+    ( defaultTextStyle+        & set #size 0.12+    )+    PlaceTop+    0+    0.04++-- | axis tick markings+--+-- >>> defaultXTicks+-- Ticks {tick = TickRound (FormatN {fstyle = FSCommaPrec, sigFigs = Just 1, maxDistinguishIterations = 4, addLPad = True, cutRightZeros = True}) 5 TickExtend, glyphTick = Just (TickStyle {style = Style {size = 3.0e-2, borderSize = 4.0e-3, color = Colour 0.05 0.05 0.05 0.40, borderColor = Colour 0.05 0.05 0.05 0.40, scaleP = ScalePY, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = VLineGlyph}, anchorTo = CanvasSection, buffer = 1.0e-2}), textTick = Just (TickStyle {style = Style {size = 4.0e-2, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, anchorTo = HudStyleSection, buffer = 1.0e-2}), lineTick = Just (TickStyle {style = Style {size = 5.0e-3, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 0.05, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, anchorTo = CanvasSection, buffer = 0.0})}+data Ticks = Ticks+  { tick :: Tick,+    glyphTick :: Maybe TickStyle,+    textTick :: Maybe TickStyle,+    lineTick :: Maybe TickStyle+  }+  deriving (Eq, Show, Generic, Data)++-- | Common elements across all tick types.+data TickStyle = TickStyle+  { style :: Style,+    anchorTo :: HudChartSection,+    buffer :: Double+  }+  deriving (Eq, Show, Generic, Data)++-- | The official glyph tick+defaultGlyphTickStyleX :: TickStyle+defaultGlyphTickStyleX =+  TickStyle+    ( defaultGlyphStyle+        & set #borderSize 0.004+        & set #glyphShape VLineGlyph+        & set #color (set opac' 0.4 dark)+        & set #borderColor (set opac' 0.4 dark)+        & set #scaleP ScalePY+    )+    CanvasSection+    0.01++-- | The official glyph tick+defaultGlyphTickStyleY :: TickStyle+defaultGlyphTickStyleY =+  TickStyle+    ( defaultGlyphStyle+        & set #borderSize 0.004+        & set #glyphShape HLineGlyph+        & set #color (set opac' 0.4 dark)+        & set #borderColor (set opac' 0.4 dark)+        & set #scaleP ScalePX+    )+    CanvasSection+    0.01++-- | The official text tick+defaultTextTick :: TickStyle+defaultTextTick =+  TickStyle+    (defaultTextStyle & set #size 0.04)+    HudStyleSection+    0.01++-- | The official line tick+defaultLineTick :: TickStyle+defaultLineTick =+  TickStyle+    ( defaultLineStyle+        & set #size 5.0e-3+        & set (#color % opac') 0.05+    )+    CanvasSection+    0++-- | The official X-axis tick+defaultXTicks :: Ticks+defaultXTicks =+  Ticks+    defaultTick+    (Just defaultGlyphTickStyleX)+    (Just defaultTextTick)+    (Just defaultLineTick)++-- | The official Y-axis tick+defaultYTicks :: Ticks+defaultYTicks =+  Ticks+    defaultTick+    (Just defaultGlyphTickStyleY)+    (Just defaultTextTick)+    (Just defaultLineTick)++-- | Style of tick marks on an axis.+data Tick+  = -- | no ticks on axis+    TickNone+  | -- | specific labels (equidistant placement)+    TickLabels [Text]+  | -- | sensibly rounded ticks, a guide to how many, and whether to extend beyond the data bounding box+    TickRound FormatN Int TickExtend+  | -- | exactly n equally spaced ticks+    TickExact FormatN Int+  | -- | specific labels and placement+    TickPlaced [(Double, Text)]+  deriving (Eq, Show, Generic, Data)++-- | Lens between a FormatN and a Tick.+formatN' :: Lens' Tick (Maybe FormatN)+formatN' =+  lens formatN_ reformatN_++formatN_ :: Tick -> Maybe FormatN+formatN_ = \case+  TickRound f _ _ -> Just f+  TickExact f _ -> Just f+  _ -> Nothing++reformatN_ :: Tick -> Maybe FormatN -> Tick+reformatN_ ts Nothing = ts+reformatN_ (TickRound _ n e) (Just f) = TickRound f n e+reformatN_ (TickExact _ n) (Just f) = TickExact f n+reformatN_ ts _ = ts++-- | Lens between number of ticks and a Tick.+--+-- Only for TickRound and TickExact+numTicks' :: Lens' Tick (Maybe Int)+numTicks' =+  lens numTicks_ renumTicks_++numTicks_ :: Tick -> Maybe Int+numTicks_ = \case+  TickRound _ n _ -> Just n+  TickExact _ n -> Just n+  _ -> Nothing++renumTicks_ :: Tick -> Maybe Int -> Tick+renumTicks_ ts Nothing = ts+renumTicks_ (TickRound f _ e) (Just n) = TickRound f n e+renumTicks_ (TickExact f _) (Just n) = TickExact f n+renumTicks_ ts _ = ts++-- | Lens between a FormatN and a Tick.+tickExtend' :: Lens' Tick (Maybe TickExtend)+tickExtend' =+  lens tickExtend_ tickReExtend_++tickExtend_ :: Tick -> Maybe TickExtend+tickExtend_ = \case+  TickRound _ _ e -> Just e+  _ -> Nothing++tickReExtend_ :: Tick -> Maybe TickExtend -> Tick+tickReExtend_ ts Nothing = ts+tickReExtend_ (TickRound f n _) (Just e) = TickRound f n e+tickReExtend_ ts _ = ts++-- | The official tick style+--+-- >>> defaultTick+-- TickRound (FormatN {fstyle = FSCommaPrec, sigFigs = Just 1, maxDistinguishIterations = 4, addLPad = True, cutRightZeros = True}) 5 TickExtend+defaultTick :: Tick+defaultTick = TickRound (FormatN FSCommaPrec (Just 1) 4 True True) 5 TickExtend++-- | Whether Ticks are allowed to extend the data range+data TickExtend = TickExtend | NoTickExtend deriving (Eq, Show, Generic, Data)++-- | options for prettifying axis decorations+--+-- >>> defaultAdjustments+-- Adjustments {maxXRatio = 8.0e-2, maxYRatio = 6.0e-2, angledRatio = 0.12, allowDiagonal = True}+data Adjustments = Adjustments+  { maxXRatio :: Double,+    maxYRatio :: Double,+    angledRatio :: Double,+    allowDiagonal :: Bool+  }+  deriving (Eq, Show, Generic, Data)++-- | The official hud adjustments.+defaultAdjustments :: Adjustments+defaultAdjustments = Adjustments 0.08 0.06 0.12 True++-- | Legend options+--+-- >>> defaultLegendOptions+-- LegendOptions {legendSize = 0.3, buffer = 0.1, vgap = 0.2, hgap = 0.1, textStyle = Style {size = 0.16, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, innerPad = 0.1, outerPad = 2.0e-2, frame = Just (Style {size = 6.0e-2, borderSize = 5.0e-3, color = Colour 0.05 0.05 0.05 0.00, borderColor = Colour 0.05 0.05 0.05 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}), place = PlaceRight, anchoring = 0.0, anchorTo = CanvasStyleSection, numStacks = 1, alignCharts = AlignRight, scaleChartsBy = 0.25, scaleP = ScalePX, legendCharts = []}+data LegendOptions = LegendOptions+  { legendSize :: Double,+    buffer :: Double,+    vgap :: Double,+    hgap :: Double,+    textStyle :: Style,+    innerPad :: Double,+    outerPad :: Double,+    frame :: Maybe Style,+    place :: Place,+    anchoring :: Double,+    anchorTo :: HudChartSection,+    numStacks :: Int,+    alignCharts :: Align,+    scaleChartsBy :: Double,+    scaleP :: ScaleP,+    legendCharts :: [(Text, [Chart])]+  }+  deriving (Eq, Show, Generic, Data)++-- | The official legend options+defaultLegendOptions :: LegendOptions+defaultLegendOptions =+  LegendOptions+    0.3+    0.1+    0.2+    0.1+    (defaultTextStyle & set #size 0.16)+    0.1+    0.02+    (Just (defaultRectStyle & set #borderSize 0.005 & set #borderColor (set opac' 1 dark) & set #color (set opac' 0 dark)))+    PlaceRight+    0+    CanvasStyleSection+    1+    AlignRight+    0.25+    ScalePX+    []++-- | Options for hud frames+--+-- >>> defaultFrameOptions+-- FrameOptions {frame = Just (Style {size = 6.0e-2, borderSize = 0.0, color = Colour 1.00 1.00 1.00 0.02, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}), anchorTo = HudStyleSection, buffer = 0.0}+data FrameOptions = FrameOptions+  { frame :: Maybe Style,+    anchorTo :: HudChartSection,+    buffer :: Double+  }+  deriving (Eq, Show, Generic, Data)++-- | The official hud frame+defaultFrameOptions :: FrameOptions+defaultFrameOptions = FrameOptions (Just (blob (grey 1 0.02))) HudStyleSection 0++-- * Huds++-- | Make Huds and potential data box extension; from a HudOption and an initial data box.+toHuds :: HudOptions -> DataBox -> (Maybe DataBox, [Hud])+toHuds o db =+  (mdb,) $+    fmap Hud $+      (as' & fmap (over #item (`axisHud` db')))+        <> (view #frames o & fmap (over #item frameHud))+        <> (view #legends o & fmap (over #item legendHud))+        <> (view #titles o & fmap (over #item titleHud))+  where+    (mdb, as') = freezeAxes db (view #axes o)+    db' = fromMaybe db mdb++-- | Freeze axes by freezing ticks, supplying a new 'DataBox' if the ticks extend the canvas.+freezeAxes :: DataBox -> [Priority AxisOptions] -> (Maybe DataBox, [Priority AxisOptions])+freezeAxes db0 as =+  foldl'+    ( \(dbm, as') ao ->+        let (dbm', ao') = freezeTicks (fromMaybe db0 dbm) (view #item ao)+         in (dbm' <|> dbm, as' <> [ao & set #item ao'])+    )+    (Nothing, [])+    as++-- | Convert ticks to TickPlaced, freezing the effect of a tick, supplying a new 'DataBox' if the ticks extend the canvas.+freezeTicks :: DataBox -> AxisOptions -> (Maybe DataBox, AxisOptions)+freezeTicks db a =+  bimap+    (fmap (\x -> placeRect (view #place a) x db))+    (\x -> a & set (#ticks % #tick) x)+    (placeTicks (placeRange (view #place a) db) (view (#ticks % #tick) a))++placeRect :: Place -> Range Double -> Rect Double -> Rect Double+placeRect pl' (Range a0 a1) (Rect x z y w) = case pl' of+  PlaceRight -> Rect x z a0 a1+  PlaceLeft -> Rect x z a0 a1+  _ -> Rect a0 a1 y w++placeRange :: Place -> ChartBox -> Range Double+placeRange pl (Rect x z y w) = case pl of+  PlaceRight -> Range y w+  PlaceLeft -> Range y w+  _ -> Range x z++placeTicks :: Range Double -> Tick -> (Maybe (Range Double), Tick)+placeTicks r t@TickRound {} = (rExtended, TickPlaced tPlaced)+  where+    (rExtended, tPlaced) = makePlacedTicks r t+placeTicks _ t = (Nothing, t)++-- | compute tick components given style, ranges and formatting+makePlacedTicks :: Range Double -> Tick -> (Maybe (Range Double), [(Double, Text)])+makePlacedTicks r s =+  case s of+    TickNone -> (Nothing, [])+    TickRound f n e ->+      ( bool (space1 ticks0) Nothing (e == NoTickExtend),+        zip ticks0 (formatNs f ticks0)+      )+      where+        ticks0 = gridSensible OuterPos (e == NoTickExtend) r n+    TickExact f n -> (Nothing, zip ticks0 (formatNs f ticks0))+      where+        ticks0 = grid OuterPos r n+    TickLabels ls ->+      ( Nothing,+        zip+          (project (Range 0 (fromIntegral $ length ls)) r . (\x -> x - 0.5) . fromIntegral <$> [1 .. length ls])+          ls+      )+    TickPlaced xs -> (Nothing, xs)++-- | compute data range of Tick given initial data range+computeRangeTick :: Range Double -> Tick -> Range Double+computeRangeTick r t = fromMaybe r (fst (makePlacedTicks r t))++-- | Create an axis.+axisHud :: AxisOptions -> DataBox -> HudChart -> ChartTree+axisHud a db hc = group (Just "axis") [b, t]+  where+    b = maybe mempty (\x -> axisBarHud (view #place a) x hc) (view #axisBar a)+    t = tickHud a db (appendHud b hc)++axisBarHud :: Place -> AxisBar -> HudChart -> ChartTree+axisBarHud pl b hc = maybe mempty (named "axisbar" . pure) c+  where+    canvasBox = view (hudChartBox' CanvasSection) hc+    anchoredBox = view (hudChartBox' (view #anchorTo b)) hc+    c = bar_ pl b <$> canvasBox <*> anchoredBox++bar_ :: Place -> AxisBar -> Rect Double -> Rect Double -> Chart+bar_ pl b (Rect x z y w) (Rect x' z' y' w') =+  Chart (view #style b) . RectData $+    case pl of+      PlaceTop ->+        [ Rect+            (x - view #overhang b)+            (z + view #overhang b)+            (w' + view #buffer b)+            (w' + view #buffer b + view #size b)+        ]+      PlaceBottom ->+        [ Rect+            (x - view #overhang b)+            (z + view #overhang b)+            (y' - view #size b - view #buffer b)+            (y' - view #buffer b)+        ]+      PlaceLeft ->+        [ Rect+            (x' - view #size b - view #buffer b)+            (x' - view #buffer b)+            (y - view #overhang b)+            (w + view #overhang b)+        ]+      PlaceRight ->+        [ Rect+            (z' + view #buffer b)+            (z' + view #buffer b + view #size b)+            (y - view #overhang b)+            (w + view #overhang b)+        ]+      PlaceAbsolute (Point x'' _) ->+        [ Rect+            (x'' + view #buffer b)+            (x'' + view #buffer b + view #size b)+            (y - view #overhang b)+            (w + view #overhang b)+        ]++-- * tick hud creation++tickHud :: AxisOptions -> DataBox -> HudChart -> ChartTree+tickHud ao db hc = maybe mempty ts (view (hudChartBox' HudStyleSection) hc)+  where+    ts b = applyTicks (view #place ao) (adjTick b) db hc+    adjTick b = maybe (view #ticks ao) (\x -> adjustTicks x b db (view #place ao) (view #ticks ao)) (view #adjustments ao)++-- | Create tick glyphs (marks), lines (grid) and text (labels)+applyTicks ::+  Place ->+  Ticks ->+  DataBox ->+  HudChart ->+  ChartTree+applyTicks pl t db hc = group (Just "ticks") [lt, gt, tt]+  where+    lt = maybe mempty (\x -> tickLine pl x (view #tick t) db hc) (view #lineTick t)+    gt = maybe mempty (\x -> tickGlyph pl x (view #tick t) db hc) (view #glyphTick t)+    tt = maybe mempty (\x -> tickText pl x (view #tick t) db (appendHud gt hc)) (view #textTick t)++-- | adjust Tick for sane font sizes etc+adjustTicks ::+  Adjustments ->+  ChartBox ->+  DataBox ->+  Place ->+  Ticks ->+  Ticks+adjustTicks (Adjustments mrx ma mry ad) vb cs pl t+  | pl == PlaceBottom || pl == PlaceTop =+      if ad+        then+          ( if adjustSizeX > 1+              then+                ( case pl of+                    PlaceBottom -> set (#textTick %? #style % #textAnchor) AnchorEnd+                    PlaceTop -> set (#textTick %? #style % #textAnchor) AnchorStart+                    _ -> set (#textTick %? #style % #textAnchor) AnchorEnd+                )+                  . over (#textTick %? #style % #size) (/ adjustSizeA)+                  $ (#textTick %? #style % #rotation ?~ pi / 4) t+              else over (#textTick %? #style % #size) (/ adjustSizeA) t+          )+        else t & over (#textTick %? #style % #size) (/ adjustSizeX)+  | otherwise -- pl `elem` [PlaceLeft, PlaceRight]+    =+      over (#textTick %? #style % #size) (/ adjustSizeY) t+  where+    max' [] = 1+    max' xs = maximum xs+    ra (Rect x z y w)+      | pl == PlaceTop || pl == PlaceBottom = Range x z+      | otherwise = Range y w+    asp = ra vb+    r = ra cs+    tickl = snd <$> ticksR (view #tick t) asp r+    maxWidth :: Double+    maxWidth =+      maybe+        1+        ( \tt ->+            max' $+              (\(Rect x z _ _) -> z - x)+                . (\x -> styleBoxText (view #style tt) x (Point 0 0))+                <$> tickl+        )+        (view #textTick t)+    maxHeight =+      maybe+        1+        ( \tt ->+            max' $+              (\(Rect _ _ y w) -> w - y)+                . (\x -> styleBoxText (view #style tt) x (Point 0 0))+                <$> tickl+        )+        (view #textTick t)++    adjustSizeX :: Double+    adjustSizeX = max (maxWidth / (upper asp - lower asp) / mrx) 1+    adjustSizeY = max (maxHeight / (upper asp - lower asp) / mry) 1+    adjustSizeA = max (maxHeight / (upper asp - lower asp) / ma) 1++-- | compute tick values and labels given options, ranges and formatting+ticksR :: Tick -> Range Double -> Range Double -> [(Double, Text)]+ticksR s d r =+  case s of+    TickNone -> []+    TickRound f n e -> zip (project r d <$> ticks0) (formatNs f ticks0)+      where+        ticks0 = gridSensible OuterPos (e == NoTickExtend) r n+    TickExact f n -> zip (project r d <$> ticks0) (formatNs f ticks0)+      where+        ticks0 = grid OuterPos r n+    TickLabels ls ->+      zip+        (project (Range 0 (fromIntegral $ length ls)) d . (\x -> x - 0.5) . fromIntegral <$> [1 .. length ls])+        ls+    TickPlaced xs -> zip (project r d . fst <$> xs) (snd <$> xs)++-- | aka marks+tickGlyph ::+  Place ->+  TickStyle ->+  Tick ->+  DataBox ->+  HudChart ->+  ChartTree+tickGlyph pl s ts db hc = maybe mempty (named "tickglyph" . pure) c+  where+    anchorBox = view (hudChartBox' (view #anchorTo s)) hc+    canvasBox = view (hudChartBox' CanvasSection) hc+    c = case (canvasBox, anchorBox) of+      (Just cb, Just ab) -> Just $ Chart (view #style s) (GlyphData ps)+        where+          ps = placePosTick pl (view #buffer s) ab bb . fst <$> ticksPlacedCanvas ts pl cb db+          bb = fromMaybe zero $ sbox (Chart (view #style s) (GlyphData [zero]))+      _ -> Nothing++placePosTick :: Place -> Double -> ChartBox -> Rect Double -> Double -> Point Double+placePosTick pl b (Rect x z y w) (Rect x' z' y' w') pos = case pl of+  PlaceTop -> Point pos (w + b - y')+  PlaceBottom -> Point pos (y - b - w')+  PlaceLeft -> Point (x - b - z') pos+  PlaceRight -> Point (z + b - x') pos+  PlaceAbsolute p -> p + Point 0 pos++-- | compute tick positions and string values in canvas space given placement, the canvas box & data box+ticksPlacedCanvas :: Tick -> Place -> ChartBox -> DataBox -> [(Double, Text)]+ticksPlacedCanvas ts pl cb db =+  first (project (placeRange pl db) (placeRange pl cb))+    <$> snd (makePlacedTicks (placeRange pl db) ts)++-- | aka tick labels+tickText ::+  Place ->+  TickStyle ->+  Tick ->+  DataBox ->+  HudChart ->+  ChartTree+tickText pl s ts db hc = maybe mempty (named "ticktext" . maybeToList) c+  where+    anchorBox = view (hudChartBox' (view #anchorTo s)) hc+    cb = view (hudChartBox' CanvasSection) hc+    c = tickText_ pl s ts <$> anchorBox <*> cb <*> pure db++tickText_ ::+  Place ->+  TickStyle ->+  Tick ->+  ChartBox ->+  ChartBox ->+  DataBox ->+  Maybe Chart+tickText_ pl s ts sb cb db =+  case l of+    [] -> Nothing+    _ -> Just $ Chart (placeTextAnchor pl (view #style s)) (TextData l)+  where+    l =+      swap . first (addp (placeSides pl (view #buffer s) sb + textPos pl (view #style s) (view #buffer s)) . placeOrigin pl)+        <$> ticksPlacedCanvas ts pl cb db++placeSides :: Place -> Double -> ChartBox -> Point Double+placeSides pl b (Rect x z y w) = case pl of+  PlaceTop -> Point 0 (w + b)+  PlaceBottom -> Point 0 (y - b)+  PlaceLeft -> Point (x - b) 0+  PlaceRight -> Point (z + b) 0+  PlaceAbsolute p -> p++placeOrigin :: Place -> Double -> Point Double+placeOrigin pl x+  | pl == PlaceTop || pl == PlaceBottom = Point x 0+  | otherwise = Point 0 x++-- | aka grid lines+tickLine ::+  Place ->+  TickStyle ->+  Tick ->+  DataBox ->+  HudChart ->+  ChartTree+tickLine pl s ts db hc =+  case cb of+    Nothing -> mempty+    Just cb' ->+      let l = (\x -> placeGridLines pl cb' x (view #buffer s)) <$> fmap fst (ticksPlacedCanvas ts pl cb' db)+       in bool (named "ticklines" [Chart (view #style s) (LineData l)]) mempty (null l)+  where+    cb = view (hudChartBox' (view #anchorTo s)) hc++placeGridLines :: Place -> ChartBox -> Double -> Double -> [Point Double]+placeGridLines pl (Rect x z y w) a b+  | pl == PlaceTop || pl == PlaceBottom = [Point a (y - b), Point a (w + b)]+  | otherwise = [Point (x - b) a, Point (z + b) a]++-- | title append transformation.+titleHud :: TitleOptions -> HudChart -> ChartTree+titleHud t hc = maybe mempty ((named "title" . pure) . title_ t) hb+  where+    hb = view (hudChartBox' HudStyleSection) hc++title_ :: TitleOptions -> ChartBox -> Chart+title_ t cb =+  Chart+    s'+    (TextData [(view #text t, placePosTitle)])+  where+    s' = view #style t & set #textAnchor (fromAnchoring (view #anchoring t)) & set #rotation (bool (Just rot) Nothing (rot == 0))+    rot' = fromMaybe 0 (view (#style % #rotation) t)+    rot+      | view #place t == PlaceRight = pi / 2 + rot'+      | view #place t == PlaceLeft = pi / 2 + rot'+      | otherwise = rot'+    placePosTitle =+      beside+        (view #place t)+        (view #anchoring t)+        (view #buffer t)+        cb+        (styleBoxText s' (view #text t) zero)++textPos :: Place -> Style -> Double -> Point Double+textPos pl tt b = case pl of+  PlaceTop -> Point 0 (b - view #vshift tt * view #vsize tt * view #size tt)+  PlaceBottom -> Point 0 (-b - view #vshift tt * view #vsize tt * view #size tt - view #vsize tt * view #size tt)+  PlaceLeft ->+    Point+      (-b)+      (view #vshift tt * view #vsize tt * view #size tt)+  PlaceRight ->+    Point+      b+      (view #vshift tt * view #vsize tt * view #size tt)+  PlaceAbsolute p -> p++placeTextAnchor :: Place -> (Style -> Style)+placeTextAnchor pl+  | pl == PlaceLeft = set #textAnchor AnchorEnd+  | pl == PlaceRight = set #textAnchor AnchorStart+  | otherwise = id++-- | Make a frame hud transformation.+frameHud :: FrameOptions -> HudChart -> ChartTree+frameHud o hc =+  case r of+    Nothing -> mempty+    Just r' -> case view #frame o of+      Nothing -> named "frame" [Chart defaultStyle (BlankData [r'])]+      Just rs -> named "frame" [Chart rs (RectData [r'])]+  where+    r = padRect (view #buffer o) <$> view (hudChartBox' (view #anchorTo o)) hc++-- | Make a legend from 'LegendOptions' given an existing 'HudChart'+legendHud :: LegendOptions -> HudChart -> ChartTree+legendHud o hc = maybe mempty (\b -> besideChart (view #place o) (view #anchoring o) (view #buffer o) b (over chart' (scaleChart (view #scaleChartsBy o)) lcs)) (view (hudChartBox' (view #anchorTo o)) hc)+  where+    lcs = legendChart o & set (charts' % each % #chartStyle % #scaleP) (view #scaleP o)++-- | frame a legend+legendFrame :: LegendOptions -> ChartTree -> ChartTree+legendFrame l content' =+  group (Just "legend") [borders, rename (Just "legendContent") content']+  where+    borders = mconcat $ [outer, inner] <> frame'+    outer = padChart (view #outerPad l) inner+    frame' = foldMap (\r -> [frameChart r 0 inner]) (view #frame l)+    inner = padChart (view #innerPad l) content'++-- | Make the contents portion of a legend+legendChart :: LegendOptions -> ChartTree+legendChart l = legendFrame l content'+  where+    content' =+      stack+        (view #numStacks l)+        AlignLeft+        AlignMid+        (view #hgap l)+        ( ( \(t, a) ->+              hori+                AlignMid+                (view #vgap l + bool 0 (twidth - gapwidth t) (view #alignCharts l == AlignRight))+                (fmap unnamed [[t], a])+          )+            <$> es+        )+    es = uncurry (legendEntry l) <$> view #legendCharts l+    twidth = maybe zero (\(Rect x z _ _) -> z - x) (styleBoxes (fst <$> es))+    gapwidth t = maybe 0 (\(Rect x z _ _) -> z - x) (sbox t)++legendText ::+  LegendOptions ->+  Text ->+  Chart+legendText l t =+  Chart (view #textStyle l & set #textAnchor AnchorStart & set #scaleP ScalePX) (TextData [(t, zero)])++legendizeChart ::+  LegendOptions ->+  Chart ->+  Chart+legendizeChart l c =+  case c of+    (Chart rs (RectData _)) -> Chart rs (RectData [Rect 0 (view #legendSize l) 0 (view #legendSize l)])+    (Chart ts (TextData t)) -> let txt = fromMaybe "text" (listToMaybe (fst <$> t)) in Chart (ts & set #size (view #legendSize l / fromIntegral (Text.length txt))) (TextData [(txt, Point (0.5 * view #legendSize l) (0.33 * view #legendSize l))])+    (Chart gs (GlyphData _)) -> Chart (gs & set #size (view #legendSize l)) (GlyphData [Point (0.5 * view #legendSize l) (0.33 * view #legendSize l)])+    (Chart ls (LineData _)) ->+      Chart+        (ls & over #size (/ view #scaleChartsBy l))+        (LineData [[Point 0 (1 * view #legendSize l), Point (2 * view #legendSize l) (1 * view #legendSize l)]])+    (Chart ps (PathData _)) ->+      ( let cs =+              singletonQuad+                ( QuadPosition+                    (Point 0 0)+                    (Point (view #legendSize l) (view #legendSize l))+                    (Point (2 * view #legendSize l) ((-1) * view #legendSize l))+                )+         in Chart (ps & set #borderSize (view #legendSize l)) (PathData cs)+      )+    _ -> blankChart1 (Rect 0 (view #legendSize l) 0 (view #legendSize l))++-- | Takes legend options, a label and a list of charts and turns it into a form suitable for legend processing.+legendEntry ::+  LegendOptions ->+  Text ->+  [Chart] ->+  (Chart, [Chart])+legendEntry l t cs =+  (legendText l t, fmap (legendizeChart l) cs)
+ src/Chart/Markup.hs view
@@ -0,0 +1,493 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}++-- | Conversion between 'ChartOptions' and 'Markup' representations.+module Chart.Markup+  ( Markup (..),+    ChartOptions (..),+    forgetHud,+    asChartTree,+    vertCO,+    horiCO,+    stackCO,+    markupChartOptions,+    markupChartTree,+    markupChart,+    header,+    renderChartOptions,+    encodeChartOptions,+    writeChartOptions,+    CssOptions (..),+    defaultCssOptions,+    PreferColorScheme (..),+    cssPreferColorScheme,+    fillSwitch,+    ShapeRendering (..),+    markupCssOptions,+    MarkupOptions (..),+    defaultMarkupOptions,+    encodeNum,+    encodePx,+    defaultCssFontFamilies,+  )+where++import Chart.Data+import Chart.Hud+import Chart.Primitive hiding (tree)+import Chart.Style+import Data.Bool+import Data.ByteString (ByteString, intercalate, writeFile)+import Data.Colour+import Data.Data+import Data.FormatN+import Data.Maybe+import Data.Path+import Data.Path.Parser+import Data.Text (Text)+import Data.Text.Encoding (decodeUtf8, encodeUtf8)+import GHC.Generics+import MarkupParse+import NumHask.Space+import Optics.Core hiding (element)+import Prelude++-- $setup+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core+-- >>> let c0 = ChartOptions (defaultMarkupOptions & #cssOptions % #preferColorScheme .~ PreferNormal) mempty mempty+-- >>> import Chart.Examples+-- >>> import MarkupParse++-- | Show a Double, or rounded to 4 decimal places if this is shorter.+--+-- >>> encodeNum 1+-- "1.0"+--+-- >>> encodeNum 1.23456+-- "1.2346"+encodeNum :: Double -> ByteString+encodeNum = encodeUtf8 . formatOrShow (FixedStyle 4) Nothing++-- | SVG width and height, without any unit suffix, are defined as pixels, which are Integers+--+-- >>> encodePx 300.0+-- "300"+encodePx :: Double -> ByteString+encodePx = strToUtf8 . show . (floor :: Double -> Int)++-- | Convert a ChartTree to markup+--+-- >>> lineExample & view #chartTree & markupChartTree & markdown_ Compact Xml+-- "<g class=\"line\"><g stroke-width=\"0.0150\" stroke=\"rgb(2%, 73%, 80%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0,-1.0 1.0,-1.0 2.0,-5.0\"/></g><g stroke-width=\"0.0150\" stroke=\"rgb(2%, 29%, 48%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0,0 2.8,-3.0\"/></g><g stroke-width=\"0.0150\" stroke=\"rgb(66%, 7%, 55%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0.5,-4.0 0.5,0\"/></g></g>"+markupChartTree :: ChartTree -> Markup+markupChartTree cs =+  maybe xs' (\l -> element "g" [Attr "class" (encodeUtf8 l)] xs') label+  where+    (ChartTree (Node (label, cs') xs)) = filterChartTree (not . isEmptyChart . chartData) cs+    xs' = mconcat $ fmap markupChart cs' <> (markupChartTree . ChartTree <$> xs)++markupText :: Style -> Text -> Point Double -> Markup+markupText s t p@(Point x y) = frame' <> element "text" as (bool (contentRaw c) (content c) (EscapeText == view #escapeText s))+  where+    as =+      uncurry Attr+        <$> [ ("x", encodeNum x),+              ("y", encodeNum $ -y)+            ]+          <> maybeToList ((\x' -> ("transform", toRotateText x' p)) <$> view #rotation s)+    -- This is very late for a chart creation. It is here so that the chart doesn't undergo scaling and thus picks up the local size of the text, less the border size of the frame.+    frame' = case view #frame s of+      Nothing -> Markup mempty+      Just f -> markupChart (Chart (f & over #borderSize (* view #size s)) (RectData [styleBoxText (s & set #frame Nothing) t p]))+    c = encodeUtf8 t++-- | Markup a text rotation about a point in radians.+--+-- includes reference changes:+--+-- - from radians to degrees+--+-- - from counter-clockwise is a positive rotation to clockwise is positive+--+-- - flip y dimension+toRotateText :: Double -> Point Double -> ByteString+toRotateText r (Point x y) =+  "rotate(" <> encodeNum (-(r * 180 / pi)) <> ", " <> encodeNum x <> ", " <> encodeNum (-y) <> ")"++toScaleText :: Double -> ByteString+toScaleText x =+  "scale(" <> encodeNum x <> ")"++-- | Convert a Rect to Markup+markupRect :: Rect Double -> Markup+markupRect (Rect x z y w) =+  emptyElem "rect" as+  where+    as =+      uncurry Attr+        <$> [ ("width", encodeNum (z - x)),+              ("height", encodeNum (w - y)),+              ("x", encodeNum x),+              ("y", encodeNum (-w))+            ]++-- | Convert a Chart to Markup+--+-- >>> import MarkupParse+-- >>> import Optics.Core+-- >>> import Control.Category ((>>>))+-- >>> lineExample & toListOf (#chartTree % charts') & mconcat & fmap (markupChart >>> markdown_ Compact Xml)+-- ["<g stroke-width=\"0.0150\" stroke=\"rgb(2%, 73%, 80%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0,-1.0 1.0,-1.0 2.0,-5.0\"/></g>","<g stroke-width=\"0.0150\" stroke=\"rgb(2%, 29%, 48%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0,0 2.8,-3.0\"/></g>","<g stroke-width=\"0.0150\" stroke=\"rgb(66%, 7%, 55%)\" stroke-opacity=\"1.0\" fill=\"none\"><polyline points=\"0.5,-4.0 0.5,0\"/></g>"]+markupChart :: Chart -> Markup+markupChart = uncurry (element "g") . f+  where+    f (Chart s (RectData xs)) = (attsRect s, mconcat (markupRect <$> xs))+    f (Chart s (TextData xs)) = (attsText s, mconcat (uncurry (markupText s) <$> xs))+    f (Chart s (GlyphData xs)) = (attsGlyph s, mconcat (markupGlyph s <$> xs))+    f (Chart s (PathData xs)) = (attsPath s, markupPath xs)+    f (Chart s (LineData xs)) = (attsLine s, markupLine xs)+    f (Chart _ (BlankData _)) = ([], mempty)++markupLine :: [[Point Double]] -> Markup+markupLine lss =+  mconcat $ emptyElem "polyline" . (: []) . Attr "points" . toPointsText <$> lss++toPointsText :: [Point Double] -> ByteString+toPointsText xs = intercalate " " $ (\(Point x y) -> encodeNum x <> "," <> encodeNum (-y)) <$> xs++-- | Path markup+markupPath :: [PathData Double] -> Markup+markupPath ps =+  emptyElem "path" [Attr "d" (pathDataToSvg ps)]++-- | GlyphStyle to markup Tree+-- Note rotation on the outside not the inside.+markupGlyph :: Style -> Point Double -> Markup+markupGlyph s p =+  case view #rotation s of+    Nothing -> gl+    Just r -> element "g" [Attr "transform" (toRotateText r p)] gl+  where+    gl = markupShape_ (view #glyphShape s) (view #size s) p++-- | Convert a dash representation from a list to text+fromDashArray :: [Double] -> ByteString+fromDashArray xs = intercalate " " $ encodeNum <$> xs++fromDashOffset :: Double -> ByteString+fromDashOffset x = encodeNum x++attsLine :: Style -> [Attr]+attsLine o =+  uncurry Attr+    <$> [ ("stroke-width", encodeNum $ view #size o),+          ("stroke", showRGB $ view #color o),+          ("stroke-opacity", showOpacity $ view #color o),+          ("fill", "none")+        ]+      <> catMaybes+        [(\x -> ("stroke-linecap", fromLineCap x)) <$> view #lineCap o]+      <> foldMap (\x -> [("stroke-linejoin", fromLineJoin x)]) (view #lineJoin o)+      <> foldMap (\x -> [("stroke-dasharray", fromDashArray x)]) (view #dasharray o)+      <> foldMap (\x -> [("stroke-dashoffset", fromDashOffset x)]) (view #dashoffset o)++attsRect :: Style -> [Attr]+attsRect o =+  uncurry Attr+    <$> [ ("stroke-width", encodeNum $ view #borderSize o),+          ("stroke", showRGB $ view #borderColor o),+          ("stroke-opacity", showOpacity $ view #borderColor o),+          ("fill", showRGB $ view #color o),+          ("fill-opacity", showOpacity $ view #color o)+        ]++-- | TextStyle to [Attr]+attsText :: Style -> [Attr]+attsText o =+  uncurry Attr+    <$> [ ("stroke-width", "0.0"),+          ("stroke", "none"),+          ("fill", showRGB $ view #color o),+          ("fill-opacity", showOpacity $ view #color o),+          ("font-size", encodeNum $ view #size o),+          ("text-anchor", fromTextAnchor $ view #textAnchor o)+        ]++-- | GlyphStyle to [Attr]+attsGlyph :: Style -> [Attr]+attsGlyph o =+  uncurry Attr+    <$> [ ("stroke-width", encodeNum $ view #borderSize o),+          ("stroke", showRGB $ view #borderColor o),+          ("stroke-opacity", showOpacity $ view #borderColor o),+          ("fill", showRGB $ view #color o),+          ("fill-opacity", showOpacity $ view #color o)+        ]+      <> foldMap ((: []) . (,) "transform" . toTranslateText) (view #translate o)++-- | PathStyle to [Attr]+attsPath :: Style -> [Attr]+attsPath o =+  uncurry Attr+    <$> [ ("stroke-width", encodeNum $ view #borderSize o),+          ("stroke", showRGB $ view #borderColor o),+          ("stroke-opacity", showOpacity $ view #borderColor o),+          ("fill", showRGB $ view #color o),+          ("fill-opacity", showOpacity $ view #color o)+        ]++-- | includes a flip of the y dimension.+toTranslateText :: Point Double -> ByteString+toTranslateText (Point x y) =+  "translate(" <> encodeNum x <> ", " <> encodeNum (-y) <> ")"++-- | GlyphShape to markup Tree+markupShape_ :: GlyphShape -> Double -> Point Double -> Markup+markupShape_ CircleGlyph s (Point x y) = emptyElem "circle" as+  where+    as =+      uncurry Attr+        <$> [ ("cx", encodeNum x),+              ("cy", encodeNum $ -y),+              ("r", encodeNum $ 0.5 * s)+            ]+markupShape_ SquareGlyph s p =+  markupRect (move p ((s *) <$> one :: Rect Double))+markupShape_ (RectSharpGlyph x') s p =+  markupRect (move p (scale (Point s (x' * s)) one :: Rect Double))+markupShape_ (RectRoundedGlyph x' rx' ry') s p = emptyElem "rect" as+  where+    as =+      uncurry Attr+        <$> [ ("width", encodeNum $ z - x),+              ("height", encodeNum $ w - y),+              ("x", encodeNum x),+              ("y", encodeNum $ -w),+              ("rx", encodeNum rx'),+              ("ry", encodeNum ry')+            ]+    (Rect x z y w) = move p (scale (Point s (x' * s)) one)+markupShape_ (TriangleGlyph (Point xa ya) (Point xb yb) (Point xc yc)) s p =+  emptyElem "polygon" as+  where+    as =+      uncurry Attr+        <$> [ ("transform", toTranslateText p),+              ("points", encodeNum (s * xa) <> "," <> encodeNum (-(s * ya)) <> " " <> encodeNum (s * xb) <> "," <> encodeNum (-(s * yb)) <> " " <> encodeNum (s * xc) <> "," <> encodeNum (-(s * yc)))+            ]+markupShape_ (EllipseGlyph x') s (Point x y) =+  emptyElem "ellipse" as+  where+    as =+      uncurry Attr+        <$> [ ("cx", (strToUtf8 . show) x),+              ("cy", (strToUtf8 . show) $ -y),+              ("rx", (strToUtf8 . show) $ 0.5 * s),+              ("ry", (strToUtf8 . show) $ 0.5 * s * x')+            ]+markupShape_ VLineGlyph s (Point x y) =+  emptyElem "polyline" [Attr "points" $ encodeNum x <> "," <> encodeNum (-(y - s / 2)) <> "\n" <> encodeNum x <> "," <> encodeNum (-(y + s / 2))]+markupShape_ HLineGlyph s (Point x y) =+  emptyElem "polyline" [Attr "points" $ encodeNum (x - s / 2) <> "," <> encodeNum (-y) <> "\n" <> encodeNum (x + s / 2) <> "," <> encodeNum (-y)]+markupShape_ (PathGlyph path) s p =+  emptyElem "path" (uncurry Attr <$> [("d", path), ("transform", toTranslateText p <> " " <> toScaleText s)])++-- | Create the classic SVG element+--+-- >>> header (Just 300) (Rect (-0.75) 0.75 (-0.5) 0.5) (element_ "foo" []) & markdown_ Compact Xml+-- "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"450\" height=\"300\" viewBox=\"-0.75 -0.5 1.5 1.0\"><foo></foo></svg>"+header :: Maybe Double -> Rect Double -> Markup -> Markup+header markupheight viewbox content' =+  element+    "svg"+    ( uncurry Attr+        <$> ( [ ("xmlns", "http://www.w3.org/2000/svg"),+                ("xmlns:xlink", "http://www.w3.org/1999/xlink")+              ]+                <> widthAndHeight+                <> [ ("viewBox", encodeNum x <> " " <> encodeNum (-w) <> " " <> encodeNum (z - x) <> " " <> encodeNum (w - y))+                   ]+            )+    )+    content'+  where+    (Rect x z y w) = viewbox+    Point w' h = width viewbox+    widthAndHeight = case markupheight of+      Nothing -> []+      Just h' ->+        [ ("width", encodePx w''),+          ("height", encodePx h')+        ]+        where+          w'' = h' / h * w'++-- | CSS prefer-color-scheme text snippet+--+-- >>> cssPreferColorScheme (light, dark) PreferHud+-- "svg {color-scheme: light dark;} {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: rgb(5%, 5%, 5%);} .ticklines g, .tickglyph g, .legendBorder g {stroke: rgb(5%, 5%, 5%);} .legendBorder g {fill: rgb(94%, 94%, 94%);}} @media (prefers-color-scheme:dark) {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: rgb(94%, 94%, 94%);} .ticklines g, .tickglyph g, .legendBorder g {stroke: rgb(94%, 94%, 94%);} .legendBorder g {fill: rgb(5%, 5%, 5%);}}"+cssPreferColorScheme :: (Colour, Colour) -> PreferColorScheme -> ByteString+cssPreferColorScheme (cl, cd) PreferHud =+  "svg {color-scheme: light dark;} {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: " <> showRGB cd <> ";} .ticklines g, .tickglyph g, .legendBorder g {stroke: " <> showRGB cd <> ";} .legendBorder g {fill: " <> showRGB cl <> ";}} @media (prefers-color-scheme:dark) {.canvas g, .title g, .axisbar g, .ticktext g, .tickglyph g, .ticklines g, .legendContent g text {fill: " <> showRGB cl <> ";} .ticklines g, .tickglyph g, .legendBorder g {stroke: " <> showRGB cl <> ";} .legendBorder g {fill: " <> showRGB cd <> ";}}"+cssPreferColorScheme (cl, _) PreferLight =+  "svg {color-scheme: light dark;} @media (prefers-color-scheme:dark) {markup {background-color: " <> showRGB cl <> ";}}"+cssPreferColorScheme (_, cd) PreferDark =+  "svg {color-scheme: light dark;} @media (prefers-color-scheme:light) {markup {background-color: " <> showRGB cd <> ";}}"+cssPreferColorScheme _ PreferNormal = mempty++-- | CSS snippet to switch between dark and light mode+--+-- > fillSwitch (color1, color2) "dark" "stuff"+--+-- ... will default to color1 for elements of the "stuff" class, but switch to color2 if "dark" mode is preferred by the user.+fillSwitch :: (Colour, Colour) -> ByteString -> ByteString -> ByteString+fillSwitch (colorNormal, colorPrefer) prefer item =+  " {." <> item <> " g {fill: " <> showRGB colorNormal <> ";}} @media (prefers-color-scheme: " <> prefer <> ") {." <> item <> " g {fill: " <> showRGB colorPrefer <> ";}}"++-- | Markup options.+--+-- >>> defaultMarkupOptions+-- MarkupOptions {markupHeight = Just 300.0, chartAspect = FixedAspect 1.5, cssOptions = CssOptions {shapeRendering = NoShapeRendering, preferColorScheme = PreferHud, fontFamilies = "\nsvg { 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\";\n}\n\nticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}", cssExtra = ""}, renderStyle = Compact}+data MarkupOptions = MarkupOptions+  { markupHeight :: Maybe Double,+    chartAspect :: ChartAspect,+    cssOptions :: CssOptions,+    renderStyle :: RenderStyle+  }+  deriving (Eq, Show, Generic, Data)++-- | The official markup options+defaultMarkupOptions :: MarkupOptions+defaultMarkupOptions = MarkupOptions (Just 300) (FixedAspect 1.5) defaultCssOptions Compact++-- | default fonts.+defaultCssFontFamilies :: ByteString+defaultCssFontFamilies = "\nsvg { 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\";" <> "\n" <> "}" <> "\n\n" <> "ticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}"++-- | CSS glyphShape rendering options+data ShapeRendering+  = UseGeometricPrecision+  | UseCssCrisp+  | NoShapeRendering+  deriving (Eq, Show, Generic, Data)++-- | CSS prefer-color-scheme options+data PreferColorScheme+  = -- | includes css that switches approriate hud elements between light and dark.+    PreferHud+  | PreferDark+  | PreferLight+  | PreferNormal+  deriving (Eq, Show, Generic, Data)++-- | css options+--+-- >>> defaultCssOptions+-- CssOptions {shapeRendering = NoShapeRendering, preferColorScheme = PreferHud, fontFamilies = "\nsvg { 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\";\n}\n\nticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}", cssExtra = ""}+data CssOptions+  = CssOptions {shapeRendering :: ShapeRendering, preferColorScheme :: PreferColorScheme, fontFamilies :: ByteString, cssExtra :: ByteString}+  deriving (Eq, Show, Generic, Data)++-- | No special shape rendering and default hud responds to user color scheme preferences.+defaultCssOptions :: CssOptions+defaultCssOptions = CssOptions NoShapeRendering PreferHud defaultCssFontFamilies mempty++-- | Convert CssOptions to Markup+markupCssOptions :: CssOptions -> Markup+markupCssOptions css =+  elementc "style" [] $+    cssPreferColorScheme (light, dark) (view #preferColorScheme css)+      <> markupShapeRendering (view #shapeRendering css)+      <> view #fontFamilies css+      <> view #cssExtra css++-- | CSS shape rendering text snippet+markupShapeRendering :: ShapeRendering -> ByteString+markupShapeRendering UseGeometricPrecision = "svg { shape-rendering: geometricPrecision; }"+markupShapeRendering UseCssCrisp = "svg { shape-rendering: crispEdges; }"+markupShapeRendering NoShapeRendering = mempty++-- | A product type consisting of a 'ChartTree', 'HudOptions' and 'MarkupOptions', which is what you need to create 'Markup'.+data ChartOptions = ChartOptions+  { markupOptions :: MarkupOptions,+    hudOptions :: HudOptions,+    chartTree :: ChartTree+  }+  deriving (Eq, Show, Generic, Data)++-- | Processes the hud options and turns them into charts, rescales the existing charts, resets the hud options to mempty, and turns on 'ScalePArea' in chart styles.+--+-- Note that this is a destructive operation, and, in particular, that+--+-- > view #chartTree (forgetHud (mempty & set #chartTree c)) /= c+forgetHud :: ChartOptions -> ChartOptions+forgetHud co =+  co+    & set #hudOptions mempty+    & set #chartTree (addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #chartTree co))+    & set (#chartTree % charts' % each % #chartStyle % #scaleP) ScalePArea++-- | Convert ChartOptions to a ChartTree, forgetting the original hud and chart data+asChartTree :: ChartOptions -> ChartTree+asChartTree = view #chartTree . forgetHud++-- | Horizontally stack a list of ChartOptions (proceeding to the right), at the supplied Align and with the supplied gap intercalated.+horiCO :: Align -> Double -> [ChartOptions] -> ChartOptions+horiCO align gap cs = mempty @ChartOptions & set #chartTree (hori align gap (asChartTree <$> cs))++-- | Vertically stack a list of ChartOptions (proceeding upwards), at the supplied Align and with the supplied gap intercalated.+vertCO :: Align -> Double -> [ChartOptions] -> ChartOptions+vertCO align gap cs = mempty @ChartOptions & set #chartTree (vert align gap (asChartTree <$> cs))++-- | Stack a list of ChartOptions horizontally, then vertically (proceeding downwards which is opposite to the usual coordinate reference system but intuitively the way people read charts)+stackCO :: Int -> Align -> Align -> Double -> [ChartOptions] -> ChartOptions+stackCO n alignV alignH gap cs = mempty @ChartOptions & set #chartTree (stack n alignV alignH gap (asChartTree <$> cs))++-- | Convert ChartOptions to Markup+--+-- >>> markupChartOptions (ChartOptions (defaultMarkupOptions & #cssOptions % #preferColorScheme .~ PreferNormal) mempty mempty) & markdown_ Compact Xml+-- "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-0.5 -0.5 1.0 1.0\"><style>\nsvg { 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\";\n}\n\nticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}</style><g class=\"chart\"></g><g class=\"hud\"></g></svg>"+markupChartOptions :: ChartOptions -> Markup+markupChartOptions co =+  header+    (view (#markupOptions % #markupHeight) co)+    viewbox+    ( markupCssOptions (view (#markupOptions % #cssOptions) co)+        <> markupChartTree ctFinal+    )+  where+    viewbox = view safeStyleBox' ctFinal+    ctFinal =+      projectChartTreeWith+        (view (#markupOptions % #chartAspect) co)+        (view #hudOptions co)+        (view #chartTree co)++-- | Render ChartOptions to an SVG ByteString+--+-- >>> encodeChartOptions (ChartOptions (defaultMarkupOptions & #cssOptions % #preferColorScheme .~ PreferNormal) mempty mempty)+-- "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-0.5 -0.5 1.0 1.0\"><style>\nsvg { 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\";\n}\n\nticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}</style><g class=\"chart\"></g><g class=\"hud\"></g></svg>"+encodeChartOptions :: ChartOptions -> ByteString+encodeChartOptions co = markdown_ (view (#markupOptions % #renderStyle) co) Xml $ markupChartOptions co++-- | Render ChartOptions to an SVG Text snippet+--+-- >>> renderChartOptions (ChartOptions (defaultMarkupOptions & #cssOptions % #preferColorScheme .~ PreferNormal) mempty mempty)+-- "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-0.5 -0.5 1.0 1.0\"><style>\nsvg { 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\";\n}\n\nticktext { font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;}</style><g class=\"chart\"></g><g class=\"hud\"></g></svg>"+renderChartOptions :: ChartOptions -> Text+renderChartOptions = decodeUtf8 . encodeChartOptions++instance Semigroup ChartOptions where+  (<>) (ChartOptions _ h c) (ChartOptions s' h' c') =+    ChartOptions s' (h <> h') (c <> c')++instance Monoid ChartOptions where+  mempty = ChartOptions defaultMarkupOptions mempty mempty++-- | Convert ChartOptions to an SVG ByteString and save to a file+writeChartOptions :: FilePath -> ChartOptions -> IO ()+writeChartOptions fp co = Data.ByteString.writeFile fp (encodeChartOptions co)
− src/Chart/Page.hs
@@ -1,1158 +0,0 @@-{-# LANGUAGE ApplicativeDo #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}--module Chart.Page-  ( repChartStaticData,-    repAnnotation,-    repRectStyle,-    repTextStyle,-    repGlyphStyle,-    repLineStyle,-    repPlace,-    repAnchor,-    repBar,-    repAdjustments,-    repTitle,-    repHudOptions,-    repAxisOptions,-    repSvgOptions,-    repData,-    repFormatN,-    repTickStyle,-    repTick,-    repPoint,-    repPointI,-    repRect,-    repRectOne,-    repRounded,-    repTriple,-    repGlyphShape,-    repLegendOptions,-    repChartsWithSharedData,-    repChartsWithStaticData,-    debugHtml,-    debugFlags,-    repHudOptionsDefault,-    repBarOptions,-    repBarData,-    repBarChart,-    repPixelOptions,-    repPixelLegendOptions,-    repPixelChart,-    repNoData,-  )-where--import Chart.Bar-import Data.FormatN-import Chart.Pixel-import Chart.Render (renderHudOptionsChart)-import Chart.Types-import Control.Lens-import Data.Attoparsec.Text-import Data.Colour-import qualified Data.Text as Text-import Lucid-import NumHask.Prelude-import NumHask.Space-import Text.Pretty.Simple (pShowNoColor)-import Web.Rep--pShow' :: (Show a) => a -> Text-pShow' = toStrict . pShowNoColor--repChartStaticData :: (Monad m) => Chart a -> SharedRep m (Chart a)-repChartStaticData c = do-  ann <- repAnnotation (c ^. #annotation)-  pure $ Chart ann (c ^. #xys)--repAnnotation :: (Monad m) => Annotation -> SharedRep m Annotation-repAnnotation initann = bimap hmap mmap rann <<*>> rs <<*>> ts <<*>> gs <<*>> ls <<*>> ps-  where-    rann =-      dropdownSum-        takeText-        id-        (Just "Chart Annotation")-        ["RectA", "TextA", "GlyphA", "LineA", "BlankA", "PixelA"]-        (annotationText initann)-    rs = repRectStyle defRectStyle-    ts = repTextStyle defText-    gs = repGlyphStyle defGlyph-    ls = repLineStyle defLine-    ps = repPixelStyle defPixel-    hmap ann rs ts gs ls ps =-      ann-        <> subtype rs (annotationText initann) "RectA"-        <> subtype ts (annotationText initann) "TextA"-        <> subtype gs (annotationText initann) "GlyphA"-        <> subtype ls (annotationText initann) "LineA"-        <> subtype ps (annotationText initann) "PixelA"-    mmap ann rs ts gs ls ps =-      case ann of-        "RectA" -> RectA rs-        "TextA" -> TextA ts texts-        "GlyphA" -> GlyphA gs-        "LineA" -> LineA ls-        "BlankA" -> BlankA-        "PixelA" -> PixelA ps-        _ -> BlankA-    defRectStyle = case initann of-      RectA s -> s-      _ -> defaultRectStyle-    defPixel = case initann of-      PixelA s -> s-      _ -> defaultPixelStyle-    (defText, texts) = case initann of-      TextA s xs -> (s, xs)-      _ -> (defaultTextStyle, Text.singleton <$> ['a' .. 'z'])-    defGlyph = case initann of-      GlyphA s -> s-      _ -> defaultGlyphStyle-    defLine = case initann of-      LineA s -> s-      _ -> defaultLineStyle--repRectStyle :: (Monad m) => RectStyle -> SharedRep m RectStyle-repRectStyle s = do-  bs <- slider (Just "border size") 0.0 0.1 0.001 (s ^. #borderSize)-  bc <- colorPicker (Just "border color") (hex $ s ^. #borderColor)-  bo <- slider (Just "border opacity") 0 1 0.1 (opac $ s ^. #borderColor)-  c <- colorPicker (Just "color") (hex $ s ^. #color)-  o <- slider (Just "opacity") 0 1 0.1 (opac $ s ^. #color)-  pure $ RectStyle bs (fromRGB (unsafeFromHex bc) bo) (fromRGB (unsafeFromHex c) o)--repPixelStyle ::-  (Monad m) =>-  PixelStyle ->-  SharedRep m PixelStyle-repPixelStyle cfg =-  bimap hmap mmap (unsafeFromHex <$> pcmin)-    <<*>> pomin-    <<*>> (unsafeFromHex <$> pcmax)-    <<*>> pomax-    <<*>> pd-    <<*>> prs-    <<*>> pt-  where-    pcmax = colorPicker (Just "high color") (toHex $ cfg ^. #pixelColorMax)-    pcmin = colorPicker (Just "low color") (toHex $ cfg ^. #pixelColorMin)-    pomax = slider (Just "high opacity") 0.0 1.0 0.001 (opac $ cfg ^. #pixelColorMax)-    pomin = slider (Just "low opacity") 0.0 1.0 0.001 (opac $ cfg ^. #pixelColorMin)-    pd = slider (Just "gradient direction") 0.0 (2 * pi) 0.001 (cfg ^. #pixelGradient)-    prs = repRectStyle (cfg ^. #pixelRectStyle)-    pt = textbox (Just "texture id") (cfg ^. #pixelTextureId)-    hmap pcmin' pomin' pcmax' pomax' pd' prs' pt' =-      pcmin' <> pomin' <> pcmax' <> pomax' <> pd' <> prs' <> pt'-    mmap pcmin' pomin' pcmax' pomax' pd' prs' pt' =-      PixelStyle (fromRGB pcmin' pomin') (fromRGB pcmax' pomax') pd' prs' pt'--repGlyphStyle :: (Monad m) => GlyphStyle -> SharedRep m GlyphStyle-repGlyphStyle gs = first (\x -> cardify (mempty, [style_ "width: 10 rem;"]) Nothing (x, [])) $ do-  sh <- repGlyphShape (gs ^. #shape)-  sz <- slider (Just "Size") 0 0.2 0.001 (gs ^. #size)-  gc <--    colorPicker-      (Just "Color")-      (toHex $ gs ^. #color)-  go <- slider (Just "Opacity") 0 1 0.1 (opac $ gs ^. #color)-  bsz <- slider (Just "Border Size") 0 0.02 0.001 (gs ^. #borderSize)-  gbc <- colorPicker (Just "Border Color") (toHex $ gs ^. #borderColor)-  gbo <- slider (Just "Border Opacity") 0 1 0.1 (opac $ gs ^. #borderColor)-  tr <--    maybeRep-      (Just "rotation")-      (isJust (gs ^. #rotation))-      (slider (Just "rotation") (-180) 180 10 (fromMaybe 0 (gs ^. #rotation)))-  tt <--    maybeRep-      (Just "translate")-      (isJust (gs ^. #translate))-      ( repPoint-          (Point (Range 0 1) (Range 0 1))-          (Point 0.001 0.001)-          (Point 0 0)-      )-  pure (GlyphStyle sz (fromRGB (unsafeFromHex gc) go) (fromRGB (unsafeFromHex gbc) gbo) bsz sh tr tt)--repTextStyle :: (Monad m) => TextStyle -> SharedRep m TextStyle-repTextStyle s = do-  ts <- slider (Just "size") 0.02 0.2 0.01 (s ^. #size)-  tc <- colorPicker (Just "color") (toHex $ s ^. #color)-  to' <- slider (Just "opacity") 0 1 0.1 (opac $ s ^. #color)-  ta <- repAnchor (s ^. #anchor)-  th <- slider (Just "hsize") 0.2 1 0.05 (s ^. #hsize)-  tv <- slider (Just "vsize") 0.5 2 0.05 (s ^. #vsize)-  tn <- slider (Just "nudge1") (-0.5) 0.5 0.05 (s ^. #nudge1)-  tr <--    maybeRep-      (Just "rotation")-      (isJust (s ^. #rotation))-      (slider (Just "rotation") (-180) 180 10 (fromMaybe 0 (s ^. #rotation)))-  tt <--    maybeRep-      (Just "translate")-      (isJust (s ^. #translate))-      ( repPoint-          (Point (Range 0 1) (Range 0 1))-          (Point 0.001 0.001)-          (Point 0 0)-      )-  tm <- checkbox (Just "mathjax") (s ^. #hasMathjax)-  pure $ TextStyle ts (fromRGB (unsafeFromHex tc) to') ta th tv tn tr tt tm--repLineStyle :: (Monad m) => LineStyle -> SharedRep m LineStyle-repLineStyle s = do-  w <- slider (Just "width") 0.000 0.05 0.001 (s ^. #width)-  c <- colorPicker (Just "color") (toHex $ s ^. #color)-  o <- slider (Just "opacity") 0 1 0.1 (opac $ s ^. #color)-  pure $ LineStyle w (fromRGB (unsafeFromHex c) o)--repPlace :: (Monad m) => Place -> SharedRep m Place-repPlace initpl = bimap hmap mmap rplace <<*>> rp-  where-    rplace =-      dropdownSum-        takeText-        id-        (Just "Placement")-        [ "Bottom",-          "Left",-          "Top",-          "Right",-          "Absolute"-        ]-        (placeText initpl)-    rp = repPoint (Point (Range 0 1) (Range 0 1)) (Point 0.01 0.01) (defPoint initpl)-    defPoint pl = case pl of-      PlaceAbsolute p -> p-      _ -> Point 0.0 0.0-    hmap rplace rp =-      div_-        ( rplace-            <> subtype rp (placeText initpl) "Absolute"-        )-    mmap rplace rp = case rplace of-      "Top" -> PlaceTop-      "Bottom" -> PlaceBottom-      "Left" -> PlaceLeft-      "Right" -> PlaceRight-      "Absolute" -> PlaceAbsolute rp-      _ -> PlaceBottom--repAnchor :: (Monad m) => Anchor -> SharedRep m Anchor-repAnchor a =-  toAnchor-    <$> dropdown-      takeText-      id-      (Just "Anchor")-      (fromAnchor <$> [AnchorStart, AnchorMiddle, AnchorEnd])-      (fromAnchor a)--repDirection :: (Monad m) => Direction -> SharedRep m Direction-repDirection a =-  toDirection-    <$> dropdown-      takeText-      id-      (Just "Direction")-      (fromDirection <$> [Vert, Hori])-      (fromDirection a)--repBar :: (Monad m) => Bar -> SharedRep m Bar-repBar cfg = do-  r <- repRectStyle (cfg ^. #rstyle)-  w <- slider (Just "width") 0 0.04 0.001 (cfg ^. #wid)-  b <- slider (Just "buffer") 0 0.08 0.001 (cfg ^. #buff)-  pure $ Bar r w b--repAdjustments :: (Monad m) => Adjustments -> SharedRep m Adjustments-repAdjustments a = do-  maxx <- slider (Just "maximum x ratio") 0.000 0.2 0.001 (a ^. #maxXRatio)-  maxy <- slider (Just "maximum y ratio") 0.000 0.2 0.001 (a ^. #maxYRatio)-  angle <- slider (Just "angle ratio") 0.000 1 0.001 (a ^. #angledRatio)-  diag <- checkbox (Just "allow diagonal text") (a ^. #allowDiagonal)-  pure $ Adjustments maxx maxy angle diag--repTitle :: (Monad m) => Title -> SharedRep m Title-repTitle cfg = do-  ttext <- textbox (Just "text") (cfg ^. #text)-  ts <- repTextStyle (cfg ^. #style)-  tp <- repPlace (cfg ^. #place)-  ta <- repAnchor (cfg ^. #anchor)-  b <- slider (Just "buffer") 0 0.2 0.01 (cfg ^. #buff)-  pure $ Title ttext ts tp ta b--repHudOptions ::-  (Monad m) =>-  Int ->-  Int ->-  Int ->-  AxisOptions ->-  Title ->-  LegendOptions ->-  [(Annotation, Text)] ->-  Annotation ->-  Text ->-  HudOptions ->-  SharedRep m HudOptions-repHudOptions naxes ntitles nlegendRows defaxis deftitle deflegend deflrs defann deflabel cfg =-  bimap hmap (\a b c d -> HudOptions a b c d) can-    <<*>> ts-    <<*>> axs-    <<*>> l-  where-    can =-      maybeRep (Just "canvas") (isJust (cfg ^. #hudCanvas)) $-        repRectStyle (fromMaybe defaultCanvas (cfg ^. #hudCanvas))-    ts =-      listRep-        (Just "titles")-        "tz"-        (checkbox Nothing)-        repTitle-        ntitles-        deftitle-        (cfg ^. #hudTitles)-    axs =-      listRep-        (Just "axes")-        "axz"-        (checkbox Nothing)-        repAxisOptions-        naxes-        defaxis-        (cfg ^. #hudAxes)-    labelsc =-      listRep-        (Just "labelsc")-        "labelscz"-        (checkbox Nothing)-        (textbox Nothing)-        nlegendRows-        deflabel-        (snd <$> deflrs)-    anns =-      listRep-        (Just "annotations")-        "annsz"-        (checkbox Nothing)-        repAnnotation-        nlegendRows-        defann-        (fst <$> deflrs)-    l =-      maybeRep-        (Just "legend")-        (isJust $ cfg ^. #hudLegend)-        ( (,)-            <$> repLegendOptions (maybe deflegend fst (cfg ^. #hudLegend))-            <*> (zip <$> anns <*> labelsc)-        )-    hmap can' ts' axs' l' =-      accordion_-        "accc"-        Nothing-        [ ("Axes", axs'),-          ("Canvas", can'),-          ("Titles", ts'),-          ("Legend", l')-        ]--repAxisOptions :: (Monad m) => AxisOptions -> SharedRep m AxisOptions-repAxisOptions cfg = bimap hmap AxisOptions b <<*>> adj <<*>> t <<*>> p-  where-    b =-      maybeRep-        (Just "axis bar")-        (isJust (cfg ^. #abar))-        (repBar (fromMaybe defaultBar (cfg ^. #abar)))-    adj =-      maybeRep-        (Just "adjustments")-        (isJust (cfg ^. #adjust))-        (repAdjustments (fromMaybe defaultAdjustments (cfg ^. #adjust)))-    t = repTick (cfg ^. #atick)-    p = repPlace (cfg ^. #place)-    hmap b' hauto' t' p' =-      accordion_-        "accaxis"-        Nothing-        [ ("Bar", b'),-          ("Auto", hauto'),-          ("Ticks", t'),-          ("Place", p')-        ]--repSvgAspect :: (Monad m) => SvgAspect -> Double -> SharedRep m SvgAspect-repSvgAspect sa ddef =-  bimap hmap toSvgAspect sa' <<*>> td-  where-    sa' =-      dropdownSum-        takeText-        id-        (Just "Aspect")-        [ "ManualAspect",-          "ChartsAspect"-        ]-        (fromSvgAspect sa)-    td = slider (Just "aspect scale") 0 10 0.01 (defD ddef)-    defD d' = case sa of-      ManualAspect d -> d-      ChartAspect -> d'-    hmap sa'' td' =-      div_-        ( sa''-            <> subtype td' (fromSvgAspect sa) "ManualAspect"-        )--repSvgOptions :: (Monad m) => SvgOptions -> SharedRep m SvgOptions-repSvgOptions s =-  bimap-    hmap-    SvgOptions-    h'-    <<*>> op'-    <<*>> ip-    <<*>> fr-    <<*>> esc-    <<*>> csso-    <<*>> scalec-    <<*>> svga-  where-    svga = repSvgAspect (s ^. #svgAspect) 1.33-    h' = slider (Just "height") 1 1000 1 (s ^. #svgHeight)-    op' =-      maybeRep-        (Just "outer pad")-        (isJust (s ^. #outerPad))-        (slider Nothing 0 0.1 0.01 (fromMaybe 1 (s ^. #outerPad)))-    ip =-      maybeRep-        (Just "inner pad")-        (isJust (s ^. #innerPad))-        (slider Nothing 0 0.1 0.01 (fromMaybe 1 (s ^. #innerPad)))-    fr =-      maybeRep-        (Just "frame")-        (isJust (s ^. #chartFrame))-        (repRectStyle (fromMaybe defaultSvgFrame (s ^. #chartFrame)))-    esc =-      bool NoEscapeText EscapeText-        <$> checkbox (Just "escape text") (EscapeText == s ^. #escapeText)-    csso =-      bool NoCssOptions UseCssCrisp-        <$> checkbox (Just "Use CssCrisp") (UseCssCrisp == s ^. #useCssCrisp)-    scalec =-      bool NoScaleCharts ScaleCharts-        <$> checkbox (Just "Scale Charts") (ScaleCharts == s ^. #scaleCharts')-    hmap h' op'' ip' fr' esc' csso' scalec' svga' =-      accordion_-        "accsvg"-        Nothing-        [ ("Aspect", svga' <> h'),-          ("Padding", op'' <> ip'),-          ("Frame", fr'),-          ("Escape", esc'),-          ("Css", csso'),-          ("Scale", scalec')-        ]--repData :: (Monad m) => Text -> SharedRep m [XY Double]-repData d = do-  a <--    dropdown-      takeText-      id-      (Just "type")-      [ "sin",-        "line",-        "one",-        "dist"-      ]-      d-  pure-    ( case a of-        "sin" -> PointXY <$> gridP sin (Range 0 (2 * pi)) 30-        "line" ->-          PointXY . uncurry Point-            <$> [(0.0, 1.0), (1.0, 1.0), (2.0, 5.0)]-        "one" -> [R 0 1 0 1]-        "dist" -> RectXY <$> gridR (\x -> exp (- (x ** 2) / 2)) (Range (-5) 5) 50-        _ -> PointXY <$> gridP sin (Range 0 (2 * pi)) 30-    )--repFormatN :: (Monad m) => FormatN -> SharedRep m FormatN-repFormatN tf = bimap hmap mmap tformat <<*>> tcommas <<*>> tfixed <<*>> texpt <<*>> tpercent <<*>> tprec <<*>> tdecimal <<*>> tdollar-  where-    tformat =-      dropdownSum-        takeText-        id-        (Just "Format")-        [ "Comma",-          "Fixed",-          "Decimal",-          "Prec",-          "Expt",-          "Dollar",-          "Percent",-          "None"-        ]-        (fromFormatN tf)-    tcommas = maybeRep Nothing (defSig tf) (sliderI (Just "prec") 0 8 1 (defInt tf))-    tfixed = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    texpt = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    tpercent = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    tprec = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    tdecimal = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    tdollar = maybeRep Nothing (defSig tf) $ sliderI (Just "prec") 0 8 1 (defInt tf)-    defInt tf' = case tf' of-      FormatComma (Just n) -> n-      FormatFixed (Just n) -> n-      FormatDecimal (Just n) -> n-      FormatPrec (Just n) -> n-      FormatExpt (Just n) -> n-      FormatDollar (Just n) -> n-      FormatPercent (Just n) -> n-      _ -> 3-    defSig tf' = case tf' of-      FormatComma (Just _) -> True-      FormatFixed (Just _) -> True-      FormatDecimal (Just _) -> True-      FormatPrec (Just _) -> True-      FormatExpt (Just _) -> True-      FormatDollar (Just _) -> True-      FormatPercent (Just _) -> True-      _ -> False-    hmap tformat' tcommas' tfixed' texpt' tpercent' tprec' tdecimal' tdollar' =-      div_-        ( tformat'-            <> subtype tcommas' (fromFormatN tf) "Comma"-            <> subtype tfixed' (fromFormatN tf) "Fixed"-            <> subtype texpt' (fromFormatN tf) "Expt"-            <> subtype tpercent' (fromFormatN tf) "Percent"-            <> subtype tprec' (fromFormatN tf) "Prec"-            <> subtype tdecimal' (fromFormatN tf) "Decimal"-            <> subtype tdollar' (fromFormatN tf) "Dollar"-        )-    mmap tformat' tcommas' tfixed' texpt' tpercent' tprec' tdecimal' tdollar' = case tformat' of-      "Comma" -> FormatComma tcommas'-      "Fixed" -> FormatFixed tfixed'-      "Decimal" -> FormatDecimal tdecimal'-      "Prec" -> FormatPrec tprec'-      "Expt" -> FormatExpt texpt'-      "Dollar" -> FormatDollar tdollar'-      "Percent" -> FormatPercent tpercent'-      "None" -> FormatNone-      _ -> FormatNone--repTickStyle :: (Monad m) => TickStyle -> SharedRep m TickStyle-repTickStyle cfg =-  bimap hmap mmap ts <<*>> ls <<*>> tr <<*>> te <<*>> tplaced-  where-    ts =-      dropdownSum-        takeText-        id-        (Just "Tick Style")-        ["TickNone", "TickLabels", "TickRound", "TickExact", "TickPlaced"]-        (tickStyleText cfg)-    ls =-      accordionList-        (Just "tick labels")-        "tick-style-labels"-        Nothing-        (textbox . Just)-        (defaultListLabels (length defLabels))-        defLabels-    tr =-      (,,)-        <$> sliderI (Just "Number of ticks") 0 20 1 defTn-        <*> repFormatN defTf-        <*> ( bool NoTickExtend TickExtend-                <$> checkbox (Just "extend") defExtend-            )-    te =-      (,)-        <$> sliderI (Just "Number of ticks") 0 20 1 defTn-        <*> repFormatN defTf-    tplaced =-      accordionList-        (Just "placed ticks")-        "tick-style-placed"-        Nothing-        dt-        (defaultListLabels (length dtDef))-        dtDef-    hmap ts' ls' tr' te' tplaced' =-      div_-        ( ts'-            <> subtype ls' (tickStyleText cfg) "TickLabels"-            <> subtype tr' (tickStyleText cfg) "TickRound"-            <> subtype te' (tickStyleText cfg) "TickExact"-            <> subtype tplaced' (tickStyleText cfg) "TickPlaced"-        )-    mmap ts' ls' (tri, trf, tre) (tei, tef) tplaced' = case ts' of-      "TickNone" -> TickNone-      "TickLabels" -> TickLabels ls'-      "TickRound" -> TickRound trf tri tre-      "TickExact" -> TickExact tef tei-      "TickPlaced" -> TickPlaced tplaced'-      _ -> TickNone-    dtDef = case cfg of-      TickPlaced x -> x-      _ -> zip [0 .. 5] (pack . show <$> [0 .. 5 :: Int])-    dt _ (x, l) = (,) <$> slider (Just "placement") 0 1 0.01 x <*> textbox (Just "label") l-    defLabels = case cfg of-      TickLabels xs -> xs-      _ -> replicate 5 ""-    defTn = case cfg of-      TickRound _ x _ -> x-      TickExact _ x -> x-      _ -> 8-    defTf = case cfg of-      TickRound x _ _ -> x-      TickExact x _ -> x-      _ -> FormatPrec (Just 3)-    defExtend = case cfg of-      TickRound _ _ e -> e == TickExtend-      _ -> True--repTick :: (Monad m) => Tick -> SharedRep m Tick-repTick cfg = bimap hmap Tick ts <<*>> gt <<*>> tt <<*>> lt-  where-    hmap ts' gt' tt' lt' =-      accordion_-        "acctick"-        Nothing-        [ ("style", ts'),-          ("glyph", gt'),-          ("text", tt'),-          ("line", lt')-        ]-    ts = repTickStyle (cfg ^. #tstyle)-    gt =-      maybeRep Nothing (isJust (cfg ^. #gtick)) $-        bimap-          (<>)-          (,)-          (repGlyphStyle (maybe defaultGlyphTick fst (cfg ^. #gtick)))-          <<*>> slider (Just "buffer") 0 0.05 0.001 (maybe 0.05 snd (cfg ^. #gtick))-    tt =-      maybeRep Nothing (isJust (cfg ^. #ttick)) $-        bimap-          (<>)-          (,)-          (repTextStyle (maybe defaultTextTick fst (cfg ^. #ttick)))-          <<*>> slider (Just "buffer") 0 0.05 0.001 (maybe 0.05 snd (cfg ^. #ttick))-    lt =-      maybeRep Nothing (isJust (cfg ^. #ltick)) $-        bimap-          (<>)-          (,)-          (repLineStyle (maybe defaultLineTick fst (cfg ^. #ltick)))-          <<*>> slider (Just "buffer") (-0.1) 0.1 0.001 (maybe 0 snd (cfg ^. #ltick))--repPoint ::-  (Monad m) =>-  Point (Range Double) ->-  Point Double ->-  Point Double ->-  SharedRep m (Point Double)-repPoint (Point (Range xmin xmax) (Range ymin ymax)) (Point xstep ystep) (Point x y) =-  bimap-    (<>)-    Point-    (slider (Just "x") xmin xmax xstep x)-    <<*>> slider (Just "y") ymin ymax ystep y--repPointI ::-  (Monad m) =>-  Point (Range Int) ->-  Point Int ->-  Point Int ->-  SharedRep m (Point Int)-repPointI (Point (Range xmin xmax) (Range ymin ymax)) (Point xstep ystep) (Point x y) =-  bimap-    (<>)-    Point-    (sliderI (Just "x") xmin xmax xstep x)-    <<*>> sliderI (Just "y") ymin ymax ystep y--repRect :: (Monad m) => Rect (Range Double) -> Rect Double -> Rect Double -> SharedRep m (Rect Double)-repRect (Rect (Range xmin xmax) (Range zmin zmax) (Range ymin ymax) (Range wmin wmax)) (Rect xstep zstep ystep wstep) (Rect x z y w) =-  bimap-    (\a b c d -> a <> b <> c <> d)-    Rect-    (slider (Just "x") xmin xmax xstep x)-    <<*>> slider (Just "z") zmin zmax zstep z-    <<*>> slider (Just "y") ymin ymax ystep y-    <<*>> slider (Just "w") wmin wmax wstep w--repRectOne :: (Monad m) => Rect Double -> SharedRep m (Rect Double)-repRectOne a = repRect (Rect (Range 0 1) (Range 0 1) (Range 0 1) (Range 0 1)) (Rect 0.01 0.01 0.01 0.01) a--repRounded :: (Monad m) => (Double, Double, Double) -> SharedRep m (Double, Double, Double)-repRounded (a, b, c) =-  bimap-    (\a' b' c' -> a' <> b' <> c')-    (,,)-    (slider Nothing 0 1 0.001 a)-    <<*>> slider Nothing 0 1 0.001 b-    <<*>> slider Nothing 0 1 0.001 c--repTriple :: (Monad m) => (a, a, a) -> (a -> SharedRep m a) -> SharedRep m (a, a, a)-repTriple (a, b, c) sr =-  bimap (\a' b' c' -> a' <> b' <> c') (,,) (sr a) <<*>> sr b <<*>> sr c--repGlyphShape :: (Monad m) => GlyphShape -> SharedRep m GlyphShape-repGlyphShape sh = bimap hmap mmap sha <<*>> ell <<*>> rsharp <<*>> rround <<*>> tri <<*>> p <<*>> lwidth-  where-    sha =-      dropdownSum-        takeText-        id-        Nothing-        [ "Circle",-          "Square",-          "Triangle",-          "Ellipse",-          "RectSharp",-          "RectRounded",-          "VLine",-          "HLine",-          "Path"-        ]-        (glyphText sh)-    ell = slider Nothing 0.5 2 0.01 defRatio-    rsharp = slider Nothing 0.5 2 0.01 defRatio-    rround = repRounded defRounded-    lwidth = slider (Just "width") 0.001 0.02 0.001 defLwidth-    tri =-      repTriple-        defTriangle-        ( repPoint-            (Point (Range 0 1) (Range 0 1))-            (Point 0.001 0.001)-        )-    p = textbox (Just "path") defP-    hmap sha' ell' rsharp' rround' tri' p' lwidth' =-      sha'-        <> subtype ell' (glyphText sh) "Ellipse"-        <> subtype rsharp' (glyphText sh) "RectSharp"-        <> subtype rround' (glyphText sh) "RectRounded"-        <> subtype tri' (glyphText sh) "Triangle"-        <> subtype lwidth' (glyphText sh) "VLine"-        <> subtype lwidth' (glyphText sh) "HLine"-        <> subtype p' (glyphText sh) "Path"-    mmap sha' ell' rsharp' rround' tri' p' lwidth' =-      case sha' of-        "Circle" -> CircleGlyph-        "Square" -> SquareGlyph-        "Ellipse" -> EllipseGlyph ell'-        "RectSharp" -> RectSharpGlyph rsharp'-        "RectRounded" -> (\(a, b, c) -> RectRoundedGlyph a b c) rround'-        "Triangle" -> (\(a, b, c) -> TriangleGlyph a b c) tri'-        "VLine" -> VLineGlyph lwidth'-        "HLine" -> HLineGlyph lwidth'-        "Path" -> PathGlyph p'-        _ -> CircleGlyph-    defP = case sh of-      PathGlyph p -> p-      _ -> mempty-    defRatio = case sh of-      EllipseGlyph r -> r-      RectSharpGlyph r -> r-      _ -> 1.5-    defLwidth = case sh of-      VLineGlyph r -> r-      HLineGlyph r -> r-      _ -> 0.005-    defRounded = case sh of-      RectRoundedGlyph a b c -> (a, b, c)-      _ -> (0.884, 2.7e-2, 5.0e-2)-    defTriangle = case sh of-      TriangleGlyph a b c -> (a, b, c)-      _ -> (Point 0.0 0.0, Point 1 1, Point 1 0)--repLegendOptions :: (Monad m) => LegendOptions -> SharedRep m LegendOptions-repLegendOptions initl =-  bimap-    hmap-    LegendOptions-    lsize'-    <<*>> vgap'-    <<*>> hgap'-    <<*>> ltext'-    <<*>> lmax'-    <<*>> innerPad'-    <<*>> outerPad'-    <<*>> legendFrame'-    <<*>> lplace'-    <<*>> scale'-  where-    lsize' = slider (Just "element size") 0.000 1 0.001 (initl ^. #lsize)-    hgap' = slider (Just "horizontal gap") 0.000 0.5 0.001 (initl ^. #hgap)-    vgap' = slider (Just "vertical gap") 0.000 0.5 0.001 (initl ^. #vgap)-    ltext' = repTextStyle (initl ^. #ltext)-    lmax' = sliderI (Just "max entries") 0 10 1 (initl ^. #lmax)-    innerPad' =-      slider-        (Just "inner padding")-        0-        0.2-        0.001-        (initl ^. #innerPad)-    outerPad' =-      slider-        (Just "outer padding")-        0-        0.2-        0.001-        (initl ^. #outerPad)-    legendFrame' =-      maybeRep-        (Just "frame")-        (isJust (initl ^. #legendFrame))-        (repRectStyle (fromMaybe defaultSvgFrame (initl ^. #legendFrame)))-    lplace' = repPlace (initl ^. #lplace)-    scale' = slider (Just "scale") 0.01 1 0.001 (initl ^. #lscale)-    hmap lsize'' vgap'' hgap'' ltext'' lmax'' innerPad'' outerPad'' legendFrame'' lplace'' scale'' =-      accordion_-        "accleg"-        Nothing-        [ ("Scale", scale'' <> lsize''),-          ("Pads", innerPad'' <> outerPad'' <> vgap'' <> hgap''),-          ("Text", ltext''),-          ("Frame", legendFrame''),-          ("Place", lplace''),-          ("Max Elements", lmax'')-        ]--repChartsWithSharedData ::-  (Monad m) =>-  SvgOptions ->-  HudOptions ->-  Int ->-  [Chart Double] ->-  ([[XY Double]] -> SharedRep m [[XY Double]]) ->-  SharedRep m (Text, Text)-repChartsWithSharedData css' hc' maxcs' cs' sxys =-  bimap-    hmap-    mmap-    cssr-    <<*>> annsr-    <<*>> sxys xys'-    <<*>> hr-    <<*>> debugFlags-  where-    xys' = view #xys <$> cs'-    anns' = view #annotation <$> cs'-    hr =-      repHudOptions-        2-        3-        5-        defaultAxisOptions-        (defaultTitle "default")-        (maybe defaultLegendOptions fst (hc' ^. #hudLegend))-        (maybe [] snd (hc' ^. #hudLegend))-        BlankA-        ""-        hc'-    cssr = repSvgOptions css'-    annsr =-      listRep-        (Just "Annotations")-        "annz"-        (checkbox Nothing)-        repAnnotation-        maxcs'-        BlankA-        anns'-    mmap css'' ann' d' h' debug' =-      let ch = zipWith Chart ann' d'-       in ( renderHudOptionsChart css'' h' [] ch,-            debugHtml debug' css'' h' ch-          )-    hmap css'' ann' _ h' debug' =-      accordion_-        "acca"-        Nothing-        [ ("Svg", css''),-          ("Annotations", ann'),-          ("Hud", h'),-          ("Debug", debug')-        ]--repChartsWithStaticData ::-  (Monad m) =>-  SvgOptions ->-  HudOptions ->-  Int ->-  [Chart Double] ->-  SharedRep m (Text, Text)-repChartsWithStaticData css' hc' maxcs' cs' =-  repChartsWithSharedData css' hc' maxcs' cs' (bipure mempty)--debugHtml :: (Bool, Bool, Bool) -> SvgOptions -> HudOptions -> [Chart Double] -> Text-debugHtml debug css hc cs =-  bool-    mempty-    ( mconcat $-        (\x -> "<p style='white-space: pre'>" <> x <> "</p>")-          <$> [ "<h2>config values</h2>",-                pShow' css,-                pShow' hc-              ]-    )-    ((\(a, _, _) -> a) debug)-    <> bool-      mempty-      ( mconcat-          [ "<h2>chart svg</h2>",-            "<xmp>",-            renderHudOptionsChart css hc [] cs,-            "</xmp>"-          ]-      )-      ((\(_, a, _) -> a) debug)-    <> bool-      mempty-      ( mconcat $-          (\x -> "<p style='white-space: pre'>" <> x <> "</p>")-            <$> [ "<h2>chart value</h2>",-                  pack $ show cs-                ]-      )-      ((\(_, _, a) -> a) debug)--debugFlags :: (Monad m) => SharedRepF m (Html ()) (Bool, Bool, Bool)-debugFlags =-  bimap-    (\a b c -> a <> b <> c)-    (,,)-    (checkbox (Just "show hudOptions values") False)-    <<*>> checkbox (Just "show chart svg") False-    <<*>> checkbox (Just "show Chart values") False--repHudOptionsDefault :: Monad m => HudOptions -> SharedRep m HudOptions-repHudOptionsDefault hc =-  repHudOptions-    2-    3-    5-    defaultAxisOptions-    (defaultTitle "default")-    defaultLegendOptions-    []-    BlankA-    ""-    hc--repBarOptions ::-  (Monad m) =>-  Int ->-  RectStyle ->-  TextStyle ->-  BarOptions ->-  SharedRep m BarOptions-repBarOptions nrows defrs defts cfg =-  bimap hmap BarOptions rs-    <<*>> ts-    <<*>> og-    <<*>> ig-    <<*>> tg-    <<*>> tgn-    <<*>> dv-    <<*>> fn-    <<*>> av-    <<*>> or-    <<*>> ho-  where-    rs =-      listRep-        (Just "bar styles")-        "rs"-        (checkbox Nothing)-        repRectStyle-        nrows-        defrs-        (cfg ^. #barRectStyles)-    ts =-      listRep-        (Just "text styles")-        "ts"-        (checkbox Nothing)-        repTextStyle-        nrows-        defts-        (cfg ^. #barTextStyles)-    og = slider (Just "outer gap") 0.0 1.0 0.001 (cfg ^. #outerGap)-    ig = slider (Just "inner gap") (-1.0) 1 0.001 (cfg ^. #innerGap)-    tg = slider (Just "text gap") (-0.05) 0.05 0.001 (cfg ^. #textGap)-    tgn = slider (Just "neg. text gap") 0 0.1 0.001 (cfg ^. #textGapNegative)-    dv = checkbox (Just "display values") (cfg ^. #displayValues)-    fn = repFormatN (cfg ^. #valueFormatN)-    av = checkbox (Just "accumulate values") (cfg ^. #accumulateValues)-    or = repDirection (cfg ^. #barOrientation)-    ho =-      repHudOptions-        2-        3-        5-        defaultAxisOptions-        (defaultTitle "bar options")-        (maybe defaultLegendOptions fst (cfg ^. #barHudOptions . #hudLegend))-        (maybe [] snd (cfg ^. #barHudOptions . #hudLegend))-        BlankA-        ""-        (cfg ^. #barHudOptions)-    hmap rs' ts' og' ig' tg' tgn' dv' fn' av' or' ho' =-      accordion_-        "accbo"-        Nothing-        [ ("Bar Styles", rs'),-          ("Text Styles", ts'),-          ("Gaps", og' <> ig' <> tg' <> tgn'),-          ("Style", dv' <> fn' <> av' <> or'),-          ("Hud", ho')-        ]--repBarData ::-  (Monad m) =>-  BarData ->-  SharedRep m BarData-repBarData initbd =-  bimap hmap BarData bd-    <<*>> rl-    <<*>> cl-  where-    rl =-      maybeRep-        Nothing-        (isJust (initbd ^. #barRowLabels))-        ( either (const []) id-            <$> readTextbox (Just "row labels") (fromMaybe [] (initbd ^. #barRowLabels))-        )-    cl =-      maybeRep-        Nothing-        (isJust (initbd ^. #barColumnLabels))-        ( either (const []) id-            <$> readTextbox (Just "column labels") (fromMaybe [] (initbd ^. #barColumnLabels))-        )-    bd =-      either (const (pure [])) id-        <$> readTextbox (Just "bar data") (initbd ^. #barData)-    hmap rl' cl' bd' = rl' <> cl' <> bd'--repPixelOptions ::-  (Monad m) =>-  PixelOptions ->-  SharedRep m PixelOptions-repPixelOptions cfg =-  bimap hmap PixelOptions ps-    <<*>> pg-    <<*>> pr-  where-    ps = repPixelStyle (cfg ^. #poStyle)-    pg = repPointI (Point (Range 1 100) (Range 1 100)) (Point 1 1) (cfg ^. #poGrain)-    pr = repRect (Rect (Range 0 5) (Range 0 5) (Range 0 5) (Range 0 5)) (Rect 0.01 0.01 0.01 0.01) (cfg ^. #poRange)-    hmap ps' pg' pr' =-      accordion_-        "accpixel"-        Nothing-        [ ("Grain", pg'),-          ("Range", pr'),-          ("Style", ps')-        ]--repPixelLegendOptions ::-  (Monad m) =>-  PixelLegendOptions ->-  SharedRep m PixelLegendOptions-repPixelLegendOptions cfg =-  bimap hmap PixelLegendOptions ps-    <<*>> pt-    <<*>> pw-    <<*>> pa-    <<*>> pl-  where-    ps = repPixelStyle (cfg ^. #ploStyle)-    pt = textbox (Just "title") (cfg ^. #ploTitle)-    pw = slider (Just "width") 0.0 0.3 0.001 (cfg ^. #ploWidth)-    pa = repAxisOptions (cfg ^. #ploAxisOptions)-    pl = repLegendOptions (cfg ^. #ploLegendOptions)-    hmap ps' pt' pw' pa' pl' =-      accordion_-        "accplo"-        Nothing-        [ ("Style", ps'),-          ("Title", pt'),-          ("Width", pw'),-          ("Axis", pa'),-          ("Legend", pl')-        ]--repBarChart :: (Monad m) => SvgOptions -> BarData -> BarOptions -> SharedRep m (Text, Text)-repBarChart css bd bo = bimap hmap mmap rcss <<*>> rbd <<*>> rbo <<*>> debugFlags-  where-    rcss = repSvgOptions css-    rbo = repBarOptions 5 defaultRectStyle defaultTextStyle bo-    rbd = repBarData bd-    barchartsvg css' bd' bo' =-      let (hc', cs') = barChart bo' bd'-       in renderHudOptionsChart css' hc' [] cs'-    mmap css' bd' bo' debug =-      ( barchartsvg css' bd' bo',-        debugHtml debug css' (bo' ^. #barHudOptions) (bars bo' bd')-      )-    hmap css' bd' bo' debug =-      accordion_-        "accbc"-        Nothing-        [ ("Svg", css'),-          ("Bar Data", bd'),-          ("Bar Options", bo'),-          ("Debug", debug)-        ]--repPixelChart ::-  (Monad m) =>-  (SvgOptions, PixelOptions, HudOptions, PixelLegendOptions, Point Double -> Double) ->-  SharedRep m (Text, Text)-repPixelChart (css, po, hc, plo, f) = bimap hmap mmap rcss <<*>> rpo <<*>> rhc <<*>> rplo <<*>> debugFlags-  where-    rcss = repSvgOptions css-    rpo = repPixelOptions po-    rhc = repHudOptionsDefault hc-    rplo = repPixelLegendOptions plo-    mmap rcss' rpo' rhc' rplo' debug =-      let (cs, hs) = pixelfl f rpo' rplo'-       in ( renderHudOptionsChart rcss' rhc' hs cs,-            debugHtml debug rcss' rhc' []-          )-    hmap rcss' rpo' rhc' rplo' debug =-      accordion_-        "accpc"-        Nothing-        [ ("Svg", rcss'),-          ("Hud", rhc'),-          ("Pixel Options", rpo'),-          ("Pixel Legend Options", rplo'),-          ("Debug", debug)-        ]--repNoData :: (Monad m) => SvgOptions -> Annotation -> HudOptions -> SharedRep m (Text, Text)-repNoData css ann hc =-  repChartsWithStaticData css hc 10 [Chart ann [one]]
− src/Chart/Pixel.hs
@@ -1,163 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}---- | pixel charts------ Opting for a Point or a Rect as concrete data elements that make up an individual chart leaves us with a bit more work to construct a Pixel chart, where colors represent detailed data-module Chart.Pixel-  ( PixelOptions (..),-    defaultPixelOptions,-    pixels,-    pixelate,-    pixelf,-    pixelfl,-    pixelLegendChart,-    PixelLegendOptions (..),-    defaultPixelLegendOptions,-    isHori,-    makePixelTick,-  )-where--import Chart.Types-import Control.Lens-import Data.Colour-import Data.FormatN-import Data.Generics.Labels ()-import NumHask.Prelude-import NumHask.Space--data PixelOptions-  = PixelOptions-      { poStyle :: PixelStyle,-        poGrain :: Point Int,-        poRange :: Rect Double-      }-  deriving (Show, Eq, Generic)--defaultPixelOptions :: PixelOptions-defaultPixelOptions =-  PixelOptions defaultPixelStyle (Point 10 10) one---- | pixel elements-data PixelData-  = PixelData-      { pixelRect :: Rect Double,-        pixelColor :: Colour-      }-  deriving (Show, Eq, Generic)---- | pixel chart without any hud trimmings-pixels :: RectStyle -> [PixelData] -> [Chart Double]-pixels rs ps =-  ( \(PixelData r c) ->-      Chart-        (RectA (rs & #color .~ c))-        [RectXY r]-  )-    <$> ps---- | create pixel data from a function on a Point-pixelate ::-  (Point Double -> Double) ->-  Rect Double ->-  Grid (Rect Double) ->-  Colour ->-  Colour ->-  ([PixelData], Range Double)-pixelate f r g c0 c1 = ((\(x, y) -> let c = blend y c0 c1 in PixelData x c) <$> ps', space1 rs)-  where-    ps = gridF f r g-    rs = realToFrac . snd <$> ps-    rs' = project (space1 rs :: Range Double) (Range 0 1) <$> rs-    ps' = zip (fst <$> ps) rs'---- | create a pixel chart from a function-pixelf :: (Point Double -> Double) -> PixelOptions -> ([Chart Double], Range Double)-pixelf f cfg =-  first (pixels (cfg ^. #poStyle . #pixelRectStyle)) $-    pixelate-      f-      (cfg ^. #poRange)-      (cfg ^. #poGrain)-      (cfg ^. #poStyle . #pixelColorMin)-      (cfg ^. #poStyle . #pixelColorMax)--pixelfl :: (Point Double -> Double) -> PixelOptions -> PixelLegendOptions -> ([Chart Double], [Hud Double])-pixelfl f po plo = (cs, [legendHud (plo ^. #ploLegendOptions) (pixelLegendChart dr plo)])-  where-    (cs, dr) = pixelf f po--data PixelLegendOptions-  = PixelLegendOptions-      {ploStyle :: PixelStyle, ploTitle :: Text, ploWidth :: Double, ploAxisOptions :: AxisOptions, ploLegendOptions :: LegendOptions}-  deriving (Eq, Show, Generic)--pixelAxisOptions :: AxisOptions-pixelAxisOptions =-  AxisOptions-    Nothing-    Nothing-    ( Tick-        (TickRound (FormatPrec (Just 3)) 4 NoTickExtend)-        (Just (defaultGlyphTick & #color .~ black & #shape .~ VLineGlyph 0.005, 0.01))-        (Just (defaultTextTick, 0.03))-        Nothing-    )-    PlaceRight--defaultPixelLegendOptions :: Text -> PixelLegendOptions-defaultPixelLegendOptions t =-  PixelLegendOptions defaultPixelStyle t 0.05 pixelAxisOptions pixelLegendOptions--pixelLegendOptions :: LegendOptions-pixelLegendOptions =-  defaultLegendOptions-    & #lplace .~ PlaceRight-    & #lscale .~ 0.7-    & #lsize .~ 0.5-    & #vgap .~ 0.05-    & #hgap .~ 0.01-    & #innerPad .~ 0.05-    & #outerPad .~ 0.02-    & #ltext . #hsize .~ 0.5--pixelLegendChart :: Range Double -> PixelLegendOptions -> [Chart Double]-pixelLegendChart dataRange l =-  padChart (l ^. #ploLegendOptions . #outerPad)-    . maybe id (\x -> frameChart x (l ^. #ploLegendOptions . #innerPad)) (l ^. #ploLegendOptions . #legendFrame)-    $ hs-  where-    (Range x0 x1) = dataRange-    a = makePixelTick l pchart-    pchart-      | l ^. #ploLegendOptions . #lplace == PlaceBottom-          || l ^. #ploLegendOptions . #lplace == PlaceTop =-        Chart (PixelA (l ^. #ploStyle & #pixelGradient .~ 0)) [R x0 x1 0 (l ^. #ploWidth)]-      | otherwise =-        Chart (PixelA (l ^. #ploStyle & #pixelGradient .~ (pi / 2))) [R 0 (l ^. #ploWidth) x0 x1]-    t = Chart (TextA (l ^. #ploLegendOptions . #ltext & #anchor .~ AnchorStart) [l ^. #ploTitle]) [zero]-    hs = vert (l ^. #ploLegendOptions . #vgap) [a, [t]]--isHori :: PixelLegendOptions -> Bool-isHori l =-  l ^. #ploLegendOptions . #lplace == PlaceBottom-    || l ^. #ploLegendOptions . #lplace == PlaceTop--makePixelTick :: PixelLegendOptions -> Chart Double -> [Chart Double]-makePixelTick l pchart = phud-  where-    r = fromMaybe one (styleBox pchart)-    r' = bool (Rect 0 (l ^. #ploWidth) 0 (l ^. #ploLegendOptions . #lsize)) (Rect 0 (l ^. #ploLegendOptions . #lsize) 0 (l ^. #ploWidth)) (isHori l)-    (hs, _) =-      makeHud-        r-        ( mempty & #hudAxes-            .~ [ l ^. #ploAxisOptions-                   & #place .~ bool PlaceRight PlaceBottom (isHori l)-               ]-        )-    phud = runHudWith r' r hs [pchart]
+ src/Chart/Primitive.hs view
@@ -0,0 +1,630 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RebindableSyntax #-}++-- | Base 'Chart' and 'ChartTree' types and support+module Chart.Primitive+  ( -- * Charts+    Chart (..),+    ChartData (..),+    rectData',+    lineData',+    glyphData',+    textData',+    pathData',+    blankData',+    pattern RectChart,+    pattern LineChart,+    pattern GlyphChart,+    pattern TextChart,+    pattern PathChart,+    pattern BlankChart,+    pattern LineChart1,+    blankChart1,+    ChartTree (..),+    tree',+    chart',+    charts',+    named,+    unnamed,+    renamed,+    rename,+    blank,+    group,+    filterChartTree,+    Orientation (..),+    Stacked (..),+    ChartAspect (..),++    -- * Boxes+    -- $boxes+    box,+    sbox,+    projectWith,+    projectChartDataWith,+    moveChartData,+    moveChart,+    scaleChart,+    scaleChartData,+    colourStyle,+    projectChartTree,+    boxes,+    box',+    styleBoxes,+    styleBox',+    safeBox',+    safeStyleBox',++    -- * Combinators+    vert,+    hori,+    stack,+    besideChart,+    frameChart,+    isEmptyChart,+    padChart,+    rectangularize,+    glyphize,++    -- * Relative position+    Align (..),+    Place (..),+    flipPlace,+    beside,+  )+where++import Chart.Data+import Chart.Style+import Data.Bifunctor+import Data.Bool+import Data.Colour+import Data.Data+import Data.Foldable+import Data.Maybe+import Data.Path+import Data.Text (Text)+import Data.Tree+import GHC.Generics+import NumHask.Prelude+import NumHask.Space+import Optics.Core++-- $setup+--+-- >>> :m -Prelude+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core+-- >>> import NumHask.Prelude+-- >>> import Prelude qualified as P+-- >>> let r = RectChart defaultRectStyle [one]++-- | A product type consisting of a 'Style', which is the stylistic manifestation of chart data, and 'ChartData' representing where data is located on the chart canvas (an xy-plane).+--+-- A simple example is:+--+-- >>> Chart defaultRectStyle (RectData [one])+-- Chart {chartStyle = Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, chartData = RectData [Rect (-0.5) 0.5 (-0.5) 0.5]}+--+-- Using the defaults, this chart is rendered as:+--+-- > writeChartOptions "other/unit.hs" $ mempty & #hudOptions .~ defaultHudOptions & #chartTree .~ unnamed [r]+--+-- ![unit example](other/unit.svg)+data Chart+  = Chart+  { chartStyle :: Style,+    chartData :: ChartData+  }+  deriving (Eq, Show, Generic, Data)++-- | Data of a 'Chart'+--+-- A sum type representing the data behind six different types of chart:+--+-- - 'RectData': a list of rectangles in the XY-domain. For example, a @'Rect' 0 1 0 1@ is the set of points on the XY Plane bounded by (0,0), (0,1), (1,0) & (1,1). Much of the library is built on 'Rect' Doubles.+-- - 'LineData': a list of (list of points) which represent connected straight lines. ['Point' 0 0, 'Point' 1 1, 'Point' 2 2, 'Point' 3 3] is an example; three lines connected up to form a line from (0,0) to (3,3).+-- - 'GlyphData': a list of points to draw a 'GlyphShape'.+-- - 'TextData': A list of Text,Point tuples representing text centered at a 'Point' in XY space.+-- - 'PathData': specification of curvilinear paths using the SVG standards.+-- - 'BlankData': a rectangular space that has no visual representation.+data ChartData+  = -- | List of rectangles+    RectData [Rect Double]+  | -- | List of (List of Points)+    LineData [[Point Double]]+  | -- | List of Points (to place the 'GlyphShape')+    GlyphData [Point Double]+  | -- | List of text and point to place it.+    TextData [(Text, Point Double)]+  | -- | List of paths+    PathData [PathData Double]+  | -- | List of rectangles with no 'Style' representation+    BlankData [Rect Double]+  deriving (Eq, Show, Generic, Data)++-- | RectData partial lens+rectData' :: Lens' ChartData (Maybe [Rect Double])+rectData' =+  lens getData setData+  where+    getData (RectData xs) = Just xs+    getData _ = Nothing+    setData (RectData _) (Just xs) = RectData xs+    setData cd _ = cd++-- | LineData partial lens+lineData' :: Lens' ChartData (Maybe [[Point Double]])+lineData' =+  lens getData setData+  where+    getData (LineData xs) = Just xs+    getData _ = Nothing+    setData (LineData _) (Just xs) = LineData xs+    setData cd _ = cd++-- | GlyphData partial lens+glyphData' :: Lens' ChartData (Maybe [Point Double])+glyphData' =+  lens getData setData+  where+    getData (GlyphData xs) = Just xs+    getData _ = Nothing+    setData (GlyphData _) (Just xs) = GlyphData xs+    setData cd _ = cd++-- | TextData partial lens+textData' :: Lens' ChartData (Maybe [(Text, Point Double)])+textData' =+  lens getData setData+  where+    getData (TextData xs) = Just xs+    getData _ = Nothing+    setData (TextData _) (Just xs) = TextData xs+    setData cd _ = cd++-- | PathData partial lens+pathData' :: Lens' ChartData (Maybe [PathData Double])+pathData' =+  lens getData setData+  where+    getData (PathData xs) = Just xs+    getData _ = Nothing+    setData (PathData _) (Just xs) = PathData xs+    setData cd _ = cd++-- | BlankData partial lens+blankData' :: Lens' ChartData (Maybe [Rect Double])+blankData' =+  lens getData setData+  where+    getData (BlankData xs) = Just xs+    getData _ = Nothing+    setData (BlankData _) (Just xs) = BlankData xs+    setData cd _ = cd++-- | pattern of a Chart with RectData+pattern RectChart :: Style -> [Rect Double] -> Chart+pattern RectChart s xs = Chart s (RectData xs)++{-# COMPLETE RectChart #-}++-- | pattern of a Chart with LineData+pattern LineChart :: Style -> [[Point Double]] -> Chart+pattern LineChart s xss = Chart s (LineData xss)++{-# COMPLETE LineChart #-}++-- | pattern of a Chart with a singleton LineData+pattern LineChart1 :: Style -> [Point Double] -> Chart+pattern LineChart1 s xs = Chart s (LineData [xs])++{-# COMPLETE LineChart1 #-}++-- | pattern of a Chart with GlyphData+pattern GlyphChart :: Style -> [Point Double] -> Chart+pattern GlyphChart s xs = Chart s (GlyphData xs)++{-# COMPLETE GlyphChart #-}++-- | pattern of a Chart with TextData+pattern TextChart :: Style -> [(Text, Point Double)] -> Chart+pattern TextChart s xs = Chart s (TextData xs)++{-# COMPLETE TextChart #-}++-- | pattern of a Chart with PathData+pattern PathChart :: Style -> [PathData Double] -> Chart+pattern PathChart s xs = Chart s (PathData xs)++{-# COMPLETE PathChart #-}++-- | pattern of a Chart with BlankData+pattern BlankChart :: Style -> [Rect Double] -> Chart+pattern BlankChart s xs = Chart s (BlankData xs)++{-# COMPLETE BlankChart #-}++-- | Create a blank Chart with a single Rect+blankChart1 :: Rect Double -> Chart+blankChart1 r = Chart defaultStyle (BlankData [r])++-- | A group of charts represented by a 'Tree' of chart lists with labelled branches. The labelling is particularly useful downstream, when groupings become grouped SVG elements with classes or ids.+newtype ChartTree+  = ChartTree {tree :: Tree (Maybe Text, [Chart])}+  deriving (Eq, Show, Generic, Data)++-- | Group a list of trees into a new tree.+group :: Maybe Text -> [ChartTree] -> ChartTree+group name cs = ChartTree $ Node (name, []) (tree <$> cs)++instance Semigroup ChartTree where+  (<>) (ChartTree x@(Node (n, cs) xs)) (ChartTree x'@(Node (n', cs') xs')) =+    case (n, n') of+      (Nothing, Nothing) -> ChartTree $ Node (Nothing, cs <> cs') (xs <> xs')+      _ -> ChartTree $ Node (Nothing, []) [x, x']++instance Monoid ChartTree where+  mempty = ChartTree $ Node (Nothing, []) []++-- | Apply a filter to a 'ChartTree'+filterChartTree :: (Chart -> Bool) -> ChartTree -> ChartTree+filterChartTree p (ChartTree (Node (a, cs) xs)) =+  ChartTree (Node (a, mapMaybe rem' cs) (tree . filterChartTree p . ChartTree <$> xs))+  where+    rem' x = bool Nothing (Just x) (p x)++-- | Lens between ChartTree and the underlying Tree representation+tree' :: Iso' ChartTree (Tree (Maybe Text, [Chart]))+tree' = iso tree ChartTree++-- | A traversal of each chart list in a tree.+charts' :: Traversal' ChartTree [Chart]+charts' = tree' % traversed % _2++-- | A traversal of each chart in a tree.+chart' :: Traversal' ChartTree Chart+chart' = tree' % traversed % _2 % traversed++-- | Convert a chart list to a tree, adding a specific text label.+named :: Text -> [Chart] -> ChartTree+named l cs = ChartTree $ Node (Just l, cs) []++-- | Convert a chart list to a tree, with no text label.+unnamed :: [Chart] -> ChartTree+unnamed cs = ChartTree $ Node (Nothing, cs) []++-- | Rename a ChartTree, removing descendent names+renamed :: Text -> ChartTree -> ChartTree+renamed l ct = named l $ foldOf charts' ct++-- | Rename a top-level label in a tree.+rename :: Maybe Text -> ChartTree -> ChartTree+rename l (ChartTree (Node (_, cs) xs)) = ChartTree (Node (l, cs) xs)++-- | A tree with no charts and no label.+blank :: Rect Double -> ChartTree+blank r = unnamed [Chart defaultStyle (BlankData [r])]++-- $boxes+--+-- Library functionality (rescaling, combining charts, working out axes and generally putting charts together) is driven by a box model. A box is a rectangular space that bounds chart elements.++-- | The 'Rect' which encloses the data elements of the chart. /Bounding box/ is a synonym.+--+-- >>> box (chartData r)+-- Just Rect (-0.5) 0.5 (-0.5) 0.5+box :: ChartData -> Maybe (Rect Double)+box (RectData a) = foldRect a+box (TextData a) = space1 $ snd <$> a+box (LineData a) = space1 $ mconcat a+box (GlyphData a) = space1 a+box (PathData a) = pathBoxes a+box (BlankData a) = foldRect a++-- | The bounding box for a chart including both data and style elements.+--+-- >>> sbox r+-- Just Rect (-0.505) 0.505 (-0.505) 0.505+--+-- In the above example, the border of the rectangle adds an extra 0.1 to the height and width of the bounding box enclosing the chart.+sbox :: Chart -> Maybe (Rect Double)+sbox (Chart s (RectData a)) = foldRect $ padRect (0.5 * view #borderSize s) <$> a+sbox (Chart s (TextData a)) = foldRect $ uncurry (styleBoxText s) <$> a+sbox (Chart s (LineData a)) = padRect (0.5 * view #size s) <$> (space1 $ mconcat a)+sbox (Chart s (GlyphData a)) = foldRect $ (\x -> addPoint x (styleBoxGlyph s)) <$> a+sbox (Chart s (PathData a)) = padRect (0.5 * view #borderSize s) <$> pathBoxes a+sbox (Chart _ (BlankData a)) = foldRect a++-- | projects a Chart to a new space from an old rectangular space, preserving linear metric structure.+--+-- >>> projectWith (fmap (2*) one) one r+-- Chart {chartStyle = Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, chartData = RectData [Rect (-1.0) 1.0 (-1.0) 1.0]}+projectWith :: Rect Double -> Rect Double -> Chart -> Chart+projectWith new old c = c & over #chartStyle (scaleStyle (scaleRatio (view (#chartStyle % #scaleP) c) new old)) & over #chartData (projectChartDataWith new old)++-- | Projects 'ChartData' from an old space to a new space.+projectChartDataWith :: Rect Double -> Rect Double -> ChartData -> ChartData+projectChartDataWith new old (RectData a) = RectData (projectOnR new old <$> a)+projectChartDataWith new old (TextData a) = TextData (second (projectOnP new old) <$> a)+projectChartDataWith new old (LineData a) = LineData (fmap (projectOnP new old) <$> a)+projectChartDataWith new old (GlyphData a) = GlyphData (projectOnP new old <$> a)+projectChartDataWith new old (PathData a) = PathData (projectPaths new old a)+projectChartDataWith new old (BlankData a) = BlankData (projectOnR new old <$> a)++-- | Move 'ChartData' by a 'Point'+moveChartData :: Point Double -> ChartData -> ChartData+moveChartData p (RectData a) = RectData (addPoint p <$> a)+moveChartData p (TextData a) = TextData (second (addp p) <$> a)+moveChartData p (LineData a) = LineData (fmap (addp p) <$> a)+moveChartData p (GlyphData a) = GlyphData (addp p <$> a)+moveChartData p (PathData a) = PathData (movePath p <$> a)+moveChartData p (BlankData a) = BlankData (addPoint p <$> a)++-- | Move a chart.+moveChart :: Point Double -> Chart -> Chart+moveChart p c = c & over #chartData (moveChartData p)++-- | Scale 'ChartData'+scaleChartData :: Double -> ChartData -> ChartData+scaleChartData p (RectData a) =+  RectData (fmap (fmap (* p)) a)+scaleChartData p (LineData a) =+  LineData (fmap (fmap (fmap (* p))) a)+scaleChartData p (TextData a) =+  TextData (fmap (second (fmap (* p))) a)+scaleChartData p (GlyphData a) =+  GlyphData (fmap (fmap (* p)) a)+scaleChartData p (PathData a) =+  PathData (scalePath p <$> a)+scaleChartData p (BlankData a) =+  BlankData (fmap (fmap (* p)) a)++-- | Scale a chart (effecting both the chart data and the style, if /#style % #scaleP/ is a scaling value).+scaleChart :: Double -> Chart -> Chart+scaleChart p c = c & over #chartData (scaleChartData p) & over #chartStyle (bool (scaleStyle p) id (view (#chartStyle % #scaleP) c == NoScaleP))++-- | Modify chart colors, applying to both border and main colors.+colourStyle :: (Colour -> Colour) -> Style -> Style+colourStyle f s = s & over #color f & over #borderColor f++-- | Project a chart tree to a new bounding box, guarding against singleton bounds.+projectChartTree :: Rect Double -> ChartTree -> ChartTree+projectChartTree new ct = case view styleBox' ct of+  Nothing -> ct+  Just b -> ct & over charts' (fmap (projectWith new b))++-- | Compute the bounding box of a list of charts, not including style allowances.+boxes :: [Chart] -> Maybe (Rect Double)+boxes cs = foldRect $ mconcat $ (maybeToList . box) . chartData <$> cs++box_ :: ChartTree -> Maybe (Rect Double)+box_ = boxes . foldOf charts'++rebox_ :: ChartTree -> Maybe (Rect Double) -> ChartTree+rebox_ cs r =+  cs+    & over chart' (fromMaybe id $ projectWith <$> r <*> box_ cs)++-- | Lens between a ChartTree and its bounding box.+box' :: Lens' ChartTree (Maybe (Rect Double))+box' =+  lens box_ rebox_++-- | Compute the bounding box of the data and style elements contained in a list of charts.+styleBoxes :: [Chart] -> Maybe (Rect Double)+styleBoxes cs = foldRect $ mconcat $ maybeToList . sbox <$> cs++styleBox_ :: ChartTree -> Maybe (Rect Double)+styleBox_ = styleBoxes . foldOf charts'++styleRebox_ :: ChartTree -> Maybe (Rect Double) -> ChartTree+styleRebox_ cs r =+  cs+    & over chart' (fromMaybe id $ projectWith <$> r <*> styleBox_ cs)++-- | Lens between a style bounding box and a ChartTree tree.+--+-- Note that a round trip may be only approximately isomorphic ie+--+-- > forall c r. \c -> view styleBox' . set styleBox' r c ~= r+styleBox' :: Lens' ChartTree (Maybe (Rect Double))+styleBox' =+  lens styleBox_ styleRebox_++-- | Getter of a ChartTree bounding box, including style, with singleton dimension guards, defaulting to one:+safeStyleBox' :: Getter ChartTree (Rect Double)+safeStyleBox' = Optics.Core.to (safeBox_ styleBox')++-- | Getter of a ChartTree bounding box, excluding style, with singleton dimension guards, defaulting to one:+safeBox' :: Getter ChartTree (Rect Double)+safeBox' = Optics.Core.to (safeBox_ box')++safeBox_ :: Lens' ChartTree (Maybe (Rect Double)) -> ChartTree -> Rect Double+safeBox_ l ct+  | b == Nothing || (Just True == fmap isSingleton b) = maybe one padSingletons (view l ct)+  | otherwise = fromMaybe one b+  where+    b = view l ct++-- | Create a frame over some charts with (additive) padding.+--+-- >>> frameChart defaultRectStyle 0.1 (unnamed [BlankChart defaultStyle []])+-- ChartTree {tree = Node {rootLabel = (Just "frame",[Chart {chartStyle = Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}, chartData = RectData []}]), subForest = []}}+frameChart :: Style -> Double -> ChartTree -> ChartTree+frameChart rs p cs = named "frame" [Chart rs (RectData (maybeToList (padRect p <$> view styleBox' cs)))]++-- | Additive padding, framing or buffering for a chart list.+padChart :: Double -> ChartTree -> ChartTree+padChart p ct = named "padding" [Chart defaultStyle (BlankData (maybeToList (padRect p <$> view styleBox' ct)))]++-- | Whether a chart is empty of data to be represented.+isEmptyChart :: ChartData -> Bool+isEmptyChart (RectData []) = True+isEmptyChart (LineData []) = True+isEmptyChart (GlyphData []) = True+isEmptyChart (TextData []) = True+isEmptyChart (PathData []) = True+isEmptyChart (BlankData _) = True+isEmptyChart _ = False++-- | Horizontally stack a list of trees (proceeding to the right), at the supplied Align and with the supplied gap intercalated.+hori :: Align -> Double -> [ChartTree] -> ChartTree+hori align gap cs = foldl' step mempty (reverse cs)+  where+    step x c = x <> over chart' (moveChart (Point (movex x c) (aligny x - aligny c))) c+    movex x c =+      maybe+        zero+        (-gap +)+        ( (-)+            <$> (rx <$> view styleBox' x)+            <*> (rz <$> view styleBox' c)+        )+    aligny x = case foldOf charts' x of+      [] -> zero+      xs -> case align of+        AlignLeft -> maybe zero (\(Rect _ _ y' _) -> y') (styleBoxes xs)+        AlignRight -> maybe zero (\(Rect _ _ _ y') -> y') (styleBoxes xs)+        AlignMid -> maybe zero (\(Rect _ _ y' w') -> (y' + w') / 2) (styleBoxes xs)+        NoAlign -> zero++-- | Vertically stack a list of trees (proceeding upwards), at the supplied Align and with the supplied gap intercalated.+vert :: Align -> Double -> [ChartTree] -> ChartTree+vert align gap cs = foldl' step mempty (reverse cs)+  where+    step x c = x <> over chart' (moveChart (Point (alignx x - alignx c) (movey x c))) c+    movey x c =+      maybe+        zero+        (gap +)+        ( (-)+            <$> (rw <$> view styleBox' x)+            <*> (ry <$> view styleBox' c)+        )+    alignx x = case foldOf charts' x of+      [] -> zero+      xs -> case align of+        AlignLeft -> maybe zero (\(Rect x' _ _ _) -> x') (styleBoxes xs)+        AlignRight -> maybe zero (\(Rect _ x' _ _) -> x') (styleBoxes xs)+        AlignMid -> maybe zero (\(Rect x' z' _ _) -> (x' + z') / 2) (styleBoxes xs)+        NoAlign -> zero++-- | Stack a list of tree charts horizontally, then vertically (proceeding downwards which is opposite to the usual coordinate reference system but intuitively the way people read charts)+stack :: Int -> Align -> Align -> Double -> [ChartTree] -> ChartTree+stack n alignV alignH gap cs = vert alignV gap (hori alignH gap <$> group' cs [])+  where+    group' [] acc = reverse acc+    group' x acc = group' (drop n x) (take n x : acc)++-- | Place a ChartTree beside a 'Rect'.+besideChart :: Place -> Double -> Double -> Rect Double -> ChartTree -> ChartTree+besideChart place anc buff cb ct = maybe ct (\b -> ct & over chart' (moveChart (beside place anc buff cb b))) (view styleBox' ct)++-- | Make a new chart tree out of the bounding boxes of a chart tree.+--+-- This includes any extra space for style elements.+rectangularize :: Style -> ChartTree -> ChartTree+rectangularize r ct = group (Just "rectangularize") [over chart' (\c -> set #chartStyle r $ set #chartData (rectangularize_ c) c) ct]++rectangularize_ :: Chart -> ChartData+rectangularize_ c = RectData (maybeToList $ sbox c)++-- | Make a new chart tree out of the data points of a chart tree, using the supplied style (for glyphs).+glyphize :: Style -> ChartTree -> ChartTree+glyphize s ct =+  group (Just "glyphize") [over chart' (set #chartStyle s . over #chartData pointize_) ct]++pointize_ :: ChartData -> ChartData+pointize_ (TextData xs) = GlyphData (snd <$> xs)+pointize_ (PathData xs) = GlyphData (pointPath <$> xs)+pointize_ (LineData xs) = GlyphData (mconcat xs)+pointize_ (BlankData xs) = GlyphData (mid <$> xs)+pointize_ (RectData xs) = GlyphData (mid <$> xs)+pointize_ (GlyphData xs) = GlyphData xs++-- | Verticle or Horizontal+data Orientation = Vert | Hori deriving (Eq, Show, Generic, Data)++-- | Whether to stack chart data+data Stacked = Stacked | NonStacked deriving (Eq, Show, Generic, Data)++-- | The basis for the x-y ratio of a chart+--+-- Default style features tend towards assuming that the usual height of the overall svg image is around 1, and ChartAspect is based on this assumption, so that a ChartAspect of @FixedAspect 1.5@, say, means a height of 1 and a width of 1.5.+data ChartAspect+  = -- | Rescale charts to a fixed x-y ratio, inclusive of hud and style features+    FixedAspect Double+  | -- | Rescale charts to an overall height of 1, preserving the x-y ratio of the data canvas.+    CanvasAspect Double+  | -- | Rescale charts to a height of 1, preserving the existing x-y ratio of the underlying charts, inclusive of hud and style.+    ChartAspect+  | -- | Do not rescale charts. The style values should make sense in relation to the data ranges.+    UnscaledAspect+  deriving (Eq, Show, Generic, Data)++-- | Rectangular placement+data Place+  = PlaceLeft+  | PlaceRight+  | PlaceTop+  | PlaceBottom+  | PlaceAbsolute (Point Double)+  deriving (Eq, Show, Generic, Data)++-- | Flip Place to the opposite side, or negate if 'PlaceAbsolute'.+--+-- >>> flipPlace PlaceLeft+-- PlaceRight+flipPlace :: Place -> Place+flipPlace PlaceLeft = PlaceRight+flipPlace PlaceRight = PlaceLeft+flipPlace PlaceTop = PlaceBottom+flipPlace PlaceBottom = PlaceTop+flipPlace (PlaceAbsolute p) = PlaceAbsolute (negate p)++-- | Point that moves a 'Rect' in relation to another 'Rect'+--+-- above and centered+-- >>> beside PlaceTop 0 0.01 one half+-- Point 0.0 0.76+--+-- above and right-aligned+-- >>> beside PlaceTop 0.5 0.01 one half+-- Point 0.25 0.76+--+-- left and with tops inline+-- >>> beside PlaceLeft (-0.5) 0 one half+-- Point (-0.75) 0.25+--+-- left and with bottoms aligned+-- >>> beside PlaceLeft 0.5 0 one half+-- Point (-0.75) (-0.25)+beside :: Place -> Double -> Double -> Rect Double -> Rect Double -> Point Double+beside pl anc buff r r' = mid r - mid r' + p + b + a+  where+    wplus = width r |/ 2 + width r' |/ 2+    wneg = width r - width r'+    b = case pl of+      PlaceTop -> Point zero buff+      PlaceBottom -> Point zero (-buff)+      PlaceLeft -> Point (-buff) zero+      PlaceRight -> Point buff zero+      PlaceAbsolute _ -> zero+    p = case pl of+      PlaceTop -> wplus {_x = zero}+      PlaceBottom -> -wplus {_x = zero}+      PlaceLeft -> -wplus {_y = zero}+      PlaceRight -> wplus {_y = zero}+      PlaceAbsolute p' -> p'+    -- This is the opposite of the usual convention, but aligns+    -- with TextAnchor usage when text is vertical.+    a = case pl of+      PlaceTop -> wneg {_y = zero} |* anc+      PlaceBottom -> wneg {_y = zero} |* anc+      PlaceLeft -> -(wneg {_x = zero} |* anc)+      PlaceRight -> -(wneg {_x = zero} |* anc)+      PlaceAbsolute _ -> zero
− src/Chart/Render.hs
@@ -1,144 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}--module Chart.Render-  ( scaleCharts,-    getAspect,-    getViewbox,-    getSize,-    renderToSvg,-    renderChartsWith,-    renderCharts,-    renderCharts_,-    writeChartsWith,-    writeCharts,-    writeCharts_,-    renderHudChart,-    renderHudOptionsChart,-    writeHudOptionsChart,-    svg2_,-    cssCrisp,-  )-where--import Chart.Types-import Control.Lens hiding (transform)-import Data.Generics.Labels ()-import qualified Data.Text.Lazy as Lazy-import Lucid-import qualified Lucid.Base as Lucid-import Lucid.Base-import NumHask.Prelude-import NumHask.Space hiding (Element)---- | scale chart data, projecting to the supplied Rect, and expanding the resultant Rect for chart style if necessary.------ Note that this modifies the underlying chart data.--- FIXME: do a divide to make an exact fit-scaleCharts ::-  Rect Double ->-  [Chart Double] ->-  (Rect Double, [Chart Double])-scaleCharts cs r = (fromMaybe one $ styleBoxes cs', cs')-  where-    cs' = projectXYs cs r--getAspect :: SvgAspect -> [Chart Double] -> Double-getAspect (ManualAspect a) _ = a-getAspect ChartAspect cs = toAspect . fromMaybe one $ styleBoxes cs--getSize :: SvgOptions -> [Chart Double] -> Point Double-getSize o cs = case view #svgAspect o of-  ManualAspect a -> (view #svgHeight o *) <$> Point a 1-  ChartAspect -> (\(Rect x z y w) -> Point (view #svgHeight o * (z - x)) (view #svgHeight o * (w - y))) . fromMaybe one $ styleBoxes cs--getViewbox :: SvgOptions -> [Chart Double] -> Rect Double-getViewbox o cs =-  bool asp (fromMaybe one $ styleBoxes cs) (NoScaleCharts == view #scaleCharts' o)-  where-    asp =-      case view #svgAspect o of-        ManualAspect a -> Rect (a * (-0.5)) (a * 0.5) (-0.5) 0.5-        ChartAspect -> fromMaybe one $ styleBoxes cs---- * rendering---- | @svg@ element + svg 2 attributes-svg2_ :: Term [Attribute] (s -> t) => s -> t-svg2_ m =-  svg_-    [ Lucid.makeAttribute "xmlns" "http://www.w3.org/2000/svg",-      Lucid.makeAttribute "xmlns:xlink" "http://www.w3.org/1999/xlink"-    ]-    m--renderToSvg :: CssOptions -> Point Double -> Rect Double -> [Chart Double] -> Html ()-renderToSvg csso (Point w' h') (Rect x z y w) cs =-  with-    ( svg2_-        ( bool id (cssCrisp <>) (csso == UseCssCrisp) $-            chartDefs cs <> mconcat (svg <$> cs)-        )-    )-    [ width_ (show w'),-      height_ (show h'),-      makeAttribute "viewBox" (show x <> " " <> show (- w) <> " " <> show (z - x) <> " " <> show (w - y))-    ]--cssCrisp :: Html ()-cssCrisp = style_ [type_ "text/css"] ("{ shape-rendering: 'crispEdges'; }" :: Text)---- | render Charts with the supplied css options, size and viewbox.-renderCharts_ :: CssOptions -> Point Double -> Rect Double -> [Chart Double] -> Text-renderCharts_ csso p r cs =-  Lazy.toStrict $ renderText (renderToSvg csso p r cs)---- | render Charts with the supplied options.-renderChartsWith :: SvgOptions -> [Chart Double] -> Text-renderChartsWith so cs =-  Lazy.toStrict $ renderText (renderToSvg (so ^. #useCssCrisp) (getSize so cs'') r' cs'')-  where-    r' = r & maybe id padRect (so ^. #outerPad)-    cs'' =-      cs'-        & maybe id (\x -> frameChart x (fromMaybe 0 (so ^. #innerPad))) (so ^. #chartFrame)-    (r, cs') =-      bool-        (getViewbox so cs, cs)-        (scaleCharts (getViewbox so cs) cs)-        (ScaleCharts == so ^. #scaleCharts')---- | render charts with the default options.-renderCharts :: [Chart Double] -> Text-renderCharts = renderChartsWith defaultSvgOptions--writeChartsWith :: FilePath -> SvgOptions -> [Chart Double] -> IO ()-writeChartsWith fp so cs = writeFile fp (renderChartsWith so cs)--writeCharts :: FilePath -> [Chart Double] -> IO ()-writeCharts fp cs = writeFile fp (renderCharts cs)---- | write Charts to a file with the supplied css options, size and viewbox.-writeCharts_ :: FilePath -> CssOptions -> Point Double -> Rect Double -> [Chart Double] -> IO ()-writeCharts_ fp csso p r cs =-  writeFile fp (renderCharts_ csso p r cs)---- * rendering huds and charts---- | Render some huds and charts.-renderHudChart :: SvgOptions -> [Hud Double] -> [Chart Double] -> Text-renderHudChart so hs cs = renderChartsWith so (runHud (getViewbox so cs) hs cs)---- | Render a chart using the supplied svg and hud config.--- FIXME: fixRect usage-renderHudOptionsChart :: SvgOptions -> HudOptions -> [Hud Double] -> [Chart Double] -> Text-renderHudOptionsChart so hc hs cs = renderHudChart so (hs <> hs') (cs <> cs')-  where-    (hs', cs') = makeHud (fixRect $ dataBox cs) hc--writeHudOptionsChart :: FilePath -> SvgOptions -> HudOptions -> [Hud Double] -> [Chart Double] -> IO ()-writeHudOptionsChart fp so hc hs cs =-  writeFile fp (renderHudOptionsChart so hc hs cs)
+ src/Chart/Style.hs view
@@ -0,0 +1,365 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}++-- | Definition of the syntactical manifestation of chart elements.+module Chart.Style+  ( Style (..),+    defaultStyle,+    scaleStyle,++    -- * RectStyle+    defaultRectStyle,+    blob,+    clear,+    border,++    -- * TextStyle+    defaultTextStyle,+    styleBoxText,+    EscapeText (..),++    -- * GlyphStyle+    defaultGlyphStyle,+    styleBoxGlyph,+    gpalette,+    GlyphShape (..),++    -- * LineStyle+    defaultLineStyle,+    LineCap (..),+    fromLineCap,+    toLineCap,+    LineJoin (..),+    fromLineJoin,+    toLineJoin,++    -- * Stack Styling+    TextAnchor (..),+    fromTextAnchor,+    fromAnchoring,+    Align (..),++    -- * PathStyle+    defaultPathStyle,++    -- * Style scaling+    ScaleP (..),+    scaleRatio,+  )+where++import Chart.Data+import Data.Bool+import Data.ByteString (ByteString)+import Data.Colour+import Data.Data+import Data.List qualified as List+import Data.Maybe+import Data.Path+import Data.Path.Parser+import Data.String+import Data.Text (Text)+import Data.Text qualified as Text+import GHC.Generics+import NumHask.Space+import Optics.Core+import Prelude++-- $setup+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core++-- | Stylistic content of chart elements, involving how chart data is represented in the physical chart.+--+-- >>> defaultStyle+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+data Style = Style+  { -- | The size of the element in relation to the canvas domain.+    size :: Double,+    -- | stroke-width+    borderSize :: Double,+    -- | fill & fill-opacity+    color :: Colour,+    -- | stroke & stroke-opacity+    borderColor :: Colour,+    -- | How to treat scale projections.+    scaleP :: ScaleP,+    -- | text-anchor+    textAnchor :: TextAnchor,+    -- | element rotation is radians+    rotation :: Maybe Double,+    -- | element translation+    translate :: Maybe (Point Double),+    -- | whether to html-like escape text+    escapeText :: EscapeText,+    -- | rectangular frame around an element.+    frame :: Maybe Style,+    -- | stroke-linecap+    lineCap :: Maybe LineCap,+    -- | stroke-linejoin+    lineJoin :: Maybe LineJoin,+    -- | stroke-dasharray+    dasharray :: Maybe [Double],+    -- | stroke-dashoffset+    dashoffset :: Maybe Double,+    -- | horizontal scaling modifier for text+    hsize :: Double,+    -- | vertical scaling modifier for text+    vsize :: Double,+    -- | horizontal shift for text alignment+    vshift :: Double,+    -- | shape for glyph chart elements+    glyphShape :: GlyphShape+  }+  deriving (Eq, Show, Generic, Data)++-- | The official default style+--+-- >>> defaultStyle+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultStyle :: Style+defaultStyle = Style 0.06 0.01 (paletteO 0 0.1) (paletteO 1 1) NoScaleP AnchorMiddle Nothing Nothing EscapeText Nothing Nothing Nothing Nothing Nothing 0.6 1.1 (-0.25) SquareGlyph++-- | The official style for rectangles.+--+-- >>> defaultRectStyle+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.02 0.73 0.80 0.10, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultRectStyle :: Style+defaultRectStyle = defaultStyle++-- | The official style for text elements.+--+-- >>> defaultTextStyle+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultTextStyle :: Style+defaultTextStyle = defaultStyle & set #size 0.06 & set #color dark++-- | The official style for glyphs.+--+-- >>> defaultGlyphStyle+-- Style {size = 3.0e-2, borderSize = 3.0e-3, color = Colour 0.02 0.73 0.80 0.20, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultGlyphStyle :: Style+defaultGlyphStyle = defaultStyle & set #size 0.03 & set #color (paletteO 0 0.2) & set #borderColor (set lightness' 0.4 $ paletteO 1 1) & set #borderSize 0.003++-- | The official style for lines.+--+-- >>> defaultLineStyle+-- Style {size = 1.2e-2, borderSize = 1.0e-2, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultLineStyle :: Style+defaultLineStyle = defaultStyle & set #size 0.012 & set #color dark++-- | The official style for paths.+--+-- >>> defaultPathStyle+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.66 0.07 0.55 1.00, borderColor = Colour 0.02 0.29 0.48 1.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+defaultPathStyle :: Style+defaultPathStyle = defaultStyle & set #color (palette 2) & set #borderColor (palette 1)++-- | Scale the size, borderSize and any translations of a 'Style'.+scaleStyle :: Double -> Style -> Style+scaleStyle x s =+  s+    & over #size (x *)+    & over #borderSize (x *)+    & over #translate (fmap (fmap (x *)))++-- | solid rectangle, no border+--+-- >>> blob black+-- Style {size = 6.0e-2, borderSize = 0.0, color = Colour 0.00 0.00 0.00 1.00, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+blob :: Colour -> Style+blob c = defaultRectStyle & set #borderSize 0 & set #borderColor transparent & set #color c++-- | transparent rect+--+-- >>> clear+-- Style {size = 6.0e-2, borderSize = 0.0, color = Colour 0.00 0.00 0.00 0.00, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+clear :: Style+clear = defaultRectStyle & set #borderSize 0 & set #borderColor transparent & set #color transparent++-- | transparent rectangle, with border+--+-- >>> border 0.01 transparent+-- Style {size = 6.0e-2, borderSize = 1.0e-2, color = Colour 0.00 0.00 0.00 0.00, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}+border :: Double -> Colour -> Style+border s c = defaultRectStyle & set #borderSize s & set #borderColor c & set #color transparent++-- | Whether to escape the common XML escaped characters.+data EscapeText = EscapeText | NoEscapeText deriving (Eq, Show, Generic, Data)++-- | the extra area from text styling+styleBoxText ::+  Style ->+  Text ->+  Point Double ->+  Rect Double+styleBoxText o t p = mpad $ move p $ maybe flat (`rotationBound` flat) (view #rotation o)+  where+    flat = Rect ((-(x' / 2.0)) + x' * a') (x' / 2 + x' * a') (-(y' / 2) + n1') (y' / 2 + n1')+    s = view #size o+    h = view #hsize o+    v = view #vsize o+    n1 = view #vshift o+    x' = s * h * fromIntegral (Text.length t)+    y' = s * v+    n1' = (-s) * n1+    a' = case view #textAnchor o of+      AnchorStart -> 0.5+      AnchorEnd -> -0.5+      AnchorMiddle -> 0.0+    mpad = case view #frame o of+      Nothing -> id+      Just f -> padRect (0.5 * view #borderSize f * view #size o)++-- | glyph shapes+data GlyphShape+  = CircleGlyph+  | SquareGlyph+  | EllipseGlyph Double+  | RectSharpGlyph Double+  | RectRoundedGlyph Double Double Double+  | -- | line width is determined by borderSize+    TriangleGlyph (Point Double) (Point Double) (Point Double)+  | VLineGlyph+  | HLineGlyph+  | PathGlyph ByteString+  deriving (Eq, Show, Generic, Data)++-- | the extra area from glyph styling+styleBoxGlyph :: Style -> Rect Double+styleBoxGlyph s = move p' $+  rot' $+    sw $ case view #glyphShape s of+      CircleGlyph -> (sz *) <$> one+      SquareGlyph -> (sz *) <$> one+      EllipseGlyph a -> scale (Point sz (a * sz)) one+      RectSharpGlyph a -> scale (Point sz (a * sz)) one+      RectRoundedGlyph a _ _ -> scale (Point sz (a * sz)) one+      VLineGlyph -> scale (Point (view #borderSize s) sz) one+      HLineGlyph -> scale (Point sz (view #borderSize s)) one+      TriangleGlyph a b c -> (sz *) <$> unsafeSpace1 ([a, b, c] :: [Point Double])+      PathGlyph path' -> maybe zero (fmap (sz *)) (pathBoxes . svgToPathData $ path')+  where+    sz = view #size s+    sw = padRect (0.5 * view #borderSize s)+    p' = fromMaybe (Point 0.0 0.0) (view #translate s)+    rot' = maybe id rotationBound (view #rotation s)++-- | Infinite list of glyph shapes+--+-- >>> gpalette 0+-- CircleGlyph+gpalette :: Int -> GlyphShape+gpalette x = cycle gpalette1_ List.!! x++-- | finite list of glyphs+gpalette1_ :: [GlyphShape]+gpalette1_ =+  [ CircleGlyph,+    SquareGlyph,+    RectSharpGlyph 0.75,+    RectRoundedGlyph 0.75 0.01 0.01,+    EllipseGlyph 0.75,+    VLineGlyph,+    HLineGlyph,+    TriangleGlyph (Point 0.0 0.0) (Point 1 1) (Point 1 0),+    PathGlyph "M0.05,-0.03660254037844387 A0.1 0.1 0.0 0 1 0.0,0.05 0.1 0.1 0.0 0 1 -0.05,-0.03660254037844387 0.1 0.1 0.0 0 1 0.05,-0.03660254037844387 Z"+  ]++-- | line cap style+data LineCap = LineCapButt | LineCapRound | LineCapSquare deriving (Eq, Show, Generic, Data)++-- | svg textifier+fromLineCap :: (IsString s) => LineCap -> s+fromLineCap LineCapButt = "butt"+fromLineCap LineCapRound = "round"+fromLineCap LineCapSquare = "square"++-- | readifier+toLineCap :: (Eq s, IsString s) => s -> LineCap+toLineCap "butt" = LineCapButt+toLineCap "round" = LineCapRound+toLineCap "square" = LineCapSquare+toLineCap _ = LineCapButt++-- | line cap style+data LineJoin = LineJoinMiter | LineJoinBevel | LineJoinRound deriving (Eq, Show, Generic, Data)++-- | svg textifier+fromLineJoin :: (IsString s) => LineJoin -> s+fromLineJoin LineJoinMiter = "miter"+fromLineJoin LineJoinBevel = "bevel"+fromLineJoin LineJoinRound = "round"++-- | readifier+toLineJoin :: (Eq s, IsString s) => s -> LineJoin+toLineJoin "miter" = LineJoinMiter+toLineJoin "bevel" = LineJoinBevel+toLineJoin "round" = LineJoinRound+toLineJoin _ = LineJoinMiter++-- | Text Anchor+data TextAnchor = AnchorMiddle | AnchorStart | AnchorEnd deriving (Eq, Show, Generic, Data)++-- | Convert a 'TextAnchor' to a 'ByteString' label.+fromTextAnchor :: TextAnchor -> ByteString+fromTextAnchor AnchorMiddle = "middle"+fromTextAnchor AnchorStart = "start"+fromTextAnchor AnchorEnd = "end"++-- | Convert a Double to a TextAnchor+fromAnchoring :: Double -> TextAnchor+fromAnchoring x = case compare x zero of+  EQ -> AnchorMiddle+  GT -> AnchorEnd+  LT -> AnchorStart++-- | Aligning stacked things.+data Align = NoAlign | AlignRight | AlignLeft | AlignMid deriving (Eq, Show, Generic, Data)++-- | Scale Projection options+data ScaleP+  = -- | Do not scale under projection.+    NoScaleP+  | -- | Scale based on the X axis ratio of a projection+    ScalePX+  | -- | Scale based on the Y axis ratio of a projection+    ScalePY+  | -- | Scale based on minimum of (X axis, Y axis) ratio+    ScalePMinDim+  | -- | Scale based on the area ratio of a projection+    ScalePArea+  deriving (Eq, Show, Generic, Data)++-- | given a ScaleP and two Rects, what is the scaling factor for a projection+--+-- Guards against scaling to zero or infinity+scaleRatio :: ScaleP -> Rect Double -> Rect Double -> Double+scaleRatio NoScaleP _ _ = 1+scaleRatio ScalePX new old = bool 1 (width nx / width ox) (width ox > 0 && width nx > 0)+  where+    (Ranges nx _) = new+    (Ranges ox _) = old+scaleRatio ScalePY new old = bool 1 (width ny / width oy) (width oy > 0 && width ny > 0)+  where+    (Ranges _ ny) = new+    (Ranges _ oy) = old+scaleRatio ScalePArea new old = bool 1 (sqrt (an / ao)) (an > 0 && ao > 0)+  where+    (Ranges nx ny) = new+    (Ranges ox oy) = old+    an = width nx * width ny+    ao = width ox * width oy+scaleRatio ScalePMinDim new old = closestToOne+  where+    x' = scaleRatio ScalePX new old+    y' = scaleRatio ScalePY new old+    closestToOne+      | x' >= 1 && y' >= 1 = bool x' y' (x' > y')+      | x' >= 1 && y' < 1 = bool x' y' (x' > (1 / y'))+      | x' < 1 && y' >= 1 = bool x' y' ((1 / x') > y')+      | otherwise = bool x' y' ((1 / x') > (1 / y'))
+ src/Chart/Surface.hs view
@@ -0,0 +1,191 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}++-- | Surface chart combinators.+--+-- A common chart is to present a set of rectangles on the XY plane with colour representing values of the underlying data. This library uses the term /surface/ chart but it is often referred to as a heatmap.+module Chart.Surface+  ( SurfaceData (..),+    SurfaceOptions (..),+    defaultSurfaceOptions,+    SurfaceStyle (..),+    defaultSurfaceStyle,+    mkSurfaceData,+    surfaces,+    surfacef,+    SurfaceLegendOptions (..),+    defaultSurfaceLegendOptions,+    surfaceLegendAxisOptions,+    gridReferenceChart,+    addSurfaceLegend,+  )+where++import Chart.Data+import Chart.Hud+import Chart.Primitive+import Chart.Style+import Data.Bifunctor+import Data.Bool+import Data.Colour+import Data.Data+import Data.Foldable+import Data.FormatN+import Data.Maybe+import GHC.Generics+import NumHask.Space+import Optics.Core+import Prelude++-- $setup+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core++-- | Options for a Surface chart.+data SurfaceOptions = SurfaceOptions+  { -- | surface style+    soStyle :: SurfaceStyle,+    -- | The grain or granularity of the chart+    soGrain :: Point Int,+    -- | Chart range+    soRange :: Rect Double+  }+  deriving (Eq, Show, Generic, Data)++-- | official style+defaultSurfaceOptions :: SurfaceOptions+defaultSurfaceOptions =+  SurfaceOptions defaultSurfaceStyle (Point 10 10) one++-- | A surface chart is a specialization of a 'RectChart'+--+-- >>> defaultSurfaceStyle+-- SurfaceStyle {surfaceColors = [Colour 0.02 0.73 0.80 1.00,Colour 0.02 0.29 0.48 1.00], surfaceRectStyle = Style {size = 6.0e-2, borderSize = 0.0, color = Colour 0.05 0.05 0.05 1.00, borderColor = Colour 0.00 0.00 0.00 0.00, scaleP = NoScaleP, textAnchor = AnchorMiddle, rotation = Nothing, translate = Nothing, escapeText = EscapeText, frame = Nothing, lineCap = Nothing, lineJoin = Nothing, dasharray = Nothing, dashoffset = Nothing, hsize = 0.6, vsize = 1.1, vshift = -0.25, glyphShape = SquareGlyph}}+--+-- ![surface example](other/surface.svg)+data SurfaceStyle = SurfaceStyle+  { -- | list of colours to interpolate between.+    surfaceColors :: [Colour],+    surfaceRectStyle :: Style+  }+  deriving (Eq, Show, Generic, Data)++-- | The official surface style.+defaultSurfaceStyle :: SurfaceStyle+defaultSurfaceStyle =+  SurfaceStyle (palette <$> [0 .. 1]) (blob dark)++-- | Main surface data elements+data SurfaceData = SurfaceData+  { -- | XY Coordinates of surface.+    surfaceRect :: Rect Double,+    -- | Surface colour.+    surfaceColor :: Colour+  }+  deriving (Eq, Show, Generic, Data)++-- | surface chart without any hud trimmings+surfaces :: Style -> [SurfaceData] -> [Chart]+surfaces rs ps =+  ( \(SurfaceData r c) ->+      Chart+        (rs & set #color c)+        (RectData [r])+  )+    <$> ps++-- | Create surface data from a function on a Point+mkSurfaceData ::+  (Point Double -> Double) ->+  Rect Double ->+  Grid (Rect Double) ->+  [Colour] ->+  ([SurfaceData], Range Double)+mkSurfaceData f r g cs = (zipWith SurfaceData rects (flip mixes cs <$> proj), x)+  where+    ps = gridF f r g+    rects = fst <$> ps+    vs = snd <$> ps+    x = unsafeSpace1 vs :: Range Double+    proj = project x (Range 0 1) <$> vs++-- | Create a surface chart from a function.+surfacef :: (Point Double -> Double) -> SurfaceOptions -> ([Chart], Range Double)+surfacef f cfg =+  first (surfaces (view (#soStyle % #surfaceRectStyle) cfg)) $+    mkSurfaceData+      f+      (view #soRange cfg)+      (view #soGrain cfg)+      (toList $ view (#soStyle % #surfaceColors) cfg)++-- | Legend specialization for a surface chart.+data SurfaceLegendOptions = SurfaceLegendOptions+  { sloAxisOptions :: AxisOptions,+    -- | Width of the legend glyph+    sloWidth :: Double,+    -- | Resolution of the legend glyph+    sloResolution :: Int,+    sloDataRange :: Range Double,+    -- | Placement of the legend versus normalised chart placement+    sloRect :: Rect Double,+    sloSurfaceStyle :: SurfaceStyle+  }+  deriving (Eq, Show, Generic, Data)++-- | 'AxisOptions' for a surface chart legend.+surfaceLegendAxisOptions :: AxisOptions+surfaceLegendAxisOptions =+  AxisOptions+    Nothing+    Nothing+    ( Ticks+        (TickRound (FormatN FSPrec (Just 3) 4 True True) 4 NoTickExtend)+        (Just defaultGlyphTickStyleY)+        (Just (defaultTextTick & set #buffer 0.05))+        Nothing+    )+    PlaceRight++-- | official surface legend options+defaultSurfaceLegendOptions :: SurfaceLegendOptions+defaultSurfaceLegendOptions =+  SurfaceLegendOptions surfaceLegendAxisOptions 0.2 100 one (Rect 0.7 0.9 0 0.5) defaultSurfaceStyle++-- | Chart used as a reference to a surface chart.+gridReferenceChart :: SurfaceLegendOptions -> ChartTree+gridReferenceChart slo =+  named "grid reference" $+    zipWith+      (\r c -> Chart (blob c) (RectData [r]))+      (gridf <$> spaceGrid)+      colorGrid+  where+    spaceGrid = gridSpace (view #sloDataRange slo) (view #sloResolution slo)+    gridf =+      bool+        (\yr -> Ranges (Range 0 (view #sloWidth slo)) yr)+        (\xr -> Ranges xr (Range 0 (view #sloWidth slo)))+        (isHori slo)+    colorGrid =+      (\x -> mixes x (toList $ view (#sloSurfaceStyle % #surfaceColors) slo))+        <$> grid MidPos (Range 0 1) (view #sloResolution slo)++isHori :: SurfaceLegendOptions -> Bool+isHori slo =+  view (#sloAxisOptions % #place) slo == PlaceBottom+    || view (#sloAxisOptions % #place) slo == PlaceTop++-- | Add a surface legend to a main surface chart.+addSurfaceLegend :: SurfaceLegendOptions -> ChartTree -> ChartTree+addSurfaceLegend slo ct = ctBoth+  where+    grc = gridReferenceChart slo+    hoLegend = (mempty :: HudOptions) & set #axes [Priority 1 (view #sloAxisOptions slo)]+    grcLegend = addHud (FixedAspect (view #sloWidth slo)) hoLegend grc+    ctbox = fromMaybe one (view styleBox' ct)+    legbox = projectOnR ctbox one (view #sloRect slo)+    ctBoth = mconcat [projectChartTree legbox grcLegend, ct]
− src/Chart/Types.hs
@@ -1,1662 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RebindableSyntax #-}-{-# LANGUAGE TypeFamilies #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS_GHC -fno-warn-type-defaults #-}--module Chart.Types-  ( Chart (..),-    Annotation (..),-    annotationText,-    RectStyle (..),-    defaultRectStyle,-    blob,-    clear,-    border,-    TextStyle (..),-    defaultTextStyle,-    Anchor (..),-    fromAnchor,-    toAnchor,-    GlyphStyle (..),-    defaultGlyphStyle,-    GlyphShape (..),-    glyphText,-    LineStyle (..),-    defaultLineStyle,-    PixelStyle (..),-    defaultPixelStyle,-    Direction (..),-    fromDirection,-    toDirection,-    padRect,--    SvgAspect (..),-    toSvgAspect,-    fromSvgAspect,-    EscapeText (..),-    CssOptions (..),-    ScaleCharts (..),-    SvgOptions (..),-    defaultSvgOptions,-    defaultSvgFrame,--    -- $hud machinery-    ChartDims (..),-    HudT (..),-    Hud,-    HudOptions (..),-    defaultHudOptions,-    defaultCanvas,-    AxisOptions (..),-    defaultAxisOptions,-    Place (..),-    placeText,-    Bar (..),-    defaultBar,-    Title (..),-    defaultTitle,-    Tick (..),-    defaultGlyphTick,-    defaultTextTick,-    defaultLineTick,-    defaultTick,-    TickStyle (..),-    defaultTickStyle,-    tickStyleText,-    TickExtend (..),-    Adjustments (..),-    defaultAdjustments,-    LegendOptions (..),-    defaultLegendOptions,-    -- $core-    projectXYs,-    projectXYsWith,-    dataBox,-    toAspect,-    scaleAnn,-    moveChart,-    -    -- $hud-    runHudWith,-    runHud,-    makeHud,-    freezeTicks,-    flipAxis,-    canvas,-    title,-    tick,-    adjustTick,-    makeTickDates,-    makeTickDatesContinuous,-    legendHud,-    legendEntry,-    legendChart,-    legendFromChart,-    -- $svg-    svg,-    svgt,-    chartDef,-    chartDefs,-    styleBox,-    styleBoxes,-    noStyleBoxes,-    styleBoxText,-    styleBoxGlyph,-    padChart,-    frameChart,-    hori,-    vert,-    stack,-    addChartBox,-    addChartBoxes,-  )-where--import Control.Lens-import Data.Colour-import Data.FormatN-import Data.Generics.Labels ()-import Data.List ((!!))-import qualified Data.Text as Text-import Data.Time-import qualified Lucid-import Lucid (class_, height_, id_, term, toHtmlRaw, width_, with)-import Lucid.Base (makeXmlElementNoEnd)-import qualified Lucid.Base as Lucid-import NumHask.Prelude-import NumHask.Space as NH hiding (Element)-import Text.HTML.TagSoup hiding (Attribute)-import qualified Prelude as P---- $setup------ >>> :set -XOverloadedLabels--- >>> :set -XNoImplicitPrelude--- >>> -- import NumHask.Prelude--- >>> import Control.Lens--- >>> import Chart.Render---- * Chart---- | A `Chart` consists of--- - specific style of representation for each xy point or xy rectangle.--- - a list of points or rectangles on the xy-plane, and-data Chart a-  = Chart-      { annotation :: Annotation,-        xys :: [XY a]-      }-  deriving (Eq, Show, Generic)---- | Manifestation of the data on a screen.-data Annotation-  = RectA RectStyle-  | TextA TextStyle [Text]-  | GlyphA GlyphStyle-  | LineA LineStyle-  | BlankA-  | PixelA PixelStyle-  deriving (Eq, Show, Generic)---- | textifier-annotationText :: Annotation -> Text-annotationText (RectA _) = "RectA"-annotationText TextA {} = "TextA"-annotationText (GlyphA _) = "GlyphA"-annotationText (LineA _) = "LineA"-annotationText BlankA = "BlankA"-annotationText (PixelA _) = "PixelA"---- | Rectangle styling------ >>> defaultRectStyle--- RectStyle {borderSize = 1.0e-2, borderColor = RGBA 0.12 0.47 0.71 0.80, color = RGBA 0.12 0.47 0.71 0.30}------ > writeCharts "other/unit.svg" [Chart (RectA defaultRectStyle) [one]]------ ![unit example](other/unit.svg)-data RectStyle-  = RectStyle-      { borderSize :: Double,-        borderColor :: Colour,-        color :: Colour-      }-  deriving (Show, Eq, Generic)---- | the style-defaultRectStyle :: RectStyle-defaultRectStyle = RectStyle 0.01 (fromRGB (palette !! 1) 0.8) (fromRGB (palette !! 1) 0.3)---- | solid rectangle, no border------ >>> blob black--- RectStyle {borderSize = 0.0, borderColor = RGBA 0.00 0.00 0.00 0.00, color = RGBA 0.00 0.00 0.00 1.00}-blob :: Colour -> RectStyle-blob = RectStyle 0 transparent---- | transparent rect------ >>> clear--- RectStyle {borderSize = 0.0, borderColor = RGBA 0.00 0.00 0.00 0.00, color = RGBA 0.00 0.00 0.00 0.00}-clear :: RectStyle-clear = RectStyle 0 transparent transparent---- | transparent rectangle, with border------ >>> border 0.01 transparent--- RectStyle {borderSize = 1.0e-2, borderColor = RGBA 0.00 0.00 0.00 0.00, color = RGBA 0.00 0.00 0.00 0.00}-border :: Double -> Colour -> RectStyle-border s c = RectStyle s c transparent---- | Text styling------ >>> defaultTextStyle--- TextStyle {size = 8.0e-2, color = RGBA 0.20 0.20 0.20 1.00, anchor = AnchorMiddle, hsize = 0.5, vsize = 1.45, nudge1 = -0.2, rotation = Nothing, translate = Nothing, hasMathjax = False}------ >>> let t = zipWith (\x y -> Chart (TextA (defaultTextStyle & (#size .~ (0.05 :: Double))) [x]) [PointXY y]) (fmap Text.singleton ['a' .. 'y']) [Point (sin (x * 0.1)) x | x <- [0 .. 25]]------ > writeCharts "other/text.svg" t------ ![text example](other/text.svg)-data TextStyle-  = TextStyle-      { size :: Double,-        color :: Colour,-        anchor :: Anchor,-        hsize :: Double,-        vsize :: Double,-        nudge1 :: Double,-        rotation :: Maybe Double,-        translate :: Maybe (Point Double),-        hasMathjax :: Bool-      }-  deriving (Show, Eq, Generic)---- | position anchor-data Anchor = AnchorMiddle | AnchorStart | AnchorEnd deriving (Eq, Show, Generic)---- | text-fromAnchor :: (IsString s) => Anchor -> s-fromAnchor AnchorMiddle = "Middle"-fromAnchor AnchorStart = "Start"-fromAnchor AnchorEnd = "End"---- | from text-toAnchor :: (Eq s, IsString s) => s -> Anchor-toAnchor "Middle" = AnchorMiddle-toAnchor "Start" = AnchorStart-toAnchor "End" = AnchorEnd-toAnchor _ = AnchorMiddle---- | the offical text style-defaultTextStyle :: TextStyle-defaultTextStyle =-  TextStyle 0.08 colorText AnchorMiddle 0.5 1.45 (-0.2) Nothing Nothing False---- | Glyph styling------ >>> defaultGlyphStyle--- GlyphStyle {size = 3.0e-2, color = RGBA 0.65 0.81 0.89 0.30, borderColor = RGBA 0.12 0.47 0.71 0.80, borderSize = 3.0e-3, shape = SquareGlyph, rotation = Nothing, translate = Nothing}------ ![glyph example](other/glyph.svg)-data GlyphStyle-  = GlyphStyle-      { -- | glyph radius-        size :: Double,-        -- | fill color-        color :: Colour,-        -- | stroke color-        borderColor :: Colour,-        -- | stroke width (adds a bit to the bounding box)-        borderSize :: Double,-        shape :: GlyphShape,-        rotation :: Maybe Double,-        translate :: Maybe (Point Double)-      }-  deriving (Show, Eq, Generic)---- | the offical glyph style-defaultGlyphStyle :: GlyphStyle-defaultGlyphStyle =-  GlyphStyle-    0.03-    (fromRGB (palette !! 0) 0.3)-    (fromRGB (palette !! 1) 0.8)-    0.003-    SquareGlyph-    Nothing-    Nothing---- | glyph shapes-data GlyphShape-  = CircleGlyph-  | SquareGlyph-  | EllipseGlyph Double-  | RectSharpGlyph Double-  | RectRoundedGlyph Double Double Double-  | TriangleGlyph (Point Double) (Point Double) (Point Double)-  | VLineGlyph Double-  | HLineGlyph Double-  | PathGlyph Text-  deriving (Show, Eq, Generic)---- | textifier-glyphText :: GlyphShape -> Text-glyphText sh =-  case sh of-    CircleGlyph -> "Circle"-    SquareGlyph -> "Square"-    TriangleGlyph {} -> "Triangle"-    EllipseGlyph _ -> "Ellipse"-    RectSharpGlyph _ -> "RectSharp"-    RectRoundedGlyph {} -> "RectRounded"-    VLineGlyph _ -> "VLine"-    HLineGlyph _ -> "HLine"-    PathGlyph _ -> "Path"---- | line style------ >>> defaultLineStyle--- LineStyle {width = 1.2e-2, color = RGBA 0.65 0.81 0.89 0.30}-data LineStyle-  = LineStyle-      { width :: Double,-        color :: Colour-      }-  deriving (Show, Eq, Generic)---- | the official default line style-defaultLineStyle :: LineStyle-defaultLineStyle = LineStyle 0.012 (fromRGB (palette !! 0) 0.3)---- | A pixel chart is a specialization of a 'RectA' chart------ >>> defaultPixelStyle--- PixelStyle {pixelColorMin = RGBA 0.65 0.81 0.89 1.00, pixelColorMax = RGBA 0.12 0.47 0.71 1.00, pixelGradient = 1.5707963267948966, pixelRectStyle = RectStyle {borderSize = 0.0, borderColor = RGBA 0.00 0.00 0.00 0.00, color = RGBA 0.00 0.00 0.00 1.00}, pixelTextureId = "pixel"}------ ![pixel example](other/pixel.svg)-data PixelStyle-  = PixelStyle-      { pixelColorMin :: Colour,-        pixelColorMax :: Colour,-        -- | expressed in directional terms-        -- 0 for horizontal-        -- pi/2 for vertical-        pixelGradient :: Double,-        pixelRectStyle :: RectStyle,-        pixelTextureId :: Text-      }-  deriving (Show, Eq, Generic)---- | The official pixel style.-defaultPixelStyle :: PixelStyle-defaultPixelStyle =-  PixelStyle (fromRGB (palette !! 0) 1) (fromRGB (palette !! 1) 1) (pi / 2) (blob black) "pixel"---- | Verticle or Horizontal-data Direction = Vert | Hori deriving (Eq, Show, Generic)---- | textifier-fromDirection :: (IsString s) => Direction -> s-fromDirection Hori = "Hori"-fromDirection Vert = "Vert"---- | readifier-toDirection :: (Eq s, IsString s) => s -> Direction-toDirection "Hori" = Hori-toDirection "Vert" = Vert-toDirection _ = Hori---- | additive padding-padRect :: (Num a) => a -> Rect a -> Rect a-padRect p (Rect x z y w) = Rect (x P.- p) (z P.+ p) (y P.- p) (w P.+ p)---- | or html-data EscapeText = EscapeText | NoEscapeText deriving (Show, Eq, Generic)---- | pixel chart helper-data CssOptions = UseCssCrisp | NoCssOptions deriving (Show, Eq, Generic)---- | turns off scaling.  Usually not what you want.-data ScaleCharts = ScaleCharts | NoScaleCharts deriving (Show, Eq, Generic)---- | The x-y ratio of the viewing box-data SvgAspect = ManualAspect Double | ChartAspect deriving (Show, Eq, Generic)---- | textifier-fromSvgAspect :: (IsString s) => SvgAspect -> s-fromSvgAspect (ManualAspect _) = "ManualAspect"-fromSvgAspect ChartAspect = "ChartAspect"---- | readifier-toSvgAspect :: (Eq s, IsString s) => s -> Double -> SvgAspect-toSvgAspect "ManualAspect" a = ManualAspect a-toSvgAspect "ChartAspect" _ = ChartAspect-toSvgAspect _ _ = ChartAspect---- | Top-level SVG options.------ >>> defaultSvgOptions--- SvgOptions {svgHeight = 300.0, outerPad = Just 2.0e-2, innerPad = Nothing, chartFrame = Nothing, escapeText = NoEscapeText, useCssCrisp = NoCssOptions, scaleCharts' = ScaleCharts, svgAspect = ManualAspect 1.5}------ > writeChartsWith "other/svgoptions.svg" (defaultSvgOptions & #svgAspect .~ ManualAspect 0.7) lines------ ![svgoptions example](other/svgoptions.svg)-data SvgOptions-  = SvgOptions-      { svgHeight :: Double,-        outerPad :: Maybe Double,-        innerPad :: Maybe Double,-        chartFrame :: Maybe RectStyle,-        escapeText :: EscapeText,-        useCssCrisp :: CssOptions,-        scaleCharts' :: ScaleCharts,-        svgAspect :: SvgAspect-      }-  deriving (Eq, Show, Generic)---- | The official svg options-defaultSvgOptions :: SvgOptions-defaultSvgOptions = SvgOptions 300 (Just 0.02) Nothing Nothing NoEscapeText NoCssOptions ScaleCharts (ManualAspect 1.5)---- | frame style-defaultSvgFrame :: RectStyle-defaultSvgFrame = border 0.01 (fromRGB (grayscale 0.7) 0.5)---- | In order to create huds, there are three main pieces of state that need to be kept track of:------ - chartDim: the rectangular dimension of the physical representation of a chart on the screen so that new hud elements can be appended. Adding a hud piece tends to expand the chart dimension.------ - canvasDim: the rectangular dimension of the canvas on which data will be represented. At times appending a hud element will cause the canvas dimension to shift.------ - dataDim: the rectangular dimension of the data being represented. Adding hud elements can cause this to change.-data ChartDims a-  = ChartDims-      { chartDim :: Rect a,-        canvasDim :: Rect a,-        dataDim :: Rect a-      }-  deriving (Eq, Show, Generic)---- | Hud monad transformer-newtype HudT m a = Hud {unhud :: [Chart a] -> StateT (ChartDims a) m [Chart a]}--type Hud = HudT Identity--instance (Monad m) => Semigroup (HudT m a) where-  (<>) (Hud h1) (Hud h2) = Hud $ h1 >=> h2--instance (Monad m) => Monoid (HudT m a) where-  mempty = Hud pure---- | Practically, the configuration of a Hud is going to be in decimals, typed into config files and the like, and so we concrete at the configuration level, and settle on doubles for specifying the geomtry of hud elements.------ > writeHudOptionsChart "other/hud.svg" defaultSvgOptions defaultHudOptions [] []------ ![hud example](other/hud.svg)-data HudOptions-  = HudOptions-      { hudCanvas :: Maybe RectStyle,-        hudTitles :: [Title],-        hudAxes :: [AxisOptions],-        hudLegend :: Maybe (LegendOptions, [(Annotation, Text)])-      }-  deriving (Eq, Show, Generic)--instance Semigroup HudOptions where-  (<>) (HudOptions c t a l) (HudOptions c' t' a' l') =-    HudOptions (listToMaybe $ catMaybes [c, c']) (t <> t') (a <> a') (listToMaybe $ catMaybes [l, l'])--instance Monoid HudOptions where-  mempty = HudOptions Nothing [] [] Nothing---- | The official hud options.-defaultHudOptions :: HudOptions-defaultHudOptions =-  HudOptions-    (Just defaultCanvas)-    []-    [ defaultAxisOptions,-      defaultAxisOptions & #place .~ PlaceLeft-    ]-    Nothing---- | The official hud canvas-defaultCanvas :: RectStyle-defaultCanvas = blob (fromRGB (grayscale 0.5) 0.025)---- | Placement of elements around (what is implicity but maybe shouldn't just be) a rectangular canvas-data Place-  = PlaceLeft-  | PlaceRight-  | PlaceTop-  | PlaceBottom-  | PlaceAbsolute (Point Double)-  deriving (Show, Eq, Generic)---- | textifier-placeText :: Place -> Text-placeText p =-  case p of-    PlaceTop -> "Top"-    PlaceBottom -> "Bottom"-    PlaceLeft -> "Left"-    PlaceRight -> "Right"-    PlaceAbsolute _ -> "Absolute"---- | axis options-data AxisOptions-  = AxisOptions-      { abar :: Maybe Bar,-        adjust :: Maybe Adjustments,-        atick :: Tick,-        place :: Place-      }-  deriving (Eq, Show, Generic)---- | The official axis-defaultAxisOptions :: AxisOptions-defaultAxisOptions = AxisOptions (Just defaultBar) (Just defaultAdjustments) defaultTick PlaceBottom---- | The bar on an axis representing the x or y plane.------ >>> defaultBar--- Bar {rstyle = RectStyle {borderSize = 0.0, borderColor = RGBA 0.50 0.50 0.50 1.00, color = RGBA 0.50 0.50 0.50 1.00}, wid = 5.0e-3, buff = 1.0e-2}-data Bar-  = Bar-      { rstyle :: RectStyle,-        wid :: Double,-        buff :: Double-      }-  deriving (Show, Eq, Generic)---- | The official axis bar-defaultBar :: Bar-defaultBar = Bar (RectStyle 0 (fromRGB (grayscale 0.5) 1) (fromRGB (grayscale 0.5) 1)) 0.005 0.01---- | Options for titles.  Defaults to center aligned, and placed at Top of the hud-data Title-  = Title-      { text :: Text,-        style :: TextStyle,-        place :: Place,-        anchor :: Anchor,-        buff :: Double-      }-  deriving (Show, Eq, Generic)---- | The official hud title-defaultTitle :: Text -> Title-defaultTitle txt =-  Title-    txt-    ( (#size .~ 0.12)-        . (#color .~ colorText)-        $ defaultTextStyle-    )-    PlaceTop-    AnchorMiddle-    0.04---- | xy coordinate markings------ >>> defaultTick--- Tick {tstyle = TickRound (FormatComma (Just 2)) 8 TickExtend, gtick = Just (GlyphStyle {size = 3.0e-2, color = RGBA 0.50 0.50 0.50 1.00, borderColor = RGBA 0.50 0.50 0.50 1.00, borderSize = 5.0e-3, shape = VLineGlyph 5.0e-3, rotation = Nothing, translate = Nothing},1.25e-2), ttick = Just (TextStyle {size = 5.0e-2, color = RGBA 0.50 0.50 0.50 1.00, anchor = AnchorMiddle, hsize = 0.5, vsize = 1.45, nudge1 = -0.2, rotation = Nothing, translate = Nothing, hasMathjax = False},1.5e-2), ltick = Just (LineStyle {width = 5.0e-3, color = RGBA 0.50 0.50 0.50 0.05},0.0)}-data Tick-  = Tick-      { tstyle :: TickStyle,-        gtick :: Maybe (GlyphStyle, Double),-        ttick :: Maybe (TextStyle, Double),-        ltick :: Maybe (LineStyle, Double)-      }-  deriving (Show, Eq, Generic)---- | The official glyph tick-defaultGlyphTick :: GlyphStyle-defaultGlyphTick =-  defaultGlyphStyle-    & #borderSize .~ 0.005-    & #borderColor .~ fromRGB (grayscale 0.5) 1-    & #color .~ fromRGB (grayscale 0.5) 1-    & #shape .~ VLineGlyph 0.005---- | The official text tick-defaultTextTick :: TextStyle-defaultTextTick =-  defaultTextStyle & #size .~ 0.05 & #color .~ fromRGB (grayscale 0.5) 1---- | The official line tick-defaultLineTick :: LineStyle-defaultLineTick =-  defaultLineStyle-    & #color .~ fromRGB (grayscale 0.5) 0.05-    & #width .~ 5.0e-3---- | The official tick-defaultTick :: Tick-defaultTick =-  Tick-    defaultTickStyle-    (Just (defaultGlyphTick, 0.0125))-    (Just (defaultTextTick, 0.015))-    (Just (defaultLineTick, 0))---- | Style of tick marks on an axis.-data TickStyle-  = -- | no ticks on axis-    TickNone-  | -- | specific labels (equidistant placement)-    TickLabels [Text]-  | -- | sensibly rounded ticks, a guide to how many, and whether to extend beyond the data bounding box-    TickRound FormatN Int TickExtend-  | -- | exactly n equally spaced ticks-    TickExact FormatN Int-  | -- | specific labels and placement-    TickPlaced [(Double, Text)]-  deriving (Show, Eq, Generic)---- | The official tick style-defaultTickStyle :: TickStyle-defaultTickStyle = TickRound (FormatComma (Just 2)) 8 TickExtend---- | textifier-tickStyleText :: TickStyle -> Text-tickStyleText TickNone = "TickNone"-tickStyleText TickLabels {} = "TickLabels"-tickStyleText TickRound {} = "TickRound"-tickStyleText TickExact {} = "TickExact"-tickStyleText TickPlaced {} = "TickPlaced"---- | Whether Ticks are allowed to extend the data range-data TickExtend = TickExtend | NoTickExtend deriving (Eq, Show, Generic)---- | options for prettifying axis decorations------ >>> defaultAdjustments--- Adjustments {maxXRatio = 8.0e-2, maxYRatio = 6.0e-2, angledRatio = 0.12, allowDiagonal = True}-data Adjustments-  = Adjustments-      { maxXRatio :: Double,-        maxYRatio :: Double,-        angledRatio :: Double,-        allowDiagonal :: Bool-      }-  deriving (Show, Eq, Generic)---- | The official hud adjustments.-defaultAdjustments :: Adjustments-defaultAdjustments = Adjustments 0.08 0.06 0.12 True---- You're all Legends!---- | Legend options------ >>> defaultLegendOptions--- LegendOptions {lsize = 0.1, vgap = 0.2, hgap = 0.1, ltext = TextStyle {size = 8.0e-2, color = RGBA 0.20 0.20 0.20 1.00, anchor = AnchorMiddle, hsize = 0.5, vsize = 1.45, nudge1 = -0.2, rotation = Nothing, translate = Nothing, hasMathjax = False}, lmax = 10, innerPad = 0.1, outerPad = 0.1, legendFrame = Just (RectStyle {borderSize = 2.0e-2, borderColor = RGBA 0.50 0.50 0.50 1.00, color = RGBA 1.00 1.00 1.00 1.00}), lplace = PlaceBottom, lscale = 0.2}------ ![legend example](other/legend.svg)-data LegendOptions-  = LegendOptions-      { lsize :: Double,-        vgap :: Double,-        hgap :: Double,-        ltext :: TextStyle,-        lmax :: Int,-        innerPad :: Double,-        outerPad :: Double,-        legendFrame :: Maybe RectStyle,-        lplace :: Place,-        lscale :: Double-      }-  deriving (Show, Eq, Generic)---- | The official legend options-defaultLegendOptions :: LegendOptions-defaultLegendOptions =-  LegendOptions-    0.1-    0.2-    0.1-    ( defaultTextStyle-        & #size .~ 0.08-    )-    10-    0.1-    0.1-    (Just (RectStyle 0.02 (fromRGB (grayscale 0.5) 1) white))-    PlaceBottom-    0.2---- | Project the xys of a chart to a new XY Space.-projectXYs :: Rect Double -> [Chart Double] -> [Chart Double]-projectXYs a cs = cs'-  where-    xss = projectTo2 a (xys <$> cs)-    ss = annotation <$> cs-    cs' = zipWith Chart ss xss-    projectTo2 vb xss =-      fmap-        ( maybe-            id-            (projectOn vb)-            (fold $ foldRect . fmap toRect <$> xss)-        )-        <$> xss---- | Project chart xys to a new XY Space from an old XY Space-projectXYsWith :: Rect Double -> Rect Double -> [Chart Double] -> [Chart Double]-projectXYsWith new old cs = cs'-  where-    xss = fmap (projectOn new old) . xys <$> cs-    ss = annotation <$> cs-    cs' = zipWith Chart ss xss---- | convert to a ratio-toAspect :: (Divisive a, Subtractive a) => Rect a -> a-toAspect (Rect x z y w) = (z - x) / (w - y)---- | get the Space of a [Chart a]-dataBox :: (Ord a) => [Chart a] -> Maybe (Rect a)-dataBox cs = foldRect . mconcat $ fmap toRect <$> (xys <$> cs)--scaleAnn :: Double -> Annotation -> Annotation-scaleAnn x (LineA a) = LineA $ a & #width %~ (* x)-scaleAnn x (RectA a) = RectA $ a & #borderSize %~ (* x)-scaleAnn x (TextA a txs) = TextA (a & #size %~ (* x)) txs-scaleAnn x (GlyphA a) = GlyphA (a & #size %~ (* x))-scaleAnn x (PixelA a) = PixelA $ a & #pixelRectStyle . #borderSize %~ (* x)-scaleAnn _ BlankA = BlankA--moveChart :: (Additive a) => XY a -> [Chart a] -> [Chart a]-moveChart sp cs = fmap (#xys %~ fmap (sp +)) cs---- | combine huds and charts to form a new Chart using the supplied--- initial canvas and data dimensions.--- Note that chart data is transformed by this computation.--- used once in makePixelTick-runHudWith ::-  -- | initial canvas dimension-  Rect Double ->-  -- | initial data dimension-  Rect Double ->-  -- | huds to add-  [Hud Double] ->-  -- | underlying chart-  [Chart Double] ->-  -- | chart list-  [Chart Double]-runHudWith ca xs hs cs =-  flip evalState (ChartDims ca' da' xs) $-    (unhud $ mconcat hs) cs'-  where-    da' = fromMaybe one $ dataBox cs'-    ca' = fromMaybe one $ styleBoxes cs'-    cs' = projectXYsWith ca xs cs---- | Combine huds and charts to form a new [Chart] using the supplied canvas and the actual data dimension.--- Note that the original chart data are transformed and irrevocably lost by this computation.--- used once in renderHudChart-runHud :: Rect Double -> [Hud Double] -> [Chart Double] -> [Chart Double]-runHud ca hs cs = runHudWith ca (fixRect $ dataBox cs) hs cs---- | Make huds from a HudOptions--- Some huds, such as the creation of tick values, can extend the data dimension of a chart, so we also return a blank chart with the new data dimension.--- The complexity internally is due to the creation of ticks and, specifically, gridSensible, which is not idempotent. As a result, a tick calculation that does extends the data area, can then lead to new tick values when applying TickRound etc.-makeHud :: Rect Double -> HudOptions -> ([Hud Double], [Chart Double])-makeHud xs cfg =-  (haxes <> [can] <> titles <> [l], [xsext])-  where-    can = maybe mempty (\x -> canvas x) (cfg ^. #hudCanvas)-    titles = title <$> (cfg ^. #hudTitles)-    newticks = (\a -> freezeTicks (a ^. #place) xs (a ^. #atick . #tstyle)) <$> (cfg ^. #hudAxes)-    axes' = zipWith (\c t -> c & #atick . #tstyle .~ fst t) (cfg ^. #hudAxes) newticks-    xsext = Chart BlankA (RectXY <$> catMaybes (snd <$> newticks))-    haxes = (\x -> maybe mempty (\a -> bar (x ^. #place) a) (x ^. #abar) <> adjustedTickHud x) <$> axes'-    l = maybe mempty (\(lo, ats) -> legendHud lo (legendChart ats lo)) (cfg ^. #hudLegend)---- convert TickRound to TickPlaced-freezeTicks :: Place -> Rect Double -> TickStyle -> (TickStyle, Maybe (Rect Double))-freezeTicks pl xs' ts@TickRound {} = maybe (ts, Nothing) (\x -> (TickPlaced (zip ps ls), Just x)) ((\x -> replaceRange pl x xs') <$> ext)-  where-    (TickComponents ps ls ext) = makeTicks ts (placeRange pl xs')-    replaceRange :: Place -> Range Double -> Rect Double -> Rect Double-    replaceRange pl' (Range a0 a1) (Rect x z y w) = case pl' of-      PlaceRight -> Rect x z a0 a1-      PlaceLeft -> Rect x z a0 a1-      _ -> Rect a0 a1 y w-freezeTicks _ _ ts = (ts, Nothing)---- |-flipAxis :: AxisOptions -> AxisOptions-flipAxis ac = case ac ^. #place of-  PlaceBottom -> ac & #place .~ PlaceLeft-  PlaceTop -> ac & #place .~ PlaceRight-  PlaceLeft -> ac & #place .~ PlaceBottom-  PlaceRight -> ac & #place .~ PlaceTop-  PlaceAbsolute _ -> ac--addToRect :: (Ord a) => Rect a -> Maybe (Rect a) -> Rect a-addToRect r r' = sconcat $ r :| maybeToList r'--canvas :: (Monad m) => RectStyle -> HudT m Double-canvas s = Hud $ \cs -> do-  a <- use #canvasDim-  let c = Chart (RectA s) [RectXY a]-  #canvasDim .= addToRect a (styleBox c)-  pure $ c : cs--bar_ :: Place -> Bar -> Rect Double -> Rect Double -> Chart Double-bar_ pl b (Rect x z y w) (Rect x' z' y' w') =-  case pl of-    PlaceTop ->-      Chart-        (RectA (rstyle b))-        [ R-            x-            z-            (w' + b ^. #buff)-            (w' + b ^. #buff + b ^. #wid)-        ]-    PlaceBottom ->-      Chart-        (RectA (rstyle b))-        [ R-            x-            z-            (y' - b ^. #wid - b ^. #buff)-            (y' - b ^. #buff)-        ]-    PlaceLeft ->-      Chart-        (RectA (rstyle b))-        [ R-            (x' - b ^. #wid - b ^. #buff)-            (x' - b ^. #buff)-            y-            w-        ]-    PlaceRight ->-      Chart-        (RectA (rstyle b))-        [ R-            (z' + (b ^. #buff))-            (z' + (b ^. #buff) + (b ^. #wid))-            y-            w-        ]-    PlaceAbsolute (Point x'' _) ->-      Chart-        (RectA (rstyle b))-        [ R-            (x'' + (b ^. #buff))-            (x'' + (b ^. #buff) + (b ^. #wid))-            y-            w-        ]--bar :: (Monad m) => Place -> Bar -> HudT m Double-bar pl b = Hud $ \cs -> do-  da <- use #chartDim-  ca <- use #canvasDim-  let c = bar_ pl b ca da-  #chartDim .= addChartBox c da-  pure $ c : cs--title_ :: Title -> Rect Double -> Chart Double-title_ t a =-  Chart-    ( TextA-        ( style'-            & #translate ?~ (realToFrac <$> (placePos' a + alignPos a))-            & #rotation ?~ rot-        )-        [t ^. #text]-    )-    [zero]-  where-    style'-      | t ^. #anchor == AnchorStart =-        #anchor .~ AnchorStart $ t ^. #style-      | t ^. #anchor == AnchorEnd =-        #anchor .~ AnchorEnd $ t ^. #style-      | otherwise = t ^. #style-    rot-      | t ^. #place == PlaceRight = 90.0-      | t ^. #place == PlaceLeft = -90.0-      | otherwise = 0-    placePos' (Rect x z y w) = case t ^. #place of-      PlaceTop -> Point ((x + z) / 2.0) (w + (t ^. #buff))-      PlaceBottom ->-        Point-          ((x + z) / 2.0)-          ( y - (t ^. #buff)-              - 0.5-              * realToFrac (t ^. #style . #vsize)-              * realToFrac (t ^. #style . #size)-          )-      PlaceLeft -> Point (x - (t ^. #buff)) ((y + w) / 2.0)-      PlaceRight -> Point (z + (t ^. #buff)) ((y + w) / 2.0)-      PlaceAbsolute p -> p-    alignPos (Rect x z y w)-      | t ^. #anchor == AnchorStart-          && t ^. #place `elem` [PlaceTop, PlaceBottom] =-        Point ((x - z) / 2.0) 0.0-      | t ^. #anchor == AnchorStart-          && t ^. #place == PlaceLeft =-        Point 0.0 ((y - w) / 2.0)-      | t ^. #anchor == AnchorStart-          && t ^. #place == PlaceRight =-        Point 0.0 ((w - y) / 2.0)-      | t ^. #anchor == AnchorEnd-          && t ^. #place `elem` [PlaceTop, PlaceBottom] =-        Point ((- x + z) / 2.0) 0.0-      | t ^. #anchor == AnchorEnd-          && t ^. #place == PlaceLeft =-        Point 0.0 ((- y + w) / 2.0)-      | t ^. #anchor == AnchorEnd-          && t ^. #place == PlaceRight =-        Point 0.0 ((y - w) / 2.0)-      | otherwise = Point 0.0 0.0---- | Add a title to a chart. The logic used to work out placement is flawed due to being able to freely specify text rotation.  It works for specific rotations (Top, Bottom at 0, Left at 90, Right @ 270)-title :: (Monad m) => Title -> HudT m Double-title t = Hud $ \cs -> do-  ca <- use #chartDim-  let c = title_ t ca-  #chartDim .= addChartBox c ca-  pure $ c : cs--placePos :: Place -> Double -> Rect Double -> Point Double-placePos pl b (Rect x z y w) = case pl of-  PlaceTop -> Point 0 (w + b)-  PlaceBottom -> Point 0 (y - b)-  PlaceLeft -> Point (x - b) 0-  PlaceRight -> Point (z + b) 0-  PlaceAbsolute p -> p--placeRot :: Place -> Maybe Double-placeRot pl = case pl of-  PlaceRight -> Just (-90.0)-  PlaceLeft -> Just (-90.0)-  _ -> Nothing--textPos :: Place -> TextStyle -> Double -> Point Double-textPos pl tt b = case pl of-  PlaceTop -> Point 0 b-  PlaceBottom -> Point 0 (- b - 0.5 * realToFrac (tt ^. #vsize) * realToFrac (tt ^. #size))-  PlaceLeft ->-    Point-      (- b)-      (realToFrac (tt ^. #nudge1) * realToFrac (tt ^. #vsize) * realToFrac (tt ^. #size))-  PlaceRight ->-    Point-      b-      (realToFrac (tt ^. #nudge1) * realToFrac (tt ^. #vsize) * realToFrac (tt ^. #size))-  PlaceAbsolute p -> p--placeRange :: Place -> Rect Double -> Range Double-placeRange pl (Rect x z y w) = case pl of-  PlaceRight -> Range y w-  PlaceLeft -> Range y w-  _ -> Range x z--placeOrigin :: Place -> Double -> Point Double-placeOrigin pl x-  | pl `elem` [PlaceTop, PlaceBottom] = Point x 0-  | otherwise = Point 0 x--placeTextAnchor :: Place -> (TextStyle -> TextStyle)-placeTextAnchor pl-  | pl == PlaceLeft = #anchor .~ AnchorEnd-  | pl == PlaceRight = #anchor .~ AnchorStart-  | otherwise = id--placeGridLines :: Place -> Rect Double -> Double -> Double -> [XY Double]-placeGridLines pl (Rect x z y w) a b-  | pl `elem` [PlaceTop, PlaceBottom] = [P a (y - b), P a (w + b)]-  | otherwise = [P (x - b) a, P (z + b) a]---- | compute tick values and labels given options, ranges and formatting-ticksR :: TickStyle -> Range Double -> Range Double -> [(Double, Text)]-ticksR s d r =-  case s of-    TickNone -> []-    TickRound f n e -> zip (project r d <$> ticks0) (formatNs f ticks0)-      where-        ticks0 = gridSensible OuterPos (e == NoTickExtend) r (fromIntegral n :: Integer)-    TickExact f n -> zip (project r d <$> ticks0) (formatNs f ticks0)-      where-        ticks0 = grid OuterPos r n-    TickLabels ls ->-      zip-        ( project (Range 0 (fromIntegral $ length ls)) d-            <$> ((\x -> x - 0.5) . fromIntegral <$> [1 .. length ls])-        )-        ls-    TickPlaced xs -> zip (project r d . fst <$> xs) (snd <$> xs)--data TickComponents-  = TickComponents-      { positions :: [Double],-        labels :: [Text],-        extension :: Maybe (Range Double)-      }-  deriving (Eq, Show, Generic)---- | compute tick components given style, ranges and formatting-makeTicks :: TickStyle -> Range Double -> TickComponents-makeTicks s r =-  case s of-    TickNone -> TickComponents [] [] Nothing-    TickRound f n e ->-      TickComponents-        ticks0-        (formatNs f ticks0)-        (bool (Just $ space1 ticks0) Nothing (e == NoTickExtend))-      where-        ticks0 = gridSensible OuterPos (e == NoTickExtend) r (fromIntegral n :: Integer)-    TickExact f n -> TickComponents ticks0 (formatNs f ticks0) Nothing-      where-        ticks0 = grid OuterPos r n-    TickLabels ls ->-      TickComponents-        ( project (Range 0 (fromIntegral $ length ls)) r-            <$> ((\x -> x - 0.5) . fromIntegral <$> [1 .. length ls])-        )-        ls-        Nothing-    TickPlaced xs -> TickComponents (fst <$> xs) (snd <$> xs) Nothing---- | compute tick values given placement, canvas dimension & data range-ticksPlaced :: TickStyle -> Place -> Rect Double -> Rect Double -> TickComponents-ticksPlaced ts pl d xs = TickComponents (project (placeRange pl xs) (placeRange pl d) <$> ps) ls ext-  where-    (TickComponents ps ls ext) = makeTicks ts (placeRange pl xs)--tickGlyph_ :: Place -> (GlyphStyle, Double) -> TickStyle -> Rect Double -> Rect Double -> Rect Double -> Chart Double-tickGlyph_ pl (g, b) ts ca da xs =-  Chart-    (GlyphA (g & #rotation .~ (realToFrac <$> placeRot pl)))-    ( PointXY . (placePos pl b ca +) . placeOrigin pl-        <$> positions-          (ticksPlaced ts pl da xs)-    )---- | aka marks-tickGlyph ::-  (Monad m) =>-  Place ->-  (GlyphStyle, Double) ->-  TickStyle ->-  HudT m Double-tickGlyph pl (g, b) ts = Hud $ \cs -> do-  a <- use #chartDim-  d <- use #canvasDim-  xs <- use #dataDim-  let c = tickGlyph_ pl (g, b) ts a d xs-  #chartDim .= addToRect a (styleBox c)-  pure $ c : cs--tickText_ ::-  Place ->-  (TextStyle, Double) ->-  TickStyle ->-  Rect Double ->-  Rect Double ->-  Rect Double ->-  [Chart Double]-tickText_ pl (txts, b) ts ca da xs =-  zipWith-    ( \txt sp ->-        Chart-          ( TextA-              (placeTextAnchor pl txts)-              [txt]-          )-          [PointXY sp]-    )-    (labels $ ticksPlaced ts pl da xs)-    ( (placePos pl b ca + textPos pl txts b +) . placeOrigin pl-        <$> positions (ticksPlaced ts pl da xs)-    )---- | aka tick labels-tickText ::-  (Monad m) =>-  Place ->-  (TextStyle, Double) ->-  TickStyle ->-  HudT m Double-tickText pl (txts, b) ts = Hud $ \cs -> do-  ca <- use #chartDim-  da <- use #canvasDim-  xs <- use #dataDim-  let c = tickText_ pl (txts, b) ts ca da xs-  #chartDim .= addChartBoxes c ca-  pure $ c <> cs---- | aka grid lines-tickLine ::-  (Monad m) =>-  Place ->-  (LineStyle, Double) ->-  TickStyle ->-  HudT m Double-tickLine pl (ls, b) ts = Hud $ \cs -> do-  da <- use #canvasDim-  xs <- use #dataDim-  let c =-        Chart (LineA ls) . (\x -> placeGridLines pl da x b)-          <$> positions (ticksPlaced ts pl da xs)-  #chartDim %= addChartBoxes c-  pure $ c <> cs---- | Create tick glyphs (marks), lines (grid) and text (labels)-tick ::-  (Monad m) =>-  Place ->-  Tick ->-  HudT m Double-tick pl t =-  maybe mempty (\x -> tickGlyph pl x (t ^. #tstyle)) (t ^. #gtick)-    <> maybe mempty (\x -> tickText pl x (t ^. #tstyle)) (t ^. #ttick)-    <> maybe mempty (\x -> tickLine pl x (t ^. #tstyle)) (t ^. #ltick)-    <> extendData pl t---- | compute an extension to the Range if a tick went over the data bounding box-computeTickExtension :: TickStyle -> Range Double -> Maybe (Range Double)-computeTickExtension s r =-  case s of-    TickNone -> Nothing-    TickRound _ n e -> bool Nothing (Just (space1 ticks0 <> r)) (e == TickExtend)-      where-        ticks0 = gridSensible OuterPos (e == NoTickExtend) r (fromIntegral n :: Integer)-    TickExact _ _ -> Nothing-    TickLabels _ -> Nothing-    TickPlaced xs -> Just $ r <> space1 (fst <$> xs)---- | Create a style extension for the data, if ticks extend beyond the existing range-tickExtended ::-  Place ->-  Tick ->-  Rect Double ->-  Rect Double-tickExtended pl t xs =-  maybe-    xs-    (\x -> rangeext xs x)-    (computeTickExtension (t ^. #tstyle) (ranged xs))-  where-    ranged xs' = case pl of-      PlaceTop -> rangex xs'-      PlaceBottom -> rangex xs'-      PlaceLeft -> rangey xs'-      PlaceRight -> rangey xs'-      PlaceAbsolute _ -> rangex xs'-    rangex (Rect x z _ _) = Range x z-    rangey (Rect _ _ y w) = Range y w-    rangeext (Rect x z y w) (Range a0 a1) = case pl of-      PlaceTop -> Rect a0 a1 y w-      PlaceBottom -> Rect a0 a1 y w-      PlaceLeft -> Rect x z a0 a1-      PlaceRight -> Rect x z a0 a1-      PlaceAbsolute _ -> Rect a0 a1 y w--extendData :: (Monad m) => Place -> Tick -> HudT m Double-extendData pl t = Hud $ \cs -> do-  #dataDim %= tickExtended pl t-  pure cs---- | adjust Tick for sane font sizes etc-adjustTick ::-  Adjustments ->-  Rect Double ->-  Rect Double ->-  Place ->-  Tick ->-  Tick-adjustTick (Adjustments mrx ma mry ad) vb cs pl t-  | pl `elem` [PlaceBottom, PlaceTop] = case ad of-    False -> t & #ttick . _Just . _1 . #size %~ (/ adjustSizeX)-    True ->-      case adjustSizeX > 1 of-        True ->-          ( case pl of-              PlaceBottom -> #ttick . _Just . _1 . #anchor .~ AnchorEnd-              PlaceTop -> #ttick . _Just . _1 . #anchor .~ AnchorStart-              _ -> #ttick . _Just . _1 . #anchor .~ AnchorEnd-          )-            . (#ttick . _Just . _1 . #size %~ (/ adjustSizeA))-            $ (#ttick . _Just . _1 . #rotation ?~ (-45)) t-        False -> (#ttick . _Just . _1 . #size %~ (/ adjustSizeA)) t-  | otherwise = -- pl `elem` [PlaceLeft, PlaceRight]-    (#ttick . _Just . _1 . #size %~ (/ adjustSizeY)) t-  where-    max' [] = 1-    max' xs = maximum xs-    ra (Rect x z y w)-      | pl `elem` [PlaceTop, PlaceBottom] = Range x z-      | otherwise = Range y w-    asp = ra vb-    r = ra cs-    tickl = snd <$> ticksR (t ^. #tstyle) asp r-    maxWidth :: Double-    maxWidth =-      maybe-        1-        ( \tt ->-            max' $-              (\(Rect x z _ _) -> z - x)-                . (\x -> styleBoxText (fst tt) x (Point 0 0)) <$> tickl-        )-        (t ^. #ttick)-    maxHeight =-      maybe-        1-        ( \tt ->-            max' $-              (\(Rect _ _ y w) -> w - y)-                . (\x -> styleBoxText (fst tt) x (Point 0 0)) <$> tickl-        )-        (t ^. #ttick)-    adjustSizeX :: Double-    adjustSizeX = max' [(maxWidth / realToFrac (upper asp - lower asp)) / mrx, 1]-    adjustSizeY = max' [(maxHeight / realToFrac (upper asp - lower asp)) / mry, 1]-    adjustSizeA = max' [(maxHeight / realToFrac (upper asp - lower asp)) / ma, 1]--adjustedTickHud :: (Monad m) => AxisOptions -> HudT m Double-adjustedTickHud c = Hud $ \cs -> do-  vb <- use #chartDim-  xs <- use #dataDim-  let adjTick =-        maybe-          (c ^. #atick)-          (\x -> adjustTick x vb xs (c ^. #place) (c ^. #atick))-          (c ^. #adjust)-  unhud (tick (c ^. #place) adjTick) cs---- | Convert a UTCTime list into sensible ticks, placed exactly-makeTickDates :: PosDiscontinuous -> Maybe Text -> Int -> [UTCTime] -> [(Int, Text)]-makeTickDates pc fmt n dates =-  lastOnes (\(_, x0) (_, x1) -> x0 == x1) . fst $ placedTimeLabelDiscontinuous pc fmt n dates-  where-    lastOnes :: (a -> a -> Bool) -> [a] -> [a]-    lastOnes _ [] = []-    lastOnes _ [x] = [x]-    lastOnes f (x : xs) = (\(x0, x1) -> reverse $ x0 : x1) $ foldl' step (x, []) xs-      where-        step (a0, rs) a1 = if f a0 a1 then (a1, rs) else (a1, a0 : rs)---- | Convert a UTCTime list into sensible ticks, placed on the (0,1) space-makeTickDatesContinuous :: PosDiscontinuous -> Maybe Text -> Int -> [UTCTime] -> [(Double, Text)]-makeTickDatesContinuous pc fmt n dates = placedTimeLabelContinuous pc fmt n (l, u)-  where-    l = minimum dates-    u = maximum dates--legendHud :: LegendOptions -> [Chart Double] -> Hud Double-legendHud l lcs = Hud $ \cs -> do-  ca <- use #chartDim-  let cs' = cs <> movedleg ca scaledleg-  #chartDim .= fromMaybe one (styleBoxes cs')-  pure cs'-  where-    scaledleg =-      (#annotation %~ scaleAnn (realToFrac $ l ^. #lscale))-        . (#xys %~ fmap (fmap (* l ^. #lscale)))-        <$> lcs-    movedleg ca' leg =-      maybe id (moveChart . PointXY . placel (l ^. #lplace) ca') (styleBoxes leg) leg-    placel pl (Rect x z y w) (Rect x' z' y' w') =-      case pl of-        PlaceTop -> Point ((x + z) / 2.0) (w + (w' - y') / 2.0)-        PlaceBottom -> Point ((x + z) / 2.0) (y - (w' - y' / 2.0))-        PlaceLeft -> Point (x - (z' - x') / 2.0) ((y + w) / 2.0)-        PlaceRight -> Point (z + (z' - x') / 2.0) ((y + w) / 2.0)-        PlaceAbsolute p -> p--legendEntry ::-  LegendOptions ->-  Annotation ->-  Text ->-  (Chart Double, Chart Double)-legendEntry l a t =-  ( Chart ann sps,-    Chart (TextA (l ^. #ltext & #anchor .~ AnchorStart) [t]) [zero]-  )-  where-    (ann, sps) = case a of-      RectA rs ->-        ( RectA rs,-          [R 0 (l ^. #lsize) 0 (l ^. #lsize)]-        )-      PixelA ps ->-        ( PixelA ps,-          [R 0 (l ^. #lsize) 0 (l ^. #lsize)]-        )-      TextA ts txts ->-        ( TextA (ts & #size .~ realToFrac (l ^. #lsize)) (take 1 txts),-          [zero]-        )-      GlyphA gs ->-        ( GlyphA (gs & #size .~ realToFrac (l ^. #lsize)),-          [P (0.5 * l ^. #lsize) (0.33 * l ^. #lsize)]-        )-      LineA ls ->-        ( LineA (ls & #width %~ (/ (realToFrac $ l ^. #lscale))),-          [P 0 (0.33 * l ^. #lsize), P (2 * l ^. #lsize) (0.33 * l ^. #lsize)]-        )-      BlankA ->-        ( BlankA,-          [zero]-        )--legendChart :: [(Annotation, Text)] -> LegendOptions -> [Chart Double]-legendChart lrs l =-  padChart (l ^. #outerPad)-    . maybe id (\x -> frameChart x (l ^. #innerPad)) (l ^. #legendFrame)-    . vert (l ^. #hgap)-    $ (\(a, t) -> hori ((l ^. #vgap) + twidth - gapwidth t) [[t], [a]])-      <$> es-  where-    es = reverse $ uncurry (legendEntry l) <$> lrs-    twidth = maybe 0 (\(Rect _ z _ _) -> z) . foldRect $ catMaybes (styleBox . snd <$> es)-    gapwidth t = maybe 0 (\(Rect _ z _ _) -> z) (styleBox t)--legendFromChart :: [Text] -> [Chart Double] -> [(Annotation, Text)]-legendFromChart = zipWith (\t c -> (c ^. #annotation, t))--terms :: Text -> [Lucid.Attribute] -> Lucid.Html ()-terms t = with $ makeXmlElementNoEnd t---- | the extra area from text styling-styleBoxText ::-  TextStyle ->-  Text ->-  Point Double ->-  Rect Double-styleBoxText o t p = move (p + p') $ maybe flat (`rotateRect` flat) (o ^. #rotation)-  where-    flat = Rect ((- x' / 2.0) + x' * a') (x' / 2 + x' * a') ((- y' / 2) - n1') (y' / 2 - n1')-    s = o ^. #size-    h = o ^. #hsize-    v = o ^. #vsize-    n1 = o ^. #nudge1-    x' = s * h * fromIntegral (sum $ maybe 0 Text.length . maybeTagText <$> parseTags t)-    y' = s * v-    n1' = s * n1-    a' = case o ^. #anchor of-      AnchorStart -> 0.5-      AnchorEnd -> -0.5-      AnchorMiddle -> 0.0-    p' = fromMaybe (Point 0.0 0.0) (o ^. #translate)---- | the extra area from glyph styling-styleBoxGlyph :: GlyphStyle -> Rect Double-styleBoxGlyph s = move p' $ sw $ case sh of-  EllipseGlyph a -> NH.scale (Point sz (a * sz)) one-  RectSharpGlyph a -> NH.scale (Point sz (a * sz)) one-  RectRoundedGlyph a _ _ -> NH.scale (Point sz (a * sz)) one-  VLineGlyph _ -> NH.scale (Point ((s ^. #borderSize) * sz) sz) one-  HLineGlyph _ -> NH.scale (Point sz ((s ^. #borderSize) * sz)) one-  TriangleGlyph a b c -> (sz *) <$> sconcat (toRect . PointXY <$> (a :| [b, c]) :: NonEmpty (Rect Double))-  _ -> (sz *) <$> one-  where-    sh = s ^. #shape-    sz = s ^. #size-    sw = padRect (0.5 * s ^. #borderSize)-    p' = fromMaybe (Point 0.0 0.0) (s ^. #translate)---- | the geometric dimensions of a Chart inclusive of style geometry-styleBox :: Chart Double -> Maybe (Rect Double)-styleBox (Chart (TextA s ts) xs) = foldRect $ zipWith (\t x -> styleBoxText s t (toPoint x)) ts xs-styleBox (Chart (GlyphA s) xs) = foldRect $ (\x -> move (toPoint x) (styleBoxGlyph s)) <$> xs-styleBox (Chart (RectA s) xs) = foldRect (padRect (0.5 * s ^. #borderSize) . toRect <$> xs)-styleBox (Chart (LineA s) xs) = foldRect (padRect (0.5 * s ^. #width) . toRect <$> xs)-styleBox (Chart BlankA xs) = foldRect (toRect <$> xs)-styleBox (Chart (PixelA s) xs) = foldRect (padRect (0.5 * s ^. #pixelRectStyle . #borderSize) . toRect <$> xs)---- | the extra geometric dimensions of a [Chart]-styleBoxes :: [Chart Double] -> Maybe (Rect Double)-styleBoxes xss = foldRect $ catMaybes (styleBox <$> xss)---- | geometric dimensions of a [Chart] not including style-noStyleBoxes :: [Chart Double] -> Maybe (Rect Double)-noStyleBoxes cs = foldRect $ toRect <$> mconcat (view #xys <$> cs)---- | calculate the linear gradient to shove in defs--- FIXME: Only works for #pixelGradient = 0 or pi//2. Can do much better with something like https://stackoverflow.com/questions/9025678/how-to-get-a-rotated-linear-gradient-svg-for-use-as-a-background-image-lgPixel :: PixelStyle -> Lucid.Html ()-lgPixel o =-  term-    "linearGradient"-    [ Lucid.id_ (o ^. #pixelTextureId),-      Lucid.makeAttribute "x1" (show x0),-      Lucid.makeAttribute "y1" (show y0),-      Lucid.makeAttribute "x2" (show x1),-      Lucid.makeAttribute "y2" (show y1)-    ]-    ( mconcat-        [ terms-            "stop"-            [ Lucid.makeAttribute "stop-opacity" (show $ opac $ o ^. #pixelColorMin),-              Lucid.makeAttribute "stop-color" (toHex (o ^. #pixelColorMin)),-              Lucid.makeAttribute "offset" "0"-            ],-          terms-            "stop"-            [ Lucid.makeAttribute "stop-opacity" (show $ opac $ o ^. #pixelColorMax),-              Lucid.makeAttribute "stop-color" (toHex (o ^. #pixelColorMax)),-              Lucid.makeAttribute "offset" "1"-            ]-        ]-    )-  where-    x0 = min 0 (cos (o ^. #pixelGradient))-    x1 = max 0 (cos (o ^. #pixelGradient))-    y0 = max 0 (sin (o ^. #pixelGradient))-    y1 = min 0 (sin (o ^. #pixelGradient))---- | get chart definitions-chartDefs :: [Chart a] -> Lucid.Html ()-chartDefs cs = bool (term "defs" (mconcat ds)) mempty (0 == length ds)-  where-    ds = mconcat $ chartDef <$> cs--chartDef :: Chart a -> [Lucid.Html ()]-chartDef c = case c of-  (Chart (PixelA s) _) -> [lgPixel s]-  _ -> []---- | Rectangle svg-svgRect :: Rect Double -> Lucid.Html ()-svgRect (Rect x z y w) =-  terms-    "rect"-    [ width_ (show $ z - x),-      height_ (show $ w - y),-      term "x" (show x),-      term "y" (show $ - w)-    ]---- | Text svg-svgText :: TextStyle -> Text -> Point Double -> Lucid.Html ()-svgText s t p@(Point x y) =-  bool id (term "g" [class_ "hasmathjax"]) (s ^. #hasMathjax) $-    term-      "text"-      ( [ term "x" (show x),-          term "y" (show $ - y)-        ]-          <> maybe [] (\x' -> [term "transform" (toRotateText x' p)]) (s ^. #rotation)-      )-      (toHtmlRaw t)---- | line svg-svgLine :: [Point Double] -> Lucid.Html ()-svgLine [] = mempty-svgLine xs = terms "polyline" [term "points" (toPointsText xs)]-  where-    toPointsText xs' = Text.intercalate "\n" $ (\(Point x y) -> show x <> "," <> show (- y)) <$> xs'---- | GlyphShape to svg Tree-svgShape :: GlyphShape -> Double -> Point Double -> Lucid.Html ()-svgShape CircleGlyph s (Point x y) =-  terms-    "circle"-    [ term "cx" (show x),-      term "cy" (show $ - y),-      term "r" (show $ 0.5 * s)-    ]-svgShape SquareGlyph s p =-  svgRect (move p ((s *) <$> one))-svgShape (RectSharpGlyph x') s p =-  svgRect (move p (NH.scale (Point s (x' * s)) one))-svgShape (RectRoundedGlyph x' rx ry) s p =-  terms-    "rect"-    [ term "width" (show $ z - x),-      term "height" (show $ w - y),-      term "x" (show x),-      term "y" (show $ - w),-      term "rx" (show rx),-      term "ry" (show ry)-    ]-  where-    (Rect x z y w) = move p (NH.scale (Point s (x' * s)) one)-svgShape (TriangleGlyph (Point xa ya) (Point xb yb) (Point xc yc)) s p =-  terms-    "polygon"-    [ term "transform" (toTranslateText p),-      term "points" (show (s * xa) <> "," <> show (- (s * ya)) <> " " <> show (s * xb) <> "," <> show (- (s * yb)) <> " " <> show (s * xc) <> "," <> show (- (s * yc)))-    ]-svgShape (EllipseGlyph x') s (Point x y) =-  terms-    "ellipse"-    [ term "cx" (show x),-      term "cy" (show $ - y),-      term "rx" (show $ 0.5 * s),-      term "ry" (show $ 0.5 * s * x')-    ]-svgShape (VLineGlyph _) s (Point x y) =-  terms "polyline" [term "points" (show x <> "," <> show (- (y - s / 2)) <> "\n" <> show x <> "," <> show (- (y + s / 2)))]-svgShape (HLineGlyph _) s (Point x y) =-  terms "polyline" [term "points" (show (x - s / 2) <> "," <> show (- y) <> "\n" <> show (x + s / 2) <> "," <> show (- y))]-svgShape (PathGlyph path) _ p =-  terms "path" [term "d" path, term "transform" (toTranslateText p)]---- | GlyphStyle to svg Tree-svgGlyph :: GlyphStyle -> Point Double -> Lucid.Html ()-svgGlyph s p =-  svgShape (s ^. #shape) (s ^. #size) (realToFrac <$> p)-    & maybe id (\r -> term "g" [term "transform" (toRotateText r p)]) (s ^. #rotation)---- | convert a Chart to svg-svg :: Chart Double -> Lucid.Html ()-svg (Chart (TextA s ts) xs) =-  term "g" (attsText s) (mconcat $ zipWith (\t p -> svgText s t (toPoint p)) ts xs)-svg (Chart (GlyphA s) xs) =-  term "g" (attsGlyph s) (mconcat $ svgGlyph s . toPoint <$> xs)-svg (Chart (LineA s) xs) =-  term "g" (attsLine s) (svgLine $ toPoint <$> xs)-svg (Chart (RectA s) xs) =-  term "g" (attsRect s) (mconcat $ svgRect . toRect <$> xs)-svg (Chart (PixelA s) xs) =-  term "g" (attsPixel s) (mconcat $ svgRect . toRect <$> xs)-svg (Chart BlankA _) = mempty---- | add a tooltip to a chart-svgt :: Chart Double -> (TextStyle, Text) -> Lucid.Html ()-svgt (Chart (TextA s ts) xs) (s', ts') =-  term "g" (attsText s) (Lucid.title_ (attsText s') (Lucid.toHtml ts') <> mconcat (zipWith (\t p -> svgText s t (toPoint p)) ts xs))-svgt (Chart (GlyphA s) xs) (s', ts') =-  term "g" (attsGlyph s) (Lucid.title_ (attsText s') (Lucid.toHtml ts') <> mconcat (svgGlyph s . toPoint <$> xs))-svgt (Chart (LineA s) xs) (s', ts') =-  term "g" (attsLine s) (Lucid.title_ (attsText s') (Lucid.toHtml ts') <> svgLine (toPoint <$> xs))-svgt (Chart (RectA s) xs) (s', ts') =-  term "g" (attsRect s) (Lucid.title_ (attsText s') (Lucid.toHtml ts') <> mconcat (svgRect . toRect <$> xs))-svgt (Chart (PixelA s) xs) (s', ts') =-  term "g" (attsPixel s) (Lucid.title_ (attsText s') (Lucid.toHtml ts') <> mconcat (svgRect . toRect <$> xs))-svgt (Chart BlankA _) _ = mempty---- * Style to Attributes--attsRect :: RectStyle -> [Lucid.Attribute]-attsRect o =-  [ term "stroke-width" (show $ o ^. #borderSize),-    term "stroke" (hex $ o ^. #borderColor),-    term "stroke-opacity" (show $ opac $ o ^. #borderColor),-    term "fill" (hex $ o ^. #color),-    term "fill-opacity" (show $ opac $ o ^. #color)-  ]--attsPixel :: PixelStyle -> [Lucid.Attribute]-attsPixel o =-  [ term "stroke-width" (show $ o ^. #pixelRectStyle . #borderSize),-    term "stroke" (toHex $ o ^. #pixelRectStyle . #borderColor),-    term "stroke-opacity" (show $ opac $ o ^. #pixelRectStyle . #borderColor),-    term "fill" ("url(#" <> (o ^. #pixelTextureId) <> ")")-  ]--attsText :: TextStyle -> [Lucid.Attribute]-attsText o =-  [ term "stroke-width" "0.0",-    term "stroke" "none",-    term "fill" (toHex $ o ^. #color),-    term "fill-opacity" (show $ opac $ o ^. #color),-    term "font-size" (show $ o ^. #size),-    term "text-anchor" (toTextAnchor $ o ^. #anchor)-  ]-    <> maybe [] ((: []) . term "transform" . toTranslateText) (o ^. #translate)-  where-    toTextAnchor :: Anchor -> Text-    toTextAnchor AnchorMiddle = "middle"-    toTextAnchor AnchorStart = "start"-    toTextAnchor AnchorEnd = "end"--attsGlyph :: GlyphStyle -> [Lucid.Attribute]-attsGlyph o =-  [ term "stroke-width" (show $ o ^. #borderSize),-    term "stroke" (toHex $ o ^. #borderColor),-    term "stroke-opacity" (show $ opac $ o ^. #borderColor),-    term "fill" (toHex $ o ^. #color),-    term "fill-opacity" (show $ opac $ o ^. #color)-  ]-    <> maybe [] ((: []) . term "transform" . toTranslateText) (o ^. #translate)--attsLine :: LineStyle -> [Lucid.Attribute]-attsLine o =-  [ term "stroke-width" (show $ o ^. #width),-    term "stroke" (toHex $ o ^. #color),-    term "stroke-opacity" (show $ opac $ o ^. #color),-    term "fill" "none"-  ]--toTranslateText :: Point Double -> Text-toTranslateText (Point x y) =-  "translate(" <> show x <> ", " <> show (- y) <> ")"--toRotateText :: Double -> Point Double -> Text-toRotateText r (Point x y) =-  "rotate(" <> show r <> ", " <> show x <> ", " <> show (- y) <> ")"---- | additively pad a [Chart]------ >>> padChart 0.1 [Chart (RectA defaultRectStyle) [RectXY one]]--- [Chart {annotation = RectA (RectStyle {borderSize = 1.0e-2, borderColor = RGBA 0.12 0.47 0.71 0.80, color = RGBA 0.12 0.47 0.71 0.30}), xys = [RectXY Rect -0.5 0.5 -0.5 0.5]},Chart {annotation = BlankA, xys = [RectXY Rect -0.605 0.605 -0.605 0.605]}]-padChart :: Double -> [Chart Double] -> [Chart Double]-padChart p cs = cs <> [Chart BlankA (maybeToList (RectXY . padRect p <$> styleBoxes cs))]---- | overlay a frame on some charts with some additive padding between------ >>> frameChart defaultRectStyle 0.1 [Chart BlankA []]--- [Chart {annotation = RectA (RectStyle {borderSize = 1.0e-2, borderColor = RGBA 0.12 0.47 0.71 0.80, color = RGBA 0.12 0.47 0.71 0.30}), xys = []},Chart {annotation = BlankA, xys = []}]-frameChart :: RectStyle -> Double -> [Chart Double] -> [Chart Double]-frameChart rs p cs = [Chart (RectA rs) (maybeToList (RectXY . padRect p <$> styleBoxes cs))] <> cs---- horizontally stack a list of list of charts (proceeding to the right) with a gap between-hori :: Double -> [[Chart Double]] -> [Chart Double]-hori _ [] = []-hori gap cs = foldl step [] cs-  where-    step x a = x <> (a & fmap (#xys %~ fmap (\s -> P (z x) 0 - P (origx x) 0 + s)))-    z xs = maybe 0 (\(Rect _ z' _ _) -> z' + gap) (styleBoxes xs)-    origx xs = maybe 0 (\(Rect x' _ _ _) -> x') (styleBoxes xs)---- vertically stack a list of charts (proceeding upwards), aligning them to the left-vert :: Double -> [[Chart Double]] -> [Chart Double]-vert _ [] = []-vert gap cs = foldl step [] cs-  where-    step x a = x <> (a & fmap (#xys %~ fmap (\s -> P (origx x - origx a) (w x) + s)))-    w xs = maybe 0 (\(Rect _ _ _ w') -> w' + gap) (styleBoxes xs)-    origx xs = maybe 0 (\(Rect x' _ _ _) -> x') (styleBoxes xs)---- stack a list of charts horizontally, then vertically-stack :: Int -> Double -> [[Chart Double]] -> [Chart Double]-stack _ _ [] = []-stack n gap cs = vert gap (hori gap <$> group' cs [])-  where-    group' [] acc = reverse acc-    group' x acc = group' (drop n x) (take n x : acc)--addChartBox :: Chart Double -> Rect Double -> Rect Double-addChartBox c r = sconcat (r :| maybeToList (styleBox c))--addChartBoxes :: [Chart Double] -> Rect Double -> Rect Double-addChartBoxes c r = sconcat (r :| maybeToList (styleBoxes c))
src/Data/Colour.hs view
@@ -1,76 +1,100 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RebindableSyntax #-}-{-# LANGUAGE TypeFamilies #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS_GHC -fno-warn-type-defaults #-} +-- | Colour representations and combinations. module Data.Colour-  ( -- $color+  ( -- * Colour     Colour,     pattern Colour,+    validColour,+    validate,+    trimColour,+    showRGBA,+    showRGB,+    showOpacity,+    opac',     opac,-    setOpac,-    fromRGB,-    hex,+    rgb,++    -- * Palette colours     palette,-    palette1,-    blend,-    toHex,-    fromHex,-    unsafeFromHex,-    grayscale,-    colorText,+    paletteO,     transparent,     black,     white,+    light,+    dark,+    grey, -    -- * re-exports-    module Graphics.Color.Model,+    -- * LCH model+    LCH (..),+    lLCH',+    cLCH',+    hLCH',+    LCHA (..),+    pattern LCHA,+    lch',+    alpha',+    RGB3 (..),+    rgbd',+    rgb32colour',+    LAB (..),+    lcha2colour',+    xy2ch',++    -- * mixins+    mix,+    mixTrim,+    mixLCHA,+    mixes,+    greyed,+    lightness',+    chroma',+    hue',+    showSwatch,+    showSwatches,+    rvRGB3,+    rvColour,+    paletteR,   ) where -import qualified Data.Attoparsec.Text as A+import Chart.Data+import Data.Bool (bool)+import Data.ByteString (ByteString)+import Data.ByteString.Char8 (pack)+import Data.Data import Data.FormatN-import Data.Generics.Labels ()-import qualified Data.Text as Text-import Graphics.Color.Model hiding (one, toRealFloat, zero)-import NumHask.Prelude-import qualified Prelude as P+import Data.List qualified as List+import Data.Text (Text)+import Data.Text qualified as Text+import GHC.Generics hiding (prec)+import Graphics.Color.Model as M hiding (LCH)+import Graphics.Color.Space qualified as S+import Harpie.Fixed (Array, array, (!))+import Harpie.Fixed qualified as F+import Harpie.Shape (KnownNats)+import Optics.Core+import System.Random+import System.Random.Stateful +{-# ANN module ("doctest-parallel: --no-implicit-module-import" :: String) #-}+ -- $setup -- -- >>> :set -XOverloadedLabels--- >>> :set -XNoImplicitPrelude--- >>> import Control.Lens--- >>> import Chart.Render---- | snatching Colour as the library color representation.-newtype Colour = Colour' {color' :: Color (Alpha RGB) Double} deriving (Eq, Generic)---- | Constructor.-pattern Colour :: Double -> Double -> Double -> Double -> Colour-pattern Colour r g b a = Colour' (ColorRGBA r g b a)+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core -{-# COMPLETE Colour #-}+-- | Colour type for the library: red, green, blue, opacity in [0,1].+data Colour = Colour Double Double Double Double+  deriving (Eq, Generic, Data)  instance Show Colour where   show (Colour r g b a) =     Text.unpack $-      "RGBA "+      "Colour "         <> fixed (Just 2) r         <> " "         <> fixed (Just 2) g@@ -79,104 +103,516 @@         <> " "         <> fixed (Just 2) a --- | get opacity+-- | CSS-style representation+showRGBA :: Colour -> ByteString+showRGBA (Colour r' g' b' a') =+  pack $ Text.unpack $ "rgba(" <> r <> ", " <> g <> ", " <> b <> ", " <> a <> ")"+  where+    r = percent (fixedSF (Just 0)) (Just 2) r'+    g = percent (fixedSF (Just 0)) (Just 2) g'+    b = percent (fixedSF (Just 0)) (Just 2) b'+    a = fixed (Just 2) a'++-- | CSS-style representation+showRGB :: Colour -> ByteString+showRGB (Colour r' g' b' _) =+  pack $ Text.unpack $ "rgb(" <> r <> ", " <> g <> ", " <> b <> ")"+  where+    r = percent (fixedSF (Just 0)) (Just 2) r'+    g = percent (fixedSF (Just 0)) (Just 2) g'+    b = percent (fixedSF (Just 0)) (Just 2) b'++-- | Is Colour in-gamut?+--+-- >>> validColour (Colour 1 1 1.01 1)+-- False+validColour :: Colour -> Bool+validColour (Colour r g b o) = r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1 && o >= 0 && o <= 1++-- | Trim colour back to gamut.+--+-- >>> trimColour (Colour 1 1 1.01 1)+-- Colour 1.00 1.00 1.00 1.00+trimColour :: Colour -> Colour+trimColour (Colour r g b a) = Colour (trim r) (trim g) (trim b) (trim a)+  where+    trim x = max 0 $ min 1 x++-- | Validate that the Colout is in-gamut.+--+-- >>> validate (Colour 1 1 1.01 1)+-- Nothing+validate :: Colour -> Maybe Colour+validate c = bool Nothing (Just c) (validColour c)++-- | Opacity or alpha opac :: Colour -> Double-opac c = getAlpha (color' c)+opac (Colour _ _ _ o) = o --- | set opacity-setOpac :: Double -> Colour -> Colour-setOpac o (Colour r g b _) = Colour r g b o+-- | CSS-style representation+showOpacity :: Colour -> ByteString+showOpacity c = pack $ Text.unpack $ formatOrShow (FixedStyle 2) Nothing (opac c) --- |-fromRGB :: Color RGB Double -> Double -> Colour-fromRGB (ColorRGB r b g) o = Colour' $ ColorRGBA r b g o+-- | lens for opacity (or alpha channel)+opac' :: Lens' Colour Double+opac' = lens opac (\(Colour r g b _) o -> Colour r g b o) --- |-hex :: Colour -> Text-hex c = toHex c+-- | Sets RGB color but not opacity+rgb :: Colour -> Colour -> Colour+rgb (Colour r g b _) (Colour _ _ _ o) = Colour r g b o --- | interpolate between 2 colors-blend :: Double -> Colour -> Colour -> Colour-blend c (Colour r g b a) (Colour r' g' b' a') = Colour r'' g'' b'' a''+-- | Select a Colour from the palette+--+-- >>> palette 0+-- Colour 0.02 0.73 0.80 1.00+--+-- ![wheel](other/wheel.svg)+palette :: Int -> Colour+palette x = cycle palette1_ List.!! x++palette1LCHA_ :: [LCHA]+palette1LCHA_ = [LCHA 0.72 0.123 207 1, LCHA 0.40 0.10 246 1, LCHA 0.50 0.21 338 1, LCHA 0.8 0.15 331 1, LCHA 0.83 0.14 69 1, LCHA 0.57 0.15 50 1, LCHA 0.38 0.085 128 1, LCHA 0.60 0.08 104 1]++-- | Finite list of Colours+--+-- Swatched to the oklab color model:+--+-- ![palette](other/palette.svg)+palette1_ :: [Colour]+palette1_ = trimColour . view lcha2colour' <$> palette1LCHA_++-- | Select a Colour from the palette with a specified opacity+--+-- >>> paletteO 0 0.5+-- Colour 0.02 0.73 0.80 0.50+paletteO :: Int -> Double -> Colour+paletteO x a = set opac' a $ cycle palette1_ List.!! x++-- | black+--+-- >>> black+-- Colour 0.00 0.00 0.00 1.00+black :: Colour+black = Colour 0 0 0 1++-- | white+--+-- >>> white+-- Colour 0.99 0.99 0.99 1.00+white :: Colour+white = Colour 0.99 0.99 0.99 1++-- | light+--+-- For lighter huds against a dark background ...+--+-- > colourHudOptions light defaultHudOptions+--+-- >>> light+-- Colour 0.94 0.94 0.94 1.00+light :: Colour+light = Colour 0.94 0.94 0.94 1++-- | dark+--+-- dark is hardcoded in most of the default options.+--+-- >>> dark+-- Colour 0.05 0.05 0.05 1.00+dark :: Colour+dark = Colour 0.05 0.05 0.05 1++-- | Grey(scale) colour inputting lightness and opacity.+--+-- >>> grey 0.5 0.4+-- Colour 0.50 0.50 0.50 0.40+grey :: Double -> Double -> Colour+grey g a = Colour g g g a++-- | Zero-opacity black+--+-- >>> transparent+-- Colour 0.00 0.00 0.00 0.00+transparent :: Colour+transparent = Colour 0 0 0 0++class ArrayAs f s a where+  arrayAs :: (KnownNats s) => Array s a -> f a++-- | LCH colour representation+--+-- oklab is a colour space being written into CSS specifications, that attempts to be ok at human-consistent colour representation. See:+--+-- - <https://bottosson.github.io/posts/oklab/ A perceptual color space for image processing>+-- - <https://www.w3.org/TR/css-color-5/#colorcontrast CSS Color Module Level 5>+-- - <https://www.w3.org/TR/css-color-4/#rgb-functions CSS Color Module Level 4>+--+-- The type is represented by three elements:+--+-- L: Lightness ranging from 0 (@LCH 0 _ _@ is black) to 1 (@LCH 1 _ _@ is white)+--+-- C: Chromacity, which ranges from 0 to around 0.32 or so.+--+-- H: Hue, which ranges from 0 to 360+data LCH a = LCH a a a deriving (Eq, Show, Functor)++instance ArrayAs LCH '[3] a where+  arrayAs a = LCH (a ! [0]) (a ! [1]) (a ! [2])++-- | Lightness lens for LCH+lLCH' :: Lens' (LCH Double) Double+lLCH' = lens (\(LCH l _ _) -> l) (\(LCH _ c h) l -> LCH l c h)++-- | Chromacity lens for LCH+cLCH' :: Lens' (LCH Double) Double+cLCH' = lens (\(LCH _ c _) -> c) (\(LCH l _ h) c -> LCH l c h)++-- | Hue lens for LCH+hLCH' :: Lens' (LCH Double) Double+hLCH' = lens (\(LCH _ _ h) -> h) (\(LCH l c _) h -> LCH l c h)++-- | LCHA representation, including an alpha channel.+data LCHA = LCHA' {_lch :: LCH Double, _alpha :: Double} deriving (Eq, Show)++-- | LCH lens for LCHA+lch' :: Lens' LCHA (LCH Double)+lch' = lens (\(LCHA' lch _) -> lch) (\(LCHA' _ a) lch -> LCHA' lch a)++-- | Alpha lens for LCHA+alpha' :: Lens' LCHA Double+alpha' = lens (\(LCHA' _ a) -> a) (\(LCHA' lch _) a -> LCHA' lch a)++-- | LCHA pattern+pattern LCHA :: Double -> Double -> Double -> Double -> LCHA+pattern LCHA l c h a <-+  LCHA' (LCH l c h) a   where-    r'' = r + c * (r' - r)-    g'' = g + c * (g' - g)-    b'' = b + c * (b' - b)-    a'' = a + c * (a' - a)+    LCHA l c h a = LCHA' (LCH l c h) a --- |-parseHex :: A.Parser (Color RGB Double)-parseHex =-  fmap toDouble-    . ( \((r, g), b) ->-          ColorRGB (fromIntegral r) (fromIntegral g) (fromIntegral b) :: Color RGB Word8-      )-    . (\(f, b) -> (f `divMod` (256 :: Int), b))-    . (`divMod` 256)-    <$> (A.string "#" *> A.hexadecimal)+{-# COMPLETE LCHA #-} --- |-fromHex :: Text -> Either Text (Color RGB Double)-fromHex = first pack . A.parseOnly parseHex+-- * RGB colour representation --- |-unsafeFromHex :: Text -> Color RGB Double-unsafeFromHex t = either (const (ColorRGB 0 0 0)) id $ A.parseOnly parseHex t+-- | A type to represent the RGB triple, useful as an intermediary between 'Colour' and 'LCHA'+data RGB3 a = RGB3 a a a deriving (Eq, Show, Functor) --- | convert from 'Colour' to #xxxxxx-toHex :: Colour -> Text-toHex c =-  "#"-    <> Text.justifyRight 2 '0' (hex' r)-    <> Text.justifyRight 2 '0' (hex' g)-    <> Text.justifyRight 2 '0' (hex' b)+instance ArrayAs RGB3 '[3] a where+  arrayAs a = RGB3 (a ! [0]) (a ! [1]) (a ! [2])++-- | Lens for conversion between Double and Word8 RGB triples.+rgbd' :: Iso' (RGB3 Double) (RGB3 Word8)+rgbd' = iso (fmap (floor . (* 256))) (fmap (\x -> fromIntegral x / 256.0))++-- | Lens for conversion between an (RGB3, alpha) pair and Colour+rgb32colour' :: Iso' (RGB3 Double, Double) Colour+rgb32colour' = iso (\(RGB3 r g b, a) -> Colour r g b a) (\(Colour r g b a) -> (RGB3 r g b, a))++-- * LAB colour representation++-- | LAB colour representation. a is green-red and b is blue-yellow+data LAB a = LAB a a a deriving (Eq, Show, Functor)++instance ArrayAs LAB '[3] a where+  arrayAs a = LAB (a ! [0]) (a ! [1]) (a ! [2])++-- * Colour conversions++-- * lcha to colour++-- | LCHA to Colour lens+--+-- >>> c0 = Colour 0.78 0.36 0.02 1.00+-- >>> view (re lcha2colour') c0+-- LCHA' {_lch = LCH 0.5969891006896103 0.15793931531669247 49.191113810479784, _alpha = 1.0}+--+-- >>> view (re lcha2colour' % lcha2colour') c0+-- Colour 0.78 0.36 0.02 1.00+--+-- >>> c1 = Colour 0.49 0.14 0.16 1+-- >>> view (re lcha2colour') c1+-- LCHA' {_lch = LCH 0.40115567099848914 0.12279066817938503 21.51476756026837, _alpha = 1.0}+--+-- >>> view (re lcha2colour' % lcha2colour') c1+-- Colour 0.49 0.14 0.16 1.00+lcha2colour' :: Iso' LCHA Colour+lcha2colour' =+  iso+    (\(LCHA' lch a) -> let (RGB3 r g b) = view (re lab2lch' % re rgb2lab') lch in Colour r g b a)+    (\c@(Colour _ _ _ a) -> LCHA' (view (re rgb32colour' % _1 % rgb2lab' % lab2lch') c) a)++-- * lab to lch++-- | Lens between generic XY color representations and CH ones, which are polar versions of the XY.+xy2ch' :: Iso' (Double, Double) (Double, Double)+xy2ch' =+  iso+    (\(x, y) -> (magnitude (Point x y), 180 / pi * mod_ (angle (Point x y)) (2 * pi)))+    (\(c, h) -> let (Point x y) = fmap (c *) (ray (pi / 180 * h)) in (x, y))++mod_ :: Double -> Double -> Double+mod_ x d = x - fromIntegral (floor (x / d) :: Integer) * d++-- | Lens between LAB and LCH+lab2lch' :: Iso' (LAB Double) (LCH Double)+lab2lch' =+  iso+    (\(LAB l a b) -> let (c, h) = view xy2ch' (a, b) in LCH l c h)+    (\(LCH l c h) -> let (a, b) = view (re xy2ch') (c, h) in LAB l a b)++-- * rgb to lab++-- | Lens between RGB3 and LAB+rgb2lab' :: Iso' (RGB3 Double) (LAB Double)+rgb2lab' =+  iso+    (\(RGB3 r g b) -> arrayAs . xyz2lab_ . rgb2xyz_ $ array [r, g, b])+    (\(LAB l a b) -> arrayAs . xyz2rgb_ . lab2xyz_ $ array [l, a, b])++-- * rgb to xyz++xyz2rgb_ :: F.Array '[3] Double -> F.Array '[3] Double+xyz2rgb_ a = array [r, g, b]   where-    (ColorRGBA r g b _) = toWord8 <$> color' c+    (S.ColorSRGB r g b) = S.xyz2rgb (S.ColorXYZ (a ! [0]) (a ! [1]) (a ! [2])) :: Color (S.SRGB 'S.NonLinear) Double --- |-hex' :: (FromInteger a, ToIntegral a Integer, Integral a, Ord a, Subtractive a) => a -> Text-hex' i-  | i < 0 = "-" <> go (- i)-  | otherwise = go i+-- >>> rgb2xyz_ [1,1,1]+-- [0.9505, 1.0, 1.089]+rgb2xyz_ :: F.Array '[3] Double -> F.Array '[3] Double+rgb2xyz_ a = array [x, y, z]   where-    go n-      | n < 16 = hexDigit n-      | otherwise = go (n `quot` 16) <> hexDigit (n `rem` 16)+    (S.ColorXYZ x y z) = S.rgb2xyz (S.ColorSRGB (a ! [0]) (a ! [1]) (a ! [2])) :: Color (S.XYZ S.D65) Double --- |-hexDigit :: (Ord a, FromInteger a, ToIntegral a Integer) => a -> Text-hexDigit n-  | n <= 9 = Text.singleton P.$! i2d (fromIntegral n)-  | otherwise = Text.singleton P.$! toEnum (fromIntegral n + 87)+-- * xyz to lab --- |-i2d :: Int -> Char-i2d i = chr (ord '0' + i)+m1 :: F.Array '[3, 3] Double+m1 =+  array+    [ 0.8189330101,+      0.3618667424,+      -0.1288597137,+      0.0329845436,+      0.9293118715,+      0.0361456387,+      0.0482003018,+      0.2643662691,+      0.6338517070+    ] --- | some RGB colors to work with-palette :: [Color RGB Double]-palette = unsafeFromHex <$> ["#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00", "#cab2d6", "#6a3d9a", "#ffff99", "#b15928"]+m2 :: F.Array '[3, 3] Double+m2 =+  array+    [ 0.2104542553,+      0.7936177850,+      -0.0040720468,+      1.9779984951,+      -2.4285922050,+      0.4505937099,+      0.0259040371,+      0.7827717662,+      -0.8086757660+    ] --- | some RGBA colors-palette1 :: [Colour]-palette1 = (\c -> fromRGB c 1) <$> palette+cubicroot :: (Floating a, Ord a) => a -> a+cubicroot x = bool ((-1) * (-x) ** (1 / 3.0)) (x ** (1 / 3.0)) (x >= 0) --- | gray with 1 opacity-grayscale :: Double -> Color RGB Double-grayscale n = ColorRGB n n n+-- >>> xyz2lab_ [0.95, 1, 1.089]+-- [0.9999686754143632, -2.580058168537569e-4, -1.1499756458199784e-4]+--+-- >>> xyz2lab_ [1,0,0]+-- [0.4499315814860224, 1.2357102101076207, -1.9027581087245393e-2]+--+-- >>> xyz2lab_ [0,1,0]+-- [0.921816758286376, -0.6712376131199635, 0.2633235500611929]+--+-- >>> xyz2lab_ [1,0,1]+-- [0.5081033967278659, 1.147837087146462, -0.36768466477695416]+--+-- >>> xyz2lab_ [0,0,1]+-- [0.15260258004008057, -1.4149965510120839, -0.4489272035597538]+xyz2lab_ :: F.Array '[3] Double -> F.Array '[3] Double+xyz2lab_ xyz =+  F.dot sum (*) m2 (cubicroot <$> F.dot sum (*) m1 xyz) --- | standard text color-colorText :: Colour-colorText = fromRGB (grayscale 0.2) 1+m1' :: F.Array '[3, 3] Double+m1' =+  array+    [ 1.227013851103521026,+      -0.5577999806518222383,+      0.28125614896646780758,+      -0.040580178423280593977,+      1.1122568696168301049,+      -0.071676678665601200577,+      -0.076381284505706892869,+      -0.42148197841801273055,+      1.5861632204407947575+    ] --- |-black :: Colour-black = fromRGB (grayscale 0) 1+m2' :: F.Array '[3, 3] Double+m2' =+  array+    [ 0.99999999845051981432,+      0.39633779217376785678,+      0.21580375806075880339,+      1.0000000088817607767,+      -0.1055613423236563494,+      -0.063854174771705903402,+      1.0000000546724109177,+      -0.089484182094965759684,+      -1.2914855378640917399+    ] --- |-white :: Colour-white = fromRGB (grayscale 1) 1+lab2xyz_ :: F.Array '[3] Double -> F.Array '[3] Double+lab2xyz_ lab =+  F.dot sum (*) m1' ((** 3.0) <$> F.dot sum (*) m2' lab) --- |-transparent :: Colour-transparent = Colour 0 0 0 0+-- * mixins++-- | Mix 2 colours, using the oklch model.+--+-- This may not always be what you expect. One example is mixing black and another colour:+--+-- >>> mix 0.8 (Colour 0 0 0 1) (Colour 0.2 0.6 0.8 0.5)+-- Colour -0.09 0.48 0.45 0.60+--+-- The mix has gone out of gamut because we are swishing through hue mixes.+--+-- In this case, settting the hue on the black colour within the LCH contruct helps:+--+-- >>> betterblack = set (lch' % hLCH') (view hue' (Colour 0.2 0.6 0.8 0.5)) (review lcha2colour' black)+-- >>> view lcha2colour' $ mixLCHA 0.8 betterblack (review lcha2colour' $ Colour 0.2 0.6 0.8 0.5)+-- Colour 0.14 0.44 0.59 0.60+mix :: Double -> Colour -> Colour -> Colour+mix x c0 c1 = view lcha2colour' (mixLCHA x (review lcha2colour' c0) (review lcha2colour' c1))++-- | Mix 2 colours, using the oklch model, trimming the reult back to in-gamut.+--+-- >>> mixTrim 0.8 (Colour 0 0 0 1) (Colour 0.2 0.6 0.8 0.5)+-- Colour 0.00 0.48 0.45 0.60+mixTrim :: Double -> Colour -> Colour -> Colour+mixTrim x c0 c1 = trimColour (mix x c0 c1)++-- | Mix two LCHA specified colours.+mixLCHA :: Double -> LCHA -> LCHA -> LCHA+mixLCHA x (LCHA l c h a) (LCHA l' c' h' a') = LCHA l'' c'' h'' a''+  where+    l'' = l + x * (l' - l)+    c'' = c + x * (c' - c)+    h'' = h + x * (h' - h)+    a'' = a + x * (a' - a)++-- | Interpolate across a list of Colours, with input being in Range 0 1+--+-- >>> mixes 0 [black, (Colour 0.2 0.6 0.8 0.5), white]+-- Colour 0.00 0.00 0.00 1.00+--+-- >>> mixes 1 [black, (Colour 0.2 0.6 0.8 0.5), white]+-- Colour 0.99 0.99 0.99 1.00+--+-- >>> mixes 0.6 [black, (Colour 0.2 0.6 0.8 0.5), white]+-- Colour 0.42 0.67 0.86 0.60+mixes :: Double -> [Colour] -> Colour+mixes _ [] = light+mixes _ [c] = c+mixes x cs = mix r (cs List.!! i') (cs List.!! (i' + 1))+  where+    l = length cs - 1+    x' = x * fromIntegral l+    i' = max 0 (min (floor x') (l - 1))+    r = x' - fromIntegral i'++-- * Colour manipulation++-- | Convert a colour to grayscale with the same lightness.+--+-- >>> greyed (Colour 0.4 0.7 0.8 0.4)+-- Colour 0.65 0.65 0.65 0.40+greyed :: Colour -> Colour+greyed = over chroma' (const 0)++-- | Lightness lens+--+-- >>> over lightness' (*0.8) (Colour 0.4 0.7 0.8 0.4)+-- Colour 0.22 0.52 0.62 0.40+lightness' :: Lens' Colour Double+lightness' = re lcha2colour' % lch' % lLCH'++-- | Chromacity lens+--+-- >>> over chroma' (*0.8) (Colour 0.4 0.7 0.8 0.4)+-- Colour 0.46 0.69 0.77 0.40+chroma' :: Lens' Colour Double+chroma' = re lcha2colour' % lch' % cLCH'++-- | Hue lens+--+-- >>> over hue' (+180) (Colour 0.4 0.7 0.8 0.4)+-- Colour 0.83 0.58 0.49 0.40+hue' :: Lens' Colour Double+hue' = re lcha2colour' % lch' % hLCH'++-- | Html element to display colours+--+-- >>> showSwatch "swatch" dark+-- "<div class=swatch style=\"background:rgba(5%, 5%, 5%, 1.00);\">swatch</div>"+showSwatch :: Text -> Colour -> Text+showSwatch label (Colour r' g' b' a') =+  "<div class=swatch style=\"background:" <> rgba <> ";\">" <> label <> "</div>"+  where+    rgba = "rgba(" <> r <> ", " <> g <> ", " <> b <> ", " <> a <> ")"+    r = percent (fixedSF (Just 0)) (Just 2) r'+    g = percent (fixedSF (Just 0)) (Just 2) g'+    b = percent (fixedSF (Just 0)) (Just 2) b'+    a = fixed (Just 2) a'++-- | Show multiple colors with embedded text.+showSwatches :: Text -> Text -> [(Text, Colour)] -> Text+showSwatches pref suff hs = "<div>" <> "\n" <> pref <> "\n" <> divs <> "\n" <> suff <> "\n" <> "</div>"+  where+    divs = Text.intercalate "\n" (uncurry showSwatch <$> hs)++-- * random colors++instance Uniform (RGB3 Double) where+  uniformM gen = do+    r <- uniformRM (0, 1) gen+    g <- uniformRM (0, 1) gen+    b <- uniformRM (0, 1) gen+    pure (RGB3 r g b)++instance Uniform Colour where+  uniformM gen = do+    r <- uniformRM (0, 1) gen+    g <- uniformRM (0, 1) gen+    b <- uniformRM (0, 1) gen+    a <- uniformRM (0, 1) gen+    pure (Colour r g b a)++-- | Random variates of a uniform+rvs :: (Uniform a) => [a]+rvs = go g0+  where+    g0 = mkStdGen 42+    go g = let (x, g') = uniform g in x : go g'++-- | Random list of RGB3s+rvRGB3 :: [RGB3 Double]+rvRGB3 = rvs++-- | Random list of Colours+rvColour :: [Colour]+rvColour = rvs++-- | Random Colours with an opacity of 1 that are not too extreme in terms of lightness or chromacity.+paletteR :: [Colour]+paletteR = go g0+  where+    g0 = mkStdGen 42+    go g = let (x, g') = runStateGen g rvSensible in x : go g'++-- | A random Colour generator that provides a (hopefully) pleasant colour not too light, dark, over-saturated or dull.+rvSensible :: (StatefulGen g m) => g -> m Colour+rvSensible gen = do+  l <- uniformRM (0.3, 0.75) gen+  c <- uniformRM (0.05, 0.24) gen+  h <- uniformRM (0, 360) gen+  pure ((trimColour . view lcha2colour') (LCHA l c h 1))
− src/Data/FormatN.hs
@@ -1,232 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedLabels #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RebindableSyntax #-}-{-# LANGUAGE TypeFamilies #-}-{-# OPTIONS_GHC -Wall #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS_GHC -fno-warn-type-defaults #-}--module Data.FormatN-  ( -- $formats-    FormatN (..),-    defaultFormatN,-    fromFormatN,-    toFormatN,-    fixed,-    decimal,-    prec,-    comma,-    expt,-    dollar,-    formatN,-    precision,-    formatNs,-  )-where--import Data.Generics.Labels ()-import Data.List (nub)-import Data.Scientific-import qualified Data.Text as Text-import NumHask.Prelude---- $setup------ >>> :set -XNoImplicitPrelude--- >>> -- import NumHask.Prelude---- | Number formatting options.------ >>> defaultFormatN--- FormatComma (Just 2)-data FormatN-  = FormatFixed (Maybe Int)-  | FormatDecimal (Maybe Int)-  | FormatComma (Maybe Int)-  | FormatExpt (Maybe Int)-  | FormatPrec (Maybe Int)-  | FormatDollar (Maybe Int)-  | FormatPercent (Maybe Int)-  | FormatNone-  deriving (Eq, Show, Generic)---- | The official format-defaultFormatN :: FormatN-defaultFormatN = FormatComma (Just 2)---- | textifier-fromFormatN :: (IsString s) => FormatN -> s-fromFormatN (FormatFixed _) = "Fixed"-fromFormatN (FormatDecimal _) = "Decimal"-fromFormatN (FormatComma _) = "Comma"-fromFormatN (FormatExpt _) = "Expt"-fromFormatN (FormatPrec _) = "Prec"-fromFormatN (FormatDollar _) = "Dollar"-fromFormatN (FormatPercent _) = "Percent"-fromFormatN FormatNone = "None"---- | readifier-toFormatN :: (Eq s, IsString s) => s -> Maybe Int -> FormatN-toFormatN "Fixed" n = FormatFixed n-toFormatN "Decimal" n = FormatDecimal n-toFormatN "Comma" n = FormatComma n-toFormatN "Expt" n = FormatExpt n-toFormatN "Prec" n = FormatPrec n-toFormatN "Dollar" n = FormatDollar n-toFormatN "Percent" n = FormatPercent n-toFormatN "None" _ = FormatNone-toFormatN _ _ = FormatNone---- | to x decimal places------ >>> fixed (Just 2) 1--- "1.00"------ >>> fixed (Just 2) 0.001--- "0.00"-fixed :: Maybe Int -> Double -> Text-fixed x n = pack $ formatScientific Fixed x (fromFloatDigits n)---- | scientific exponential------ >>> expt (Just 2) 1234--- "1.23e3"-expt :: Maybe Int -> Double -> Text-expt x n = pack $ formatScientific Exponent x (fromFloatDigits n)---- | round to n significant figures------ >>> roundSig 2 1234--- 1230.0------ >>> roundSig 2 0.001234--- 1.23e-3-roundSig :: Int -> Double -> Scientific-roundSig n x = scientific r' (e - length ds0)-  where-    (ds, e) = toDecimalDigits $ fromFloatDigits x-    (ds0, ds1) = splitAt (n + 1) ds-    r =-      (fromIntegral $ foldl' (\x a -> x * 10 + a) 0 ds0 :: Double)-        + (fromIntegral $ foldl' (\x a -> x * 10 + a) 0 ds1) / (10.0 ^ (length ds1 :: Int))-    r' = round r :: Integer---- | format numbers between 0.001 and 1,000,000 using digit and comma notation and exponential outside this range, with x significant figures.--- > prec (Just 1) 0.00234--- "0.0023"------ > prec (Just 1) 0.000023--- "2.3e-5"------ > prec (Just 1) 123--- "120"------ > prec (Just 1) 123456--- "120,000"------ >>> prec (Just 1) 1234567--- "1.2e6"-prec :: Maybe Int -> Double -> Text-prec n x-  | x < 0 = "-" <> prec n (- x)-  | x == 0 = "0"-  | x < 0.001 = expt n x-  | x > 1e6 = expt n x-  | otherwise = decimal n (toRealFloat x')-  where-    x' = maybe fromFloatDigits roundSig n $ x---- | round to n significant figures and always use decimal notation--- >>> decimal (Just 2) 0.000001234--- "0.00000123"------ >>> decimal (Just 2) 1234567--- "1230000"-decimal :: Maybe Int -> Double -> Text-decimal n x = x''-  where-    x' = pack $ formatScientific Fixed Nothing $ maybe fromFloatDigits roundSig n $ x-    x'' = (\x -> bool x' (fst x) (snd x == ".0")) $ Text.breakOn "." x'---- | add commas format for numbers above 1,000 but below 1 million, otherwise use prec.------ >>> comma Nothing 1234.567--- "1,234.567"------ >>> comma (Just 2) 1234--- "1,230"-comma :: Maybe Int -> Double -> Text-comma n x-  | x < 0 = "-" <> comma n (- x)-  | x < 1000 || x > 1e6 = prec n x-  | otherwise = case n of-    Nothing -> addcomma (show x)-    Just _ -> addcomma (prec n x)-  where-    addcomma :: Text -> Text-    addcomma x = (\x -> fst x <> snd x) . first (Text.reverse . Text.intercalate "," . Text.chunksOf 3 . Text.reverse) $ Text.breakOn "." x---- | dollars and cents, always decimal notation------ >>> dollar (Just 2) 1234--- "$1,230"------ >>> dollar (Just 2) 0.01234--- "$0.0123"-dollar :: (Maybe Int) -> Double -> Text-dollar n x-  | x < 0 = "-" <> dollar n (- x)-  | otherwise = "$" <> comma n x---- | fixed percent, always decimal notation------ >>> percent (Just 2) 0.001234--- "0.123%"-percent :: Maybe Int -> Double -> Text-percent n x = (<> "%") $ decimal n (100 * x)---- | make text-formatN :: FormatN -> Double -> Text-formatN (FormatFixed n) x = fixed n x-formatN (FormatDecimal n) x = decimal n x-formatN (FormatPrec n) x = prec n x-formatN (FormatComma n) x = comma n x-formatN (FormatExpt n) x = expt n x-formatN (FormatDollar n) x = dollar n x-formatN (FormatPercent n) x = percent n x-formatN FormatNone x = pack (show x)---- | Provide formatted text for a list of numbers so that they are just distinguished.  'precision commas 2 ticks' means use as much precision as is needed for them to be distinguished, but with at least 2 significant figures.-precision :: (Maybe Int -> Double -> Text) -> Maybe Int -> [Double] -> [Text]-precision f Nothing xs = f Nothing <$> xs-precision f (Just n0) xs =-  precLoop f n0 xs-  where-    precLoop f' n xs' =-      let s = f' (Just n) <$> xs'-       in if s == nub s || n > 4-            then s-            else precLoop f' (n + 1) xs'---- | Consistently format a list of doubles.-formatNs :: FormatN -> [Double] -> [Text]-formatNs (FormatFixed n) xs = precision fixed n xs-formatNs (FormatDecimal n) xs = precision decimal n xs-formatNs (FormatPrec n) xs = precision prec n xs-formatNs (FormatComma n) xs = precision comma n xs-formatNs (FormatExpt n) xs = precision expt n xs-formatNs (FormatDollar n) xs = precision dollar n xs-formatNs (FormatPercent n) xs = precision percent n xs-formatNs FormatNone xs = pack . show <$> xs
+ src/Data/Path.hs view
@@ -0,0 +1,518 @@+{-# LANGUAGE RebindableSyntax #-}+{-# LANGUAGE TypeFamilies #-}++-- | SVG path manipulation+module Data.Path+  ( -- * Svg Paths+    -- $path+    PathData (..),+    pointPath,+    movePath,+    scalePath,+    projectPath,+    projectPaths,+    pathBoxes,+    pathBox,++    -- * Path maths+    ArcInfo (..),+    ArcPosition (..),+    ArcCentroid (..),+    arcCentroid,+    arcPosition,+    arcBox,+    arcDerivs,+    ellipse,+    QuadPosition (..),+    QuadPolar (..),+    quadPosition,+    quadPolar,+    quadBox,+    quadBezier,+    quadDerivs,+    CubicPosition (..),+    CubicPolar (..),+    cubicPosition,+    cubicPolar,+    cubicBox,+    cubicBezier,+    cubicDerivs,+    singletonCubic,+    singletonQuad,+    singletonArc,+    singletonPie,+  )+where++import Chart.Data+import Data.Data+import GHC.Generics+import Geom2D.CubicBezier qualified as B+import NumHask.Prelude+import NumHask.Space hiding (rw, rx, ry, rz)++-- $setup+--+-- >>> :set -XOverloadedLabels+-- >>> :set -XOverloadedStrings+-- >>> import Chart+-- >>> import Optics.Core++-- $path+-- Every element of an SVG path can be thought of as exactly two points in space, with instructions of how to draw a curve between them.  From this point of view, one which this library adopts, a path chart is thus very similar to a line chart.  There's just a lot more information about the style to deal with.+--+-- References:+--+-- [SVG d](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d)+--+-- [SVG path](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths)++-- | Representation of a single SVG path data point+data PathData a+  = -- | Starting position+    StartP (Point a)+  | -- | line (from previous position)+    LineP (Point a)+  | -- | cubic bezier curve+    CubicP (Point a) (Point a) (Point a)+  | -- | quad bezier curve+    QuadP (Point a) (Point a)+  | -- arc+    ArcP (ArcInfo a) (Point a)+  deriving (Eq, Show, Generic, Data)++-- | View the Point part of a PathData+pointPath :: PathData a -> Point a+pointPath (StartP p) = p+pointPath (LineP p) = p+pointPath (CubicP _ _ p) = p+pointPath (QuadP _ p) = p+pointPath (ArcP _ p) = p++-- | Move the Point part of a PathData+movePath :: (Additive a) => Point a -> PathData a -> PathData a+movePath x (StartP p) = StartP (p + x)+movePath x (LineP p) = LineP (p + x)+movePath x (CubicP c1 c2 p) = CubicP (c1 + x) (c2 + x) (p + x)+movePath x (QuadP c p) = QuadP (c + x) (p + x)+movePath x (ArcP i p) = ArcP i (p + x)++-- | Multiplicatively scale a PathData+scalePath :: (Multiplicative a) => a -> PathData a -> PathData a+scalePath x (StartP p) = StartP (fmap (x *) p)+scalePath x (LineP p) = LineP (fmap (x *) p)+scalePath x (CubicP c1 c2 p) = CubicP (fmap (x *) c1) (fmap (x *) c2) (fmap (x *) p)+scalePath x (QuadP c p) = QuadP (fmap (x *) c) (fmap (x *) p)+scalePath x (ArcP i p) = ArcP i (fmap (x *) p)++-- | Project a list of connected PathDatas from one Rect (XY plave) to a new one.+projectPaths :: Rect Double -> Rect Double -> [PathData Double] -> [PathData Double]+projectPaths new old ps = snd $ mapAccumL (\s a -> let d = projectPath new old s a in (pointPath d, d)) zero ps++-- | Project a PathData from one Rect (XY plave) to a new one.+projectPath ::+  Rect Double ->+  Rect Double ->+  Point Double ->+  PathData Double ->+  PathData Double+projectPath new old _ (CubicP c1 c2 p) =+  CubicP (projectOnP new old c1) (projectOnP new old c2) (projectOnP new old p)+projectPath new old _ (QuadP c p) =+  QuadP (projectOnP new old c) (projectOnP new old p)+projectPath new old p1 (ArcP ai p2) = ArcP (projectArcPosition new old (ArcPosition p1 p2 ai)) (projectOnP new old p2)+projectPath new old _ (LineP p) = LineP (projectOnP new old p)+projectPath new old _ (StartP p) = StartP (projectOnP new old p)++-- | Convert cubic position to path data.+singletonCubic :: CubicPosition Double -> [PathData Double]+singletonCubic (CubicPosition s e c1 c2) = [StartP s, CubicP c1 c2 e]++-- | Convert quad position to path data.+singletonQuad :: QuadPosition Double -> [PathData Double]+singletonQuad (QuadPosition s e c) = [StartP s, QuadP c e]++-- | Convert arc position to path data.+singletonArc :: ArcPosition Double -> [PathData Double]+singletonArc (ArcPosition s e i) = [StartP s, ArcP i e]++-- | Convert arc position to a pie slice, with a specific center.+singletonPie :: Point Double -> ArcPosition Double -> [PathData Double]+singletonPie c (ArcPosition s e i) = [StartP c, LineP s, ArcP i e, LineP c]++-- * Arc types++-- | Information about an individual arc path.+data ArcInfo a = ArcInfo+  { -- | ellipse radii+    radii :: Point a,+    -- | rotation of the ellipse. positive means counter-clockwise (which is different to SVG).+    phi :: a,+    large :: Bool,+    -- | sweep means clockwise+    clockwise :: Bool+  }+  deriving (Eq, Show, Generic, Data)++-- | Specification of an Arc using positional referencing as per SVG standard.+data ArcPosition a = ArcPosition+  { posStart :: Point a,+    posEnd :: Point a,+    posInfo :: ArcInfo a+  }+  deriving (Eq, Show, Generic, Data)++-- | Arc specification based on centroidal interpretation.+--+-- See: https://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter+data ArcCentroid a = ArcCentroid+  { -- | ellipse center+    centroid :: Point a,+    -- | ellipse radii+    radius :: Point a,+    -- | ellipse rotation+    cphi :: a,+    -- | starting point angle to the x-axis+    ang0 :: a,+    -- | difference between ending point angle and starting point angle+    angdiff :: a+  }+  deriving (Eq, Show, Generic, Data)++-- | convert from an ArcPosition spec to ArcCentroid spec.+--+-- See also [this](https://math.stackexchange.com/questions/55627/how-to-find-the-center-of-an-scaled-ellipse)+--+-- >>> let p = ArcPosition (Point 0 0) (Point 1 0) (ArcInfo (Point 1 0.5) (pi/4) False True)+-- >>> arcCentroid p+-- ArcCentroid {centroid = Point 0.20952624903444356 (-0.48412291827592724), radius = Point 1.0 0.5, cphi = 0.7853981633974483, ang0 = 1.3753858999692936, angdiff = -1.823476581936975}+arcCentroid :: (Ord a, FromInteger a, TrigField a, ExpField a) => ArcPosition a -> ArcCentroid a+arcCentroid (ArcPosition p1@(Point x1 y1) p2@(Point x2 y2) (ArcInfo rad phi' large' clockwise')) = ArcCentroid c (Point rx ry) phi' ang1 angd+  where+    (Point x1' y1') = rotateP (-phi') ((p1 - p2) |/ two)+    (Point rx' ry') = rad+    l = x1' ** 2 / rx' ** 2 + y1' ** 2 / ry' ** 2+    (rx, ry) = bool (rx', ry') (rx' * sqrt l, ry' * sqrt l) (l > 1)+    snumer = max 0 $ (rx * rx * ry * ry) - (rx * rx * y1' * y1') - (ry * ry * x1' * x1')+    s =+      bool (-1) 1 (large' == clockwise')+        * sqrt+          (snumer / (rx * rx * y1' * y1' + ry * ry * x1' * x1'))+    cx' = s * rx * y1' / ry+    cy' = s * (-ry) * x1' / rx+    cx = (x1 + x2) / 2 + cos phi' * cx' - sin phi' * cy'+    cy = (y1 + y2) / 2 + sin phi' * cx' + cos phi' * cy'+    c = Point cx cy+    ang1 = angle (Point (-((cx' - x1') / rx)) (-((cy' - y1') / ry)))+    ang2 = angle (Point (-((cx' + x1') / rx)) (-((cy' + y1') / ry)))+    angd' = ang2 - ang1+    angd =+      bool 0 (2 * pi) (not clockwise' && angd' < 0)+        + bool 0 (-(2 * pi)) (clockwise' && angd' > 0)+        + angd'++-- | Convert from an ArcCentroid to an ArcPosition specification.+--+-- Morally,+--+-- > arcPosition . arcCentroid == id+--+-- Not isomorphic if:+--+-- - angle diff is pi and large is True+--+-- - radii are less than they should be and thus get scaled up.+arcPosition :: (Ord a, Absolute a, TrigField a) => ArcCentroid a -> ArcPosition a+arcPosition (ArcCentroid c r phi' ang1 angd) =+  ArcPosition p1 p2 (ArcInfo r phi' large' clockwise')+  where+    p1 = ellipse c r phi' ang1+    p2 = ellipse c r phi' (ang1 + angd)+    large' = abs angd > pi+    clockwise' = angd < zero++-- | Ellipse formulae+--+-- >>> ellipse zero (Point 1 2) (pi/6) pi+-- Point (-0.8660254037844388) (-0.4999999999999997)+--+-- Compare this "elegent" definition from [stackexchange](https://math.stackexchange.com/questions/426150/what-is-the-general-equation-of-the-ellipse-that-is-not-in-the-origin-and-rotate)+--+-- \[\dfrac{((x-h)\cos(A)+(y-k)\sin(A))^2}{a^2}+\dfrac{((x-h) \sin(A)-(y-k) \cos(A))^2}{b^2}=1\]+--+-- with the haskell code:+--+-- > c + (rotate phi |. (r * ray theta))+--+-- See also: [wolfram](https://mathworld.wolfram.com/Ellipse.html)+ellipse :: (Direction b, Dir b ~ a, Affinity b a, TrigField a) => b -> b -> a -> a -> b+ellipse c r phi' theta = c + (rotate phi' |. (r * ray theta))++-- | compute the bounding box for an arcBox+--+-- > let p = ArcPosition (Point 0 0) (Point 1 0) (ArcInfo (Point 1 0.5) (pi/4) False True)+-- > arcBox p+arcBox :: ArcPosition Double -> Rect Double+arcBox p = unsafeSpace1 pts+  where+    (ArcCentroid c r phi' ang0' angd) = arcCentroid p+    (x', y') = arcDerivs r phi'+    angr = ang0' ... (ang0' + angd) :: Range Double+    angs =+      filter+        (|.| angr)+        [ x',+          x' - 2 * pi,+          x' + pi,+          x' - pi,+          y',+          y' - 2 * pi,+          y' + pi,+          y' - pi,+          ang0',+          ang0' + angd+        ]+    pts = ellipse c r phi' <$> angs++-- | Potential arc turning points.+--+-- >>> arcDerivs (Point 1 0.5) (pi/4)+-- (-0.4636476090008061,0.4636476090008062)+arcDerivs :: Point Double -> Double -> (Double, Double)+arcDerivs (Point rx ry) phi' = (thetax1, thetay1)+  where+    thetax1 = atan2 (-(sin phi' * ry)) (cos phi' * rx)+    thetay1 = atan2 (cos phi' * ry) (sin phi' * rx)++-- | Quadratic bezier curve expressed in positional terms.+data QuadPosition a = QuadPosition+  { -- | starting point+    qposStart :: Point a,+    -- | ending point+    qposEnd :: Point a,+    -- | control point+    qposControl :: Point a+  }+  deriving (Eq, Show, Generic, Data)++-- | Quadratic bezier curve with control point expressed in polar terms normalised to the start - end line.+data QuadPolar a = QuadPolar+  { -- | starting point+    qpolStart :: Point a,+    -- | ending point+    qpolEnd :: Point a,+    -- | control point in terms of distance from and angle to the qp0 - qp2 line+    qpolControl :: Polar a+  }+  deriving (Eq, Show, Generic, Data)++-- | Convert from a positional to a polar representation of a cubic bezier.+--+-- >>> quadPolar (QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1)))+-- QuadPolar {qpolStart = Point 0.0 0.0, qpolEnd = Point 1.0 1.0, qpolControl = Polar {radial = 2.1213203435596424, azimuth = -0.7853981633974483}}+quadPolar :: (Eq a, TrigField a, ExpField a) => QuadPosition a -> QuadPolar a+quadPolar (QuadPosition start' end control) = QuadPolar start' end control'+  where+    mp = (start' + end) |/ two+    control' = polar (control - mp)++-- | Convert from a polar to a positional representation of a quadratic bezier.+--+-- > quadPosition . quadPolar == id+-- > quadPolar . quadPosition == id+--+-- >>> quadPosition $ quadPolar (QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1)))+-- QuadPosition {qposStart = Point 0.0 0.0, qposEnd = Point 1.0 1.0, qposControl = Point 2.0 (-0.9999999999999998)}+quadPosition :: (TrigField a) => QuadPolar a -> QuadPosition a+quadPosition (QuadPolar start' end control) = QuadPosition start' end control'+  where+    control' = coord control + (start' + end) |/ two++-- | The quadratic bezier equation+--+-- >>> quadBezier (QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1))) 0.33333333+-- Point 0.9999999933333332 (-0.33333333333333326)+quadBezier :: (FromInteger a, ExpField a) => QuadPosition a -> a -> Point a+quadBezier (QuadPosition start' end control) theta =+  (1 - theta)+    ^ 2+    *| start'+    + 2+    * (1 - theta)+    * theta+    *| control+    + theta+    ^ 2+    *| end++-- | QuadPosition turning points.+--+-- >>> quadDerivs (QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1)))+-- [0.6666666666666666,0.3333333333333333]+quadDerivs :: QuadPosition Double -> [Double]+quadDerivs (QuadPosition start' end control) = [x', y']+  where+    (Point detx dety) = start' - 2 *| control + end+    x' = bool ((_x start' - _x control) / detx) (2 * (_x control - _x start')) (detx == 0)+    y' = bool ((_y start' - _y control) / dety) (2 * (_y control - _y start')) (dety == 0)++-- | Bounding box for a QuadPosition+--+-- >>> quadBox (QuadPosition (Point 0 0) (Point 1 1) (Point 2 (-1)))+-- Rect 0.0 1.3333333333333335 (-0.33333333333333337) 1.0+quadBox :: QuadPosition Double -> Rect Double+quadBox p = unsafeSpace1 pts+  where+    ts = quadDerivs p+    pts = quadBezier p <$> ([0, 1] <> ts)++-- | Cubic bezier curve+--+-- Note that the ordering is different to the svg standard.+data CubicPosition a = CubicPosition+  { -- | starting point+    cposStart :: Point a,+    -- | ending point+    cposEnd :: Point a,+    -- | control point 1+    cposControl1 :: Point a,+    -- | control point 2+    cposControl2 :: Point a+  }+  deriving (Eq, Show, Generic, Data)++-- | A polar representation of a cubic bezier with control points expressed as polar and normalised to the start - end line.+data CubicPolar a = CubicPolar+  { -- | starting point+    cpolStart :: Point a,+    -- | ending point+    cpolEnd :: Point a,+    -- | control point in terms of distance from and angle to the start end line+    cpolControl1 :: Polar a,+    -- | control point in terms of distance from and angle to the start end line+    cpolControl2 :: Polar a+  }+  deriving (Eq, Show, Generic, Data)++-- | Convert from a positional to a polar representation of a cubic bezier.+--+-- > cubicPosition . cubicPolar == id+-- > cubicPolar . cubicPosition == id+--+-- >>> cubicPolar (CubicPosition (Point 0 0) (Point 1 1) (Point 1 (-1)) (Point 0 2))+-- CubicPolar {cpolStart = Point 0.0 0.0, cpolEnd = Point 1.0 1.0, cpolControl1 = Polar {radial = 1.1180339887498947, azimuth = -1.2490457723982544}, cpolControl2 = Polar {radial = 1.1180339887498947, azimuth = 1.8925468811915387}}+cubicPolar :: (Eq a, ExpField a, TrigField a) => CubicPosition a -> CubicPolar a+cubicPolar (CubicPosition start' end control1 control2) = CubicPolar start' end control1' control2'+  where+    mp = (start' + end) |/ two+    control1' = polar $ (control1 - mp) |/ magnitude (end - start')+    control2' = polar $ (control2 - mp) |/ magnitude (end - start')++-- | Convert from a polar to a positional representation of a cubic bezier.+--+-- > cubicPosition . cubicPolar == id+-- > cubicPolar . cubicPosition == id+--+-- >>> cubicPosition $ cubicPolar (CubicPosition (Point 0 0) (Point 1 1) (Point 1 (-1)) (Point 0 2))+-- CubicPosition {cposStart = Point 0.0 0.0, cposEnd = Point 1.0 1.0, cposControl1 = Point 1.0 (-1.0), cposControl2 = Point 1.6653345369377348e-16 2.0}+cubicPosition :: (Eq a, TrigField a, ExpField a) => CubicPolar a -> CubicPosition a+cubicPosition (CubicPolar start' end control1 control2) = CubicPosition start' end control1' control2'+  where+    control1' = magnitude (end - start') *| coord control1 + (start' + end) |/ two+    control2' = magnitude (end - start') *| coord control2 + (start' + end) |/ two++-- | The cubic bezier equation+--+-- >>> cubicBezier (CubicPosition (Point 0 0) (Point 1 1) (Point 1 (-1)) (Point 0 2)) 0.8535533905932737+-- Point 0.6767766952966369 1.2071067811865475+cubicBezier :: (FromInteger a, TrigField a) => CubicPosition a -> a -> Point a+cubicBezier (CubicPosition start' end control1 control2) theta =+  (1 - theta)+    ^ 3+    *| start'+    + 3+    * (1 - theta)+    ^ 2+    * theta+    *| control1+    + 3+    * (1 - theta)+    * theta+    ^ 2+    *| control2+    + theta+    ^ 3+    *| end++-- | Turning point positions for a CubicPosition (0,1 or 2)+--+-- >>> cubicDerivs (CubicPosition (Point 0 0) (Point 1 1) (Point 1 (-1)) (Point 0 2))+-- [0.8535533905932737,0.14644660940672624,0.5]+cubicDerivs :: CubicPosition Double -> [Double]+cubicDerivs+  ( CubicPosition+      (Point c0x c0y)+      (Point c3x c3y)+      (Point c1x c1y)+      (Point c2x c2y)+    ) =+    B.bezierHoriz b <> B.bezierVert b+    where+      b =+        B.CubicBezier+          (B.Point c0x c0y)+          (B.Point c1x c1y)+          (B.Point c2x c2y)+          (B.Point c3x c3y)++-- | Bounding box for a CubicPosition+--+-- >>> cubicBox (CubicPosition (Point 0 0) (Point 1 1) (Point 1 (-1)) (Point 0 2))+-- Rect 0.0 1.0 (-0.20710678118654752) 1.2071067811865475+cubicBox :: CubicPosition Double -> Rect Double+cubicBox p = unsafeSpace1 pts+  where+    ts = cubicDerivs p+    pts =+      cubicBezier p+        <$> filter+          (|.| Range 0 1)+          ([0, 1] <> ts)++-- | Bounding box for a list of path XYs.+pathBoxes :: [PathData Double] -> Maybe (Rect Double)+pathBoxes [] = Nothing+pathBoxes (x : xs) =+  Just $+    snd $+      foldl' step begin xs+  where+    begin :: (Point Double, Rect Double)+    begin = (pointPath x, singleton (pointPath x))+    step (start', r) a@(ArcP _ p) = (pointPath a, bool (pathBox start' a <> r) r (p == start'))+    step (start', r) a = (pointPath a, pathBox start' a <> r)++-- | Bounding box for a path info, start and end Points.+pathBox :: Point Double -> PathData Double -> Rect Double+pathBox start' info =+  case info of+    StartP p -> singleton p+    LineP p -> unsafeSpace1 [start', p]+    CubicP c1 c2 p -> cubicBox (CubicPosition start' p c1 c2)+    QuadP c p -> quadBox (QuadPosition start' p c)+    ArcP i p -> arcBox (ArcPosition start' p i)++-- | project an ArcPosition given new and old Rects+--+-- The radii of the ellipse can be represented as:+--+-- Point rx 0 & Point 0 ry+--+-- These two points are firstly rotated by p and then undergo scaling...+projectArcPosition :: Rect Double -> Rect Double -> ArcPosition Double -> ArcInfo Double+projectArcPosition new old (ArcPosition _ _ (ArcInfo (Point rx ry) phi' l cl)) = ArcInfo (Point rx'' ry'') phi' l cl+  where+    rx' = rotateP phi' (Point rx zero)+    rx'' = magnitude $ rx' * width new / width old+    ry' = rotateP phi' (Point zero ry)+    ry'' = magnitude $ ry' * width new / width old
+ src/Data/Path/Parser.hs view
@@ -0,0 +1,474 @@+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RebindableSyntax #-}+{-# LANGUAGE TemplateHaskell #-}++-- | Conversions to and from an SVG path to a 'PathData'+module Data.Path.Parser+  ( -- * Parsing+    parsePath,+    pathParser,+    command,+    svgToPathData,+    pathDataToSvg,+    PathCommand (..),+    Origin (..),+    toPathDatas,+  )+where++import Chart.Data+import Control.Applicative hiding (many, optional, some, (<|>))+import Control.Monad.State.Lazy+import Data.ByteString (ByteString, intercalate)+import Data.Char hiding (isDigit)+import Data.Data+import Data.FormatN+import Data.Path (ArcInfo (ArcInfo), PathData (..))+import Data.Text.Encoding (encodeUtf8)+import FlatParse.Basic+import GHC.Generics+import GHC.OverloadedLabels+import NumHask.Prelude hiding (optional, (<|>))+import Optics.Core hiding ((<|))++-- * parsing helpers++runParserMaybe :: Parser e a -> ByteString -> Maybe a+runParserMaybe p b = case runParser p b of+  OK r _ -> Just r+  Fail -> Nothing+  Err _ -> Nothing++comma_ :: Parser e ()+comma_ = $(char ',')++ws_ :: Parser e ()+ws_ =+  $( switch+       [|+         case _ of+           " " -> ws_+           "\n" -> ws_+           "\t" -> ws_+           "\r" -> ws_+           "\f" -> ws_+           _ -> pure ()+         |]+   )++-- | Parse a raw path string.+--+-- > :set -XOverloadedStrings+-- > let outerseg1 = "M-1.0,0.5 A0.5 0.5 0.0 1 1 0.0,-1.2320508075688774 1.0 1.0 0.0 0 0 -0.5,-0.3660254037844387 1.0 1.0 0.0 0 0 -1.0,0.5 Z"+-- > parsePath outerseg1+-- Just [MoveTo OriginAbsolute [Point (-1.0) 0.5],EllipticalArc OriginAbsolute [(0.5,0.5,0.0,True,True,Point 0.0 (-1.2320508075688774)),(1.0,1.0,0.0,False,False,Point (-0.5) (-0.3660254037844387)),(1.0,1.0,0.0,False,False,Point (-1.0) 0.5)],EndPath]+parsePath :: ByteString -> Maybe [PathCommand]+parsePath = runParserMaybe pathParser++commaWsp :: Parser e (Maybe ())+commaWsp = ws_ *> optional comma_ <* ws_++minus :: Parser e ()+minus = $(char '-') <|> byteString "¯"++digit :: Parser e Int+digit = (\c -> ord c - ord '0') <$> satisfyAscii isDigit++digits :: Parser e (Int, Int)+digits = do+  (place, n) <- chainr (\n (place, acc) -> (place * 10, acc + place * n)) digit (pure (1, 0))+  case place of+    1 -> empty+    _ -> pure (place, n)++-- A 'Double' parser. does not parse .1 as a double.+double :: Parser e Double+double = do+  (placel, nl) <- digits+  withOption+    ($(char '.') *> digits)+    ( \(placer, nr) ->+        case placel of+          1 -> empty+          _ -> pure $ fromIntegral nl + fromIntegral nr / fromIntegral placer+    )+    ( case placel of+        1 -> empty+        _ -> pure $ fromIntegral nl+    )++-- Parser for a signed prefix to a number. Unlike uiua, this parses '-' as a negative number prefix.+signed :: (Subtractive b) => Parser e b -> Parser e b+signed p = do+  m <- optional minus+  case m of+    Nothing -> p+    Just () -> negate <$> p++num :: Parser e Double+num = signed double++point :: Parser e (Point Double)+point = Point <$> num <* commaWsp <*> num++numComma :: Parser e Double+numComma = num <* commaWsp++points :: Parser e [Point Double]+points = (:) <$> point <*> many (commaWsp *> point) <|> pure []++pointPair :: Parser e (Point Double, Point Double)+pointPair = (,) <$> point <* commaWsp <*> point++pointPairs :: Parser e [(Point Double, Point Double)]+pointPairs = (:) <$> pointPair <*> many (commaWsp *> pointPair) <|> pure []++nums :: Parser e [Double]+nums = (:) <$> num <*> many (commaWsp *> num) <|> pure []++flag :: Parser e Bool+flag = fmap (/= 0) digit++-- | Items separated by a comma and one or more whitespace tokens either side.+manyComma :: Parser e a -> Parser e [a]+manyComma a = (:) <$> a <*> many (commaWsp *> a) <|> pure []++flagComma :: Parser e Bool+flagComma = flag <* commaWsp++curveToArgs ::+  Parser+    e+    (Point Double, Point Double, Point Double)+curveToArgs =+  (,,)+    <$> (point <* commaWsp)+    <*> (point <* commaWsp)+    <*> point++ellipticalArgs ::+  Parser+    e+    (Double, Double, Double, Bool, Bool, Point Double)+ellipticalArgs =+  (,,,,,)+    <$> numComma+    <*> numComma+    <*> numComma+    <*> flagComma+    <*> flagComma+    <*> point++-- | Parser for PathCommands+pathParser :: Parser e [PathCommand]+pathParser = ws_ *> manyComma command++-- | Parser for a 'PathCommand'+command :: Parser e PathCommand+command =+  (MoveTo OriginAbsolute <$ $(char 'M') <*> (ws_ *> points))+    <|> (MoveTo OriginRelative <$ $(char 'm') <*> (ws_ *> points))+    <|> (LineTo OriginAbsolute <$ $(char 'L') <*> (ws_ *> points))+    <|> (LineTo OriginRelative <$ $(char 'l') <*> (ws_ *> points))+    <|> (HorizontalTo OriginAbsolute <$ $(char 'H') <*> (ws_ *> nums))+    <|> (HorizontalTo OriginRelative <$ $(char 'h') <*> (ws_ *> nums))+    <|> (VerticalTo OriginAbsolute <$ $(char 'V') <*> (ws_ *> nums))+    <|> (VerticalTo OriginRelative <$ $(char 'v') <*> (ws_ *> nums))+    <|> (CurveTo OriginAbsolute <$ $(char 'C') <*> (ws_ *> manyComma curveToArgs))+    <|> (CurveTo OriginRelative <$ $(char 'c') <*> (ws_ *> manyComma curveToArgs))+    <|> (SmoothCurveTo OriginAbsolute <$ $(char 'S') <*> (ws_ *> pointPairs))+    <|> (SmoothCurveTo OriginRelative <$ $(char 's') <*> (ws_ *> pointPairs))+    <|> (QuadraticBezier OriginAbsolute <$ $(char 'Q') <*> (ws_ *> pointPairs))+    <|> (QuadraticBezier OriginRelative <$ $(char 'q') <*> (ws_ *> pointPairs))+    <|> (SmoothQuadraticBezierCurveTo OriginAbsolute <$ $(char 'T') <*> (ws_ *> points))+    <|> (SmoothQuadraticBezierCurveTo OriginRelative <$ $(char 't') <*> (ws_ *> points))+    <|> (EllipticalArc OriginAbsolute <$ $(char 'A') <*> (ws_ *> manyComma ellipticalArgs))+    <|> (EllipticalArc OriginRelative <$ $(char 'a') <*> (ws_ *> manyComma ellipticalArgs))+    <|> (EndPath <$ $(char 'Z') <* commaWsp)+    <|> (EndPath <$ $(char 'z') <* commaWsp)++-- | Path command definition (ripped from reanimate-svg).+data PathCommand+  = -- | M or m command+    MoveTo !Origin ![Point Double]+  | -- | Line to, L or l Svg path command.+    LineTo !Origin ![Point Double]+  | -- | Equivalent to the H or h svg path command.+    HorizontalTo !Origin ![Double]+  | -- | Equivalent to the V or v svg path command.+    VerticalTo !Origin ![Double]+  | -- | Cubic bezier, C or c command+    CurveTo !Origin ![(Point Double, Point Double, Point Double)]+  | -- | Smooth cubic bezier, equivalent to S or s command+    SmoothCurveTo !Origin ![(Point Double, Point Double)]+  | -- | Quadratic bezier, Q or q command+    QuadraticBezier !Origin ![(Point Double, Point Double)]+  | -- | Quadratic bezier, T or t command+    SmoothQuadraticBezierCurveTo !Origin ![Point Double]+  | -- | Elliptical arc, A or a command.+    EllipticalArc !Origin ![(Double, Double, Double, Bool, Bool, Point Double)]+  | -- | Close the path, Z or z svg path command.+    EndPath+  deriving (Eq, Show, Generic, Data)++-- | Tell if a path command is absolute (in the current+-- user coordiante) or relative to the previous point.+data Origin+  = -- | Next point in absolute coordinate+    OriginAbsolute+  | -- | Next point relative to the previous+    OriginRelative+  deriving (Eq, Show, Generic, Data)++pointToSvgCoords :: Point Double -> Point Double+pointToSvgCoords (Point x y) = Point x (-y)++svgCoords :: PathData Double -> PathData Double+svgCoords (CubicP a b p) = CubicP (pointToSvgCoords a) (pointToSvgCoords b) (pointToSvgCoords p)+svgCoords (QuadP a p) = QuadP (pointToSvgCoords a) (pointToSvgCoords p)+svgCoords (StartP p) = StartP (pointToSvgCoords p)+svgCoords (LineP p) = LineP (pointToSvgCoords p)+svgCoords (ArcP i p) = ArcP i (pointToSvgCoords p)++-- | Convert from a path info, start point, end point triple to a path text clause.+--+-- Note that morally,+--+-- > toPathsAbsolute . toPathDatas . parsePath == id+--+-- but the round trip destroys much information, including:+--+-- - path text spacing+--+-- - "Z", which is replaced by a LineI instruction from the end point back to the original start of the path.+--+-- - Sequences of the same instruction type are uncompressed+--+-- - As the name suggests, relative paths are translated to absolute ones.+--+-- - implicit L's in multiple M instructions are separated.+--+-- In converting between chart-svg and SVG there are two changes in reference:+--+-- - arc rotation is expressed as positive degrees for a clockwise rotation in SVG, and counter-clockwise in radians for chart-svg+--+-- - A positive y-direction is down for SVG and up for chart-svg+toPathAbsolute ::+  PathData Double ->+  -- | path text+  ByteString+toPathAbsolute (StartP p) = "M " <> pp' p+toPathAbsolute (LineP p) = "L " <> pp' p+toPathAbsolute (CubicP c1 c2 p) =+  "C "+    <> pp' c1+    <> " "+    <> pp' c2+    <> " "+    <> pp' p+toPathAbsolute (QuadP control p) =+  "Q "+    <> pp' control+    <> " "+    <> pp' p+toPathAbsolute (ArcP (ArcInfo (Point x y) phi' l sw) x2) =+  "A "+    <> pv' x+    <> " "+    <> pv' y+    <> " "+    <> pv' (-(phi' * 180 / pi))+    <> " "+    <> bool "0" "1" l+    <> " "+    <> bool "0" "1" sw+    <> " "+    <> pp' x2++-- | Render a value to 4 SigFigs+pv' :: Double -> ByteString+pv' x =+  encodeUtf8 $+    formatOrShow (FixedStyle 4) Nothing x++-- | Render a point (including conversion to SVG Coordinates).+pp' :: Point Double -> ByteString+pp' (Point x y) =+  encodeUtf8 $+    formatOrShow (FixedStyle 4) Nothing x+      <> ","+      <> formatOrShow (FixedStyle 4) Nothing (bool (-y) y (y == zero))++data PathCursor = PathCursor+  { -- | previous position+    curPrevious :: Point Double,+    -- | start point (to close out the path)+    curStart :: Point Double,+    -- | last control point+    curControl :: Maybe (Point Double)+  }+  deriving (Eq, Show, Generic, Data)++stateCur0 :: PathCursor+stateCur0 = PathCursor zero zero Nothing++-- | Convert from an SVG d attribute text snippet to a [`PathData` `Double`]+svgToPathData :: ByteString -> [PathData Double]+svgToPathData = foldMap toPathDatas . parsePath++-- | Convert from [`PathData` `Double`] to an SVG d path text snippet.+pathDataToSvg :: [PathData Double] -> ByteString+pathDataToSvg xs = intercalate " " $ fmap toPathAbsolute xs++-- | Convert from a path command list to a PathA specification+toPathDatas :: [PathCommand] -> [PathData Double]+toPathDatas xs = fmap svgCoords $ mconcat $ flip evalState stateCur0 $ mapM toPathData xs++-- | Convert relative points to absolute points+relToAbs :: (Additive a) => a -> [a] -> [a]+relToAbs p xs = accsum (p : xs)++moveTo :: [Point Double] -> State PathCursor [PathData Double]+moveTo [] = pure []+moveTo (x : xs) = do+  put (PathCursor (fromMaybe x $ listToMaybe $ reverse xs) x Nothing)+  pure (StartP x : (LineP <$> xs))++lineTo :: [Point Double] -> State PathCursor [PathData Double]+lineTo xs = do+  modify (set #curPrevious (last xs) . set #curControl Nothing)+  pure $ LineP <$> xs++horTo :: [Double] -> State PathCursor [PathData Double]+horTo xs = do+  (PathCursor (Point _ y) _ _) <- get+  lineTo (fmap (`Point` y) xs)++verTo :: [Double] -> State PathCursor [PathData Double]+verTo ys = do+  (PathCursor (Point x _) _ _) <- get+  lineTo (fmap (Point x) ys)++curveTo :: [(Point Double, Point Double, Point Double)] -> State PathCursor [PathData Double]+curveTo xs = do+  modify+    ( set #curPrevious ((\(_, _, p) -> p) (last xs))+        . (#curControl ?~ (\(_, c2, _) -> c2) (last xs))+    )+  pure $ (\(c1, c2, x2) -> CubicP c1 c2 x2) <$> xs++-- | Convert relative points to absolute points+relToAbs3 :: (Additive a) => a -> [(a, a, a)] -> [(a, a, a)]+relToAbs3 p xs = xs'+  where+    x1 = (\(x, _, _) -> x) <$> xs+    x2 = (\(_, x, _) -> x) <$> xs+    x3 = (\(_, _, x) -> x) <$> xs+    x1' = fmap (p +) (accsum x1)+    x2' = fmap (p +) (accsum x2)+    x3' = fmap (p +) (accsum x3)+    xs' = zip3 x1' x2' x3'++reflControlPoint :: State PathCursor (Point Double)+reflControlPoint = do+  (PathCursor p _ c) <- get+  case c of+    Nothing -> pure p+    Just c' -> pure (p - (c' - p))++smoothCurveToStep :: (Point Double, Point Double) -> State PathCursor (PathData Double)+smoothCurveToStep (c2, x2) = do+  c1 <- reflControlPoint+  modify ((#curControl ?~ c2) . set #curPrevious x2)+  pure (CubicP c1 c2 x2)++smoothCurveTo :: [(Point Double, Point Double)] -> State PathCursor [PathData Double]+smoothCurveTo = mapM smoothCurveToStep++-- | Convert relative points to absolute points+relToAbs2 :: (Additive a) => a -> [(a, a)] -> [(a, a)]+relToAbs2 p xs = xs'+  where+    x1 = fst <$> xs+    x2 = snd <$> xs+    x1' = fmap (p +) (accsum x1)+    x2' = fmap (p +) (accsum x2)+    xs' = zip x1' x2'++quad :: [(Point Double, Point Double)] -> State PathCursor [PathData Double]+quad xs = do+  modify+    ( set #curPrevious (snd (last xs))+        . set #curControl (Just (fst (last xs)))+    )+  pure $ uncurry QuadP <$> xs++smoothQuadStep :: Point Double -> State PathCursor (PathData Double)+smoothQuadStep x2 = do+  c1 <- reflControlPoint+  modify (set #curControl (Just c1) . set #curPrevious x2)+  pure (QuadP c1 x2)++smoothQuad :: [Point Double] -> State PathCursor [PathData Double]+smoothQuad = mapM smoothQuadStep++arcTo :: [(Double, Double, Double, Bool, Bool, Point Double)] -> State PathCursor [PathData Double]+arcTo xs = do+  modify (set #curPrevious ((\(_, _, _, _, _, p) -> p) (last xs)) . set #curControl Nothing)+  pure $ fromPathEllipticalArc <$> xs++fromPathEllipticalArc :: (a, a, a, Bool, Bool, Point a) -> PathData a+fromPathEllipticalArc (x, y, r, l, s, p) = ArcP (ArcInfo (Point x y) r l s) p++-- | Convert relative points to absolute points+relToAbsArc :: (Additive a) => Point a -> [(a, a, a, Bool, Bool, Point a)] -> [(a, a, a, Bool, Bool, Point a)]+relToAbsArc p xs = xs'+  where+    ps = (\(_, _, _, _, _, pt) -> pt) <$> xs+    ps' = fmap (p +) (accsum ps)+    xs' = zipWith (\(x0, x1, x2, x3, x4, _) pt -> (x0, x1, x2, x3, x4, pt)) xs ps'++-- | Convert a path command fragment to PathData+--+-- flips the y-dimension of points.+toPathData :: PathCommand -> State PathCursor [PathData Double]+toPathData (MoveTo OriginAbsolute xs) = moveTo xs+toPathData (MoveTo OriginRelative xs) = do+  (PathCursor p _ _) <- get+  moveTo (relToAbs p xs)+toPathData EndPath = do+  (PathCursor _ s _) <- get+  pure [LineP s]+toPathData (LineTo OriginAbsolute xs) = lineTo xs+toPathData (LineTo OriginRelative xs) = do+  (PathCursor p _ _) <- get+  lineTo (relToAbs p xs)+toPathData (HorizontalTo OriginAbsolute xs) = horTo xs+toPathData (HorizontalTo OriginRelative xs) = do+  (PathCursor (Point x _) _ _) <- get+  horTo (relToAbs x xs)+toPathData (VerticalTo OriginAbsolute xs) = verTo xs+toPathData (VerticalTo OriginRelative ys) = do+  (PathCursor (Point _ y) _ _) <- get+  verTo (relToAbs y ys)+toPathData (CurveTo OriginAbsolute xs) = curveTo xs+toPathData (CurveTo OriginRelative xs) = do+  (PathCursor p _ _) <- get+  curveTo (relToAbs3 p xs)+toPathData (SmoothCurveTo OriginAbsolute xs) = smoothCurveTo xs+toPathData (SmoothCurveTo OriginRelative xs) = do+  (PathCursor p _ _) <- get+  smoothCurveTo (relToAbs2 p xs)+toPathData (QuadraticBezier OriginAbsolute xs) = quad xs+toPathData (QuadraticBezier OriginRelative xs) = do+  (PathCursor p _ _) <- get+  quad (relToAbs2 p xs)+toPathData (SmoothQuadraticBezierCurveTo OriginAbsolute xs) = smoothQuad xs+toPathData (SmoothQuadraticBezierCurveTo OriginRelative xs) = do+  (PathCursor p _ _) <- get+  smoothQuad (relToAbs p xs)+toPathData (EllipticalArc OriginAbsolute xs) = arcTo xs+toPathData (EllipticalArc OriginRelative xs) = do+  (PathCursor p _ _) <- get+  arcTo (relToAbsArc p xs)
− test/test.hs
@@ -1,16 +0,0 @@-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wall #-}--module Main where--import NumHask.Prelude-import Test.DocTest--main :: IO ()-main = doctest-  [ "src/Chart.hs",-    "src/Data/FormatN.hs",-    "src/Chart/Types.hs",-    "src/Chart/Bar.hs"-  ]-