pytex-preprocessor 0.4.4__tar.gz → 0.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. {pytex_preprocessor-0.4.4/src/pytex_preprocessor.egg-info → pytex_preprocessor-0.4.6}/PKG-INFO +1 -1
  2. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/pyproject.toml +1 -1
  3. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/biblatex.py +6 -2
  4. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/build.py +2 -2
  5. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/tectonic.py +156 -48
  6. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/variants.py +64 -7
  7. pytex_preprocessor-0.4.6/src/pytex_hsrtreport/assets/logos/MAKERS-Icon.svg +101 -0
  8. pytex_preprocessor-0.4.6/src/pytex_hsrtreport/assets/logos/MAKERS-RAlign.svg +1360 -0
  9. pytex_preprocessor-0.4.6/src/pytex_hsrtreport/assets/logos/MAKERS.svg +163 -0
  10. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/document.py +10 -5
  11. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/logos.py +3 -0
  12. pytex_preprocessor-0.4.6/src/pytex_hsrtreport/variants.py +39 -0
  13. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_markdown/__init__.py +9 -1
  14. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_markdown/convert.py +126 -38
  15. pytex_preprocessor-0.4.6/src/pytex_markdown/frontmatter.py +195 -0
  16. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/__init__.py +5 -2
  17. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/convert.py +5 -13
  18. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/document.py +1 -1
  19. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/header.py +1 -1
  20. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/shortcodes.py +12 -11
  21. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/signatures.py +1 -1
  22. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6/src/pytex_preprocessor.egg-info}/PKG-INFO +1 -1
  23. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_preprocessor.egg-info/SOURCES.txt +11 -6
  24. pytex_preprocessor-0.4.6/src/pytex_protocol/__init__.py +59 -0
  25. pytex_preprocessor-0.4.6/src/pytex_protocol/frontmatter.py +7 -0
  26. pytex_preprocessor-0.4.4/src/pytex_hsrtreport/variants.py +0 -24
  27. pytex_preprocessor-0.4.4/src/pytex_protocol/frontmatter.py +0 -80
  28. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/LICENSE +0 -0
  29. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/README.md +0 -0
  30. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/setup.cfg +0 -0
  31. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/__init__.py +0 -0
  32. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/__init__.py +0 -0
  33. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/builtin.py +0 -0
  34. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/captions.py +0 -0
  35. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/cleveref.py +0 -0
  36. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/colors.py +0 -0
  37. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/conditionals.py +0 -0
  38. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/counters.py +0 -0
  39. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/definitions.py +0 -0
  40. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/floats.py +0 -0
  41. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/font.py +0 -0
  42. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/fontawesome.py +0 -0
  43. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/fontspec.py +0 -0
  44. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/geometry.py +0 -0
  45. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/glossaries.py +0 -0
  46. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/graphics.py +0 -0
  47. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/hooks.py +0 -0
  48. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/hyperref.py +0 -0
  49. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/lengths.py +0 -0
  50. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/listings.py +0 -0
  51. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/mdframed.py +0 -0
  52. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/picture.py +0 -0
  53. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/setspace.py +0 -0
  54. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/commands/tables.py +0 -0
  55. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/helpers/__init__.py +0 -0
  56. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/helpers/coerce.py +0 -0
  57. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/helpers/parenting.py +0 -0
  58. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/helpers/sanitize.py +0 -0
  59. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/helpers/with_package.py +0 -0
  60. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/interface/__init__.py +0 -0
  61. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/interface/control_sequence.py +0 -0
  62. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/interface/package.py +0 -0
  63. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/interface/tex.py +0 -0
  64. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/__init__.py +0 -0
  65. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/color.py +0 -0
  66. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/comment.py +0 -0
  67. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/concat.py +0 -0
  68. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/control_sequence.py +0 -0
  69. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/document.py +0 -0
  70. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/document_class.py +0 -0
  71. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/empty.py +0 -0
  72. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/environment.py +0 -0
  73. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/image.py +0 -0
  74. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/include.py +0 -0
  75. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/length.py +0 -0
  76. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/math.py +0 -0
  77. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/package.py +0 -0
  78. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/model/raw.py +0 -0
  79. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/packages.py +0 -0
  80. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/registry.py +0 -0
  81. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex/template.py +0 -0
  82. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_analyze/__init__.py +0 -0
  83. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_analyze/analyze.py +0 -0
  84. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_analyze/optimize.py +0 -0
  85. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/__init__.py +0 -0
  86. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/console.py +0 -0
  87. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/render.py +0 -0
  88. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/tex2py.py +0 -0
  89. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_builder/tree.py +0 -0
  90. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/__init__.py +0 -0
  91. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-Bold.ttf +0 -0
  92. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-BoldItalic.ttf +0 -0
  93. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-Book.ttf +0 -0
  94. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-BookItalic.ttf +0 -0
  95. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-Medium.ttf +0 -0
  96. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-MediumItalic.ttf +0 -0
  97. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-Strong.ttf +0 -0
  98. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-Thin.ttf +0 -0
  99. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Blender/Blender-ThinItalic.ttf +0 -0
  100. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-Black.ttf +0 -0
  101. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-Bold.ttf +0 -0
  102. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-BoldItalic.ttf +0 -0
  103. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-Italic.ttf +0 -0
  104. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-Medium.ttf +0 -0
  105. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/DIN/DIN-Regular.ttf +0 -0
  106. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/fonts/Times New Roman.ttf +0 -0
  107. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/ASTA.svg +0 -0
  108. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/DUMMY.png +0 -0
  109. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/DUMMY_FOOT.png +0 -0
  110. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/ECHO.svg +0 -0
  111. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/HSRT.pdf +0 -0
  112. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/INF.pdf +0 -0
  113. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/STUPA.pdf +0 -0
  114. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/assets/logos/Skyline.pdf +0 -0
  115. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/boxes.py +0 -0
  116. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/citations.py +0 -0
  117. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/cleveref_names.py +0 -0
  118. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/colors.py +0 -0
  119. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/fonts.py +0 -0
  120. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/glossary.py +0 -0
  121. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/hyperref_config.py +0 -0
  122. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/listings.py +0 -0
  123. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/pagebreak.py +0 -0
  124. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/pagesetup.py +0 -0
  125. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/tex/pagesetup.tex +0 -0
  126. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/titlepage.py +0 -0
  127. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/voting.py +0 -0
  128. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/watermark.py +0 -0
  129. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_hsrtreport/wordcount.py +0 -0
  130. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_koma/__init__.py +0 -0
  131. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_koma/commands.py +0 -0
  132. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_koma/document.py +0 -0
  133. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_markdown/escape.py +0 -0
  134. {pytex_preprocessor-0.4.4/src/pytex_protocol → pytex_preprocessor-0.4.6/src/pytex_markdown/protocol}/entries.py +0 -0
  135. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_preprocessor.egg-info/dependency_links.txt +0 -0
  136. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_preprocessor.egg-info/entry_points.txt +0 -0
  137. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_preprocessor.egg-info/requires.txt +0 -0
  138. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_preprocessor.egg-info/top_level.txt +0 -0
  139. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_tikz/__init__.py +0 -0
  140. {pytex_preprocessor-0.4.4 → pytex_preprocessor-0.4.6}/src/pytex_tikz/tikz.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytex-preprocessor
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: Type-safe LaTeX document generation with Python
5
5
  Author-email: Frederik Beimgraben <frederik@beimgraben.net>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pytex-preprocessor"
