metanorma-oiml 0.1.0

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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.adoc +291 -0
  4. data/data/themes/oiml/assets/oiml-logo-full-dark.svg +1 -0
  5. data/data/themes/oiml/assets/oiml-logo-full-light.svg +1 -0
  6. data/data/themes/oiml/assets/oiml-logo-icon-dark.svg +1 -0
  7. data/data/themes/oiml/assets/oiml-logo-icon-light.svg +1 -0
  8. data/data/themes/oiml/assets/oiml-logo.svg +1 -0
  9. data/data/themes/oiml/theme.yaml +56 -0
  10. data/exe/oiml-sts +10 -0
  11. data/lib/metanorma/oiml/document/root.rb +29 -0
  12. data/lib/metanorma/oiml/document.rb +35 -0
  13. data/lib/metanorma/oiml/html/renderer.rb +14 -0
  14. data/lib/metanorma/oiml/html.rb +14 -0
  15. data/lib/metanorma/oiml/sts/cli.rb +89 -0
  16. data/lib/metanorma/oiml/sts/html_renderer/assets/metanorma-icon-dark.svg +1 -0
  17. data/lib/metanorma/oiml/sts/html_renderer/assets/metanorma-icon-light.svg +1 -0
  18. data/lib/metanorma/oiml/sts/html_renderer/assets/oiml-logo-dark.svg +1 -0
  19. data/lib/metanorma/oiml/sts/html_renderer/assets/oiml-logo.svg +1 -0
  20. data/lib/metanorma/oiml/sts/html_renderer/assets/oiml-smart-logo-dark.svg +1 -0
  21. data/lib/metanorma/oiml/sts/html_renderer/assets/oiml-smart-logo.svg +1 -0
  22. data/lib/metanorma/oiml/sts/html_renderer/assets/page.js +145 -0
  23. data/lib/metanorma/oiml/sts/html_renderer/assets/theme.css +509 -0
  24. data/lib/metanorma/oiml/sts/html_renderer/ruby.rb +1071 -0
  25. data/lib/metanorma/oiml/sts/html_renderer/templates/_element.html.liquid +1 -0
  26. data/lib/metanorma/oiml/sts/html_renderer/templates/_footer.html.liquid +21 -0
  27. data/lib/metanorma/oiml/sts/html_renderer/templates/_hero.html.liquid +9 -0
  28. data/lib/metanorma/oiml/sts/html_renderer/templates/_img.html.liquid +1 -0
  29. data/lib/metanorma/oiml/sts/html_renderer/templates/_link.html.liquid +1 -0
  30. data/lib/metanorma/oiml/sts/html_renderer/templates/_meta_header.html.liquid +1 -0
  31. data/lib/metanorma/oiml/sts/html_renderer/templates/document.html.liquid +43 -0
  32. data/lib/metanorma/oiml/sts/html_renderer.rb +19 -0
  33. data/lib/metanorma/oiml/sts/mathml_builder.rb +93 -0
  34. data/lib/metanorma/oiml/sts/parity_validator/normaliser.rb +95 -0
  35. data/lib/metanorma/oiml/sts/parity_validator/report.rb +137 -0
  36. data/lib/metanorma/oiml/sts/parity_validator.rb +23 -0
  37. data/lib/metanorma/oiml/sts/transformer/back_transformer.rb +55 -0
  38. data/lib/metanorma/oiml/sts/transformer/base.rb +71 -0
  39. data/lib/metanorma/oiml/sts/transformer/block_dispatcher.rb +145 -0
  40. data/lib/metanorma/oiml/sts/transformer/body_transformer.rb +23 -0
  41. data/lib/metanorma/oiml/sts/transformer/context.rb +27 -0
  42. data/lib/metanorma/oiml/sts/transformer/dl_transformer.rb +49 -0
  43. data/lib/metanorma/oiml/sts/transformer/document_transformer.rb +65 -0
  44. data/lib/metanorma/oiml/sts/transformer/figure_transformer.rb +49 -0
  45. data/lib/metanorma/oiml/sts/transformer/footnote_collector.rb +33 -0
  46. data/lib/metanorma/oiml/sts/transformer/formula_transformer.rb +45 -0
  47. data/lib/metanorma/oiml/sts/transformer/front_transformer.rb +84 -0
  48. data/lib/metanorma/oiml/sts/transformer/id_generator.rb +39 -0
  49. data/lib/metanorma/oiml/sts/transformer/inline_transformer.rb +14 -0
  50. data/lib/metanorma/oiml/sts/transformer/list_transformer.rb +82 -0
  51. data/lib/metanorma/oiml/sts/transformer/model_builder.rb +322 -0
  52. data/lib/metanorma/oiml/sts/transformer/note_transformer.rb +103 -0
  53. data/lib/metanorma/oiml/sts/transformer/paragraph_transformer.rb +574 -0
  54. data/lib/metanorma/oiml/sts/transformer/reference_transformer.rb +107 -0
  55. data/lib/metanorma/oiml/sts/transformer/rendered_text_extractor.rb +168 -0
  56. data/lib/metanorma/oiml/sts/transformer/section_transformer.rb +233 -0
  57. data/lib/metanorma/oiml/sts/transformer/source_document.rb +246 -0
  58. data/lib/metanorma/oiml/sts/transformer/standard.rb +37 -0
  59. data/lib/metanorma/oiml/sts/transformer/table_transformer.rb +290 -0
  60. data/lib/metanorma/oiml/sts/transformer/term_transformer.rb +236 -0
  61. data/lib/metanorma/oiml/sts/transformer.rb +47 -0
  62. data/lib/metanorma/oiml/sts/validation_report.rb +43 -0
  63. data/lib/metanorma/oiml/sts/validator.rb +126 -0
  64. data/lib/metanorma/oiml/sts/version.rb +9 -0
  65. data/lib/metanorma/oiml/sts.rb +84 -0
  66. data/lib/metanorma-oiml.rb +10 -0
  67. data/schematron/oiml-sts.sch +70 -0
  68. metadata +221 -0
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metanorma
4
+ module Oiml
5
+ module Html
6
+ # OIML documents render iso-style; the OIML root uses the ISO
7
+ # section classes the parent renderer already registers — only
8
+ # the root itself needs dispatch (exact-class, OGC pattern).
9
+ class Renderer < Metanorma::Iso::Html::Renderer
10
+ register_render "Metanorma::Oiml::Document::Root", :render_document
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "metanorma/iso/html"
4
+
5
+ module Metanorma
6
+ module Oiml
7
+ # HTML format slice for the flavor: the renderer, registered with
8
+ # the harness from oiml/document.rb. Renders iso-style; the OIML
9
+ # root uses the ISO section classes the ISO renderer registers.
10
+ module Html
11
+ autoload :Renderer, "#{__dir__}/html/renderer"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "pathname"
5
+ require "thor"
6
+
7
+ module Metanorma
8
+ module Oiml
9
+ module Sts
10
+ # Thor CLI for `oiml-sts`.
11
+ #
12
+ # Commands:
13
+ # convert <input.xml> [output.xml] Convert one MN-XML to STS XML.
14
+ # convert-dir <input-dir> <output-dir> Batch convert every presentation XML.
15
+ # validate <sts.xml> Validate against OIML X 999 rules.
16
+ class Cli < Thor
17
+ package_name "oiml-sts"
18
+
19
+ desc "convert INPUT [OUTPUT]", "Convert a Metanorma presentation XML to OIML NISO STS XML"
20
+ method_option :validate, type: :boolean, default: false,
21
+ desc: "Run the validator on the output and exit non-zero on errors"
22
+ def convert(input, output = nil)
23
+ warn_oiml_sts_deprecated
24
+ sts_xml = Sts.convert(read_input(input))
25
+ output_path = output || default_output_for(input)
26
+ write_output(output_path, sts_xml)
27
+ $stdout.puts "Wrote #{output_path} (#{sts_xml.bytesize} bytes)"
28
+ if options[:validate]
29
+ report = Sts.validate(sts_xml)
30
+ $stdout.puts report.to_s
31
+ exit 1 unless report.valid?
32
+ end
33
+ end
34
+
35
+ desc "convert-dir INPUT_DIR OUTPUT_DIR",
36
+ "Batch convert every document.presentation.xml under INPUT_DIR"
37
+ def convert_dir(input_dir, output_dir)
38
+ warn_oiml_sts_deprecated
39
+ require "pathname"
40
+
41
+ inputs = Pathname.new(input_dir).glob("**/document.presentation.xml")
42
+ raise "No presentation XMLs found under #{input_dir}" if inputs.empty?
43
+
44
+ FileUtils.mkdir_p(output_dir)
45
+ inputs.sort.each do |input|
46
+ slug = input.parent.basename.to_s
47
+ output = File.join(output_dir, "#{slug}.sts.xml")
48
+ $stdout.puts "Converting #{slug}..."
49
+ sts_xml = Sts.convert(input.read)
50
+ write_output(output, sts_xml)
51
+ rescue StandardError => e
52
+ $stderr.puts " FAILED: #{e.class}: #{e.message}"
53
+ end
54
+ end
55
+
56
+ desc "validate STS_XML", "Validate an OIML STS XML against OIML X 999 constraints"
57
+ def validate(input)
58
+ report = Sts.validate(read_input(input))
59
+ $stdout.puts report.to_s
60
+ exit 1 unless report.valid?
61
+ end
62
+
63
+ private
64
+
65
+ # oiml-sts is superseded by the metanorma pipeline (metanorma-core#12):
66
+ # `metanorma compile -t oiml -x oimlsts <file>.adoc`. Retained for one
67
+ # release cycle; scheduled for removal.
68
+ def warn_oiml_sts_deprecated
69
+ $stderr.puts "[DEPRECATED] `oiml-sts` is superseded by " \
70
+ "`metanorma compile -t oiml -x oimlsts <file>.adoc` " \
71
+ "and will be removed in a future release."
72
+ end
73
+
74
+ def read_input(path)
75
+ Pathname.new(path).read
76
+ end
77
+
78
+ def write_output(path, content)
79
+ FileUtils.mkdir_p(File.dirname(path))
80
+ File.write(path, content)
81
+ end
82
+
83
+ def default_output_for(input)
84
+ input.sub(/\.xml\z/, ".sts.xml")
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-5ecd4954-1c9b-4b8e-80be-243ce0d02998" xmlns="http://www.w3.org/2000/svg" width="52mm" height="52mm" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 147.4 147.4"><defs><clipPath id="uuid-cab9f5bb-b4da-4e94-9792-0a224cf9ffe6"><path d="m145.28,119.33c-8.79,0-13.28,5.51-17.24,10.36-3.96,4.85-7.25,8.89-14.14,8.89-2.95.06-5.84-.87-8.19-2.65-1.38-12.25-2.77-24.51-4.15-36.76l-3.2-28.22v-.09c0-.07,0-.14,0-.21,0-.06-.02-.12-.05-.17-.03-.07-.06-.14-.09-.21l-.12-.11-.15-.21-.07-.09-.21-.2-.07-.06-.24-.16h-.09l-.25-.1h-1.76v-37.22c.01-.06.01-.13,0-.19-.04-.36-.18-.71-.4-1l-19.61-25.43c-.74-.87-2.05-.97-2.92-.23-.08.07-.16.15-.23.23l-19.59,25.39c-.22.29-.36.64-.4,1v37.29h-1.53l-.27.11h-.06l-.27.17h-.05c-.08.07-.15.14-.22.21l-.06.07c-.06.07-.11.14-.16.22l-.07.12c-.04.07-.07.15-.1.22-.01.05-.03.11-.05.16,0,.07,0,.14,0,.21v.09l-3.2,28.2-4.11,36c-1.79-1.66-3.44-3.47-4.92-5.41-4-4.85-8.45-10.36-17.24-10.36s-13.35,5.65-17.31,10.51c-.65.79-1.29,1.58-2,2.35-.63.91-.41,2.15.5,2.78.77.54,1.81.46,2.5-.17.69-.8,1.36-1.62,2-2.43,3.89-4.77,7.25-8.89,14.14-8.89s10.25,4.11,14.14,8.89c3.89,4.78,8.55,10.36,17.33,10.36s13.28-5.51,17.24-10.36c2.85-3.49,5.34-6.56,9.09-8.01,2.47-.96,5.05-.88,5.05-.88,2.14,0,3.73.47,4.13.59,3.11.96,5.09,2.85,6.75,4.48,1.46,1.43,1.79,2.07,3.27,3.85,3.29,3.95,6.35,7.58,11.14,9.33,1.78.65,3.8,1.03,6.11,1.03,8.8,0,13.28-5.51,17.24-10.36,3.96-4.85,7.25-8.89,14.14-8.89,1.11,0,2-.9,2-2s-.89-2-2-2l.02-.04Zm-50.72-46.03l2.75,24.11h-6.14l-7-12.11,6.95-12h3.44Zm-27.87,10.01l-5.79-10.01h25.58l-5.79,10.01h-14Zm7-73.32l15.5,20.16h-31l15.5-20.16Zm-17.59,24.12h35.16v35.1h-35.16v-35.1Zm-6.34,67.3h6.46l7,12.11-7,12.11h-9.22l2.76-24.22Zm1.34,37.2c-1.88.02-3.74-.35-5.47-1.08l.9-7.88h9.71l3.45,6c-2.42,1.98-5.47,3.03-8.59,2.96m31.4-19.26c-8.8,0-13.28,5.5-17.24,10.35-.87,1.06-1.71,2.06-2.57,3.06l-3-5.12,7-12.11h14.17l2.24,3.84c-.19.01-.37-.03-.58-.03h-.02Zm62.78,0-63.71-61.88c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.9-2-2s.89-2,2-2h15.62m0-8.01c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.89-2-2s.89-2,2-2h15.62m0-8c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.6c-1.11-.05-1.96-.98-1.92-2.08.05-1.1.98-1.96,2.08-1.92h15.62m27.53,15.31s0,0,0,0c.66-.89,1.91-1.07,2.8-.42l20,16.09c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42l-20-16.09c-.78-.68-.91-1.85-.29-2.69m1.54-14.57c-.61,0-1.18-.28-1.56-.75-.69-.86-.55-2.12.31-2.81l20-16.07c.84-.62,2.01-.49,2.69.29.73.83.65,2.09-.18,2.82l-20,16.09c-.36.27-.81.41-1.26.39h0v.04Zm2.32,6.81c0-1.1.9-2,2-2h26.66c1.1.05,1.96.99,1.9,2.1-.05,1.1-.99,1.96-2.1,1.9h-26.47c-1.1,0-2-.9-2-2m-77.5,7.28c.86-.69,2.13-.55,2.82.31.69.86.56,2.13-.31,2.82l-19.97,16.09c-.86.7-2.12.57-2.83-.28-.7-.86-.57-2.12.28-2.83l20-16.11h0M15.36,25.5c-.83-.74-.91-2-.17-2.83.73-.83,2-.9,2.83-.17l19.98,16.11c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42L15.49,25.62h0l-.13-.12Zm-9.63,25.5c-1.1-.05-1.96-.98-1.91-2.08.05-1.1.98-1.96,2.08-1.92h26.47c1.11,0,2,.9,2,2s-.89,2-2,2H5.73" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-b81c2210-a2cc-4c27-bc7d-e842bd70bc8e"><path d="m145.28,119.33c-8.79,0-13.28,5.51-17.24,10.36-3.96,4.85-7.25,8.89-14.14,8.89-2.95.06-5.84-.87-8.19-2.65-1.38-12.25-2.77-24.51-4.15-36.76l-3.2-28.22v-.09c0-.07,0-.14,0-.21,0-.06-.02-.12-.05-.17-.03-.07-.06-.14-.09-.21l-.12-.11-.15-.21-.07-.09-.21-.2-.07-.06-.24-.16h-.09l-.25-.1h-1.76v-37.22c.01-.06.01-.13,0-.19-.04-.36-.18-.71-.4-1l-19.61-25.43c-.74-.87-2.05-.97-2.92-.23-.08.07-.16.15-.23.23l-19.59,25.39c-.22.29-.36.64-.4,1v37.29h-1.53l-.27.11h-.06l-.27.17h-.05c-.08.07-.15.14-.22.21l-.06.07c-.06.07-.11.14-.16.22l-.07.12c-.04.07-.07.15-.1.22-.01.05-.03.11-.05.16,0,.07,0,.14,0,.21v.09l-3.2,28.2-4.11,36c-1.79-1.66-3.44-3.47-4.92-5.41-4-4.85-8.45-10.36-17.24-10.36s-13.35,5.65-17.31,10.51c-.65.79-1.29,1.58-2,2.35-.63.91-.41,2.15.5,2.78.77.54,1.81.46,2.5-.17.69-.8,1.36-1.62,2-2.43,3.89-4.77,7.25-8.89,14.14-8.89s10.25,4.11,14.14,8.89c3.89,4.78,8.55,10.36,17.33,10.36s13.28-5.51,17.24-10.36c2.85-3.49,5.34-6.56,9.09-8.01,2.47-.96,5.05-.88,5.05-.88,2.14,0,3.73.47,4.13.59,3.11.96,5.09,2.85,6.75,4.48,1.46,1.43,1.79,2.07,3.27,3.85,3.29,3.95,6.35,7.58,11.14,9.33,1.78.65,3.8,1.03,6.11,1.03,8.8,0,13.28-5.51,17.24-10.36,3.96-4.85,7.25-8.89,14.14-8.89,1.11,0,2-.9,2-2s-.89-2-2-2l.02-.04Zm-50.72-46.03l2.75,24.11h-6.14l-7-12.11,6.95-12h3.44Zm-27.87,10.01l-5.79-10.01h25.58l-5.79,10.01h-14Zm7-73.32l15.5,20.16h-31l15.5-20.16Zm-17.59,24.12h35.16v35.1h-35.16v-35.1Zm-6.34,67.3h6.46l7,12.11-7,12.11h-9.22l2.76-24.22Zm1.34,37.2c-1.88.02-3.74-.35-5.47-1.08l.9-7.88h9.71l3.45,6c-2.42,1.98-5.47,3.03-8.59,2.96m31.4-19.26c-8.8,0-13.28,5.5-17.24,10.35-.87,1.06-1.71,2.06-2.57,3.06l-3-5.12,7-12.11h14.17l2.24,3.84c-.19.01-.37-.03-.58-.03h-.02Zm62.78,0-63.71-61.88c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.9-2-2s.89-2,2-2h15.62m0-8.01c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.89-2-2s.89-2,2-2h15.62m0-8c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.6c-1.11-.05-1.96-.98-1.92-2.08.05-1.1.98-1.96,2.08-1.92h15.62m27.53,15.31s0,0,0,0c.66-.89,1.91-1.07,2.8-.42l20,16.09c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42l-20-16.09c-.78-.68-.91-1.85-.29-2.69m1.54-14.57c-.61,0-1.18-.28-1.56-.75-.69-.86-.55-2.12.31-2.81l20-16.07c.84-.62,2.01-.49,2.69.29.73.83.65,2.09-.18,2.82l-20,16.09c-.36.27-.81.41-1.26.39h0v.04Zm2.32,6.81c0-1.1.9-2,2-2h26.66c1.1.05,1.96.99,1.9,2.1-.05,1.1-.99,1.96-2.1,1.9h-26.47c-1.1,0-2-.9-2-2m-77.5,7.28c.86-.69,2.13-.55,2.82.31.69.86.56,2.13-.31,2.82l-19.97,16.09c-.86.7-2.12.57-2.83-.28-.7-.86-.57-2.12.28-2.83l20-16.11h0M15.36,25.5c-.83-.74-.91-2-.17-2.83.73-.83,2-.9,2.83-.17l19.98,16.11c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42L15.49,25.62h0l-.13-.12Zm-9.63,25.5c-1.1-.05-1.96-.98-1.91-2.08.05-1.1.98-1.96,2.08-1.92h26.47c1.11,0,2,.9,2,2s-.89,2-2,2H5.73" style="fill:none; stroke-width:0px;"/></clipPath><radialGradient id="uuid-24fb7c6f-c54c-4f11-8696-f8b9e30f645f" cx="73.7" cy="73.7" fx="73.7" fy="-49.12" r="203.08" gradientUnits="userSpaceOnUse"><stop offset=".39" stop-color="#e2dbff"/><stop offset=".86" stop-color="#5a9cfa"/></radialGradient><clipPath id="uuid-a494d594-b8c5-4576-a707-0f3f62bf2ae2"><path d="m145.28,119.33c-8.79,0-13.28,5.51-17.24,10.36-3.96,4.85-7.25,8.89-14.14,8.89-2.95.06-5.84-.87-8.19-2.65-1.38-12.25-2.77-24.51-4.15-36.76l-3.2-28.22v-.09c0-.07,0-.14,0-.21,0-.06-.02-.12-.05-.17-.03-.07-.06-.14-.09-.21l-.12-.11-.15-.21-.07-.09-.21-.2-.07-.06-.24-.16h-.09l-.25-.1h-1.76v-37.22c.01-.06.01-.13,0-.19-.04-.36-.18-.71-.4-1l-19.61-25.43c-.74-.87-2.05-.97-2.92-.23-.08.07-.16.15-.23.23l-19.59,25.39c-.22.29-.36.64-.4,1v37.29h-1.53l-.27.11h-.06l-.27.17h-.05c-.08.07-.15.14-.22.21l-.06.07c-.06.07-.11.14-.16.22l-.07.12c-.04.07-.07.15-.1.22-.01.05-.03.11-.05.16,0,.07,0,.14,0,.21v.09l-3.2,28.2-4.11,36c-1.79-1.66-3.44-3.47-4.92-5.41-4-4.85-8.45-10.36-17.24-10.36s-13.35,5.65-17.31,10.51c-.65.79-1.29,1.58-2,2.35-.63.91-.41,2.15.5,2.78.77.54,1.81.46,2.5-.17.69-.8,1.36-1.62,2-2.43,3.89-4.77,7.25-8.89,14.14-8.89s10.25,4.11,14.14,8.89c3.89,4.78,8.55,10.36,17.33,10.36s13.28-5.51,17.24-10.36c2.85-3.49,5.34-6.56,9.09-8.01,2.47-.96,5.05-.88,5.05-.88,2.14,0,3.73.47,4.13.59,3.11.96,5.09,2.85,6.75,4.48,1.46,1.43,1.79,2.07,3.27,3.85,3.29,3.95,6.35,7.58,11.14,9.33,1.78.65,3.8,1.03,6.11,1.03,8.8,0,13.28-5.51,17.24-10.36,3.96-4.85,7.25-8.89,14.14-8.89,1.11,0,2-.9,2-2s-.89-2-2-2l.02-.04Zm-50.72-46.03l2.75,24.11h-6.14l-7-12.11,6.95-12h3.44Zm-27.87,10.01l-5.79-10.01h25.58l-5.79,10.01h-14Zm7-73.32l15.5,20.16h-31l15.5-20.16Zm-17.59,24.12h35.16v35.1h-35.16v-35.1Zm-6.34,67.3h6.46l7,12.11-7,12.11h-9.22l2.76-24.22Zm1.34,37.2c-1.88.02-3.74-.35-5.47-1.08l.9-7.88h9.71l3.45,6c-2.42,1.98-5.47,3.03-8.59,2.96m31.4-19.26c-8.8,0-13.28,5.5-17.24,10.35-.87,1.06-1.71,2.06-2.57,3.06l-3-5.12,7-12.11h14.17l2.24,3.84c-.19.01-.37-.03-.58-.03h-.02Zm62.78,0-63.71-61.88c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.9-2-2s.89-2,2-2h15.62m0-8.01c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.89-2-2s.89-2,2-2h15.62m0-8c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.6c-1.11-.05-1.96-.98-1.92-2.08.05-1.1.98-1.96,2.08-1.92h15.62m27.53,15.31s0,0,0,0c.66-.89,1.91-1.07,2.8-.42l20,16.09c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42l-20-16.09c-.78-.68-.91-1.85-.29-2.69m1.54-14.57c-.61,0-1.18-.28-1.56-.75-.69-.86-.55-2.12.31-2.81l20-16.07c.84-.62,2.01-.49,2.69.29.73.83.65,2.09-.18,2.82l-20,16.09c-.36.27-.81.41-1.26.39h0v.04Zm2.32,6.81c0-1.1.9-2,2-2h26.66c1.1.05,1.96.99,1.9,2.1-.05,1.1-.99,1.96-2.1,1.9h-26.47c-1.1,0-2-.9-2-2m-77.5,7.28c.86-.69,2.13-.55,2.82.31.69.86.56,2.13-.31,2.82l-19.97,16.09c-.86.7-2.12.57-2.83-.28-.7-.86-.57-2.12.28-2.83l20-16.11h0M15.36,25.5c-.83-.74-.91-2-.17-2.83.73-.83,2-.9,2.83-.17l19.98,16.11c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42L15.49,25.62h0l-.13-.12Zm-9.63,25.5c-1.1-.05-1.96-.98-1.91-2.08.05-1.1.98-1.96,2.08-1.92h26.47c1.11,0,2,.9,2,2s-.89,2-2,2H5.73" style="fill:none; stroke-width:0px;"/></clipPath></defs><g style="clip-path:url(#uuid-cab9f5bb-b4da-4e94-9792-0a224cf9ffe6);"><g style="clip-path:url(#uuid-b81c2210-a2cc-4c27-bc7d-e842bd70bc8e);"><rect x=".15" y=".15" width="147.1" height="147.1" style="fill:url(#uuid-24fb7c6f-c54c-4f11-8696-f8b9e30f645f); stroke-width:0px;"/></g><g style="clip-path:url(#uuid-a494d594-b8c5-4576-a707-0f3f62bf2ae2);"><rect x=".15" y=".15" width="147.1" height="147.1" style="fill:url(#uuid-24fb7c6f-c54c-4f11-8696-f8b9e30f645f); stroke-width:0px;"/></g></g></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-db8c372e-944d-4df9-b8b0-4a61cf77f2ce" xmlns="http://www.w3.org/2000/svg" width="52mm" height="52mm" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 147.4 147.4"><defs><clipPath id="uuid-81f828fd-72f4-4a48-8d84-2e4c05ab6663"><path d="m145.28,119.33c-8.79,0-13.28,5.51-17.24,10.36-3.96,4.85-7.25,8.89-14.14,8.89-2.95.06-5.84-.87-8.19-2.65-1.38-12.25-2.77-24.51-4.15-36.76l-3.2-28.22v-.09c0-.07,0-.14,0-.21,0-.06-.02-.12-.05-.17-.03-.07-.06-.14-.09-.21l-.12-.11-.15-.21-.07-.09-.21-.2-.07-.06-.24-.16h-.09l-.25-.1h-1.76v-37.22c0-.06,0-.13,0-.19-.04-.36-.18-.71-.4-1l-19.61-25.43c-.74-.87-2.05-.97-2.92-.23-.08.07-.16.15-.23.23l-19.59,25.39c-.22.29-.36.64-.4,1v37.29h-1.53l-.27.11h-.06l-.27.17h-.05c-.08.07-.15.14-.22.21l-.06.07c-.06.07-.11.14-.16.22l-.07.12c-.04.07-.07.15-.1.22,0,.05-.03.11-.05.16,0,.07,0,.14,0,.21v.09l-3.2,28.2-4.11,36c-1.79-1.66-3.44-3.47-4.92-5.41-4-4.85-8.45-10.36-17.24-10.36s-13.35,5.65-17.31,10.51c-.65.79-1.29,1.58-2,2.35-.63.91-.41,2.15.5,2.78.77.54,1.81.46,2.5-.17.69-.8,1.36-1.62,2-2.43,3.89-4.77,7.25-8.89,14.14-8.89s10.25,4.11,14.14,8.89c3.89,4.78,8.55,10.36,17.33,10.36s13.28-5.51,17.24-10.36c2.85-3.49,5.34-6.56,9.09-8.01,2.26-.87,4.25-.89,5.05-.88,3.9.03,6.69,1.7,7.8,2.38,2.37,1.45,2.83,2.25,6.35,6.54,3.11,3.8,6.22,7.54,11.14,9.33,1.78.65,3.8,1.03,6.11,1.03,8.8,0,13.28-5.51,17.24-10.36,3.96-4.85,7.25-8.89,14.14-8.89,1.1,0,2-.9,2-2s-.9-2-2-2l.02-.04Zm-50.72-46.03l2.75,24.11h-6.14l-7-12.11,6.95-12h3.44Zm-27.87,10.01l-5.79-10.01h25.58l-5.79,10.01h-14Zm7-73.32l15.5,20.16h-31l15.5-20.16Zm-17.59,24.12h35.16v35.1h-35.16v-35.1Zm-6.34,67.3h6.46l7,12.11-7,12.11h-9.22l2.76-24.22Zm1.34,37.2c-1.88.02-3.74-.35-5.47-1.08l.9-7.88h9.71l3.45,6c-2.42,1.98-5.47,3.03-8.59,2.96m31.4-19.26c-8.8,0-13.28,5.5-17.24,10.35-.87,1.06-1.71,2.06-2.57,3.06l-3-5.12,7-12.11h14.17l2.24,3.84c-.19.01-.37-.03-.58-.03h-.02Zm62.78,0-63.71-61.88c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.9-2-2s.89-2,2-2h15.62m0-8.01c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.43c-1.11,0-2-.89-2-2s.89-2,2-2h15.62m0-8c1.1.05,1.96.99,1.9,2.1-.05,1.11-.99,1.96-2.1,1.9h-15.6c-1.11-.05-1.96-.98-1.92-2.08.05-1.1.98-1.96,2.08-1.92h15.62m27.53,15.31s0,0,0,0c.66-.89,1.91-1.07,2.8-.42l20,16.09c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42l-20-16.09c-.78-.68-.91-1.85-.29-2.69m1.54-14.57c-.61,0-1.18-.28-1.56-.75-.69-.86-.55-2.12.31-2.81l20-16.07c.84-.62,2.01-.49,2.69.29.73.83.65,2.09-.18,2.82l-20,16.09c-.36.27-.81.41-1.26.39h0v.04Zm2.32,6.81c0-1.1.9-2,2-2h26.66c1.1.05,1.96.99,1.9,2.1-.05,1.1-.99,1.96-2.1,1.9h-26.47c-1.1,0-2-.9-2-2m-77.5,7.28c.86-.69,2.13-.55,2.82.31.69.86.56,2.13-.31,2.82l-19.97,16.09c-.86.7-2.12.57-2.83-.28-.7-.86-.57-2.12.28-2.83l20-16.11h0M15.36,25.5c-.83-.74-.91-2-.17-2.83.73-.83,2-.9,2.83-.17l19.98,16.11c.78.69.91,1.86.29,2.69-.66.89-1.91,1.07-2.8.42L15.49,25.62h0l-.13-.12Zm-9.63,25.5c-1.1-.05-1.96-.98-1.91-2.08.05-1.1.98-1.96,2.08-1.92h26.47c1.11,0,2,.9,2,2s-.89,2-2,2H5.73" style="fill:none; stroke-width:0px;"/></clipPath><radialGradient id="uuid-3f814705-4d4c-4032-88ea-8f4480020c22" cx="73.7" cy="73.7" fx="73.7" fy="-49.12" r="203.08" gradientTransform="translate(.15 46.9) rotate(.33) scale(1 .36)" gradientUnits="userSpaceOnUse"><stop offset=".01" stop-color="#7c60e6"/><stop offset=".09" stop-color="#725edb"/><stop offset=".32" stop-color="#575abe"/><stop offset=".55" stop-color="#4458a9"/><stop offset=".78" stop-color="#38569d"/><stop offset="1" stop-color="#355699"/></radialGradient></defs><g style="clip-path:url(#uuid-81f828fd-72f4-4a48-8d84-2e4c05ab6663);"><rect x=".15" y=".15" width="147.1" height="147.1" style="fill:url(#uuid-3f814705-4d4c-4032-88ea-8f4480020c22); stroke-width:0px;"/></g></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-392c8297-f600-40b0-8154-0463046a40c3" xmlns="http://www.w3.org/2000/svg" width="400" height="350" viewBox="0 0 400 350"><path d="m197.45,339.95c-91,0-165-74-165-165S106.45,9.95,197.45,9.95s165,74,165,165-74,165-165,165m-83.7-26.9c24.4,14.9,53.1,23.5,83.8,23.5s59.5-8.6,84-23.6c-14.4-16.2-45.6-26.3-82.4-26.6h-1.2c-36.9,0-69.5,10.4-84.2,26.7m-3.5-273.9c-44.7,28.8-74.3,78.9-74.3,135.9s29.9,107.5,74.8,136.2c15.3-17.6,48.4-28.3,87.1-28.3h1.3c38.1.2,70.5,11,85.3,28.1,44.8-28.7,74.6-79,74.6-136.1s-29.5-106.9-74-135.7c-14.6,17.5-47.3,28.5-85.8,28.8-40,.2-73.8-10.8-89-28.9m2.9-1.9c14.5,16.7,47.4,27.4,84.8,27.4h1.2c37.3-.2,68.8-10.6,82.9-27.2-24.6-15.2-53.6-24-84.6-24s-59.7,8.7-84.3,23.8" style="fill:#61b4ff; stroke-width:0px;"/><path d="m49.55,226.55c27.6,0,43.4-25.5,43.4-51,0-23-20.1-46.3-43.4-46.3S6.05,152.55,6.05,175.55c0,25.5,15.9,51,43.5,51m22.9-35.4c0,5.4-.1,10.7-1.4,15.6-2.5,9.6-8.2,16.3-21.5,16.3s-19-6.7-21.5-16.3c-1.3-4.9-1.5-10.2-1.5-15.6v-30.4c0-5,.8-9.8,2.1-13.9,2.5-8.5,8.5-14.1,20.9-14.1s18,5.6,20.8,14.1c1.4,4.2,2.1,8.9,2.1,13.9,0,0,0,30.4,0,30.4Z" style="fill:#fff; stroke-width:0px;"/><polygon points="149.75 134.85 163.55 134.85 163.55 131.35 118.15 131.35 118.15 134.85 131.95 134.85 131.95 220.95 118.15 220.95 118.15 224.45 163.55 224.45 163.55 220.95 149.75 220.95 149.75 134.85" style="fill:#fff; stroke-width:0px;"/><polygon points="281.55 134.85 295.35 134.85 295.35 131.35 260.15 131.35 239.95 195.05 220.35 131.35 184.45 131.35 184.45 134.85 198.25 134.85 198.25 220.95 184.45 220.95 184.45 224.45 216.25 224.45 216.25 220.95 202.65 220.95 202.65 137.15 202.95 137.15 230.75 224.45 235.45 224.45 263.35 137.15 263.75 137.15 263.75 220.95 249.95 220.95 249.95 224.45 295.35 224.45 295.35 220.95 281.55 220.95 281.55 134.85" style="fill:#fff; stroke-width:0px;"/><path d="m392.55,224.45l1.4-31.4h-4.3c-.6,16-6.8,27.9-24.5,27.9h-18.3v-86.2h14.5v-3.5h-46.1v3.5h13.8v86.2h-13.8v3.5h77.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m198.15,340.05h-.2v-2h-.2v1.9c-51.3,0-90.7-40.8-105.5-109l3.4-.7c13,59.8,45.2,98,87.5,105.1-25.2-17-34.5-76.5-37.5-104.5l3.4-.4c7,64.8,24.5,104.1,47.1,106l.1-106.3h3.4l-.2,106.4c23.1-1.7,40.8-41.3,47.5-106.6l3.4.4c-5.8,56-19.2,92.8-37.8,105.2,42.4-7.1,74.6-45.5,87.6-105.8l3.4.7c-14.8,68.6-54.2,109.6-105.4,109.6m49.3-212.9c-6.4-68-24.6-110.8-47.9-112.9l-.1,112.7h-3.4l.1-112.8c-23.7,2-42.1,44.9-48.2,112.9l-3.4-.3c5.3-59,19.4-98.7,38.9-111.6-44.2,7.1-77,47.6-89.2,111.5l-3.4-.6C104.65,53.65,144.55,10.55,197.65,10.55h.2v.1c53.3.1,93.3,43.2,107,115.5l-3.4.6c-12.1-63.9-45-104.5-89.5-111.6,19.3,12.9,33.4,52.6,38.9,111.6l-3.4.4h0Z" style="fill:#61b4ff; stroke-width:0px;"/></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-2d2d8ecd-7322-4f1e-8ad1-fcb9dd136ee5" xmlns="http://www.w3.org/2000/svg" width="400" height="350" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 350"><defs><clipPath id="uuid-aa61105c-aa3b-4905-8fff-b890585593c3"><path d="m26.02,7.53v334.94h347.97V7.53H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-0e4318b5-a032-499c-a333-629758ec1c27"><circle cx="200" cy="175" r="165" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-5b46790f-24ca-492e-8999-d1d768922ab3"><path d="m26.02,392.51v334.94h347.97v-334.94H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-5eaf6753-d116-4019-a045-cfcdc43d11d9"><circle cx="200" cy="559.98" r="165" style="fill:none; stroke-width:0px;"/></clipPath></defs><g style="clip-path:url(#uuid-aa61105c-aa3b-4905-8fff-b890585593c3);"><path d="m200,14c12.65,0,25.44,16.62,35.1,45.59,10.26,30.77,15.9,71.75,15.9,115.41s-5.65,84.64-15.9,115.41c-9.66,28.97-22.45,45.59-35.1,45.59s-25.44-16.62-35.1-45.59c-10.26-30.77-15.9-71.75-15.9-115.41s5.65-84.64,15.9-115.41c9.66-28.97,22.45-45.59,35.1-45.59m0-4c-30.38,0-55,73.87-55,165s24.62,165,55,165,55-73.87,55-165S230.38,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,14c58.45,0,106,72.22,106,161s-47.55,161-106,161-106-72.22-106-161S141.55,14,200,14m0-4c-60.75,0-110,73.87-110,165s49.25,165,110,165,110-73.87,110-165S260.75,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,14c43,0,83.44,16.75,113.84,47.16,30.41,30.41,47.16,70.84,47.16,113.84s-16.75,83.44-47.16,113.84c-30.41,30.41-70.84,47.16-113.84,47.16s-83.44-16.75-113.84-47.16c-30.41-30.41-47.16-70.84-47.16-113.84s16.75-83.44,47.16-113.84c30.41-30.41,70.84-47.16,113.84-47.16m0-4c-91.13,0-165,73.87-165,165s73.87,165,165,165,165-73.87,165-165S291.13,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><line x1="200" y1="10.25" x2="200" y2="340" style="fill:none; stroke:#004996; stroke-linejoin:round; stroke-width:4px;"/><g style="clip-path:url(#uuid-0e4318b5-a032-499c-a333-629758ec1c27);"><path d="m200-41.77c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,288.23c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#004996; stroke-width:0px;"/></g></g><path d="m10.66,216.74h-2.11v-24.67h3.6c2.6,11.78,9.67,22.69,22.81,22.69,9.8,0,18.48-7.19,18.48-17.36,0-11.53-10.29-13.76-19.59-16.99-2.48-.87-4.96-1.74-7.44-2.48-11.53-3.47-17.23-12.15-17.23-23.93,0-13.02,9.67-22.69,22.57-22.69,7.19,0,12.4,1.74,18.1,6.2l4.71-4.96h2.23v23.43h-3.97c-1.36-11.78-9.05-21.57-21.45-21.57-7.94,0-15.38,5.83-15.38,14.14,0,9.55,6.57,10.54,14.26,12.65,3.1.87,5.58,1.74,7.69,2.36,2.48.74,5.58,1.61,8.18,2.85,10.42,4.96,14.14,13.14,14.14,24.3,0,15.62-10.17,27.15-26.16,27.15-5.83,0-13.27-2.36-17.61-6.32l-5.83,5.21Z" style="stroke-width:0px;"/><path d="m147.83,212.89h12.28v3.1h-40.42v-3.1h12.28v-74.52h-.37l-24.8,77.62h-4.22l-24.67-77.62h-.25v74.52h12.03v3.1h-28.27v-3.1h12.28v-76.63h-12.28v-3.1h31.99l17.36,56.66,17.98-56.66h31.37v3.1h-12.28v76.63Z" style="stroke-width:0px;"/><path d="m159.56,215.99v-3.1h10.04l29.63-81.59h4.22l28.39,81.59h9.92v3.1h-39.31v-3.1h12.9l-7.56-21.95h-26.78l-7.69,21.95h12.65v3.1h-26.41Zm22.81-28.15h24.18l-11.66-34.59-12.52,34.59Z" style="stroke-width:0px;"/><path d="m270.75,212.89h12.27v3.1h-40.42v-3.1h12.28v-76.63h-12.28v-3.1h41.54c13.52,0,29.63,1.61,29.63,18.85,0,14.01-14.76,18.85-26.29,20.09v.25c19.34,2.98,23.68,13.39,23.68,33.6,0,4.34.37,9.3,12.28,7.07v2.98c-3.47.87-6.94,1.49-10.54,1.49-12.52,0-19.09-6.32-19.09-18.97,0-10.29-1.74-17.98-4.96-20.71-3.47-2.98-7.44-4.46-11.28-4.46h-6.82v39.55Zm0-42.65h10.17c11.16,0,15.75-5.33,15.75-16.49,0-13.89-4.09-17.48-15.13-17.48h-10.79v33.97Z" style="stroke-width:0px;"/><path d="m335.68,215.99v-3.1h13.02v-76.63c-17.48-.87-22.82,7.56-25.05,23.43h-3.97l1.36-26.53h71.05l1.36,26.53h-3.84c-2.23-15.87-7.56-24.3-25.05-23.43v76.63h13.02v3.1h-41.91Z" style="stroke-width:0px;"/><g style="clip-path:url(#uuid-5b46790f-24ca-492e-8999-d1d768922ab3);"><g style="clip-path:url(#uuid-5eaf6753-d116-4019-a045-cfcdc43d11d9);"><path d="m200,343.21c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#61b4ff; stroke-width:0px;"/></g></g></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-25719554-89b6-40aa-a949-76868e430d34" xmlns="http://www.w3.org/2000/svg" width="400" height="350" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 350"><defs><clipPath id="uuid-730f8b3a-07e3-4c41-8ef6-7b88b7c5bf89"><path d="m26.02-377.47V-42.53h347.97v-334.94H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-a8f0ebc6-4123-4f41-a636-9eba2ad1d974"><circle cx="200" cy="-210" r="165" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-670149b9-ac0c-4079-b07e-f68c5d8a5102"><path d="m26.02,7.51v334.94h347.97V7.51H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-d14546d8-5846-4ca0-98dc-59f96f61f3f9"><circle cx="200" cy="174.98" r="165" style="fill:none; stroke-width:0px;"/></clipPath></defs><g style="clip-path:url(#uuid-730f8b3a-07e3-4c41-8ef6-7b88b7c5bf89);"><g style="clip-path:url(#uuid-a8f0ebc6-4123-4f41-a636-9eba2ad1d974);"><path d="m200-96.77c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77S145.62,10.77,200,10.77s98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#004996; stroke-width:0px;"/></g></g><g style="clip-path:url(#uuid-670149b9-ac0c-4079-b07e-f68c5d8a5102);"><path d="m200,13.98c12.65,0,25.44,16.62,35.1,45.59,10.26,30.77,15.9,71.75,15.9,115.41s-5.65,84.64-15.9,115.41c-9.66,28.97-22.45,45.59-35.1,45.59s-25.44-16.62-35.1-45.59c-10.26-30.77-15.9-71.75-15.9-115.41s5.65-84.64,15.9-115.41c9.66-28.97,22.45-45.59,35.1-45.59m0-4c-30.38,0-55,73.87-55,165s24.62,165,55,165,55-73.87,55-165S230.38,9.98,200,9.98h0Z" style="fill:#61b4ff; stroke-width:0px;"/><path d="m200,13.98c58.45,0,106,72.22,106,161s-47.55,161-106,161-106-72.22-106-161S141.55,13.98,200,13.98m0-4c-60.75,0-110,73.87-110,165s49.25,165,110,165,110-73.87,110-165S260.75,9.98,200,9.98h0Z" style="fill:#61b4ff; stroke-width:0px;"/><path d="m200,13.98c43,0,83.44,16.75,113.84,47.16,30.41,30.41,47.16,70.84,47.16,113.84s-16.75,83.44-47.16,113.84c-30.41,30.41-70.84,47.16-113.84,47.16s-83.44-16.75-113.84-47.16c-30.41-30.41-47.16-70.84-47.16-113.84s16.75-83.44,47.16-113.84c30.41-30.41,70.84-47.16,113.84-47.16m0-4c-91.13,0-165,73.87-165,165s73.87,165,165,165,165-73.87,165-165S291.13,9.98,200,9.98h0Z" style="fill:#61b4ff; stroke-width:0px;"/><line x1="200" y1="10.23" x2="200" y2="339.98" style="fill:none; stroke:#61b4ff; stroke-linejoin:round; stroke-width:4px;"/><g style="clip-path:url(#uuid-d14546d8-5846-4ca0-98dc-59f96f61f3f9);"><path d="m200-41.79c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#61b4ff; stroke-width:0px;"/><path d="m200,288.21c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#61b4ff; stroke-width:0px;"/></g></g><path d="m10.66,216.72h-2.11v-24.67h3.6c2.6,11.78,9.67,22.69,22.81,22.69,9.8,0,18.48-7.19,18.48-17.36,0-11.53-10.29-13.76-19.59-16.99-2.48-.87-4.96-1.74-7.44-2.48-11.53-3.47-17.23-12.15-17.23-23.93,0-13.02,9.67-22.69,22.57-22.69,7.19,0,12.4,1.74,18.1,6.2l4.71-4.96h2.23v23.43h-3.97c-1.36-11.78-9.05-21.57-21.45-21.57-7.94,0-15.38,5.83-15.38,14.13,0,9.55,6.57,10.54,14.26,12.65,3.1.87,5.58,1.74,7.69,2.36,2.48.74,5.58,1.61,8.18,2.85,10.42,4.96,14.14,13.14,14.14,24.3,0,15.62-10.17,27.15-26.16,27.15-5.83,0-13.27-2.36-17.61-6.32l-5.83,5.21Z" style="fill:#fff; stroke-width:0px;"/><path d="m147.83,212.87h12.28v3.1h-40.42v-3.1h12.28v-74.52h-.37l-24.8,77.62h-4.22l-24.67-77.62h-.25v74.52h12.03v3.1h-28.27v-3.1h12.28v-76.63h-12.28v-3.1h31.99l17.36,56.67,17.98-56.67h31.37v3.1h-12.28v76.63Z" style="fill:#fff; stroke-width:0px;"/><path d="m159.56,215.97v-3.1h10.04l29.63-81.59h4.22l28.39,81.59h9.92v3.1h-39.31v-3.1h12.9l-7.56-21.95h-26.78l-7.69,21.95h12.65v3.1h-26.41Zm22.81-28.15h24.18l-11.66-34.59-12.52,34.59Z" style="fill:#fff; stroke-width:0px;"/><path d="m270.75,212.87h12.27v3.1h-40.42v-3.1h12.28v-76.63h-12.28v-3.1h41.54c13.52,0,29.63,1.61,29.63,18.85,0,14.01-14.76,18.85-26.29,20.09v.25c19.34,2.98,23.68,13.39,23.68,33.6,0,4.34.37,9.3,12.28,7.07v2.98c-3.47.87-6.94,1.49-10.54,1.49-12.52,0-19.09-6.32-19.09-18.97,0-10.29-1.74-17.98-4.96-20.71-3.47-2.98-7.44-4.46-11.28-4.46h-6.82v39.55Zm0-42.65h10.17c11.16,0,15.75-5.33,15.75-16.49,0-13.89-4.09-17.48-15.13-17.48h-10.79v33.97Z" style="fill:#fff; stroke-width:0px;"/><path d="m335.68,215.97v-3.1h13.02v-76.63c-17.48-.87-22.82,7.56-25.05,23.43h-3.97l1.36-26.53h71.05l1.36,26.53h-3.84c-2.23-15.87-7.56-24.3-25.05-23.43v76.63h13.02v3.1h-41.91Z" style="fill:#fff; stroke-width:0px;"/></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="uuid-2d2d8ecd-7322-4f1e-8ad1-fcb9dd136ee5" xmlns="http://www.w3.org/2000/svg" width="400" height="350" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 350"><defs><clipPath id="uuid-aa61105c-aa3b-4905-8fff-b890585593c3"><path d="m26.02,7.53v334.94h347.97V7.53H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-0e4318b5-a032-499c-a333-629758ec1c27"><circle cx="200" cy="175" r="165" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-5b46790f-24ca-492e-8999-d1d768922ab3"><path d="m26.02,392.51v334.94h347.97v-334.94H26.02Zm373.98,221.03H0v-107.13h400v107.13Z" style="fill:none; stroke-width:0px;"/></clipPath><clipPath id="uuid-5eaf6753-d116-4019-a045-cfcdc43d11d9"><circle cx="200" cy="559.98" r="165" style="fill:none; stroke-width:0px;"/></clipPath></defs><g style="clip-path:url(#uuid-aa61105c-aa3b-4905-8fff-b890585593c3);"><path d="m200,14c12.65,0,25.44,16.62,35.1,45.59,10.26,30.77,15.9,71.75,15.9,115.41s-5.65,84.64-15.9,115.41c-9.66,28.97-22.45,45.59-35.1,45.59s-25.44-16.62-35.1-45.59c-10.26-30.77-15.9-71.75-15.9-115.41s5.65-84.64,15.9-115.41c9.66-28.97,22.45-45.59,35.1-45.59m0-4c-30.38,0-55,73.87-55,165s24.62,165,55,165,55-73.87,55-165S230.38,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,14c58.45,0,106,72.22,106,161s-47.55,161-106,161-106-72.22-106-161S141.55,14,200,14m0-4c-60.75,0-110,73.87-110,165s49.25,165,110,165,110-73.87,110-165S260.75,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,14c43,0,83.44,16.75,113.84,47.16,30.41,30.41,47.16,70.84,47.16,113.84s-16.75,83.44-47.16,113.84c-30.41,30.41-70.84,47.16-113.84,47.16s-83.44-16.75-113.84-47.16c-30.41-30.41-47.16-70.84-47.16-113.84s16.75-83.44,47.16-113.84c30.41-30.41,70.84-47.16,113.84-47.16m0-4c-91.13,0-165,73.87-165,165s73.87,165,165,165,165-73.87,165-165S291.13,10,200,10h0Z" style="fill:#004996; stroke-width:0px;"/><line x1="200" y1="10.25" x2="200" y2="340" style="fill:none; stroke:#004996; stroke-linejoin:round; stroke-width:4px;"/><g style="clip-path:url(#uuid-0e4318b5-a032-499c-a333-629758ec1c27);"><path d="m200-41.77c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#004996; stroke-width:0px;"/><path d="m200,288.23c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#004996; stroke-width:0px;"/></g></g><path d="m10.66,216.74h-2.11v-24.67h3.6c2.6,11.78,9.67,22.69,22.81,22.69,9.8,0,18.48-7.19,18.48-17.36,0-11.53-10.29-13.76-19.59-16.99-2.48-.87-4.96-1.74-7.44-2.48-11.53-3.47-17.23-12.15-17.23-23.93,0-13.02,9.67-22.69,22.57-22.69,7.19,0,12.4,1.74,18.1,6.2l4.71-4.96h2.23v23.43h-3.97c-1.36-11.78-9.05-21.57-21.45-21.57-7.94,0-15.38,5.83-15.38,14.14,0,9.55,6.57,10.54,14.26,12.65,3.1.87,5.58,1.74,7.69,2.36,2.48.74,5.58,1.61,8.18,2.85,10.42,4.96,14.14,13.14,14.14,24.3,0,15.62-10.17,27.15-26.16,27.15-5.83,0-13.27-2.36-17.61-6.32l-5.83,5.21Z" style="stroke-width:0px;"/><path d="m147.83,212.89h12.28v3.1h-40.42v-3.1h12.28v-74.52h-.37l-24.8,77.62h-4.22l-24.67-77.62h-.25v74.52h12.03v3.1h-28.27v-3.1h12.28v-76.63h-12.28v-3.1h31.99l17.36,56.66,17.98-56.66h31.37v3.1h-12.28v76.63Z" style="stroke-width:0px;"/><path d="m159.56,215.99v-3.1h10.04l29.63-81.59h4.22l28.39,81.59h9.92v3.1h-39.31v-3.1h12.9l-7.56-21.95h-26.78l-7.69,21.95h12.65v3.1h-26.41Zm22.81-28.15h24.18l-11.66-34.59-12.52,34.59Z" style="stroke-width:0px;"/><path d="m270.75,212.89h12.27v3.1h-40.42v-3.1h12.28v-76.63h-12.28v-3.1h41.54c13.52,0,29.63,1.61,29.63,18.85,0,14.01-14.76,18.85-26.29,20.09v.25c19.34,2.98,23.68,13.39,23.68,33.6,0,4.34.37,9.3,12.28,7.07v2.98c-3.47.87-6.94,1.49-10.54,1.49-12.52,0-19.09-6.32-19.09-18.97,0-10.29-1.74-17.98-4.96-20.71-3.47-2.98-7.44-4.46-11.28-4.46h-6.82v39.55Zm0-42.65h10.17c11.16,0,15.75-5.33,15.75-16.49,0-13.89-4.09-17.48-15.13-17.48h-10.79v33.97Z" style="stroke-width:0px;"/><path d="m335.68,215.99v-3.1h13.02v-76.63c-17.48-.87-22.82,7.56-25.05,23.43h-3.97l1.36-26.53h71.05l1.36,26.53h-3.84c-2.23-15.87-7.56-24.3-25.05-23.43v76.63h13.02v3.1h-41.91Z" style="stroke-width:0px;"/><g style="clip-path:url(#uuid-5b46790f-24ca-492e-8999-d1d768922ab3);"><g style="clip-path:url(#uuid-5eaf6753-d116-4019-a045-cfcdc43d11d9);"><path d="m200,343.21c25.62,0,49.64,5.62,67.65,15.82,17.29,9.79,26.81,22.56,26.81,35.96s-9.52,26.16-26.81,35.96c-18,10.2-42.03,15.82-67.65,15.82s-49.64-5.62-67.65-15.82c-17.29-9.79-26.81-22.56-26.81-35.96s9.52-26.16,26.81-35.96c18-10.2,42.03-15.82,67.65-15.82m0-4c-54.38,0-98.45,24.97-98.45,55.77s44.08,55.77,98.45,55.77,98.45-24.97,98.45-55.77-44.08-55.77-98.45-55.77h0Z" style="fill:#61b4ff; stroke-width:0px;"/></g></g></svg>
@@ -0,0 +1,145 @@
1
+ /* Page behaviour — vanilla JS, no dependencies.
2
+ - scroll-spy table of contents (IntersectionObserver)
3
+ - mobile TOC drawer with backdrop
4
+ - back-to-top button
5
+ - heading-anchor deep links (copy URL on click)
6
+ */
7
+ (function () {
8
+ "use strict";
9
+
10
+ var toc = document.getElementById("toc");
11
+ var toggle = document.getElementById("toc-toggle");
12
+ var themeToggle = document.getElementById("theme-toggle");
13
+ var crumbCurrent = document.getElementById("crumb-current");
14
+ var backToTop = document.getElementById("back-to-top");
15
+ var root = document.documentElement;
16
+
17
+ /* ---- light/dark theme: stored choice wins, else system ---- */
18
+ var THEME_KEY = "mn-theme";
19
+ function systemTheme() {
20
+ return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches
21
+ ? "dark" : "light";
22
+ }
23
+ function applyTheme(theme) {
24
+ root.setAttribute("data-theme", theme);
25
+ if (themeToggle) {
26
+ themeToggle.setAttribute("aria-pressed", String(theme === "dark"));
27
+ themeToggle.title = theme === "dark" ? "Switch to light mode" : "Switch to dark mode";
28
+ }
29
+ }
30
+ var stored = null;
31
+ try { stored = localStorage.getItem(THEME_KEY); } catch (e) { /* private mode */ }
32
+ applyTheme(stored === "dark" || stored === "light" ? stored : systemTheme());
33
+ if (themeToggle) {
34
+ themeToggle.addEventListener("click", function () {
35
+ var next = root.getAttribute("data-theme") === "dark" ? "light" : "dark";
36
+ applyTheme(next);
37
+ try { localStorage.setItem(THEME_KEY, next); } catch (e) { /* ignore */ }
38
+ });
39
+ }
40
+ if (window.matchMedia) {
41
+ window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", function (event) {
42
+ var saved = null;
43
+ try { saved = localStorage.getItem(THEME_KEY); } catch (e) { /* ignore */ }
44
+ if (!saved) applyTheme(event.matches ? "dark" : "light");
45
+ });
46
+ }
47
+
48
+ /* ---- mobile TOC drawer ---- */
49
+ var backdrop = null;
50
+ function setDrawer(open) {
51
+ if (!toc || !toggle) return;
52
+ toc.classList.toggle("open", open);
53
+ toggle.setAttribute("aria-expanded", String(open));
54
+ toggle.textContent = open ? "×" : "☰";
55
+ if (open && !backdrop) {
56
+ backdrop = document.createElement("div");
57
+ backdrop.className = "toc-backdrop";
58
+ backdrop.addEventListener("click", function () { setDrawer(false); });
59
+ document.body.appendChild(backdrop);
60
+ } else if (!open && backdrop) {
61
+ backdrop.remove();
62
+ backdrop = null;
63
+ }
64
+ }
65
+ if (toggle) {
66
+ toggle.addEventListener("click", function () {
67
+ setDrawer(!(toc && toc.classList.contains("open")));
68
+ });
69
+ }
70
+ if (toc) {
71
+ toc.addEventListener("click", function (event) {
72
+ if (event.target.closest("a")) setDrawer(false);
73
+ });
74
+ }
75
+
76
+ /* ---- scroll-spy (also drives the breadcrumb) ---- */
77
+ var links = toc ? Array.prototype.slice.call(toc.querySelectorAll("a[href^='#']")) : [];
78
+ if (links.length && "IntersectionObserver" in window) {
79
+ var byId = {};
80
+ links.forEach(function (a) { byId[a.getAttribute("href").slice(1)] = a; });
81
+ var current = null;
82
+ var observer = new IntersectionObserver(function (entries) {
83
+ entries.forEach(function (entry) {
84
+ if (!entry.isIntersecting) return;
85
+ var link = byId[entry.target.id];
86
+ if (!link || link === current) return;
87
+ if (current) current.classList.remove("active");
88
+ link.classList.add("active");
89
+ current = link;
90
+ if (crumbCurrent) crumbCurrent.textContent = link.textContent;
91
+ scrollTocIntoView(link);
92
+ });
93
+ }, { rootMargin: "-10% 0px -75% 0px", threshold: 0 });
94
+ Object.keys(byId).forEach(function (id) {
95
+ var el = document.getElementById(id);
96
+ if (el) observer.observe(el);
97
+ });
98
+ }
99
+
100
+ // Scrolls the TOC panel so the active entry stays visible. Uses
101
+ // nearest() so a nested <a> finds its <li> wrapper, then computes
102
+ // the minimum scroll needed (only moves when the link is outside
103
+ // the visible band — no jumpy centre-on-every-change behaviour).
104
+ function scrollTocIntoView(link) {
105
+ if (!toc) return;
106
+ var item = link.closest("li");
107
+ if (!item) return;
108
+ var top = item.offsetTop;
109
+ var bottom = top + item.offsetHeight;
110
+ var viewTop = toc.scrollTop;
111
+ var viewBottom = viewTop + toc.clientHeight;
112
+ if (top < viewTop) {
113
+ toc.scrollTo({ top: top - 8, behavior: "smooth" });
114
+ } else if (bottom > viewBottom) {
115
+ toc.scrollTo({ top: bottom - toc.clientHeight + 8, behavior: "smooth" });
116
+ }
117
+ }
118
+
119
+ /* ---- heading anchor links: click to copy ---- */
120
+ document.addEventListener("click", function (event) {
121
+ var anchor = event.target.closest("a.h-anchor");
122
+ if (!anchor) return;
123
+ event.preventDefault();
124
+ var url = location.href.split("#")[0] + anchor.getAttribute("href");
125
+ if (navigator.clipboard && navigator.clipboard.writeText) {
126
+ navigator.clipboard.writeText(url);
127
+ anchor.classList.add("copied");
128
+ setTimeout(function () { anchor.classList.remove("copied"); }, 900);
129
+ }
130
+ history.replaceState(null, "", anchor.getAttribute("href"));
131
+ });
132
+
133
+ /* ---- back to top ---- */
134
+ function onScroll() {
135
+ if (!backToTop) return;
136
+ backToTop.classList.toggle("visible", window.scrollY > 600);
137
+ }
138
+ window.addEventListener("scroll", onScroll, { passive: true });
139
+ if (backToTop) {
140
+ backToTop.addEventListener("click", function () {
141
+ window.scrollTo({ top: 0, behavior: "smooth" });
142
+ });
143
+ onScroll();
144
+ }
145
+ })();