aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--8seg_digit_circuit.svg1065
-rw-r--r--8seg_strand_power_distribution.svg500
-rw-r--r--center_fw/src/main.c2
-rw-r--r--led_tape.svg48
-rw-r--r--len_map.py96
5 files changed, 1687 insertions, 24 deletions
diff --git a/8seg_digit_circuit.svg b/8seg_digit_circuit.svg
new file mode 100644
index 0000000..f67610d
--- /dev/null
+++ b/8seg_digit_circuit.svg
@@ -0,0 +1,1065 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="210mm"
+ height="297mm"
+ viewBox="0 0 210 297"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
+ sodipodi:docname="8seg_digit_circuit.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ inkscape:zoom="2"
+ inkscape:cx="251.25"
+ inkscape:cy="492.75"
+ inkscape:window-width="3840"
+ inkscape:window-height="2091"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1"
+ showgrid="false" />
+ <defs
+ id="defs1">
+ <rect
+ x="406.95899"
+ y="527.87061"
+ width="40.574219"
+ height="36.401856"
+ id="rect152" />
+ <rect
+ x="122.64551"
+ y="276.75879"
+ width="172.68359"
+ height="82.104492"
+ id="rect146" />
+ <rect
+ x="636.1924"
+ y="49.355225"
+ width="136.55447"
+ height="106.04116"
+ id="rect121" />
+ <rect
+ x="624.4692"
+ y="16.598365"
+ width="155.11603"
+ height="107.82135"
+ id="rect120" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="269.24966"
+ height="278.60213"
+ id="rect80" />
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="342.47363"
+ height="107.58745"
+ id="rect76" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="209.77623"
+ height="56.109158"
+ id="rect65" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect45" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect46" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect47" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect48" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect49" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect50" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect51" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect52" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="307.93604"
+ height="31.362564"
+ id="rect66" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="449.28024"
+ height="31.606377"
+ id="rect67" />
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="436.93362"
+ height="105.38921"
+ id="rect77" />
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="568.39697"
+ height="105.62805"
+ id="rect78" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect81" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect82" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect83" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect87" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect88" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect89" />
+ <rect
+ x="636.1924"
+ y="49.355225"
+ width="136.55447"
+ height="106.04116"
+ id="rect122" />
+ <rect
+ x="122.64551"
+ y="276.75879"
+ width="172.68359"
+ height="82.104492"
+ id="rect147" />
+ <rect
+ x="122.64551"
+ y="276.75879"
+ width="172.68359"
+ height="82.104492"
+ id="rect151" />
+ <rect
+ x="406.95899"
+ y="527.87061"
+ width="40.574219"
+ height="36.401856"
+ id="rect153" />
+ <rect
+ x="122.64551"
+ y="276.75879"
+ width="172.68359"
+ height="82.104492"
+ id="rect154" />
+ <rect
+ x="122.64551"
+ y="276.75879"
+ width="172.68359"
+ height="82.104492"
+ id="rect155" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect27" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect28" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect29" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="269.24966"
+ height="278.60213"
+ id="rect30" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect34" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect35" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect36" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect39" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect40" />
+ <rect
+ x="670.42442"
+ y="498.4256"
+ width="540.87899"
+ height="258.26417"
+ id="rect41" />
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g80"
+ transform="translate(-0.52916317,15.070855)"
+ style="stroke:#e2e2e2;stroke-width:4.6;stroke-dasharray:none;stroke-opacity:1">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7288-9"
+ d="M 43.431053,68.411334 V 228.58867 H 166.56894 V 68.411334 Z"
+ style="fill:none;fill-rule:evenodd;stroke:#e2e2e2;stroke-width:4.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7290-2"
+ d="M 43.431053,68.411334 166.56894,228.58867"
+ style="fill:none;fill-rule:evenodd;stroke:#e2e2e2;stroke-width:4.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7292-0"
+ d="M 166.56894,68.411334 43.431053,228.58867"
+ style="fill:none;fill-rule:evenodd;stroke:#e2e2e2;stroke-width:4.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path7288-9"
+ id="use78"
+ style="stroke:#e2e2e2;stroke-width:4.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-128.28683,-95.399382)"
+ id="text80"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect80);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"><tspan
+ x="785.27119"
+ y="514.88774"
+ id="tspan26"><tspan
+ style="font-weight:bold"
+ id="tspan22">LED Tape segments</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-65.266591,-87.888875)"
+ id="text81"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect81);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan32"><tspan
+ style="text-align:start"
+ id="tspan28">l = 100.0 - 2*3.0 = 94 cm</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-63.172964,-83.102724)"
+ id="text82"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect82);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan37"><tspan
+ style="text-align:start"
+ id="tspan35">l = 130 - 2*3.0 = 124 cm</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-55.690478,-78.316574)"
+ id="text83"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect83);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan41"><tspan
+ style="text-align:start"
+ id="tspan40">l = 82 - 2.0 = 80 cm</tspan></tspan></text>
+ <rect
+ style="fill:#6699ff;stroke:none;stroke-width:11.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect84"
+ width="4.4600143"
+ height="2.2300072"
+ x="64.579918"
+ y="36.249962"
+ rx="0"
+ ry="0" />
+ <rect
+ style="fill:#99cc33;stroke:none;stroke-width:11.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect85"
+ width="4.4600143"
+ height="2.2300072"
+ x="64.579918"
+ y="41.03611"
+ rx="0"
+ ry="0" />
+ <rect
+ style="fill:#ff9900;stroke:none;stroke-width:11.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect86"
+ width="4.4600143"
+ height="2.2300072"
+ x="64.579918"
+ y="45.822262"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-93.857239,-87.888875)"
+ id="text86"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect87);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan43"><tspan
+ style="text-align:start"
+ id="tspan42">Horizontal (H)</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-93.857239,-83.102724)"
+ id="text87"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect88);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan45"><tspan
+ style="text-align:start"
+ id="tspan44">Vertical (V)</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-93.857239,-78.316574)"
+ id="text88"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect89);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="670.42383"
+ y="514.88774"
+ id="tspan47"><tspan
+ style="text-align:start"
+ id="tspan46">Diagonal (D)</tspan></tspan></text>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.20000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect90"
+ width="35.400009"
+ height="35.400009"
+ x="-122.7"
+ y="145.87085"
+ rx="0"
+ ry="0"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:none;stroke:#cc0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 91.67838,148.36259 9.02949,11.75325 c 1.40487,2.17107 5.07377,2.43826 8.38538,6.41463 l 9.82133,12.90318"
+ id="path90"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#003399;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 116.57917,146.46147 -9.0827,11.71217 c -4.37235,4.47023 -1.12999,5.7243 -4.08136,9.73677 l -9.994558,12.76947"
+ id="path91"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect91"
+ width="35.400009"
+ height="35.400009"
+ x="-66.709923"
+ y="72.268623"
+ rx="0"
+ ry="0"
+ transform="scale(-1,1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect92"
+ width="35.400009"
+ height="35.400009"
+ x="-177.6308"
+ y="72.268623"
+ rx="0"
+ ry="0"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:none;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 59.534207,106.36904 47.88867,91.217966 c -2.064319,-2.384295 -3.419038,-1.249338 -3.208827,1.360961 l -0.05481,13.601383"
+ id="path94"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.99999595, 0.49999899;stroke-opacity:1;stroke-dashoffset:0"
+ d="M 59.534207,102.82068 47.88867,87.669604 c -2.064319,-2.384295 -1.300545,-5.52025 3.042471,-5.58921 h 14.563678"
+ id="path95"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect95"
+ width="35.400009"
+ height="35.400009"
+ x="143.05925"
+ y="-254.52634"
+ rx="0"
+ ry="0"
+ transform="scale(1,-1)" />
+ <path
+ style="fill:none;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 150.23497,220.42593 11.64554,15.15107 c 2.06432,2.3843 3.41904,1.24934 3.20883,-1.36096 l 0.0548,-13.60138"
+ id="path96"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 150.23497,223.97429 11.64554,15.15107 c 2.06432,2.3843 1.30054,5.52025 -3.04247,5.58921 h -14.56368"
+ id="path97"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 148.09091,105.59036 13.50408,-17.510359 c 2.06301,-3.039119 -0.51768,-3.04055 -2.75583,-3.051763 l -14.64204,0.06257"
+ id="path98"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.99999595, 0.49999899;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 150.15017,106.52139 163.7605,89.294461 c 1.27276,-1.559361 4.25042,-3.465513 4.25042,-0.102314 l 0.0296,17.329243"
+ id="path99"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect101"
+ width="35.400009"
+ height="35.400009"
+ x="32.162769"
+ y="-255.29588"
+ rx="0"
+ ry="0"
+ transform="scale(1,-1)" />
+ <path
+ style="fill:none;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 61.7962,221.88061 -13.50408,17.51035 c -2.06301,3.03912 0.51768,3.04055 2.75583,3.05177 l 14.64204,-0.0626"
+ id="path101"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 59.6434,221.04312 -13.61033,17.22693 c -1.27276,1.55936 -4.25042,3.46551 -4.25042,0.10231 l -0.0296,-17.32924"
+ id="path102"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 59.534207,102.82068 102.79812,159.4652"
+ id="path103" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 65.25829,82.037628 95.62026,0.157353"
+ id="path104" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 167.9298,106.3948 -0.22789,131.15116"
+ id="path105" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 144.5165,244.75896 46.805929,244.48998"
+ id="path106" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 41.590227,221.17125 42.120944,85.714921"
+ id="path107" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 150.2115,106.50125 -42.36175,54.51889"
+ id="path108" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 149.96836,223.96126 108.14663,168.54139"
+ id="path109" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2, 0.499999;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 59.55657,220.94801 42.9072,-55.37207"
+ id="path110" />
+ <path
+ style="fill:#000000;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 93.607981,180.73548 61.721814,222.1469"
+ id="path111" />
+ <path
+ style="fill:#000000;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 65.507369,242.65185 108.123301,0.002"
+ id="path112"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+ d="m 164.20951,236.90008 c 0.23258,2.12957 0.471,4.20578 9.3948,4.14642"
+ id="path113"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#000000;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 165.0354,220.91933 165.84181,91.61818"
+ id="path114" />
+ <path
+ style="fill:#000000;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 144.0987,85.038736 50.647811,84.781905"
+ id="path115" />
+ <path
+ style="fill:#000000;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 59.394825,106.21651 91.70422,148.78084"
+ id="path116" />
+ <path
+ style="fill:#000000;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 118.81626,179.50248 31.80297,41.2719"
+ id="path117" />
+ <path
+ style="fill:#000000;stroke:#003399;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 116.46886,146.6125 31.54769,-40.88381"
+ id="path118" />
+ <path
+ style="fill:#000000;stroke:#cc0000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 44.696496,105.77959 44.145109,237.16614"
+ id="path119" />
+ <g
+ id="g124"
+ transform="translate(1.6052485,-0.26406657)">
+ <g
+ id="g122"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="path122"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="text121"
+ aria-label="-" />
+ </g>
+ <g
+ id="g123"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="path122-7"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="text122"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g127"
+ transform="rotate(180,104.19738,164.00238)">
+ <g
+ id="g125"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle124"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path124"
+ aria-label="-" />
+ </g>
+ <g
+ id="g126"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle125"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path125"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g130"
+ transform="rotate(-90,113.30534,153.66026)">
+ <g
+ id="g128"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle127"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path127"
+ aria-label="-" />
+ </g>
+ <g
+ id="g129"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle128"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path128"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g133"
+ transform="rotate(90,95.1393,155.3154)">
+ <g
+ id="g131"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle130"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path130"
+ aria-label="-" />
+ </g>
+ <g
+ id="g132"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle131"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path131"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g136"
+ transform="rotate(128.95565,104.92298,113.90847)">
+ <g
+ id="g134"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle133"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path133"
+ aria-label="-" />
+ </g>
+ <g
+ id="g135"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle134"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path134"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g139"
+ transform="rotate(-51.04435,209.01573,163.40954)">
+ <g
+ id="g137"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle136"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path136"
+ aria-label="-" />
+ </g>
+ <g
+ id="g138"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle137"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path137"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g142"
+ transform="matrix(-0.62871865,-0.77763286,-0.77763286,0.62871865,210.98407,159.27794)">
+ <g
+ id="g140"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle139"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path139"
+ aria-label="-" />
+ </g>
+ <g
+ id="g141"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle140"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path140"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <g
+ id="g145"
+ transform="matrix(0.62871865,0.77763286,0.77763286,-0.62871865,-0.98407102,167.86377)">
+ <g
+ id="g143"
+ transform="translate(-67.028497,73.360492)">
+ <circle
+ style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle142"
+ cx="170.42325"
+ cy="17.602734"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:0.499999"
+ d="m 168.79936,17.890083 v -0.574698 h 3.24778 v 0.574698 z"
+ id="path142"
+ aria-label="-" />
+ </g>
+ <g
+ id="g144"
+ transform="translate(-67.045388,52.930473)">
+ <circle
+ style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle143"
+ cx="170.44014"
+ cy="23.846945"
+ r="2.7543051" />
+ <path
+ style="font-size:18.6667px;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';white-space:pre;stroke-width:1.23032"
+ d="m 642.18342,59.097156 h 3.71467 v 1.325336 h -3.71467 v 3.84534 h -1.34401 v -3.84534 h -3.71467 v -1.325336 h 3.71467 v -3.864007 h 1.34401 z"
+ id="path143"
+ transform="matrix(0.40639743,0,0,0.40639743,-90.268453,-0.43550093)"
+ aria-label="+" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ transform="matrix(0,0.26458333,-0.26458333,0,111.28117,42.082293)"
+ id="text146"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect146);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="122.64453"
+ y="288.88945"
+ id="tspan48">&quot;Rev R07&quot;</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0,-0.26458333,0.26458333,0,97.364963,269.73658)"
+ id="text147"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect147);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="122.64453"
+ y="288.88945"
+ id="tspan49">&quot;Rev R07&quot;</tspan></text>
+ <path
+ style="opacity:1;vector-effect:none;fill:#99cc33;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ d="m 178.32426,238.73866 h -5.86347 v 7.49566 h 5.88103"
+ id="path147" />
+ <path
+ style="opacity:1;vector-effect:none;fill:#669900;fill-opacity:1;stroke:none;stroke-width:0.499997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ d="m 173.82393,238.73866 h -1.36314 v 7.49566 h 1.36722"
+ id="path148" />
+ <circle
+ style="opacity:1;vector-effect:none;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="path149"
+ cx="176.21227"
+ cy="240.83934"
+ r="1.4043393" />
+ <circle
+ style="opacity:1;vector-effect:none;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ id="circle149"
+ cx="176.21227"
+ cy="244.13365"
+ r="1.4043393" />
+ <path
+ style="opacity:1;vector-effect:none;fill:#6699ff;fill-opacity:1;stroke:#99cc33;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ d="m 174.89416,242.15745 2.63621,-2.63621"
+ id="path150" />
+ <path
+ style="opacity:1;vector-effect:none;fill:#6699ff;fill-opacity:1;stroke:#99cc33;stroke-width:0.499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
+ d="m 174.89416,245.45176 2.63621,-2.63621"
+ id="path151" />
+ <g
+ id="g153"
+ transform="translate(2.2911975,0.01169304)">
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,64.611134,73.935145)"
+ id="text151"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect151);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="122.64453"
+ y="288.88945"
+ id="tspan50">&quot; Up &quot;</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,-3.1682789,7.288201)"
+ id="text152"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect152);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="406.95898"
+ y="540.00273"
+ id="tspan51">↑</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,-9.7156972,7.288201)"
+ id="text153"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect153);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="406.95898"
+ y="540.00273"
+ id="tspan52">↑</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ transform="matrix(0,0.26458333,-0.26458333,0,111.28117,199.04532)"
+ id="text154"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect154);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="122.64453"
+ y="288.88945"
+ id="tspan53">&quot;[URL]&quot;</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0,-0.26458333,0.26458333,0,98.157857,128.40939)"
+ id="text155"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';text-align:start;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect155);display:inline;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"><tspan
+ x="122.64453"
+ y="288.88945"
+ id="tspan54">&quot;[URL]&quot;</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-139.22402,-87.888875)"
+ id="text23"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect27);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1188.3551"
+ y="514.88774"
+ id="tspan55">0 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-139.22402,-83.102724)"
+ id="text25"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect28);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1188.3551"
+ y="514.88774"
+ id="tspan56">0 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-139.34622,-78.316574)"
+ id="text27"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect29);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1188.828"
+ y="514.88774"
+ id="tspan57">6 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-53.953504,-95.399382)"
+ id="text30"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect30);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"><tspan
+ x="841.44554"
+ y="514.88774"
+ id="tspan59"><tspan
+ style="font-weight:bold"
+ id="tspan58">Cut patterns</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-129.97783,-87.888875)"
+ id="text31"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect34);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1191.3999"
+ y="514.88774"
+ id="tspan60">1 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-129.97783,-83.102724)"
+ id="text33"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect35);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1189.2014"
+ y="514.88774"
+ id="tspan61">3 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-130.10003,-78.316574)"
+ id="text34"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect36);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1188.3551"
+ y="514.88774"
+ id="tspan62">0 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-120.73164,-87.888875)"
+ id="text36"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect39);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1189.2014"
+ y="514.88774"
+ id="tspan63">3 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-120.73164,-83.102724)"
+ id="text38"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect40);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1191.3999"
+ y="514.88774"
+ id="tspan64">1 x</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.24548338,0,0,0.24548338,-120.85384,-78.316574)"
+ id="text39"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect41);display:inline;fill:#000000;stroke:none;stroke-width:46.0317;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="-143.86632"
+ y="0"><tspan
+ x="1191.3999"
+ y="514.88774"
+ id="tspan65">1 x</tspan></text>
+ </g>
+</svg>
diff --git a/8seg_strand_power_distribution.svg b/8seg_strand_power_distribution.svg
new file mode 100644
index 0000000..abbbb7e
--- /dev/null
+++ b/8seg_strand_power_distribution.svg
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="8seg_strand_power_distribution.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ inkscape:zoom="3.3756135"
+ inkscape:cx="542.71616"
+ inkscape:cy="393.26184"
+ inkscape:window-width="3840"
+ inkscape:window-height="2091"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs1">
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="342.47363"
+ height="107.58745"
+ id="rect76" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="209.77623"
+ height="56.109158"
+ id="rect65" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect45" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect46" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect47" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect48" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect49" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect50" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect51" />
+ <rect
+ x="213.55869"
+ y="338.95828"
+ width="92.228409"
+ height="107.67358"
+ id="rect52" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="307.93604"
+ height="31.362564"
+ id="rect66" />
+ <rect
+ x="159.17676"
+ y="268.1709"
+ width="449.28024"
+ height="31.606376"
+ id="rect67" />
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="436.93361"
+ height="105.38921"
+ id="rect77" />
+ <rect
+ x="365.72055"
+ y="199.51234"
+ width="568.39698"
+ height="105.62805"
+ id="rect78" />
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g97"
+ transform="matrix(0.99867976,0,0,0.80998993,88.198567,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7288-9"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7290-2"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7292-0"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g3"
+ transform="matrix(0.99867976,0,0,0.80998993,102.19874,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path1"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g6"
+ transform="matrix(0.99867976,0,0,0.80998993,116.19874,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g9"
+ transform="matrix(0.99867976,0,0,0.80998993,130.19891,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path8"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path9"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12"
+ transform="matrix(0.99867976,0,0,0.80998993,144.19874,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path10"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path12"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g15"
+ transform="matrix(0.99867976,0,0,0.80998993,158.19891,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path13"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path15"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g18"
+ transform="matrix(0.99867976,0,0,0.80998993,172.19891,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path16"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path17"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path18"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g21"
+ transform="matrix(0.99867976,0,0,0.80998993,186.19908,0.32484439)"
+ style="stroke:#cc0000;stroke-width:1.11186">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path19"
+ d="m 40.760409,104.53616 v 15.71634 h 9.742942 v -15.71634 z"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path20"
+ d="m 40.760409,104.53616 9.742942,15.71634"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path21"
+ d="M 50.503351,104.53616 40.760409,120.2525"
+ style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:0.300112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,-19.531248,-75.07778)"
+ id="text45"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect45);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="298.94265"
+ y="355.42094"
+ id="tspan2"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan1">1</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,-4.8796409,-75.07778)"
+ id="text46"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect46);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="296.63626"
+ y="355.42094"
+ id="tspan4"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan3">2</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,9.2213001,-75.07778)"
+ id="text47"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect47);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="296.74414"
+ y="355.42094"
+ id="tspan6"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan5">3</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,23.257104,-75.07778)"
+ id="text48"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect48);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="296.31273"
+ y="355.42094"
+ id="tspan8"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan7">4</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,37.086934,-75.07778)"
+ id="text49"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect49);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="297.19215"
+ y="355.42094"
+ id="tspan10"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan9">5</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,51.200505,-75.07778)"
+ id="text50"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect50);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="296.3708"
+ y="355.42094"
+ id="tspan12"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan11">6</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,64.786539,-75.07778)"
+ id="text51"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect51);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="297.2917"
+ y="355.42094"
+ id="tspan14"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan13">7</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.50666058,0,0,0.50666058,79.330959,-75.07778)"
+ id="text52"
+ style="font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display, Normal';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect52);display:inline;fill:#000000;stroke-width:0.592113;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="295.94769"
+ y="355.42094"
+ id="tspan16"><tspan
+ style="-inkscape-font-specification:'Sitka Display'"
+ id="tspan15">8</tspan></tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 140.75158,80.570218 h 12.4892"
+ id="path52"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 138.37356,82.867536 h 2.07802"
+ id="path56"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 140.60158,77.580565 h 27.24371"
+ id="path63"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 169.32363,77.580565 h 26.1367"
+ id="path64"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 196.93867,77.580565 h 26.1367"
+ id="path65"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,27.983625,10.314591)"
+ id="text65"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect65);display:inline;fill:none;stroke:#000000;stroke-width:1.13386;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="326.29349"
+ y="284.63383"
+ id="tspan18"><tspan
+ style="fill:#000000;stroke:none"
+ id="tspan17">0.2 m</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,2.0120841,5.8582719)"
+ id="text66"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect66);display:inline;fill:none;stroke:#000000;stroke-width:1.13386;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="279.80754"
+ y="284.63383"
+ id="tspan20"><tspan
+ style="fill:#000000;stroke:none"
+ id="tspan19">0.4 + 1.0 + 0.3 m = 1.7 m</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,-35.385118,1.404148)"
+ id="text67"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect67);display:inline;fill:none;stroke:#000000;stroke-width:1.13386;stroke-linecap:round;stroke-linejoin:round"><tspan
+ x="247.66717"
+ y="284.63383"
+ id="tspan22"><tspan
+ style="fill:#000000;stroke:none"
+ id="tspan21">0.4 + 1.0 + 0.4 + 1.0 + 0.1 + 0.2 + 0.2 m = 3.3 m</tspan></tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 168.77046,80.570218 h 12.4892"
+ id="path67"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 166.39244,82.867536 h 2.07802"
+ id="path68"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 196.52763,80.570218 h 12.4892"
+ id="path69"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 194.14961,82.867536 h 2.07802"
+ id="path70"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 223.72646,80.570218 h 12.4892"
+ id="path71"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round"
+ d="m 221.34844,82.867536 h 2.07802"
+ id="path72"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#000000;stroke:#808080;stroke-width:0.15;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 140.45158,73.993385 V 88.513586"
+ id="path73" />
+ <path
+ style="fill:#000000;stroke:#808080;stroke-width:0.15;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 168.714,73.993385 V 88.513586"
+ id="path74" />
+ <path
+ style="fill:#000000;stroke:#808080;stroke-width:0.15;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 196.30263,73.993385 V 88.513586"
+ id="path75" />
+ <path
+ style="fill:#000000;stroke:#808080;stroke-width:0.15;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 223.71141,73.993385 V 88.513586"
+ id="path76" />
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,23.84675,-15.672795)"
+ id="text76"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect76);display:inline;fill:#000000;stroke:none;stroke-width:0.566929;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"><tspan
+ x="472.27943"
+ y="215.97367"
+ id="tspan23">Splitter &quot;A&quot; side is cable red side</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,-1.1460406,-9.3386453)"
+ id="text77"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect77);display:inline;fill:#000000;stroke:none;stroke-width:0.566929;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"><tspan
+ x="366.318"
+ y="215.97367"
+ id="tspan24">Left (short) stub: Terminal block right side is cable red side</tspan></text>
+ <text
+ xml:space="preserve"
+ transform="matrix(0.26458333,0,0,0.26458333,-35.928931,-3.0044956)"
+ id="text78"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.6667px;line-height:normal;font-family:'Sitka Display';-inkscape-font-specification:'Sitka Display';text-align:end;text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect78);display:inline;fill:#000000;stroke:none;stroke-width:0.566929;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"><tspan
+ x="505.71223"
+ y="215.97367"
+ id="tspan25">Right (long) stub: Terminal block left side is cable red side</tspan></text>
+ </g>
+</svg>
diff --git a/center_fw/src/main.c b/center_fw/src/main.c
index c066297..8c91607 100644
--- a/center_fw/src/main.c
+++ b/center_fw/src/main.c
@@ -209,7 +209,7 @@ void ADC1_IRQHandler(void) {
/* Read sample and apply threshold */
int sample = ADC1->DR; /* resets the EOC interrupt flag */
- int bit = sample > THRESHOLD_ADC_COUNTS;
+ int bit = sample < THRESHOLD_ADC_COUNTS;
int bit_margin = ((int)sample) - THRESHOLD_ADC_COUNTS;
if (bit_margin < 0) {
bit_margin = -bit_margin;
diff --git a/led_tape.svg b/led_tape.svg
index 6999959..3d7796f 100644
--- a/led_tape.svg
+++ b/led_tape.svg
@@ -2,21 +2,21 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
width="5mm"
height="2.5mm"
viewBox="0 0 18.897638 9.4488189"
sodipodi:docname="led_tape.svg"
- inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata8">
<rdf:RDF>
@@ -25,7 +25,6 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@@ -40,15 +39,15 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1030"
+ inkscape:window-width="3208"
+ inkscape:window-height="1981"
id="namedview4"
showgrid="false"
- inkscape:zoom="0.99999999"
- inkscape:cx="119.84761"
- inkscape:cy="40.617263"
- inkscape:window-x="0"
- inkscape:window-y="50"
+ inkscape:zoom="0.12102105"
+ inkscape:cx="-1222.9277"
+ inkscape:cy="-1739.3668"
+ inkscape:window-x="26"
+ inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="svg2"
inkscape:measure-start="288.323,-37.2999"
@@ -59,27 +58,30 @@
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-units="mm"
- inkscape:snap-global="false" />
+ inkscape:snap-global="false"
+ inkscape:showpageshadow="2"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1" />
<g
id="g7297-4"
- transform="matrix(1.3935337,0,0,1.5391961,-1554.0801,276.53669)"
- style="stroke-width:20.64532852;stroke-miterlimit:4;stroke-dasharray:none;fill:none;stroke:#bfbfbf">
+ transform="matrix(1.5310128,0,0,1.6910455,-1737.4329,315.54284)"
+ style="fill:none;stroke:#bfbfbf;stroke-width:20.6453;stroke-miterlimit:4;stroke-dasharray:none">
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path7288-9"
d="M 1344,-246.55117 V 2697.4487 H 3791.9999 V -246.55117 Z"
- style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.6453276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.6453;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path7290-2"
d="M 1344,-246.55117 3791.9999,2697.4487"
- style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.64532852;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.6453;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path7292-0"
d="M 3791.9999,-246.55117 1344,2697.4487"
- style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.64532852;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:20.6453;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
inkscape:connector-curvature="0"
diff --git a/len_map.py b/len_map.py
new file mode 100644
index 0000000..89642ba
--- /dev/null
+++ b/len_map.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python3
+
+# This script calculates the optimal cut distribution to reduce waste while matching the desired 2:2:4 segment count
+# It applies brute force since the problem space is very small.
+
+import numpy as np
+import itertools
+
+l_tot = 500
+
+a, b, c = 94, 124, 80
+n, m, l = 2, 2, 4
+arr = np.array([a, b, c], dtype=int)
+arr_count = np.array([n, m, l], dtype=int)
+
+# Find all possible splits of a [l_tot] m led tape into segments of lengths [a], [b] and [c] that leave a remainder
+# that's smaller than any of [a], [b] and [c].
+candidates = []
+for i in range(l_tot//a + 1):
+ l_rem_i = l_tot - i*a
+ if l_rem_i < 0:
+ continue
+
+ for j in range(l_rem_i//b + 1):
+ l_rem_j = l_rem_i - j*b
+ if l_rem_j < 0:
+ continue
+
+ k = l_rem_j // c
+ l_rem_k = l_rem_j - k*c
+
+ print(f'Candidate: ({i} {j} {k}) {i=}*{a} {j=}*{b=} {k=}*{c=} => remainder {l_rem_k}')
+ candidates.append((i, j, k))
+candidates = np.array(candidates, dtype=int)
+print()
+
+# Find all ways to combine the cuts found above to cut [num_rolls] into segments, where the amount of segments of length
+# [a], [b], and [c] that we get in total best matches the proportions we need ([n] times [a], [m] times [b], [l] times
+# [c], so 2:2:4 times for 94:124:80 cm)
+num_rolls = 3
+indices_seen = set()
+out = []
+for indices in itertools.product(candidates, repeat=num_rolls):
+ indices = np.array(indices)
+ index_tup = tuple(sorted(map(tuple, indices)))
+ if index_tup in indices_seen:
+ continue
+ indices_seen.add(index_tup)
+ rem = l_tot - (indices * arr).sum(axis=1)
+ rem_total = rem.sum()
+ count_total = indices.sum(axis=0).astype(float)
+ count_total /= arr_count
+ spread = count_total.max() - count_total.min()
+
+ if spread > 2 or (rem < 2).any():
+ continue
+ print(indices.tolist(), f'{rem_total=} {spread=}')
+ out.append((spread, rem_total, indices.tolist(), rem.tolist(), indices.sum(axis=0).tolist()))
+print()
+
+# Print out the n best matches found. Sort first by how close we match our target 2:2:4 ratio, then by how much waste
+# we leave.
+print('Best matches:')
+for spread, rem_total, indices, rem, index_sum in sorted(out, key=lambda x: (x[0], x[1]))[:25]:
+ print(indices, f'{spread=} {rem_total=} {rem=} {index_sum=}')
+
+# Here's the output for future reference. There are a number of combinations that produce 68 cm of waste split across
+# three 5m rolls of tape. We selected # 1 since it leaves leftovers of useful lengths.
+#
+# Best matches:
+# [[0, 0, 6], [0, 4, 0], [4, 0, 1]] spread=0.25 rem_total=68 rem=[20, 4, 44] index_sum=[4, 4, 7]
+# [[0, 0, 6], [1, 3, 0], [3, 1, 1]] spread=0.25 rem_total=68 rem=[20, 34, 14] index_sum=[4, 4, 7]
+# [[0, 2, 3], [0, 2, 3], [4, 0, 1]] spread=0.25 rem_total=68 rem=[12, 12, 44] index_sum=[4, 4, 7]
+# [[0, 2, 3], [1, 1, 3], [3, 1, 1]] spread=0.25 rem_total=68 rem=[12, 42, 14] index_sum=[4, 4, 7]
+# [[0, 2, 3], [2, 1, 2], [2, 1, 2]] spread=0.25 rem_total=68 rem=[12, 28, 28] index_sum=[4, 4, 7]
+# [[0, 3, 1], [1, 0, 5], [3, 1, 1]] spread=0.25 rem_total=68 rem=[48, 6, 14] index_sum=[4, 4, 7]
+# [[0, 4, 0], [1, 0, 5], [3, 0, 2]] spread=0.25 rem_total=68 rem=[4, 6, 58] index_sum=[4, 4, 7]
+# [[1, 0, 5], [1, 3, 0], [2, 1, 2]] spread=0.25 rem_total=68 rem=[6, 34, 28] index_sum=[4, 4, 7]
+# [[0, 0, 6], [0, 3, 1], [3, 1, 1]] spread=0.5 rem_total=82 rem=[20, 48, 14] index_sum=[3, 4, 8]
+# [[0, 0, 6], [0, 4, 0], [3, 0, 2]] spread=0.5 rem_total=82 rem=[20, 4, 58] index_sum=[3, 4, 8]
+# [[0, 0, 6], [1, 3, 0], [2, 1, 2]] spread=0.5 rem_total=82 rem=[20, 34, 28] index_sum=[3, 4, 8]
+# [[0, 1, 4], [0, 2, 3], [3, 1, 1]] spread=0.5 rem_total=82 rem=[56, 12, 14] index_sum=[3, 4, 8]
+# [[0, 2, 3], [0, 2, 3], [3, 0, 2]] spread=0.5 rem_total=82 rem=[12, 12, 58] index_sum=[3, 4, 8]
+# [[0, 2, 3], [1, 0, 5], [2, 2, 0]] spread=0.5 rem_total=82 rem=[12, 6, 64] index_sum=[3, 4, 8]
+# [[0, 2, 3], [1, 1, 3], [2, 1, 2]] spread=0.5 rem_total=82 rem=[12, 42, 28] index_sum=[3, 4, 8]
+# [[0, 3, 1], [1, 0, 5], [2, 1, 2]] spread=0.5 rem_total=82 rem=[48, 6, 28] index_sum=[3, 4, 8]
+# [[0, 4, 0], [1, 0, 5], [2, 0, 3]] spread=0.5 rem_total=82 rem=[4, 6, 72] index_sum=[3, 4, 8]
+# [[1, 0, 5], [1, 1, 3], [1, 3, 0]] spread=0.5 rem_total=82 rem=[6, 42, 34] index_sum=[3, 4, 8]
+# [[0, 0, 6], [0, 3, 1], [4, 0, 1]] spread=0.5 rem_total=112 rem=[20, 48, 44] index_sum=[4, 3, 8]
+# [[0, 0, 6], [1, 2, 1], [3, 1, 1]] spread=0.5 rem_total=112 rem=[20, 78, 14] index_sum=[4, 3, 8]
+# [[0, 0, 6], [1, 3, 0], [3, 0, 2]] spread=0.5 rem_total=112 rem=[20, 34, 58] index_sum=[4, 3, 8]
+# [[0, 0, 6], [2, 1, 2], [2, 2, 0]] spread=0.5 rem_total=112 rem=[20, 28, 64] index_sum=[4, 3, 8]
+# [[0, 1, 4], [0, 2, 3], [4, 0, 1]] spread=0.5 rem_total=112 rem=[56, 12, 44] index_sum=[4, 3, 8]
+# [[0, 1, 4], [1, 1, 3], [3, 1, 1]] spread=0.5 rem_total=112 rem=[56, 42, 14] index_sum=[4, 3, 8]
+# [[0, 1, 4], [2, 1, 2], [2, 1, 2]] spread=0.5 rem_total=112 rem=[56, 28, 28] index_sum=[4, 3, 8]
+