7
- version = "0.4.4"
7
+ version = "0.4.6"
8
8
  authors = [
9
9
  { name="Frederik Beimgraben", email="frederik@beimgraben.net" },
10
10
  ]
@@ -58,8 +58,12 @@ def Parencite(*keys: str) -> TeX:
58
58
 
59
59
  @Registry.add
60
60
  @with_package(BIBLATEX)
61
- def Autocite(*keys: str) -> TeX:
62
- return ControlSequence("autocite", (Parameter(",".join(keys)),))
61
+ def Autocite(*keys: str, postnote: str | None = None) -> TeX:
62
+ key_param = Parameter(",".join(keys))
63
+ if postnote is None:
64
+ return ControlSequence("autocite", (key_param,))
65
+ # A single optional argument to \autocite is the postnote (e.g. a page).
66
+ return ControlSequence("autocite", (Parameter(postnote, optional=True), key_param))
63
67
 
64
68
 
65
69
  @Registry.add
@@ -142,8 +142,8 @@ def _parse_args(argv: list[str]) -> Config:
142
142
  default=None,
143
143
  metavar="STYLE",
144
144
  help=(
145
- "Markdown output style: plain, report, protocol-asta, protocol-stupa"
146
- + " (default: auto-detect)"
145
+ "Markdown output style: plain, report, report-makers, "
146
+ + "protocol-asta, protocol-stupa (default: auto-detect)"
147
147
  ),
148
148
  )
149
149
  _ = parser.add_argument(
@@ -15,6 +15,7 @@ import subprocess
15
15
  import tarfile
16
16
  import tempfile
17
17
  import xml.etree.ElementTree as ET
18
+ import zipfile
18
19
  from pathlib import Path
19
20
  from typing import TYPE_CHECKING
20
21
 
@@ -52,20 +53,50 @@ BIBER_MIRROR_URL = (
52
53
  "/releases/download/biber-binaries/{asset}"
53
54
  )
54
55
 
55
- # SHA256 of each upstream biber tarball, keyed by the versioned mirror asset
56
- # name. Used to verify downloads from either source and to reject HTML error
57
- # pages a CDN might serve with a 200 status. Linux x86_64 only for now; other
58
- # platforms download from SourceForge without a pinned checksum.
56
+ # SHA256 of each biber binary, keyed by the versioned mirror asset name. Used
57
+ # to verify downloads from either source and to reject HTML error pages a CDN
58
+ # might serve with a 200 status. Covers every mirrored platform (glibc/musl
59
+ # Linux x86_64, Linux aarch64, macOS x86_64/universal, Windows x86_64).
59
60
  BIBER_SHA256: dict[str, str] = {
61
+ "biber-2.11-darwin_x86_64.tar.gz": "4e3343574f917d7825148e4c9ccb665154476ec0817abf67f1fea052fb8cc728",
62
+ "biber-2.11-linux_x86_64-musl.tar.gz": "a6b7e61446ee8b23cc0b6b1eaffd4a8e0d271f06874ad22b025cc41f74050617",
60
63
  "biber-2.11-linux_x86_64.tar.gz": "7fcb51491fb24151810a92b2e2d03b7a1291823c0f8d6fb53183af391fca42e7",
64
+ "biber-2.11-MSWIN64.zip": "f3a438ae8d94e7afbd069f0f941b3d93816fc06647d88460ba05a5485ed4372a",
65
+ "biber-2.12-darwin_x86_64.tar.gz": "5a5f20669bd3e4cf56fd246ef2ba37d601ca2059510590a5022da4487d5e7bb8",
61
66
  "biber-2.12-linux_x86_64.tar.gz": "fd0b5145cc908c400a701b583330635d533d750b73a272d1d5ea47e10b2fbf71",
67
+ "biber-2.12-MSWIN64.zip": "96d99e075dbb666ad4ec93bcca5fcc15ea07b6f70e9151e7d44baa4cc7c02932",
68
+ "biber-2.13-darwin_x86_64.tar.gz": "ad47307b6f27c7bb129a1a3235e01245be3e95541bba9adca6892196e599edfd",
69
+ "biber-2.13-linux_x86_64-musl.tar.gz": "d4a25d32fef6993b5ea0dece70af4b09a1f2758f8b8737924250f3e6b80a979a",
62
70
  "biber-2.13-linux_x86_64.tar.gz": "03101f418d46f4666272b68a4318d9e4b7a840d9dfa05d93ddc490d491157a75",
71
+ "biber-2.13-MSWIN64.zip": "bf3ab70629465d674d020a10f34e307c7f6fb031dc7ea73627a1fe53b1e8457b",
72
+ "biber-2.14-darwin_x86_64.tar.gz": "d834ba71c05f8dfe668d4c40d13c0e11e0fee24e567877479a0ac1c98ad89131",
73
+ "biber-2.14-linux_x86_64-musl.tar.gz": "0b6c2a8307111c6dc2897d338be1ad446ef2e1ca8d126f806ce5c9bf7ff486ca",
63
74
  "biber-2.14-linux_x86_64.tar.gz": "dab3177f03322b5529d07d47d21d9e573a90c23d86eaaf11591b2d155316ee1b",
75
+ "biber-2.14-MSWIN64.zip": "247451621ef60378045cf917a007ef3219d3cbf833f080c3333927dea854b4fe",
76
+ "biber-2.15-darwin_x86_64.tar.gz": "e2b4931db6b4a684b640f41e53faee1c68f931f03c41d8f2c40d8b11c85511c7",
77
+ "biber-2.15-linux_x86_64-musl.tar.gz": "277acd35d51a07c1b75782514f88f1ad380581b0077548eaa0db6b60263dafaa",
64
78
  "biber-2.15-linux_x86_64.tar.gz": "653c8add18d2e94a233a6b9aae6d8144f965c2ce13fb7b4e66502b55fcd06e06",
79
+ "biber-2.15-MSWIN64.zip": "61553ef3d5e8bdff86e1ac8204236fbf3980bc8ade94949f1ad874ba4031eb7f",
80
+ "biber-2.16-darwin_x86_64.tar.gz": "c396133cc924c23111353ea5cb0e9960a98f1fddca8f42fbdb89e89424fc136f",
81
+ "biber-2.16-linux_x86_64-musl.tar.gz": "e0935c8e67016889b3c8bb1f0fbd602b587f6935cd61ee23bc2eb898ae633f58",
65
82
  "biber-2.16-linux_x86_64.tar.gz": "3afb97a42d2cf272d3c0b51663725e55339c4e6f3d594cd52e16c39fa9fcfb13",
83
+ "biber-2.16-MSWIN64.zip": "8e7a4c98626511bcf1c89a1847242cdd0e0113927137577eedaa13c72ce84b4b",
84
+ "biber-2.17-darwin_universal.tar.gz": "182e1efa074d8a2a23a8893f2a22440d4e463cce55e4ed02076ac4c0ee0614b2",
85
+ "biber-2.17-darwin_x86_64.tar.gz": "aa72ccdd01d59367b919d517f7a116e5dc40848abc1909cd812b485f791df7f4",
86
+ "biber-2.17-linux_x86_64-musl.tar.gz": "8967c4d34bfd2ed3d71e54d8a20a0c766b90368348994c99fca56ee2d812619e",
66
87
  "biber-2.17-linux_x86_64.tar.gz": "129d2e0332a57e985ffa253e5e9fbd28ef99af5a068d1b141145211969aa8999",
88
+ "biber-2.17-MSWIN64.zip": "c103bffc5ae0a7f513e7c26b6d394e9be6cf41952959c5d604ee2e6581b5dea2",
89
+ "biber-2.18-darwin_universal.tar.gz": "a0848ca266334284f1145470e53c3882b2d5e8ad82828700df1f6e347f7b675b",
90
+ "biber-2.18-darwin_x86_64.tar.gz": "f05520a397162434e93ef28b6be2c866f555a1979f150601fecf6d22d4bb8f2e",
91
+ "biber-2.18-linux_x86_64-musl.tar.gz": "34da2cc489a1387bfda8c76add3d613ececd9b674d0361a2b1464cf592dee2ed",
67
92
  "biber-2.18-linux_x86_64.tar.gz": "2a6b4cd15a1139907799da0d23cd4ddcce8341af3960d2b3d1d3e4b4a9f1fb53",
93
+ "biber-2.18-MSWIN64.zip": "02ee3a8b6838b7ff1e9aea1a5342686981b9364067a7b8e7131c3b3201cf387c",
94
+ "biber-2.19-darwin_universal.tar.gz": "0ebda145064eb5b8901a4ed5c8c5e5e6a5208e0aba425f7febcb5fb5b1a9c11b",
95
+ "biber-2.19-darwin_x86_64.tar.gz": "3835aab3247d3bff79b0c2fcf061149b80e39bf11f55a3a30cf946043a85d45b",
96
+ "biber-2.19-linux_aarch64.tar.gz": "45571c262e714786ec841320ee1845f0e3e3cf29443bb58769b26c6fc6274766",
97
+ "biber-2.19-linux_x86_64-musl.tar.gz": "66e765df8b52446659a978f35d25974b835b7168ddd96f45d4a49cea6bd727eb",
68
98
  "biber-2.19-linux_x86_64.tar.gz": "e2eda3e6ea7ac7e78d60e99a0e2aeb1096829f95791c06b768ed31a12889e58e",
99
+ "biber-2.19-MSWIN64.zip": "f0bccdec320e89a04b067f1189957b4bbe6feb445005357601f6e295e83e97da",
69
100
  }
70
101
 
71
102
 
@@ -112,45 +143,140 @@ def ensure_tectonic(console: Console) -> Path:
112
143
  return cached
113
144
 
114
145
 
115
- def _biber_sf_path() -> tuple[str, str]:
116
- """Return (sourceforge_subdir, filename) for biber on this platform."""
146
+ # macOS binaries lived under OSX_Intel up to biber 2.16 and moved to MacOS
147
+ # from 2.17 on; the SourceForge fallback URL needs the right subdir per version.
148
+ _OLD_MAC_DIRS: frozenset[str] = frozenset(
149
+ {"2.11", "2.12", "2.13", "2.14", "2.15", "2.16"}
150
+ )
151
+
152
+
153
+ def _biber_candidates(version: str) -> list[tuple[str, str, str]]:
154
+ """``(sf_subdir, sf_filename, mirror_asset)`` for this platform, best first.
155
+
156
+ More than one candidate is returned where a fallback helps:
157
+
158
+ * Linux x86_64 prefers the statically-linked *musl* build, which has no
159
+ shared-library dependencies (the glibc build needs e.g. ``libnsl.so.1``,
160
+ absent on many minimal systems), then falls back to the glibc build.
161
+ * macOS prefers the *universal* build (the only arm64-native option, added
162
+ in 2.17), then the x86_64 build (runs under Rosetta on Apple silicon).
163
+
164
+ Candidates upstream never published for a given version simply 404, and the
165
+ download loop moves on to the next one.
166
+ """
117
167
  system = platform.system()
118
168
  machine = platform.machine()
169
+ mac_dir = "OSX_Intel" if version in _OLD_MAC_DIRS else "MacOS"
170
+ # biber 2.19 renamed the musl tarball; earlier releases use the old name.
171
+ musl_file = (
172
+ "biber-linux-musl_x86_64.tar.gz"
173
+ if version == "2.19"
174
+ else "biber-linux_x86_64-musl.tar.gz"
175
+ )
119
176
  if system == "Linux":
120
177
  if machine == "x86_64":
121
- return "Linux", "biber-linux_x86_64.tar.gz"
122
- return "Linux-musl", f"biber-linuxmusl_{machine}.tar.gz"
123
- if system == "Darwin":
124
- arch = "arm64" if machine == "arm64" else "x86_64"
125
- return "MacOS", f"biber-darwin_{arch}.tar.gz"
126
- if system == "Windows":
127
- return "Windows", "biber-windows_x86_64.zip"
178
+ return [
179
+ ("Linux-musl", musl_file, f"biber-{version}-linux_x86_64-musl.tar.gz"),
180
+ (
181
+ "Linux",
182
+ "biber-linux_x86_64.tar.gz",
183
+ f"biber-{version}-linux_x86_64.tar.gz",
184
+ ),
185
+ ]
186
+ if machine in ("aarch64", "arm64"):
187
+ return [
188
+ (
189
+ "Linux",
190
+ "biber-linux_aarch64.tar.gz",
191
+ f"biber-{version}-linux_aarch64.tar.gz",
192
+ ),
193
+ ]
194
+ elif system == "Darwin":
195
+ return [
196
+ (
197
+ mac_dir,
198
+ "biber-darwin_universal.tar.gz",
199
+ f"biber-{version}-darwin_universal.tar.gz",
200
+ ),
201
+ (
202
+ mac_dir,
203
+ "biber-darwin_x86_64.tar.gz",
204
+ f"biber-{version}-darwin_x86_64.tar.gz",
205
+ ),
206
+ ]
207
+ elif system == "Windows":
208
+ return [("Windows", "biber-MSWIN64.zip", f"biber-{version}-MSWIN64.zip")]
128
209
  raise BuildError(
129
210
  f"unsupported platform for biber auto-download: {system} {machine}"
130
211
  )
131
212
 
132
213
 
133
214
  def _biber_cached(version: str) -> Path:
134
- return CACHE_DIR / "biber" / version / "biber"
215
+ name = "biber.exe" if platform.system() == "Windows" else "biber"
216
+ return CACHE_DIR / "biber" / version / name
135
217
 
136
218
 
137
- def _mirror_asset(version: str, filename: str) -> str:
138
- """Versioned mirror asset name, e.g. ``biber-2.17-linux_x86_64.tar.gz``."""
139
- return filename.replace("biber-", f"biber-{version}-", 1)
219
+ def _biber_sources(version: str) -> list[tuple[str, str | None]]:
220
+ """``(url, expected_sha256 or None)`` to try in order.
140
221
 
222
+ For each platform candidate the mirror is tried first, then SourceForge.
223
+ """
224
+ sources: list[tuple[str, str | None]] = []
225
+ for sf_dir, filename, asset in _biber_candidates(version):
226
+ sha = BIBER_SHA256.get(asset)
227
+ sources.append((BIBER_MIRROR_URL.format(asset=asset), sha))
228
+ sources.append(
229
+ (
230
+ BIBER_RELEASE_URL.format(
231
+ version=version, sf_dir=sf_dir, filename=filename
232
+ ),
233
+ sha,
234
+ )
235
+ )
236
+ return sources
141
237
 
142
- def _biber_sources(version: str) -> list[tuple[str, str | None]]:
143
- """(url, expected_sha256 or None) pairs to try in order: mirror, then SourceForge."""
144
- sf_dir, filename = _biber_sf_path()
145
- asset = _mirror_asset(version, filename)
146
- sha = BIBER_SHA256.get(asset)
147
- return [
148
- (BIBER_MIRROR_URL.format(asset=asset), sha),
149
- (
150
- BIBER_RELEASE_URL.format(version=version, sf_dir=sf_dir, filename=filename),
151
- sha,
152
- ),
153
- ]
238
+
239
+ def _is_biber_member(name: str) -> bool:
240
+ """Whether an archive member is the biber executable.
241
+
242
+ Most archives hold a plain ``biber`` (``biber.exe`` on Windows), but a few
243
+ musl tarballs name the binary after the tarball (e.g.
244
+ ``biber-linux_x86_64-musl``). AppleDouble sidecars (``._biber``) are
245
+ excluded. The largest matching member is chosen by the callers.
246
+ """
247
+ base = Path(name).name
248
+ if base.startswith("._"):
249
+ return False
250
+ return base in {"biber", "biber.exe"} or base.startswith("biber")
251
+
252
+
253
+ def _extract_biber_binary(archive: Path, version: str) -> bytes:
254
+ """Read the biber executable out of a ``.tar.gz`` or ``.zip`` archive."""
255
+ if zipfile.is_zipfile(archive):
256
+ with zipfile.ZipFile(archive) as zf:
257
+ members = [
258
+ i
259
+ for i in zf.infolist()
260
+ if not i.is_dir() and _is_biber_member(i.filename)
261
+ ]
262
+ if not members:
263
+ raise BuildError(
264
+ f"biber binary not found inside the biber {version} archive"
265
+ )
266
+ return zf.read(max(members, key=lambda i: i.file_size))
267
+ with tarfile.open(archive) as tf:
268
+ tar_members = [
269
+ m for m in tf.getmembers() if m.isfile() and _is_biber_member(m.name)
270
+ ]
271
+ member = max(tar_members, key=lambda m: m.size, default=None)
272
+ if member is None:
273
+ raise BuildError(
274
+ f"biber binary not found inside the biber {version} archive"
275
+ )
276
+ src = tf.extractfile(member)
277
+ if src is None:
278
+ raise BuildError(f"could not read biber from the biber {version} archive")
279
+ return src.read()
154
280
 
155
281
 
156
282
  def _download_to(url: str, dest: Path, sha: str | None, console: Console) -> bool:
@@ -196,25 +322,7 @@ def _ensure_biber(version: str, console: Console) -> Path:
196
322
  raise BuildError(
197
323
  f"failed to download biber {version} from the mirror or SourceForge"
198
324
  )
199
- with tarfile.open(tmp) as tf:
200
- member = next(
201
- (
202
- m
203
- for m in tf.getmembers()
204
- if Path(m.name).name == "biber" and m.isfile()
205
- ),
206
- None,
207
- )
208
- if member is None:
209
- raise BuildError(
210
- f"biber binary not found inside the biber {version} archive"
211
- )
212
- src = tf.extractfile(member)
213
- if src is None:
214
- raise BuildError(
215
- f"could not read biber from the biber {version} archive"
216
- )
217
- cached.write_bytes(src.read())
325
+ cached.write_bytes(_extract_biber_binary(tmp, version))
218
326
  except Exception:
219
327
  if cached.exists():
220
328
  cached.unlink()
@@ -4,6 +4,8 @@ A *variant* maps a Markdown source to a concrete document:
4
4
 
5
5
  * ``plain`` - a bare ``Document`` wrapping the converted Markdown.
6
6
  * ``report`` - an HSRT report with title page and table of contents.
7
+ * ``report-makers`` - an HSRT report branded with the MAKERS logo (title page
8
+ and footer on every page).
7
9
  * ``protocol-asta`` - an AStA meeting protocol (HSRT report, AStA logos).
8
10
  * ``protocol-stupa`` - a StuPa meeting protocol (HSRT report, StuPa logos).
9
11
 
@@ -19,29 +21,37 @@ of the document when it is not given via frontmatter/config.
19
21
  from __future__ import annotations
20
22
 
21
23
  import re
24
+ from pathlib import Path
22
25
  from typing import TYPE_CHECKING
23
26
 
27
+ from pytex.commands.biblatex import Addbibresource
24
28
  from pytex.commands.builtin import ChapterStar
25
29
  from pytex.model.concat import Concat
26
30
  from pytex.model.document import Document
31
+ from pytex.model.empty import Empty
27
32
  from pytex.model.raw import Raw
28
33
  from pytex_hsrtreport.document import HSRTReport
29
34
  from pytex_hsrtreport.titlepage import TitlePageDataLine
30
35
  from pytex_hsrtreport.variants import Variant
31
- from pytex_markdown import Markdown, escape_latex
32
- from pytex_protocol.document import build_protocol
33
- from pytex_protocol.frontmatter import split_frontmatter
36
+ from pytex_markdown import Markdown, escape_latex, split_frontmatter
37
+ from pytex_markdown.protocol import build_protocol
34
38
 
35
39
  if TYPE_CHECKING:
36
40
  from collections.abc import Mapping
37
41
 
38
42
  from pytex.interface.package import PackageOption
39
43
  from pytex.interface.tex import TeX
40
- from pytex_protocol.frontmatter import FrontmatterValue
44
+ from pytex_markdown.frontmatter import FrontmatterValue
41
45
 
42
46
  __all__ = ["VARIANT_NAMES", "build_document"]
43
47
 
44
- VARIANT_NAMES: tuple[str, ...] = ("plain", "report", "protocol-asta", "protocol-stupa")
48
+ VARIANT_NAMES: tuple[str, ...] = (
49
+ "plain",
50
+ "report",
51
+ "report-makers",
52
+ "protocol-asta",
53
+ "protocol-stupa",
54
+ )
45
55
 
46
56
  type Options = Mapping[str, object]
47
57
 
@@ -65,6 +75,8 @@ def build_document(
65
75
  return _plain(body, options)
66
76
  if variant == "report":
67
77
  return _report(body, options)
78
+ if variant == "report-makers":
79
+ return _report(body, options, logo_variant=Variant.MAKERS, footer_logos=True)
68
80
  if variant == "protocol-asta":
69
81
  return _protocol(meta, body, options, force=Variant.ASTA)
70
82
  if variant == "protocol-stupa":
@@ -92,7 +104,13 @@ def _plain(body: str, options: dict[str, object]) -> TeX:
92
104
  )
93
105
 
94
106
 
95
- def _report(body: str, options: dict[str, object]) -> TeX:
107
+ def _report(
108
+ body: str,
109
+ options: dict[str, object],
110
+ *,
111
+ logo_variant: Variant = Variant.INF,
112
+ footer_logos: bool = False,
113
+ ) -> TeX:
96
114
  title = _str(options, "title", "titel")
97
115
  derived = False
98
116
  if title is None:
@@ -103,10 +121,14 @@ def _report(body: str, options: dict[str, object]) -> TeX:
103
121
  # The `#` heading was pulled out for the title page; re-emit it at the
104
122
  # top of the body as a big, unnumbered heading so it is not lost.
105
123
  body_tex = Concat(ChapterStar(escape_latex(title)), Raw("\n\n"), body_tex)
124
+ bibliography = _bibliography(options)
106
125
  return HSRTReport(
107
- variant=Variant.INF,
126
+ variant=logo_variant,
108
127
  show_titlepage=title is not None,
128
+ show_footer_logos=footer_logos,
109
129
  show_toc=True,
130
+ show_bibliography=bibliography is not None,
131
+ user_preamble=_bib_preamble(bibliography) if bibliography else Empty,
110
132
  title=escape_latex(title) if title is not None else None,
111
133
  author=_escaped(_str(options, "author", "autor")),
112
134
  abstract=_escaped(_str(options, "abstract", "zusammenfassung")),
@@ -144,6 +166,41 @@ def _protocol(
144
166
 
145
167
  # -- helpers ---------------------------------------------------------------
146
168
 
169
+ # Self-contained .bib name written next to the .tex via filecontents so biber
170
+ # finds it in the build dir without an external file path.
171
+ _BIB_FILENAME = "pytex-md-refs.bib"
172
+
173
+
174
+ def _bibliography(options: Mapping[str, object]) -> str | None:
175
+ """BibTeX content from the ``bibliography`` frontmatter, or ``None``.
176
+
177
+ The value is either inline BibTeX (a block scalar, recognised by an ``@``
178
+ entry) or a path to a ``.bib`` file, which is read in. A path that does not
179
+ resolve to a file is ignored.
180
+ """
181
+ value = _str(options, "bibliography", "literatur", "bibliografie", "bib")
182
+ if value is None:
183
+ return None
184
+ if "@" in value:
185
+ return value
186
+ path = Path(value)
187
+ return path.read_text(encoding="utf-8") if path.is_file() else None
188
+
189
+
190
+ def _bib_preamble(content: str) -> TeX:
191
+ """Emit the bibliography as an inline ``filecontents`` .bib + ``\\addbibresource``.
192
+
193
+ Writing the .bib via ``filecontents`` keeps the document self-contained: the
194
+ file lands in the build dir at compile time, so biber resolves it without a
195
+ separate path (and the numeric biblatex default style applies).
196
+ """
197
+ block = (
198
+ f"\\begin{{filecontents*}}[overwrite,noheader]{{{_BIB_FILENAME}}}\n"
199
+ + content.rstrip("\n")
200
+ + "\n\\end{filecontents*}\n"
201
+ )
202
+ return Concat(Raw(block, allow_replacements=False), Addbibresource(_BIB_FILENAME))
203
+
147
204
 
148
205
  def _str(options: Mapping[str, object], *keys: str) -> str | None:
149
206
  for key in keys:
@@ -0,0 +1,101 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="461.55865mm"
6
+ height="447.56244mm"
7
+ viewBox="0 0 461.55865 447.56244"
8
+ version="1.1"
9
+ id="svg1"
10
+ xml:space="preserve"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ xmlns:svg="http://www.w3.org/2000/svg"><defs
13
+ id="defs1" /><g
14
+ id="layer2"
15
+ transform="translate(-1560.2505,-33.956207)"><g
16
+ id="layer1-4"
17
+ transform="translate(1536)"><g
18
+ id="g11-7-0-0-9-0-20-7"
19
+ transform="matrix(0,0.59667125,0.59667125,0,393.2673,161.87008)"
20
+ style="stroke-width:0.443432"><path
21
+ id="path3-9-3-3-8-7-0-1-0-3-2-8"
22
+ style="fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
23
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
24
+ id="path3-9-3-3-8-7-3-1-7-3-6-3-4"
25
+ style="fill:#f18700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
26
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
27
+ transform="rotate(120,158.4647,-495.98275)" /><path
28
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-7-5"
29
+ style="fill:#ce1625;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
30
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
31
+ transform="rotate(-120,158.45415,-495.99122)" /></g><g
32
+ id="g11-7-0-0-9-0-0-5-0"
33
+ transform="matrix(0.51673246,-0.29833562,0.29833562,0.51673246,241.95468,423.93573)"
34
+ style="stroke-width:0.443432"><path
35
+ id="path3-9-3-3-8-7-0-1-0-3-1-9-3"
36
+ style="fill:#008b92;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
37
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
38
+ id="path3-9-3-3-8-7-3-1-7-3-6-9-2-6"
39
+ style="fill:#0075bf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
40
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
41
+ transform="rotate(120,158.4647,-495.98275)" /><path
42
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-6-2-1"
43
+ style="fill:#29235c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
44
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
45
+ transform="rotate(-120,158.45415,-495.99122)" /></g><g
46
+ id="g11-7-0-0-9-0-2-89-0"
47
+ transform="matrix(0,0.59667125,0.59667125,0,630.13284,25.684221)"
48
+ style="stroke-width:0.443432"><path
49
+ id="path3-9-3-3-8-7-0-1-0-3-16-7-6"
50
+ style="fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
51
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
52
+ id="path3-9-3-3-8-7-3-1-7-3-6-2-36-3"
53
+ style="fill:#f18700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
54
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
55
+ transform="rotate(120,158.4647,-495.98275)" /><path
56
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-1-1-2"
57
+ style="fill:#ce1625;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
58
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
59
+ transform="rotate(-120,158.45415,-495.99122)" /></g><g
60
+ id="g11-7-0-0-9-0-2-8-2-0"
61
+ transform="matrix(0,0.59667125,0.59667125,0,630.43565,300.31284)"
62
+ style="stroke-width:0.443432"><path
63
+ id="path3-9-3-3-8-7-0-1-0-3-16-6-9-6"
64
+ style="fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
65
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
66
+ id="path3-9-3-3-8-7-3-1-7-3-6-2-3-3-1"
67
+ style="fill:#f18700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
68
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
69
+ transform="rotate(120,158.4647,-495.98275)" /><path
70
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-1-8-1-5"
71
+ style="fill:#ce1625;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
72
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
73
+ transform="rotate(-120,158.45414,-495.99122)" /></g><g
74
+ id="g11-7-0-0-9-0-0-0-94-5"
75
+ transform="matrix(0.51673246,-0.29833562,0.29833562,0.51673246,478.82011,560.2897)"
76
+ style="stroke-width:0.443432"><path
77
+ id="path3-9-3-3-8-7-0-1-0-3-1-1-78-4"
78
+ style="fill:#008b92;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
79
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
80
+ id="path3-9-3-3-8-7-3-1-7-3-6-9-9-4-7"
81
+ style="fill:#0075bf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
82
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
83
+ transform="rotate(120,158.4647,-495.98275)" /><path
84
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-6-7-5-6"
85
+ style="fill:#29235c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
86
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
87
+ transform="rotate(-120,158.45415,-495.99122)" /></g><g
88
+ id="g11-7-0-0-9-0-0-0-9-0-5"
89
+ transform="matrix(0.51673246,-0.29833562,0.29833562,0.51673246,241.95467,698.73251)"
90
+ style="stroke-width:0.443432"><path
91
+ id="path3-9-3-3-8-7-0-1-0-3-1-1-5-3-6"
92
+ style="fill:#008b92;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
93
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z" /><path
94
+ id="path3-9-3-3-8-7-3-1-7-3-6-9-9-1-6-9"
95
+ style="fill:#0075bf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
96
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
97
+ transform="rotate(120,158.4647,-495.98275)" /><path
98
+ id="path3-9-3-3-8-7-3-5-2-9-3-2-6-7-2-10-3"
99
+ style="fill:#29235c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.87637;stroke-dasharray:none;stroke-opacity:1"
100
+ d="m 72.187145,-608.63455 c -8.389369,38.44406 -27.282093,70.83442 -54.178521,94.61352 -4.137019,3.65754 -5.449842,10.26951 -2.688548,15.05251 14.675938,25.42107 29.351877,50.84214 44.027816,76.26321 2.761293,4.783 8.673559,6.0982 13.068673,2.75435 28.548345,-21.71988 52.510725,-48.95763 72.013875,-81.76553 2.82204,-4.74718 3.00458,-12.6906 0.7284,-17.72185 -7.11103,-15.71813 -21.09098,-50.13052 -25.68624,-89.06116 -0.64735,-5.48427 -5.43095,-9.95351 -10.9538,-9.95353 l -24.440675,-6e-5 c -5.522847,-2e-5 -10.713598,4.42321 -11.89098,9.81854 z"
101
+ transform="rotate(-120,158.45415,-495.99122)" /></g></g></g></svg>