]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
docs: move many specification-like documents into specifications/
authorBrian Warner <warner@lothar.com>
Sun, 22 Feb 2009 06:40:54 +0000 (23:40 -0700)
committerBrian Warner <warner@lothar.com>
Sun, 22 Feb 2009 06:40:54 +0000 (23:40 -0700)
28 files changed:
docs/CHK-hashes.svg [deleted file]
docs/Makefile
docs/URI-extension.txt [deleted file]
docs/dirnodes.txt [deleted file]
docs/file-encoding.txt [deleted file]
docs/file-encoding1.svg [deleted file]
docs/file-encoding2.svg [deleted file]
docs/file-encoding3.svg [deleted file]
docs/file-encoding4.svg [deleted file]
docs/file-encoding5.svg [deleted file]
docs/file-encoding6.svg [deleted file]
docs/mut.svg [deleted file]
docs/mutable.txt [deleted file]
docs/specifications/CHK-hashes.svg [new file with mode: 0644]
docs/specifications/Makefile [new file with mode: 0644]
docs/specifications/URI-extension.txt [new file with mode: 0644]
docs/specifications/dirnodes.txt [new file with mode: 0644]
docs/specifications/file-encoding.txt [new file with mode: 0644]
docs/specifications/file-encoding1.svg [new file with mode: 0644]
docs/specifications/file-encoding2.svg [new file with mode: 0644]
docs/specifications/file-encoding3.svg [new file with mode: 0644]
docs/specifications/file-encoding4.svg [new file with mode: 0644]
docs/specifications/file-encoding5.svg [new file with mode: 0644]
docs/specifications/file-encoding6.svg [new file with mode: 0644]
docs/specifications/mut.svg [new file with mode: 0644]
docs/specifications/mutable.txt [new file with mode: 0644]
docs/specifications/uri.txt [new file with mode: 0644]
docs/uri.txt [deleted file]

diff --git a/docs/CHK-hashes.svg b/docs/CHK-hashes.svg
deleted file mode 100644 (file)
index 22bd524..0000000
+++ /dev/null
@@ -1,723 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/warner/trees/tahoe/docs"
-   sodipodi:docname="chk-hashes.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;">
-      <path
-         id="path3237"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path3391"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.58344932"
-     inkscape:cx="372.04724"
-     inkscape:cy="526.18109"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="791"
-     inkscape:window-height="827"
-     inkscape:window-x="591"
-     inkscape:window-y="150" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g2168"
-       transform="translate(-8.75,0)">
-      <rect
-         y="80.555412"
-         x="53.132294"
-         height="135.40164"
-         width="197.10367"
-         id="rect2160"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text2162"
-         y="108.97614"
-         x="151.88493"
-         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="108.97614"
-           x="151.88493"
-           id="tspan2164"
-           sodipodi:role="line">data</tspan><tspan
-           id="tspan2166"
-           y="132.97614"
-           x="151.88493"
-           sodipodi:role="line">(plaintext)</tspan></text>
-    </g>
-    <g
-       id="g2190"
-       transform="translate(-0.25,0)">
-      <rect
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect2178"
-         width="197.10367"
-         height="135.40164"
-         x="44.632294"
-         y="324.55542" />
-      <text
-         xml:space="preserve"
-         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="143.38493"
-         y="352.97614"
-         id="text2180"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan2182"
-           x="143.38493"
-           y="352.97614">data</tspan><tspan
-           sodipodi:role="line"
-           x="143.38493"
-           y="376.97614"
-           id="tspan2184">(crypttext)</tspan></text>
-    </g>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2198"
-       width="197.10367"
-       height="135.40164"
-       x="44.382294"
-       y="583.55542" />
-    <text
-       xml:space="preserve"
-       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="142.68532"
-       y="611.97614"
-       id="text2200"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         x="142.68532"
-         y="611.97614"
-         id="tspan2204">shares</tspan></text>
-    <g
-       id="g3193"
-       transform="translate(-10.413708,29.158381)">
-      <path
-         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         sodipodi:ry="20.567339"
-         sodipodi:rx="20.567339"
-         sodipodi:cy="133.6877"
-         sodipodi:cx="418.20258"
-         id="path2212"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3185"
-         sodipodi:cx="418.20258"
-         sodipodi:cy="133.6877"
-         sodipodi:rx="20.567339"
-         sodipodi:ry="20.567339"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" />
-      <path
-         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         sodipodi:ry="20.567339"
-         sodipodi:rx="20.567339"
-         sodipodi:cy="133.6877"
-         sodipodi:cx="418.20258"
-         id="path3187"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         id="path3189"
-         d="M 396.76226,145.32825 L 407.17597,134.91454"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         id="path3191"
-         d="M 433.21024,147.41099 L 423.8379,134.91454"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <g
-       id="g3200"
-       transform="translate(-9.3723369,269.71503)">
-      <path
-         sodipodi:type="arc"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3202"
-         sodipodi:cx="418.20258"
-         sodipodi:cy="133.6877"
-         sodipodi:rx="20.567339"
-         sodipodi:ry="20.567339"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" />
-      <path
-         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         sodipodi:ry="20.567339"
-         sodipodi:rx="20.567339"
-         sodipodi:cy="133.6877"
-         sodipodi:cx="418.20258"
-         id="path3204"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3206"
-         sodipodi:cx="418.20258"
-         sodipodi:cy="133.6877"
-         sodipodi:rx="20.567339"
-         sodipodi:ry="20.567339"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 396.76226,145.32825 L 407.17597,134.91454"
-         id="path3208" />
-      <path
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 433.21024,147.41099 L 423.8379,134.91454"
-         id="path3210" />
-    </g>
-    <g
-       transform="translate(-6.2482246,538.38869)"
-       id="g3212">
-      <path
-         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         sodipodi:ry="20.567339"
-         sodipodi:rx="20.567339"
-         sodipodi:cy="133.6877"
-         sodipodi:cx="418.20258"
-         id="path3214"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3216"
-         sodipodi:cx="418.20258"
-         sodipodi:cy="133.6877"
-         sodipodi:rx="20.567339"
-         sodipodi:ry="20.567339"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" />
-      <path
-         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)"
-         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
-         sodipodi:ry="20.567339"
-         sodipodi:rx="20.567339"
-         sodipodi:cy="133.6877"
-         sodipodi:cx="418.20258"
-         id="path3218"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         id="path3220"
-         d="M 396.76226,145.32825 L 407.17597,134.91454"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         id="path3222"
-         d="M 433.21024,147.41099 L 423.8379,134.91454"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="399.88635"
-       y="110.96302"
-       id="text3224"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3226"
-         x="399.88635"
-         y="110.96302">plaintext</tspan><tspan
-         sodipodi:role="line"
-         x="399.88635"
-         y="130.96302"
-         id="tspan3228">hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="400.92773"
-       y="350.4783"
-       id="text3230"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3232"
-         x="400.92773"
-         y="350.4783">crypttext</tspan><tspan
-         sodipodi:role="line"
-         x="400.92773"
-         y="370.4783"
-         id="tspan3234">hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="405.09323"
-       y="618.1106"
-       id="text3236"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3238"
-         x="405.09323"
-         y="618.1106">share</tspan><tspan
-         sodipodi:role="line"
-         x="405.09323"
-         y="638.1106"
-         id="tspan3240">hash tree</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.05825377;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3242"
-       width="207.32907"
-       height="421.5722"
-       x="527.92419"
-       y="161.13995" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="536.46478"
-       y="183.39211"
-       id="text3244"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3246"
-         x="536.46478"
-         y="183.39211">URI Extension Block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="536.95264"
-       y="245.09413"
-       id="text3248"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3250"
-         x="536.95264"
-         y="245.09413">plaintext root</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="536.95264"
-       y="281.08698"
-       id="text3252"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3254"
-         x="536.95264"
-         y="281.08698">plaintext (flat) hash</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="540.59265"
-       y="435.34201"
-       id="text3256"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3258"
-         x="540.59265"
-         y="435.34201">crypttext root</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="540.59265"
-       y="483.33246"
-       id="text3260"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3262"
-         x="540.59265"
-         y="483.33246">crypttext (flat) hash</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="539.89264"
-       y="558.74603"
-       id="text3264"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3266"
-         x="539.89264"
-         y="558.74603">share root</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
-       d="M 239.95229,183.39211 L 363.35632,183.39211"
-       id="path3383" />
-    <path
-       id="path3583"
-       d="M 239.95229,425.05834 L 363.35632,425.05834"
-       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
-       d="M 239.95229,692.43375 L 363.35632,692.43375"
-       id="path3585" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 417.58968,150.5351 C 470.69959,151.57647 472.62807,183.93923 479.03055,202.60364 C 487.14356,226.25457 499.85797,233.58442 529.01635,241.13436"
-       id="path3589"
-       sodipodi:nodetypes="csz" />
-    <path
-       sodipodi:nodetypes="csz"
-       id="path3591"
-       d="M 421.75516,391.09175 C 449.87218,392.13312 454.33789,400.8898 470.69958,411.91917 C 496.5159,429.32187 494.65112,422.07253 523.8095,429.62247"
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 420.71379,662.88952 C 420.71379,662.88952 471.01868,647.53267 473.30302,607.17618 C 475.6461,565.78169 496.083,554.97747 525.89224,551.46284"
-       id="path3595"
-       sodipodi:nodetypes="czz" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 241.59802,201.56227 C 288.98039,203.12433 310.58883,210.67426 381.1417,228.63791 C 451.69457,246.60156 477.72883,273.67719 523.80949,273.41685"
-       id="path3599"
-       sodipodi:nodetypes="czz" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 243.68076,448.36714 C 296.26998,448.88782 323.60597,457.47913 393.63815,465.02907 C 463.67033,472.57901 487.62186,479.8686 523.80949,478.56689"
-       id="path3601"
-       sodipodi:nodetypes="czz" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3603"
-       width="611.87836"
-       height="109.69247"
-       x="54.846237"
-       y="807.26807" />
-    <text
-       xml:space="preserve"
-       style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="329.71826"
-       y="910.10474"
-       id="text3605"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3607"
-         x="329.71826"
-         y="910.10474">URI</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="159.39687"
-       y="841.54694"
-       id="text3609"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3611"
-         x="159.39687"
-         y="841.54694">encryption</tspan><tspan
-         sodipodi:role="line"
-         x="159.39687"
-         y="861.54694"
-         id="tspan3613">key</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="359.92844"
-       y="842.72693"
-       id="text3615"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3617"
-         x="359.92844"
-         y="842.72693">storage</tspan><tspan
-         sodipodi:role="line"
-         x="359.92844"
-         y="862.72693"
-         id="tspan3619">index</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="570.74371"
-       y="844.42694"
-       id="text3621"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3623"
-         x="570.74371"
-         y="844.42694">UEB</tspan><tspan
-         sodipodi:role="line"
-         x="570.74371"
-         y="864.42694"
-         id="tspan3625">hash</tspan></text>
-    <path
-       style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:9,9;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 267.37541,557.0321 L 315.36587,66.843852 L 740.4242,73.699632 L 740.4242,752.42182 L 418.20256,752.42182 L 416.48862,713.00109 L 356.50054,646.15724 L 310.22403,661.58274 L 190.24789,659.8688 L 191.96183,557.0321 L 267.37541,557.0321 z "
-       id="path3627"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 358.21449,824.40751 C 362.49935,783.27283 382.20972,758.84911 414.77467,740.42421"
-       id="path3629"
-       sodipodi:nodetypes="cz" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 629.01779,582.74128 C 623.87595,661.15426 575.88549,723.71325 574.17154,814.12384"
-       id="path3631"
-       sodipodi:nodetypes="cz" />
-    <g
-       id="g3434">
-      <path
-         transform="translate(1.7139449,-5.1418348)"
-         d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1  101.12275,278.51605 A 36.849815 23.138256 0 1 1  174.82238 278.51605 z"
-         sodipodi:ry="23.138256"
-         sodipodi:rx="36.849815"
-         sodipodi:cy="278.51605"
-         sodipodi:cx="137.97256"
-         id="path3635"
-         style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3637"
-         y="281.24622"
-         x="115.93739"
-         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="281.24622"
-           x="115.93739"
-           id="tspan3639"
-           sodipodi:role="line">AES</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="M 133.6877,212.52917 L 135.40165,250.23596"
-       id="path3646" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="M 138.82954,296.51247 L 138.82954,323.93559"
-       id="path3648" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 147.39926,817.55173 C 123.40403,754.13577 56.155146,767.27832 30.851008,736.99632 C 4.7133492,705.71682 5.5877376,315.58243 32.564954,281.08697 C 58.702614,247.66504 65.129907,260.94812 101.12275,272.51724"
-       id="path3650"
-       sodipodi:nodetypes="czzz" />
-    <g
-       id="g3426">
-      <path
-         transform="translate(-1.7139449,243.38018)"
-         sodipodi:type="arc"
-         style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3219"
-         sodipodi:cx="137.97256"
-         sodipodi:cy="278.51605"
-         sodipodi:rx="36.849815"
-         sodipodi:ry="23.138256"
-         d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1  101.12275,278.51605 A 36.849815 23.138256 0 1 1  174.82238 278.51605 z" />
-      <text
-         xml:space="preserve"
-         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="112.5095"
-         y="529.76825"
-         id="text3221"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan3223"
-           x="112.5095"
-           y="529.76825">FEC</tspan></text>
-    </g>
-    <path
-       id="path3445"
-       d="M 195.38972,855.25852 L 318.79375,855.25852"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       id="path3447"
-       d="M 133.68771,457.62329 L 133.68771,498.75797"
-       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 133.68771,546.74843 L 133.68771,582.74127"
-       id="path3449"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path3451"
-       d="M 99.408806,943.93737 L 147.39926,943.93737"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="65.129906"
-       y="953.42938"
-       id="text3453"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3455"
-         x="65.129906"
-         y="953.42938">A</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="164.53871"
-       y="952.95337"
-       id="text3457"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         x="164.53871"
-         y="952.95337"
-         id="tspan3461">B :</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="217.67101"
-       y="952.95337"
-       id="text3465"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3467"
-         x="217.67101"
-         y="952.95337">B is derived from A by hashing, therefore B validates A</tspan></text>
-    <path
-       sodipodi:nodetypes="cc"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a10101;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 99.408806,969.64654 L 147.39926,969.64654"
-       id="path3469" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3471"
-       y="979.13855"
-       x="65.129906"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="979.13855"
-         x="65.129906"
-         id="tspan3473"
-         sodipodi:role="line">A</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3475"
-       y="978.66254"
-       x="164.53871"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         id="tspan3477"
-         y="978.66254"
-         x="164.53871"
-         sodipodi:role="line">B :</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3479"
-       y="978.66254"
-       x="217.67101"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="978.66254"
-         x="217.67101"
-         id="tspan3481"
-         sodipodi:role="line">B is derived from A by encryption or erasure coding</tspan></text>
-    <path
-       id="path3483"
-       d="M 99.408806,997.06966 L 147.39926,997.06966"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="65.129906"
-       y="1006.5616"
-       id="text3485"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3487"
-         x="65.129906"
-         y="1006.5616">A</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="164.53871"
-       y="1006.0856"
-       id="text3489"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         x="164.53871"
-         y="1006.0856"
-         id="tspan3491">B :</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="217.67101"
-       y="1006.0856"
-       id="text3493"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3495"
-         x="217.67101"
-         y="1006.0856">A is used as an index to retrieve data B</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#1bcc03;fill-opacity:1;stroke:#1bcc03;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="625.5899"
-       y="740.42419"
-       id="text3497"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3499"
-         x="625.5899"
-         y="740.42419">SHARE</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="249.20799"
-       y="30.851007"
-       id="text3501"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3503"
-         x="249.20799"
-         y="30.851007">CHK File Hashes</tspan></text>
-  </g>
-</svg>
index 04db86d8621d56e7aa2be476bf27dd95db6f1bcc..490072177f6c62baa47a3a82726cc8e26e55a32e 100644 (file)
@@ -1,7 +1,5 @@
 
-SOURCES = CHK-hashes.svg file-encoding1.svg file-encoding2.svg \
-       file-encoding3.svg file-encoding4.svg file-encoding5.svg \
-       file-encoding6.svg subtree1.svg lease-tradeoffs.svg
+SOURCES = subtree1.svg lease-tradeoffs.svg
 
 PNGS = $(patsubst %.svg,%.png,$(SOURCES))
 EPSS = $(patsubst %.svg,%.eps,$(SOURCES))
diff --git a/docs/URI-extension.txt b/docs/URI-extension.txt
deleted file mode 100644 (file)
index 8ec383e..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-
-"URI Extension Block"
-
-This block is a serialized dictionary with string keys and string values
-(some of which represent numbers, some of which are SHA-256 hashes). All
-buckets hold an identical copy. The hash of the serialized data is kept in
-the URI.
-
-The download process must obtain a valid copy of this data before any
-decoding can take place. The download process must also obtain other data
-before incremental validation can be performed. Full-file validation (for
-clients who do not wish to do incremental validation) can be performed solely
-with the data from this block.
-
-At the moment, this data block contains the following keys (and an estimate
-on their sizes):
-
- size                5
- segment_size        7
- num_segments        2
- needed_shares       2
- total_shares        3
-
- codec_name          3
- codec_params        5+1+2+1+3=12
- tail_codec_params   12
-
- share_root_hash     32 (binary) or 52 (base32-encoded) each
- plaintext_hash
- plaintext_root_hash
- crypttext_hash
- crypttext_root_hash
-
-Some pieces are needed elsewhere (size should be visible without pulling the
-block, the Tahoe3 algorithm needs total_shares to find the right peers, all
-peer selection algorithms need needed_shares to ask a minimal set of peers).
-Some pieces are arguably redundant but are convenient to have present
-(test_encode.py makes use of num_segments).
-
-The rule for this data block is that it should be a constant size for all
-files, regardless of file size. Therefore hash trees (which have a size that
-depends linearly upon the number of segments) are stored elsewhere in the
-bucket, with only the hash tree root stored in this data block.
-
-This block will be serialized as follows:
-
- assert that all keys match ^[a-zA-z_\-]+$
- sort all the keys lexicographically
- for k in keys:
-  write("%s:" % k)
-  write(netstring(data[k]))
-
-
-Serialized size:
-
- dense binary (but decimal) packing: 160+46=206
- including 'key:' (185) and netstring (6*3+7*4=46) on values: 231
- including 'key:%d\n' (185+13=198) and printable values (46+5*52=306)=504
-
-We'll go with the 231-sized block, and provide a tool to dump it as text if
-we really want one.
diff --git a/docs/dirnodes.txt b/docs/dirnodes.txt
deleted file mode 100644 (file)
index adc8fca..0000000
+++ /dev/null
@@ -1,433 +0,0 @@
-
-= Tahoe Directory Nodes =
-
-As explained in the architecture docs, Tahoe can be roughly viewed as a
-collection of three layers. The lowest layer is the distributed filestore, or
-DHT: it provides operations that accept files and upload them to the mesh,
-creating a URI in the process which securely references the file's contents.
-The middle layer is the filesystem, creating a structure of directories and
-filenames resembling the traditional unix/windows filesystems. The top layer
-is the application layer, which uses the lower layers to provide useful
-services to users, like a backup application, or a way to share files with
-friends.
-
-This document examines the middle layer, the "filesystem".
-
-== DHT Primitives ==
-
-In the lowest layer (DHT), there are two operations that reference immutable
-data (which we refer to as "CHK URIs" or "CHK read-capabilities" or "CHK
-read-caps"). One puts data into the grid (but only if it doesn't exist
-already), the other retrieves it:
-
- chk_uri = put(data)
- data = get(chk_uri)
-
-We also have three operations which reference mutable data (which we refer to
-as "mutable slots", or "mutable write-caps and read-caps", or sometimes "SSK
-slots"). One creates a slot with some initial contents, a second replaces the
-contents of a pre-existing slot, and the third retrieves the contents:
-
- mutable_uri = create(initial_data)
- replace(mutable_uri, new_data)
- data = get(mutable_uri)
-
-== Filesystem Goals ==
-
-The main goal for the middle (filesystem) layer is to give users a way to
-organize the data that they have uploaded into the mesh. The traditional way
-to do this in computer filesystems is to put this data into files, give those
-files names, and collect these names into directories.
-
-Each directory is a series of name-value pairs, which maps "child name" to an
-object of some kind. Those child objects might be files, or they might be
-other directories.
-
-The directory structure is therefore a directed graph of nodes, in which each
-node might be a directory node or a file node. All file nodes are terminal
-nodes.
-
-== Dirnode Goals ==
-
-What properties might be desirable for these directory nodes? In no
-particular order:
-
- 1: functional. Code which does not work doesn't count.
- 2: easy to document, explain, and understand
- 3: confidential: it should not be possible for others to see the contents of
-                  a directory
- 4: integrity: it should not be possible for others to modify the contents
-               of a directory
- 5: available: directories should survive host failure, just like files do
- 6: efficient: in storage, communication bandwidth, number of round-trips
- 7: easy to delegate individual directories in a flexible way
- 8: updateness: everybody looking at a directory should see the same contents
- 9: monotonicity: everybody looking at a directory should see the same
-                  sequence of updates
-
-Some of these goals are mutually exclusive. For example, availability and
-consistency are opposing, so it is not possible to achieve #5 and #8 at the
-same time. Moreover, it takes a more complex architecture to get close to the
-available-and-consistent ideal, so #2/#6 is in opposition to #5/#8.
-
-Tahoe-0.7.0 introduced distributed mutable files, which use public key
-cryptography for integrity, and erasure coding for availability. These
-achieve roughly the same properties as immutable CHK files, but their
-contents can be replaced without changing their identity. Dirnodes are then
-just a special way of interpreting the contents of a specific mutable file.
-Earlier releases used a "vdrive server": this server was abolished in the
-0.7.0 release.
-
-For details of how mutable files work, please see "mutable.txt" in this
-directory.
-
-For the current 0.7.0 release, we achieve most of our desired properties. The
-integrity and availability of dirnodes is equivalent to that of regular
-(immutable) files, with the exception that there are more simultaneous-update
-failure modes for mutable slots. Delegation is quite strong: you can give
-read-write or read-only access to any subtree, and the data format used for
-dirnodes is such that read-only access is transitive: i.e. if you grant Bob
-read-only access to a parent directory, then Bob will get read-only access
-(and *not* read-write access) to its children.
-
-Relative to the previous "vdrive-server" based scheme, the current
-distributed dirnode approach gives better availability, but cannot guarantee
-updateness quite as well, and requires far more network traffic for each
-retrieval and update. Mutable files are somewhat less available than
-immutable files, simply because of the increased number of combinations
-(shares of an immutable file are either present or not, whereas there are
-multiple versions of each mutable file, and you might have some shares of
-version 1 and other shares of version 2). In extreme cases of simultaneous
-update, mutable files might suffer from non-monotonicity.
-
-
-== Dirnode secret values ==
-
-As mentioned before, dirnodes are simply a special way to interpret the
-contents of a mutable file, so the secret keys and capability strings
-described in "mutable.txt" are all the same. Each dirnode contains an RSA
-public/private keypair, and the holder of the "write capability" will be able
-to retrieve the private key (as well as the AES encryption key used for the
-data itself). The holder of the "read capability" will be able to obtain the
-public key and the AES data key, but not the RSA private key needed to modify
-the data.
-
-The "write capability" for a dirnode grants read-write access to its
-contents. This is expressed on concrete form as the "dirnode write cap": a
-printable string which contains the necessary secrets to grant this access.
-Likewise, the "read capability" grants read-only access to a dirnode, and can
-be represented by a "dirnode read cap" string.
-
-For example,
-URI:DIR2:swdi8ge1s7qko45d3ckkyw1aac%3Aar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o
-is a write-capability URI, while
-URI:DIR2-RO:buxjqykt637u61nnmjg7s8zkny:ar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o
-is a read-capability URI, both for the same dirnode.
-
-
-== Dirnode storage format ==
-
-Each dirnode is stored in a single mutable file, distributed in the Tahoe
-grid. The contents of this file are a serialized list of netstrings, one per
-child. Each child is a list of four netstrings: (name, rocap, rwcap,
-metadata). (remember that the contents of the mutable file are encrypted by
-the read-cap, so this section describes the plaintext contents of the mutable
-file, *after* it has been decrypted by the read-cap).
-
-The name is simple a UTF-8 -encoded child name. The 'rocap' is a read-only
-capability URI to that child, either an immutable (CHK) file, a mutable file,
-or a directory. The 'rwcap' is a read-write capability URI for that child,
-encrypted with the dirnode's write-cap: this enables the "transitive
-readonlyness" property, described further below. The 'metadata' is a
-JSON-encoded dictionary of type,value metadata pairs. Some metadata keys are
-pre-defined, the rest are left up to the application.
-
-Each rwcap is stored as IV + ciphertext + MAC. The IV is a 16-byte random
-value. The ciphertext is obtained by using AES in CTR mode on the rwcap URI
-string, using a key that is formed from a tagged hash of the IV and the
-dirnode's writekey. The MAC is a 32-byte SHA-256 -based HMAC (using that same
-AES key) over the (IV+ciphertext) pair.
-
-If Bob has read-only access to the 'bar' directory, and he adds it as a child
-to the 'foo' directory, then he will put the read-only cap for 'bar' in both
-the rwcap and rocap slots (encrypting the rwcap contents as described above).
-If he has full read-write access to 'bar', then he will put the read-write
-cap in the 'rwcap' slot, and the read-only cap in the 'rocap' slot. Since
-other users who have read-only access to 'foo' will be unable to decrypt its
-rwcap slot, this limits those users to read-only access to 'bar' as well,
-thus providing the transitive readonlyness that we desire.
-
-=== Dirnode sizes, mutable-file initial read sizes ===
-
-How big are dirnodes? When reading dirnode data out of mutable files, how
-large should our initial read be? If we guess exactly, we can read a dirnode
-in a single round-trip, and update one in two RTT. If we guess too high,
-we'll waste some amount of bandwidth. If we guess low, we need to make a
-second pass to get the data (or the encrypted privkey, for writes), which
-will cost us at least another RTT.
-
-Assuming child names are between 10 and 99 characters long, how long are the
-various pieces of a dirnode?
-
- netstring(name) ~= 4+len(name)
- chk-cap = 97 (for 4-char filesizes)
- dir-rw-cap = 88
- dir-ro-cap = 91
- netstring(cap) = 4+len(cap)
- encrypted(cap) = 16+cap+32
- JSON({}) = 2
- JSON({ctime=float,mtime=float}): 57
- netstring(metadata) = 4+57 = 61
-
-so a CHK entry is:
- 5+ 4+len(name) + 4+97 + 5+16+97+32 + 4+57
-And a 15-byte filename gives a 336-byte entry. When the entry points at a
-subdirectory instead of a file, the entry is a little bit smaller. So an
-empty directory uses 0 bytes, a directory with one child uses about 336
-bytes, a directory with two children uses about 672, etc.
-
-When the dirnode data is encoding using our default 3-of-10, that means we
-get 112ish bytes of data in each share per child.
-
-The pubkey, signature, and hashes form the first 935ish bytes of the
-container, then comes our data, then about 1216 bytes of encprivkey. So if we
-read the first:
-
- 1kB: we get 65bytes of dirnode data : only empty directories
- 1kiB: 89bytes of dirnode data : maybe one short-named subdir
- 2kB: 1065bytes: about 9 entries
- 3kB: 2065bytes: about 18 entries, or 7.5 entries plus the encprivkey
- 4kB: 3065bytes: about 27 entries, or about 16.5 plus the encprivkey
-
-So we've written the code to do an initial read of 2kB from each share when
-we read the mutable file, which should give good performance (one RTT) for
-small directories.
-
-
-== Design Goals, redux ==
-
-How well does this design meet the goals?
-
- #1 functional: YES: the code works and has extensive unit tests
- #2 documentable: YES: this document is the existence proof
- #3 confidential: YES: see below
- #4 integrity: MOSTLY: a coalition of storage servers can rollback individual
-                       mutable files, but not a single one. No server can
-                       substitute fake data as genuine.
- #5 availability: YES: as long as 'k' storage servers are present and have
-                       the same version of the mutable file, the dirnode will
-                       be available.
- #6 efficient: MOSTLY:
-      network: single dirnode lookup is very efficient, since clients can
-               fetch specific keys rather than being required to get or set
-               the entire dirnode each time. Traversing many directories
-               takes a lot of roundtrips, and these can't be collapsed with
-               promise-pipelining because the intermediate values must only
-               be visible to the client. Modifying many dirnodes at once
-               (e.g. importing a large pre-existing directory tree) is pretty
-               slow, since each graph edge must be created independently.
-      storage: each child has a separate IV, which makes them larger than
-               if all children were aggregated into a single encrypted string
- #7 delegation: VERY: each dirnode is a completely independent object,
-                to which clients can be granted separate read-write or
-                read-only access
- #8 updateness: VERY: with only a single point of access, and no caching,
-                each client operation starts by fetching the current
-                value, so there are no opportunities for staleness
- #9 monotonicity: VERY: the single point of access also protects against
-                  retrograde motion
-     
-
-
-=== Confidentiality leaks in the vdrive server ===
-
-Dirnode (and the mutable files upon which they are based) are very private
-against other clients: traffic between the client and the storage servers is
-protected by the Foolscap SSL connection, so they can observe very little.
-Storage index values are hashes of secrets and thus unguessable, and they are
-not made public, so other clients cannot snoop through encrypted dirnodes
-that they have not been told about.
-
-Storage servers can observe access patterns and see ciphertext, but they
-cannot see the plaintext (of child names, metadata, or URIs). If an attacker
-operates a significant number of storage servers, they can infer the shape of
-the directory structure by assuming that directories are usually accessed
-from root to leaf in rapid succession. Since filenames are usually much
-shorter than read-caps and write-caps, the attacker can use the length of the
-ciphertext to guess the number of children of each node, and might be able to
-guess the length of the child names (or at least their sum). From this, the
-attacker may be able to build up a graph with the same shape as the plaintext
-filesystem, but with unlabeled edges and unknown file contents.
-
-
-=== Integrity failures in the vdrive server ===
-
-The mutable file's integrity mechanism (RSA signature on the hash of the file
-contents) prevents the storage server from modifying the dirnode's contents
-without detection. Therefore the storage servers can make the dirnode
-unavailable, but not corrupt it.
-
-A sufficient number of colluding storage servers can perform a rollback
-attack: replace all shares of the whole mutable file with an earlier version.
-TODO: To prevent this, when retrieving the contents of a mutable file, the
-client should query more servers than necessary and use the highest available
-version number. This insures that one or two misbehaving storage servers
-cannot cause this rollback on their own.
-
-
-=== Improving the efficiency of dirnodes ===
-
-The current mutable-file -based dirnode scheme suffers from certain
-inefficiencies. A very large directory (with thousands or millions of
-children) will take a significant time to extract any single entry, because
-the whole file must be downloaded first, then parsed and searched to find the
-desired child entry. Likewise, modifying a single child will require the
-whole file to be re-uploaded.
-
-The current design assumes (and in some cases, requires) that dirnodes remain
-small. The mutable files on which dirnodes are based are currently using
-"SDMF" ("Small Distributed Mutable File") design rules, which state that the
-size of the data shall remain below one megabyte. More advanced forms of
-mutable files (MDMF and LDMF) are in the design phase to allow efficient
-manipulation of larger mutable files. This would reduce the work needed to
-modify a single entry in a large directory.
-
-Judicious caching may help improve the reading-large-directory case. Some
-form of mutable index at the beginning of the dirnode might help as well. The
-MDMF design rules allow for efficient random-access reads from the middle of
-the file, which would give the index something useful to point at.
-
-The current SDMF design generates a new RSA public/private keypair for each
-directory. This takes considerable time and CPU effort, generally one or two
-seconds per directory. We have designed (but not yet built) a DSA-based
-mutable file scheme which will use shared parameters to reduce the
-directory-creation effort to a bare minimum (picking a random number instead
-of generating two random primes).
-
-
-When a backup program is run for the first time, it needs to copy a large
-amount of data from a pre-existing filesystem into reliable storage. This
-means that a large and complex directory structure needs to be duplicated in
-the dirnode layer. With the one-object-per-dirnode approach described here,
-this requires as many operations as there are edges in the imported
-filesystem graph.
-
-Another approach would be to aggregate multiple directories into a single
-storage object. This object would contain a serialized graph rather than a
-single name-to-child dictionary. Most directory operations would fetch the
-whole block of data (and presumeably cache it for a while to avoid lots of
-re-fetches), and modification operations would need to replace the whole
-thing at once. This "realm" approach would have the added benefit of
-combining more data into a single encrypted bundle (perhaps hiding the shape
-of the graph from a determined attacker), and would reduce round-trips when
-performing deep directory traversals (assuming the realm was already cached).
-It would also prevent fine-grained rollback attacks from working: a coalition
-of storage servers could change the entire realm to look like an earlier
-state, but it could not independently roll back individual directories.
-
-The drawbacks of this aggregation would be that small accesses (adding a
-single child, looking up a single child) would require pulling or pushing a
-lot of unrelated data, increasing network overhead (and necessitating
-test-and-set semantics for the modification side, which increases the chances
-that a user operation will fail, making it more challenging to provide
-promises of atomicity to the user). 
-
-It would also make it much more difficult to enable the delegation
-("sharing") of specific directories. Since each aggregate "realm" provides
-all-or-nothing access control, the act of delegating any directory from the
-middle of the realm would require the realm first be split into the upper
-piece that isn't being shared and the lower piece that is. This splitting
-would have to be done in response to what is essentially a read operation,
-which is not traditionally supposed to be a high-effort action. On the other
-hand, it may be possible to aggregate the ciphertext, but use distinct
-encryption keys for each component directory, to get the benefits of both
-schemes at once.
-
-
-=== Dirnode expiration and leases ===
-
-Dirnodes are created any time a client wishes to add a new directory. How
-long do they live? What's to keep them from sticking around forever, taking
-up space that nobody can reach any longer?
-
-Mutable files are created with limited-time "leases", which keep the shares
-alive until the last lease has expired or been cancelled. Clients which know
-and care about specific dirnodes can ask to keep them alive for a while, by
-renewing a lease on them (with a typical period of one month). Clients are
-expected to assist in the deletion of dirnodes by canceling their leases as
-soon as they are done with them. This means that when a client deletes a
-directory, it should also cancel its lease on that directory. When the lease
-count on a given share goes to zero, the storage server can delete the
-related storage. Multiple clients may all have leases on the same dirnode:
-the server may delete the shares only after all of the leases have gone away.
-
-We expect that clients will periodically create a "manifest": a list of
-so-called "refresh capabilities" for all of the dirnodes and files that they
-can reach. They will give this manifest to the "repairer", which is a service
-that keeps files (and dirnodes) alive on behalf of clients who cannot take on
-this responsibility for themselves. These refresh capabilities include the
-storage index, but do *not* include the readkeys or writekeys, so the
-repairer does not get to read the files or directories that it is helping to
-keep alive.
-
-After each change to the user's vdrive, the client creates a manifest and
-looks for differences from their previous version. Anything which was removed
-prompts the client to send out lease-cancellation messages, allowing the data
-to be deleted.
-
-
-== Starting Points: root dirnodes ==
-
-Any client can record the URI of a directory node in some external form (say,
-in a local file) and use it as the starting point of later traversal. Each
-Tahoe user is expected to create a new (unattached) dirnode when they first
-start using the grid, and record its URI for later use.
-
-== Mounting and Sharing Directories ==
-
-The biggest benefit of this dirnode approach is that sharing individual
-directories is almost trivial. Alice creates a subdirectory that she wants to
-use to share files with Bob. This subdirectory is attached to Alice's
-filesystem at "~alice/share-with-bob". She asks her filesystem for the
-read-write directory URI for that new directory, and emails it to Bob. When
-Bob receives the URI, he asks his own local vdrive to attach the given URI,
-perhaps at a place named "~bob/shared-with-alice". Every time either party
-writes a file into this directory, the other will be able to read it. If
-Alice prefers, she can give a read-only URI to Bob instead, and then Bob will
-be able to read files but not change the contents of the directory. Neither
-Alice nor Bob will get access to any files above the mounted directory: there
-are no 'parent directory' pointers. If Alice creates a nested set of
-directories, "~alice/share-with-bob/subdir2", and gives a read-only URI to
-share-with-bob to Bob, then Bob will be unable to write to either
-share-with-bob/ or subdir2/.
-
-A suitable UI needs to be created to allow users to easily perform this
-sharing action: dragging a folder their vdrive to an IM or email user icon,
-for example. The UI will need to give the sending user an opportunity to
-indicate whether they want to grant read-write or read-only access to the
-recipient. The recipient then needs an interface to drag the new folder into
-their vdrive and give it a home.
-
-== Revocation ==
-
-When Alice decides that she no longer wants Bob to be able to access the
-shared directory, what should she do? Suppose she's shared this folder with
-both Bob and Carol, and now she wants Carol to retain access to it but Bob to
-be shut out. Ideally Carol should not have to do anything: her access should
-continue unabated.
-
-The current plan is to have her client create a deep copy of the folder in
-question, delegate access to the new folder to the remaining members of the
-group (Carol), asking the lucky survivors to replace their old reference with
-the new one. Bob may still have access to the old folder, but he is now the
-only one who cares: everyone else has moved on, and he will no longer be able
-to see their new changes. In a strict sense, this is the strongest form of
-revocation that can be accomplished: there is no point trying to force Bob to
-forget about the files that he read a moment before being kicked out. In
-addition it must be noted that anyone who can access the directory can proxy
-for Bob, reading files to him and accepting changes whenever he wants.
-Preventing delegation between communication parties is just as pointless as
-asking Bob to forget previously accessed files. However, there may be value
-to configuring the UI to ask Carol to not share files with Bob, or to
-removing all files from Bob's view at the same time his access is revoked.
-
diff --git a/docs/file-encoding.txt b/docs/file-encoding.txt
deleted file mode 100644 (file)
index 23862ea..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-
-== FileEncoding ==
-
-When the client wishes to upload an immutable file, the first step is to
-decide upon an encryption key. There are two methods: convergent or random.
-The goal of the convergent-key method is to make sure that multiple uploads
-of the same file will result in only one copy on the grid, whereas the
-random-key method does not provide this "convergence" feature.
-
-The convergent-key method computes the SHA-256d hash of a single-purpose tag,
-the encoding parameters, a "convergence secret", and the contents of the
-file. It uses a portion of the resulting hash as the AES encryption key.
-There are security concerns with using convergence this approach (the
-"partial-information guessing attack", please see ticket #365 for some
-references), so Tahoe uses a separate (randomly-generated) "convergence
-secret" for each node, stored in NODEDIR/private/convergence . The encoding
-parameters (k, N, and the segment size) are included in the hash to make sure
-that two different encodings of the same file will get different keys. This
-method requires an extra IO pass over the file, to compute this key, and
-encryption cannot be started until the pass is complete. This means that the
-convergent-key method will require at least two total passes over the file.
-
-The random-key method simply chooses a random encryption key. Convergence is
-disabled, however this method does not require a separate IO pass, so upload
-can be done with a single pass. This mode makes it easier to perform
-streaming upload.
-
-Regardless of which method is used to generate the key, the plaintext file is
-encrypted (using AES in CTR mode) to produce a ciphertext. This ciphertext is
-then erasure-coded and uploaded to the servers. Two hashes of the ciphertext
-are generated as the encryption proceeds: a flat hash of the whole
-ciphertext, and a Merkle tree. These are used to verify the correctness of
-the erasure decoding step, and can be used by a "verifier" process to make
-sure the file is intact without requiring the decryption key.
-
-The encryption key is hashed (with SHA-256d and a single-purpose tag) to
-produce the "Storage Index". This Storage Index (or SI) is used to identify
-the shares produced by the method described below. The grid can be thought of
-as a large table that maps Storage Index to a ciphertext. Since the
-ciphertext is stored as erasure-coded shares, it can also be thought of as a
-table that maps SI to shares.
-
-Anybody who knows a Storage Index can retrieve the associated ciphertext:
-ciphertexts are not secret.
-
-
-[[Image(file-encoding1.png)]]
-
-The ciphertext file is then broken up into segments. The last segment is
-likely to be shorter than the rest. Each segment is erasure-coded into a
-number of "blocks". This takes place one segment at a time. (In fact,
-encryption and erasure-coding take place at the same time, once per plaintext
-segment). Larger segment sizes result in less overhead overall, but increase
-both the memory footprint and the "alacrity" (the number of bytes we have to
-receive before we can deliver validated plaintext to the user). The current
-default segment size is 128KiB.
-
-One block from each segment is sent to each shareholder (aka leaseholder,
-aka landlord, aka storage node, aka peer). The "share" held by each remote
-shareholder is nominally just a collection of these blocks. The file will
-be recoverable when a certain number of shares have been retrieved.
-
-[[Image(file-encoding2.png)]]
-
-The blocks are hashed as they are generated and transmitted. These
-block hashes are put into a Merkle hash tree. When the last share has been
-created, the merkle tree is completed and delivered to the peer. Later, when
-we retrieve these blocks, the peer will send many of the merkle hash tree
-nodes ahead of time, so we can validate each block independently.
-
-The root of this block hash tree is called the "block root hash" and
-used in the next step.
-
-[[Image(file-encoding3.png)]]
-
-There is a higher-level Merkle tree called the "share hash tree". Its leaves
-are the block root hashes from each share. The root of this tree is called
-the "share root hash" and is included in the "URI Extension Block", aka UEB.
-The ciphertext hash and Merkle tree are also put here, along with the
-original file size, and the encoding parameters. The UEB contains all the
-non-secret values that could be put in the URI, but would have made the URI
-too big. So instead, the UEB is stored with the share, and the hash of the
-UEB is put in the URI.
-
-The URI then contains the secret encryption key and the UEB hash. It also
-contains the basic encoding parameters (k and N) and the file size, to make
-download more efficient (by knowing the number of required shares ahead of
-time, sufficient download queries can be generated in parallel).
-
-The URI (also known as the immutable-file read-cap, since possessing it
-grants the holder the capability to read the file's plaintext) is then
-represented as a (relatively) short printable string like so:
-
- URI:CHK:auxet66ynq55naiy2ay7cgrshm:6rudoctmbxsmbg7gwtjlimd6umtwrrsxkjzthuldsmo4nnfoc6fa:3:10:1000000
-
-[[Image(file-encoding4.png)]]
-
-During download, when a peer begins to transmit a share, it first transmits
-all of the parts of the share hash tree that are necessary to validate its
-block root hash. Then it transmits the portions of the block hash tree
-that are necessary to validate the first block. Then it transmits the
-first block. It then continues this loop: transmitting any portions of the
-block hash tree to validate block#N, then sending block#N.
-
-[[Image(file-encoding5.png)]]
-
-So the "share" that is sent to the remote peer actually consists of three
-pieces, sent in a specific order as they become available, and retrieved
-during download in a different order according to when they are needed.
-
-The first piece is the blocks themselves, one per segment. The last
-block will likely be shorter than the rest, because the last segment is
-probably shorter than the rest. The second piece is the block hash tree,
-consisting of a total of two SHA-1 hashes per block. The third piece is a
-hash chain from the share hash tree, consisting of log2(numshares) hashes.
-
-During upload, all blocks are sent first, followed by the block hash
-tree, followed by the share hash chain. During download, the share hash chain
-is delivered first, followed by the block root hash. The client then uses
-the hash chain to validate the block root hash. Then the peer delivers
-enough of the block hash tree to validate the first block, followed by
-the first block itself. The block hash chain is used to validate the
-block, then it is passed (along with the first block from several other
-peers) into decoding, to produce the first segment of crypttext, which is
-then decrypted to produce the first segment of plaintext, which is finally
-delivered to the user.
-
-[[Image(file-encoding6.png)]]
-
-== Hashes ==
-
-All hashes use SHA-256d, as defined in Practical Cryptography (by Ferguson
-and Schneier). All hashes use a single-purpose tag, e.g. the hash that
-converts an encryption key into a storage index is defined as follows:
-
- SI = SHA256d(netstring("allmydata_immutable_key_to_storage_index_v1") + key)
-
-When two separate values need to be combined together in a hash, we wrap each
-in a netstring.
-
-Using SHA-256d (instead of plain SHA-256) guards against length-extension
-attacks. Using the tag protects our Merkle trees against attacks in which the
-hash of a leaf is confused with a hash of two children (allowing an attacker
-to generate corrupted data that nevertheless appears to be valid), and is
-simply good "cryptograhic hygiene". The "Chosen Protocol Attack" by Kelsey,
-Schneier, and Wagner (http://www.schneier.com/paper-chosen-protocol.html) is
-relevant. Putting the tag in a netstring guards against attacks that seek to
-confuse the end of the tag with the beginning of the subsequent value.
diff --git a/docs/file-encoding1.svg b/docs/file-encoding1.svg
deleted file mode 100644 (file)
index 06b702a..0000000
+++ /dev/null
@@ -1,435 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- 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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docbase="/home/warner/trees/tahoe/docs"
-   sodipodi:docname="file-encoding1.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   sodipodi:modified="true">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;">
-      <path
-         id="path3252"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective81" />
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.0395661"
-     inkscape:cx="631.22458"
-     inkscape:cy="706.27996"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="1680"
-     inkscape:window-height="1050"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showgrid="false" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3081"
-       transform="translate(-198.1596,-0.9619396)">
-      <rect
-         y="17.505058"
-         x="210.76614"
-         height="78.85553"
-         width="305.95944"
-         id="rect1872"
-         style="fill:#e3f4d7;stroke:#000000;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text1874"
-         y="44.315933"
-         x="258.83313"
-         style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="44.315933"
-           x="258.83313"
-           id="tspan3079"
-           sodipodi:role="line">FILE (plaintext)</tspan></text>
-    </g>
-    <g
-       id="g4629"
-       transform="translate(-8.6574585,46.173112)">
-      <rect
-         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         id="rect3033"
-         width="116.35974"
-         height="73.956482"
-         x="442.19803"
-         y="243.98456" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="501.92212"
-         y="264.25281"
-         id="text3035"
-         sodipodi:linespacing="100%"><tspan
-           y="264.25281"
-           x="501.92212"
-           id="tspan3047"
-           sodipodi:role="line">convergent</tspan><tspan
-           id="tspan4627"
-           y="284.25281"
-           x="501.92212"
-           sodipodi:role="line">encryption</tspan><tspan
-           y="304.25281"
-           x="501.92212"
-           sodipodi:role="line"
-           id="tspan4604">key</tspan></text>
-    </g>
-    <g
-       id="g3139"
-       transform="translate(-122.35224,48.551816)">
-      <path
-         transform="matrix(0.923205,0,0,0.923205,-231.4625,247.6493)"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3128"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3130"
-         y="434.10446"
-         x="299.26846"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="434.10446"
-           x="299.26846"
-           id="tspan3137"
-           sodipodi:role="line">AES-CTR</tspan></text>
-    </g>
-    <g
-       id="g3201"
-       transform="translate(-129.86188,50.020871)">
-      <rect
-         style="fill:#d5e5ff;stroke:#000000;stroke-width:0.96806562;stroke-opacity:1"
-         id="rect3154"
-         width="286.73019"
-         height="78.85553"
-         x="196.96533"
-         y="521.95709" />
-      <text
-         transform="scale(0.968066,1.032988)"
-         xml:space="preserve"
-         style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="249.83606"
-         y="531.24384"
-         id="text3156"
-         sodipodi:linespacing="100%"><tspan
-           y="531.24384"
-           x="249.83606"
-           id="tspan3163"
-           sodipodi:role="line">FILE (crypttext)</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 208.10132,509.1107 L 208.10132,568.80529"
-       id="path3170"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g4640"
-       transform="translate(447.30202,-236.63721)">
-      <rect
-         y="755.01099"
-         x="24.107248"
-         height="28.084265"
-         width="36.708984"
-         id="rect3195"
-         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3197"
-         y="771.30011"
-         x="32.327164"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="771.30011"
-           x="32.327164"
-           id="tspan3246"
-           sodipodi:role="line">tag</tspan></text>
-    </g>
-    <g
-       id="g4661"
-       transform="translate(1.9238797,4.8096992)">
-      <rect
-         y="702.01349"
-         x="514.47058"
-         height="55.723186"
-         width="100.84161"
-         id="rect3237"
-         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3239"
-         y="724.94507"
-         x="564.60577"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="724.94507"
-           x="564.60577"
-           id="tspan3253"
-           sodipodi:role="line">storage</tspan><tspan
-           id="tspan4659"
-           y="744.94507"
-           x="564.60577"
-           sodipodi:role="line">index</tspan></text>
-    </g>
-    <g
-       id="g3212"
-       transform="translate(-96.193983,-7.2527756)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         id="path3214"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" />
-      <text
-         xml:space="preserve"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="548.34637"
-         y="181.94142"
-         id="text3216"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan3218"
-           x="548.34637"
-           y="181.94142">SHA-256</tspan></text>
-    </g>
-    <g
-       transform="translate(-9.1639282,440.10771)"
-       id="g3220">
-      <path
-         transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3222"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3224"
-         y="181.94142"
-         x="548.34637"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="181.94142"
-           x="548.34637"
-           id="tspan3226"
-           sodipodi:role="line">SHA-256</tspan></text>
-    </g>
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 320.32596,46.173119 C 407.86248,54.830577 448.26397,96.193988 468.4647,138.51934"
-       id="path2462"
-       sodipodi:nodetypes="cz" />
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 200.08348,97.15593 C 198.48026,294.3536 195.91508,353.03192 205.85512,444.41621"
-       id="path4024"
-       sodipodi:nodetypes="cs" />
-    <g
-       id="g4558"
-       transform="translate(141.40516,-11.543278)">
-      <rect
-         y="125.18694"
-         x="220.07802"
-         height="36.436913"
-         width="55.42865"
-         id="rect4549"
-         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text4551"
-         y="145.6524"
-         x="237.65776"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan4553"
-           x="237.65776"
-           y="145.6524">tag</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cz"
-       id="path4563"
-       d="M 416.51994,129.86189 C 429.9871,127.93801 436.72069,133.70964 452.11173,151.9865"
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <g
-       id="g4576"
-       transform="translate(12.505218,-12.505218)">
-      <rect
-         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1"
-         id="rect4567"
-         width="161.24203"
-         height="40.284672"
-         x="481.72565"
-         y="69.394432" />
-      <text
-         xml:space="preserve"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="498.39401"
-         y="92.476768"
-         id="text4569"
-         sodipodi:linespacing="100%"><tspan
-           y="92.476768"
-           x="498.39401"
-           id="tspan4571"
-           sodipodi:role="line">encoding parameters</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cz"
-       id="path4581"
-       d="M 564.65868,98.11787 C 565.62061,128.89994 533.87661,132.7477 507.90423,147.1768"
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 479.04603,201.04543 C 487.70348,234.71332 489.62738,252.99018 491.55126,288.58195"
-       id="path4583"
-       sodipodi:nodetypes="cz" />
-    <g
-       id="g4616"
-       transform="translate(16.352977,64.449968)">
-      <rect
-         y="227.63158"
-         x="583.60315"
-         height="71.070618"
-         width="119.24558"
-         id="rect4587"
-         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text4589"
-         y="246.66689"
-         x="644.2406"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan4591"
-           x="644.2406"
-           y="246.66689">random</tspan><tspan
-           id="tspan4600"
-           sodipodi:role="line"
-           x="644.2406"
-           y="266.66687">encryption</tspan><tspan
-           id="tspan4602"
-           sodipodi:role="line"
-           x="644.2406"
-           y="286.66687">key</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cz"
-       id="path4593"
-       d="M 486.74156,365.53714 C 480.96991,415.55801 289.54389,464.61694 241.4469,469.42664"
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 654.1191,362.65133 C 625.26089,454.03561 275.1148,476.16022 241.4469,480.00798"
-       id="path4595"
-       sodipodi:nodetypes="cz" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier 10 Pitch"
-       x="561.77289"
-       y="335.71701"
-       id="text4636"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan4638"
-         x="561.77289"
-         y="335.71701">or</tspan></text>
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 485.77962,367.46102 C 496.36095,429.98711 582.93553,528.10497 576.20196,584.85942"
-       id="path4645"
-       sodipodi:nodetypes="cz" />
-    <path
-       sodipodi:nodetypes="cz"
-       id="path4647"
-       d="M 654.1191,364.57521 C 642.57581,418.44383 597.36465,548.3057 582.93554,585.82136"
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 507.90424,532.91467 C 534.83855,543.49601 533.87661,566.58256 548.30571,589.66912"
-       id="path4649"
-       sodipodi:nodetypes="cz" />
-    <path
-       sodipodi:nodetypes="cz"
-       id="path4651"
-       d="M 564.65869,648.34745 C 568.50644,671.43401 569.46838,687.78698 569.46838,704.13996"
-       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-  </g>
-</svg>
diff --git a/docs/file-encoding2.svg b/docs/file-encoding2.svg
deleted file mode 100644 (file)
index 6db3de3..0000000
+++ /dev/null
@@ -1,922 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   sodipodi:docbase="/home/warner/trees/tahoe/docs"
-   sodipodi:docname="file-encoding2.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   sodipodi:modified="true">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.51978303"
-     inkscape:cx="372.04724"
-     inkscape:cy="526.18109"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="900"
-     inkscape:window-height="756"
-     inkscape:window-x="779"
-     inkscape:window-y="153" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3201"
-       transform="translate(-5.78221,-477.996)">
-      <rect
-         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
-         id="rect3154"
-         width="286.73019"
-         height="78.85553"
-         x="196.96533"
-         y="521.95709" />
-      <text
-         transform="scale(0.968066,1.032988)"
-         xml:space="preserve"
-         style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="249.83606"
-         y="531.24384"
-         id="text3156"
-         sodipodi:linespacing="100%"><tspan
-           y="531.24384"
-           x="249.83606"
-           id="tspan3163"
-           sodipodi:role="line">FILE (crypttext)</tspan></text>
-    </g>
-    <g
-       id="g2022">
-      <rect
-         y="214.548"
-         x="40.845631"
-         height="80.782936"
-         width="80.498047"
-         id="rect3273"
-         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3275"
-         y="255.87878"
-         x="56.581703"
-         style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"
-         transform="scale(0.968066,1.032988)"><tspan
-           y="255.87878"
-           x="56.581703"
-           id="tspan1993"
-           sodipodi:role="line">segA</tspan></text>
-    </g>
-    <g
-       id="g2017">
-      <rect
-         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
-         id="rect3284"
-         width="80.498047"
-         height="80.782936"
-         x="161.45784"
-         y="214.548" />
-      <text
-         transform="scale(0.968066,1.032988)"
-         xml:space="preserve"
-         style="font-size:28;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="184.53419"
-         y="251.69087"
-         id="text3286"
-         sodipodi:linespacing="100%"><tspan
-           y="251.69087"
-           x="184.53419"
-           id="tspan1995"
-           sodipodi:role="line">segB</tspan></text>
-    </g>
-    <g
-       id="g2012">
-      <rect
-         y="214.548"
-         x="282.07007"
-         height="80.782936"
-         width="80.498047"
-         id="rect3290"
-         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3292"
-         y="253.62892"
-         x="304.44913"
-         style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"
-         transform="scale(0.968066,1.032988)"><tspan
-           y="253.62892"
-           x="304.44913"
-           id="tspan1997"
-           sodipodi:role="line">segC</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 223.51231,125.60384 L 88.587195,212.82815"
-       id="path4243"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 297.10782,124.24096 L 205.79487,215.55391"
-       id="path4245"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 373.4291,122.87808 L 325.7283,212.82816"
-       id="path4247"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 458.9333,124.24096 L 443.56317,216.05143"
-       id="path4249"
-       sodipodi:nodetypes="cc" />
-    <rect
-       y="214.548"
-       x="422.02194"
-       height="80.782951"
-       width="61.22403"
-       id="rect3296"
-       style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3298"
-       y="253.42572"
-       x="440.45892"
-       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"
-       transform="scale(0.968066,1.032988)"><tspan
-         sodipodi:role="line"
-         id="tspan1999"
-         x="440.45892"
-         y="253.42572">segD</tspan></text>
-    <rect
-       style="fill:white;fill-opacity:1;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
-       id="rect3308"
-       width="32.312965"
-       height="80.782936"
-       x="484.21405"
-       y="214.548" />
-    <g
-       id="g2040"
-       transform="translate(-16.41804,-13.31249)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path2029"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" />
-      <text
-         xml:space="preserve"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="84.763"
-         y="377.10425"
-         id="text2031"
-         sodipodi:linespacing="100%"><tspan
-           y="377.10425"
-           x="84.763"
-           id="tspan2038"
-           sodipodi:role="line">FEC</tspan></text>
-    </g>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect2045"
-       width="62.568695"
-       height="54.581161"
-       x="106.49989"
-       y="400.05042"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="114.42955"
-       y="424.05099"
-       id="text2932"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan2934"
-         x="114.42955"
-         y="424.05099">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="126.88751"
-       y="445.35098"
-       id="text2936"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan2938"
-         x="126.88751"
-         y="445.35098">A1</tspan></text>
-    <rect
-       ry="0"
-       y="471.49408"
-       x="106.49989"
-       height="54.581161"
-       width="62.568695"
-       id="rect2956"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text2960"
-       y="495.49466"
-       x="114.42955"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3869"
-         x="114.42955"
-         y="495.49466">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text2964"
-       y="516.79468"
-       x="126.88751"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3018"
-         x="126.88751"
-         y="516.79468">A2</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect2970"
-       width="62.568695"
-       height="54.581161"
-       x="106.49989"
-       y="542.93781"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="114.42955"
-       y="566.93835"
-       id="text2974"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan2976"
-         x="114.42955"
-         y="566.93835">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="126.88751"
-       y="588.23834"
-       id="text2978"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3040"
-         x="126.88751"
-         y="588.23834">A3</tspan></text>
-    <rect
-       ry="0"
-       y="614.38141"
-       x="106.49989"
-       height="54.581161"
-       width="62.568695"
-       id="rect2984"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text2988"
-       y="638.38196"
-       x="114.42955"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="638.38196"
-         x="114.42955"
-         id="tspan2990"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text2992"
-       y="659.68195"
-       x="126.88751"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3042"
-         x="126.88751"
-         y="659.68195">A4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 79.874914,296.213 L 79.874914,326.83172"
-       id="path2996" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 90.524902,388.06915 C 85.442028,403.37176 95.420905,411.5033 105.16864,424.01286"
-       id="path3000"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 82.537411,389.4004 C 77.419162,441.79407 81.801856,464.47336 103.83739,495.90028"
-       id="path3002"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 71.887422,389.4004 C 62.3162,464.27336 66.595451,538.86154 105.16864,573.1127"
-       id="path3004"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 59.906185,384.0754 C 30.833264,497.98462 73.280777,611.91471 105.16864,643.66887"
-       id="path3006"
-       sodipodi:nodetypes="cc" />
-    <g
-       transform="translate(114.1248,-13.31249)"
-       id="g3090">
-      <path
-         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3092"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3094"
-         y="377.10425"
-         x="84.763"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3096"
-           x="84.763"
-           y="377.10425">FEC</tspan></text>
-    </g>
-    <rect
-       ry="0"
-       y="400.05042"
-       x="237.04271"
-       height="54.581161"
-       width="62.568695"
-       id="rect3098"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3100"
-       y="424.05099"
-       x="244.97237"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="424.05099"
-         x="244.97237"
-         id="tspan3102"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3104"
-       y="445.35098"
-       x="257.43033"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3266"
-         x="257.43033"
-         y="445.35098">B1</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3108"
-       width="62.568695"
-       height="54.581161"
-       x="237.04271"
-       y="471.49408"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="244.97237"
-       y="495.49466"
-       id="text3110"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3112"
-         x="244.97237"
-         y="495.49466">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="257.43033"
-       y="516.79468"
-       id="text3114"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3268"
-         x="257.43033"
-         y="516.79468">B2</tspan></text>
-    <rect
-       ry="0"
-       y="542.93781"
-       x="237.04271"
-       height="54.581161"
-       width="62.568695"
-       id="rect3118"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3120"
-       y="566.93835"
-       x="244.97237"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="566.93835"
-         x="244.97237"
-         id="tspan3122"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3124"
-       y="588.23834"
-       x="257.43033"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3270"
-         x="257.43033"
-         y="588.23834">B3</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3128"
-       width="62.568695"
-       height="54.581161"
-       x="237.04271"
-       y="614.38141"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="244.97237"
-       y="638.38196"
-       id="text3130"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3132"
-         x="244.97237"
-         y="638.38196">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="257.43033"
-       y="659.68195"
-       id="text3134"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3272"
-         x="257.43033"
-         y="659.68195">B4</tspan></text>
-    <path
-       id="path3138"
-       d="M 210.41773,296.213 L 210.41773,326.83172"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3140"
-       d="M 221.06772,388.06915 C 215.98484,403.37176 225.96372,411.5033 235.71146,424.01286"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3142"
-       d="M 213.08023,389.4004 C 207.96198,441.79407 212.34467,464.47336 234.38021,495.90028"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3144"
-       d="M 202.43024,389.4004 C 192.85902,464.27336 197.13827,538.86154 235.71146,573.1127"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3146"
-       d="M 190.449,384.0754 C 161.37608,497.98462 203.82359,611.91471 235.71146,643.66887"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <g
-       id="g3148"
-       transform="translate(241.4443,-13.31249)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3150"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" />
-      <text
-         xml:space="preserve"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="84.763"
-         y="377.10425"
-         id="text3152"
-         sodipodi:linespacing="100%"><tspan
-           y="377.10425"
-           x="84.763"
-           id="tspan3154"
-           sodipodi:role="line">FEC</tspan></text>
-    </g>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3156"
-       width="62.568695"
-       height="54.581161"
-       x="364.36224"
-       y="400.05042"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="372.2919"
-       y="424.05099"
-       id="text3158"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3160"
-         x="372.2919"
-         y="424.05099">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="384.74988"
-       y="445.35098"
-       id="text3162"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3274"
-         x="384.74988"
-         y="445.35098">C1</tspan></text>
-    <rect
-       ry="0"
-       y="471.49408"
-       x="364.36224"
-       height="54.581161"
-       width="62.568695"
-       id="rect3166"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3168"
-       y="495.49466"
-       x="372.2919"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="495.49466"
-         x="372.2919"
-         id="tspan3170"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3172"
-       y="516.79468"
-       x="384.74988"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3278"
-         x="384.74988"
-         y="516.79468">C2</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3176"
-       width="62.568695"
-       height="54.581161"
-       x="364.36224"
-       y="542.93781"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="372.2919"
-       y="566.93835"
-       id="text3178"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3180"
-         x="372.2919"
-         y="566.93835">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="384.74988"
-       y="588.23834"
-       id="text3182"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3280"
-         x="384.74988"
-         y="588.23834">C3</tspan></text>
-    <rect
-       ry="0"
-       y="614.38141"
-       x="364.36224"
-       height="54.581161"
-       width="62.568695"
-       id="rect3186"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3188"
-       y="638.38196"
-       x="372.2919"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="638.38196"
-         x="372.2919"
-         id="tspan3190"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3192"
-       y="659.68195"
-       x="384.74988"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3282"
-         x="384.74988"
-         y="659.68195">C4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 337.73727,296.213 L 337.73727,326.83172"
-       id="path3196" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 348.38726,388.06915 C 343.30438,403.37176 353.28326,411.5033 363.031,424.01286"
-       id="path3198"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 340.39977,389.4004 C 335.28152,441.79407 339.66421,464.47336 361.69975,495.90028"
-       id="path3200"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 329.74978,389.4004 C 320.17856,464.27336 324.45781,538.86154 363.031,573.1127"
-       id="path3202"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 317.76854,384.0754 C 288.69562,497.98462 331.14313,611.91471 363.031,643.66887"
-       id="path3204"
-       sodipodi:nodetypes="cc" />
-    <g
-       transform="translate(370.3755,-13.31249)"
-       id="g3207">
-      <path
-         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3209"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3211"
-         y="377.10425"
-         x="84.763"
-         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3213"
-           x="84.763"
-           y="377.10425">FEC</tspan></text>
-    </g>
-    <rect
-       ry="0"
-       y="400.05042"
-       x="493.29343"
-       height="54.581161"
-       width="62.568695"
-       id="rect3215"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3217"
-       y="424.05099"
-       x="501.22308"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="424.05099"
-         x="501.22308"
-         id="tspan3219"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3221"
-       y="445.35098"
-       x="513.68103"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3284"
-         x="513.68103"
-         y="445.35098">D1</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3225"
-       width="62.568695"
-       height="54.581161"
-       x="493.29343"
-       y="471.49408"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="501.22308"
-       y="495.49466"
-       id="text3227"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3229"
-         x="501.22308"
-         y="495.49466">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="513.68103"
-       y="516.79468"
-       id="text3231"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3286"
-         x="513.68103"
-         y="516.79468">D2</tspan></text>
-    <rect
-       ry="0"
-       y="542.93781"
-       x="493.29343"
-       height="54.581161"
-       width="62.568695"
-       id="rect3235"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3237"
-       y="566.93835"
-       x="501.22308"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="566.93835"
-         x="501.22308"
-         id="tspan3239"
-         sodipodi:role="line">block</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3241"
-       y="588.23834"
-       x="513.68103"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3288"
-         x="513.68103"
-         y="588.23834">D3</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3245"
-       width="62.568695"
-       height="54.581161"
-       x="493.29343"
-       y="614.38141"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="501.22308"
-       y="638.38196"
-       id="text3247"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3249"
-         x="501.22308"
-         y="638.38196">block</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="513.68103"
-       y="659.68195"
-       id="text3251"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3293"
-         x="513.68103"
-         y="659.68195">D4</tspan></text>
-    <path
-       id="path3256"
-       d="M 466.66845,296.213 L 466.66845,326.83172"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3258"
-       d="M 477.31844,388.06915 C 472.23556,403.37176 482.21444,411.5033 491.96218,424.01286"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3260"
-       d="M 469.33095,389.4004 C 464.2127,441.79407 468.59539,464.47336 490.63093,495.90028"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3262"
-       d="M 458.68096,389.4004 C 449.10974,464.27336 453.38899,538.86154 491.96218,573.1127"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="cc"
-       id="path3264"
-       d="M 446.69972,384.0754 C 417.6268,497.98462 460.07431,611.91471 491.96218,643.66887"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3831"
-       width="516.80328"
-       height="103.59095"
-       x="66.758537"
-       y="604.61957" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="80.570648"
-       y="700.15332"
-       id="text3833"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3835"
-         x="80.570648"
-         y="700.15332">share4</tspan></text>
-    <rect
-       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3837"
-       width="95.533775"
-       height="81.721664"
-       x="631.90411"
-       y="640.30084" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="650.27539"
-       y="660.8269"
-       id="text3839"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3841"
-         x="650.27539"
-         y="660.8269">peer 4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 582.41071,673.68012 C 631.90411,677.13315 631.90411,677.13315 631.90411,677.13315"
-       id="path3843" />
-  </g>
-</svg>
diff --git a/docs/file-encoding3.svg b/docs/file-encoding3.svg
deleted file mode 100644 (file)
index fb5fd4c..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/warner/work/tahoe-misc"
-   sodipodi:docname="file-encoding3.svg">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.523584"
-     inkscape:cx="372.04724"
-     inkscape:cy="526.18109"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="900"
-     inkscape:window-height="756"
-     inkscape:window-x="778"
-     inkscape:window-y="96" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3308"
-       transform="translate(-492.4404,-287.9192)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3297"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3299"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3306"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-361.8975,-287.9192)"
-       id="g3313">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3315"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3317"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3319"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       id="g3321"
-       transform="translate(-427.1689,-180.8987)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3323"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3325"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3327"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-298.6406,-78.23132)"
-       id="g3329">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3331"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3333"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3335"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-234.578,-287.9192)"
-       id="g3345">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3347"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3349"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3351"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       id="g3353"
-       transform="translate(-170.1124,-180.8987)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3355"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3357"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3359"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-105.6468,-287.9192)"
-       id="g3361">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3363"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3365"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3367"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <rect
-       ry="0"
-       y="47.720215"
-       x="76.855522"
-       height="54.581161"
-       width="62.568695"
-       id="rect2984"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text2988"
-       y="71.720772"
-       x="84.785179"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="71.720772"
-         x="84.785179"
-         id="tspan2990"
-         sodipodi:role="line">share</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text2992"
-       y="93.020752"
-       x="97.243141"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3042"
-         x="97.243141"
-         y="93.020752">A4</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3128"
-       width="62.568695"
-       height="54.581161"
-       x="207.39835"
-       y="47.720215"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="215.328"
-       y="71.720772"
-       id="text3130"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3132"
-         x="215.328"
-         y="71.720772">share</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="227.78596"
-       y="93.020752"
-       id="text3134"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3272"
-         x="227.78596"
-         y="93.020752">B4</tspan></text>
-    <rect
-       ry="0"
-       y="47.720215"
-       x="334.7179"
-       height="54.581161"
-       width="62.568695"
-       id="rect3186"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3188"
-       y="71.720772"
-       x="342.64755"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="71.720772"
-         x="342.64755"
-         id="tspan3190"
-         sodipodi:role="line">share</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3192"
-       y="93.020752"
-       x="355.10553"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3282"
-         x="355.10553"
-         y="93.020752">C4</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3245"
-       width="62.568695"
-       height="54.581161"
-       x="463.64905"
-       y="47.720215"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="471.5787"
-       y="71.720772"
-       id="text3247"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3249"
-         x="471.5787"
-         y="71.720772">share</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="484.03665"
-       y="93.020752"
-       id="text3251"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3293"
-         x="484.03665"
-         y="93.020752">D4</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3831"
-       width="516.80328"
-       height="491.99808"
-       x="37.114162"
-       y="37.958374" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="44.343109"
-       y="521.89929"
-       id="text3833"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3835"
-         x="44.343109"
-         y="521.89929">share4</tspan></text>
-    <rect
-       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3837"
-       width="95.533775"
-       height="81.721664"
-       x="602.25977"
-       y="73.639648" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="620.63104"
-       y="94.16571"
-       id="text3839"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3841"
-         x="620.63104"
-         y="94.16571">peer 4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 552.76635,107.01893 C 602.25975,110.47196 602.25975,110.47196 602.25975,110.47196"
-       id="path3843" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 106.27121,102.50451 L 108.15211,173.97895"
-       id="path2431" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 238.8751,102.50451 L 237.93464,173.03849"
-       id="path2433" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 366.77673,103.44496 L 366.77673,172.09804"
-       id="path2435" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 495.61881,103.44496 L 495.61881,173.03849"
-       id="path2437" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 489.97609,208.77571 L 438.25116,282.13106"
-       id="path2439" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 370.53854,207.83526 L 420.38255,282.13106"
-       id="path2441" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 236.05374,209.71617 L 183.38836,284.01197"
-       id="path2443" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 110.97347,207.83526 L 164.5793,282.13106"
-       id="path2445" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 178.6861,315.98737 L 289.65957,388.40226"
-       id="path2447" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 426.02527,315.98737 L 316.93271,389.34272"
-       id="path2449" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1"
-       id="rect3336"
-       width="474.92883"
-       height="334.80142"
-       x="61.129456"
-       y="140.12263" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="241.69646"
-       y="263.32199"
-       id="text3338"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3340"
-         x="241.69646"
-         y="263.32199">Merkle Tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="68.653069"
-       y="466.45987"
-       id="text3342"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3344"
-         x="68.653069"
-         y="466.45987">block hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="321.63498"
-       y="405.33044"
-       id="text3346"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3352"
-         x="321.63498"
-         y="405.33044">&quot;block root hash&quot;</tspan></text>
-  </g>
-</svg>
diff --git a/docs/file-encoding4.svg b/docs/file-encoding4.svg
deleted file mode 100644 (file)
index f4b21d0..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- 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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docbase="/home/warner/work/tahoe-misc"
-   sodipodi:docname="file-encoding4.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective5442" />
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.0814091"
-     inkscape:cx="327.67132"
-     inkscape:cy="590.71497"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="1680"
-     inkscape:window-height="1050"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showgrid="false" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="212.25175"
-       y="109.45165"
-       id="text3632"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3634"
-         x="212.25175"
-         y="109.45165">block</tspan><tspan
-         sodipodi:role="line"
-         x="212.25175"
-         y="129.45165"
-         id="tspan3636">root hashes</tspan></text>
-    <g
-       id="g3642"
-       transform="translate(-226.712,-129.0765)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3644"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3646"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3648"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       id="g3675"
-       transform="translate(175.712,7.63966)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3331"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3653"
-         y="160.03162"
-         x="68.92907"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="160.03162"
-           x="68.92907"
-           id="tspan3655"
-           sodipodi:role="line">s1</tspan></text>
-    </g>
-    <g
-       id="g3686"
-       transform="translate(175.712,2.282887)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3657"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="68.029869"
-         y="239.32857"
-         id="text3659"
-         sodipodi:linespacing="100%"><tspan
-           y="239.32857"
-           x="68.029869"
-           id="tspan3680"
-           sodipodi:role="line">s2</tspan></text>
-    </g>
-    <g
-       id="g3691"
-       transform="translate(175.712,0.186429)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3663"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3665"
-         y="313.49518"
-         x="70.729767"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="313.49518"
-           x="70.729767"
-           id="tspan3682"
-           sodipodi:role="line">s3</tspan></text>
-    </g>
-    <g
-       id="g3696"
-       transform="translate(175.712,7.639653)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3669"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="72.669769"
-         y="377.16217"
-         id="text3671"
-         sodipodi:linespacing="100%"><tspan
-           y="377.16217"
-           x="72.669769"
-           id="tspan3684"
-           sodipodi:role="line">s4</tspan></text>
-    </g>
-    <g
-       transform="translate(-228.8541,-284.0256)"
-       id="g3701">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3703"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3705"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3707"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-110.3217,-218.3329)"
-       id="g3709">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3711"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3713"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3715"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 270.6808,165.29588 L 353.51073,189.57362"
-       id="path3717" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 272.10891,234.55883 C 275.67916,233.13073 354.22478,203.14059 354.22478,203.14059"
-       id="path3719" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 274.96511,307.39204 L 356.36693,341.66649"
-       id="path3721" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 275.67916,379.51119 L 355.65288,358.80371"
-       id="path3723" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 390.64138,347.3789 L 473.4713,271.68949"
-       id="path3725" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 389.92733,198.14223 L 472.75725,253.12416"
-       id="path3727" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="82.126266"
-       y="105.04523"
-       id="text4615"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan4617"
-         x="82.126266"
-         y="105.04523">shares</tspan></text>
-    <g
-       id="g4662"
-       transform="translate(0,-7.629395e-6)">
-      <rect
-         ry="0"
-         y="131.23222"
-         x="69.941055"
-         height="62.310936"
-         width="88.076958"
-         id="rect3245"
-         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text4619"
-         y="167.66769"
-         x="84.927971"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="167.66769"
-           x="84.927971"
-           id="tspan4621"
-           sodipodi:role="line">share1</tspan></text>
-    </g>
-    <g
-       id="g4657"
-       transform="translate(-0.77298,-0.515305)">
-      <rect
-         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="rect4623"
-         width="88.076958"
-         height="62.310936"
-         x="70.714035"
-         y="203.11914"
-         ry="0" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="85.700951"
-         y="239.55461"
-         id="text4625"
-         sodipodi:linespacing="100%"><tspan
-           y="239.55461"
-           x="85.700951"
-           id="tspan4641"
-           sodipodi:role="line">share2</tspan></text>
-    </g>
-    <g
-       id="g4652"
-       transform="translate(-3.864891,1.288307)">
-      <rect
-         ry="0"
-         y="272.68713"
-         x="73.805946"
-         height="62.310936"
-         width="88.076958"
-         id="rect4629"
-         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text4631"
-         y="309.12259"
-         x="88.792862"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="309.12259"
-           x="88.792862"
-           id="tspan4643"
-           sodipodi:role="line">share3</tspan></text>
-    </g>
-    <g
-       id="g4647"
-       transform="translate(-4.637871,0)">
-      <rect
-         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="rect4635"
-         width="88.076958"
-         height="62.310936"
-         x="74.578926"
-         y="345.34702"
-         ry="0" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="89.565842"
-         y="381.78247"
-         id="text4637"
-         sodipodi:linespacing="100%"><tspan
-           y="381.78247"
-           x="89.565842"
-           id="tspan4645"
-           sodipodi:role="line">share4</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 159.23338,161.89201 L 234.98518,160.34605"
-       id="path4667" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 159.23338,233.77892 L 236.53114,233.00595"
-       id="path4669" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 160.77934,304.11988 L 239.62305,305.66584"
-       id="path4671" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 158.4604,374.46084 L 238.85007,377.55275"
-       id="path4673" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5560"
-       width="451.25253"
-       height="376.15237"
-       x="201.65356"
-       y="75.152138" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="320.79318"
-       y="271.27441"
-       id="text3338"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3340"
-         x="320.79318"
-         y="271.27441">Merkle Tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="211.74399"
-       y="441.22202"
-       id="text3342"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan7495"
-         x="211.74399"
-         y="441.22202">share hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="495.05698"
-       y="240.97345"
-       id="text5566"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan5568"
-         x="495.05698"
-         y="240.97345">&quot;share root hash&quot;</tspan></text>
-    <rect
-       style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8042"
-       width="372.43307"
-       height="126.05428"
-       x="258.43817"
-       y="492.44629" />
-    <text
-       xml:space="preserve"
-       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="267.38785"
-       y="521.40631"
-       id="text8044"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan8046"
-         x="267.38785"
-         y="521.40631">URI Extension Block</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 491.09641,278.8051 L 505.57143,535.71157"
-       id="path8064"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g5534">
-      <text
-         sodipodi:linespacing="100%"
-         id="text8048"
-         y="560.19122"
-         x="296.70987"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="560.19122"
-           x="296.70987"
-           id="tspan8050"
-           sodipodi:role="line">file size</tspan></text>
-      <rect
-         y="538.7973"
-         x="291.02008"
-         height="31.027878"
-         width="84.953964"
-         id="rect8066"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g5539"
-       transform="translate(-21.380944,3.5634906)">
-      <text
-         sodipodi:linespacing="100%"
-         id="text8052"
-         y="595.66229"
-         x="296.09039"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="595.66229"
-           x="296.09039"
-           id="tspan8054"
-           sodipodi:role="line">encoding parameters</tspan></text>
-      <rect
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect8068"
-         width="205.77185"
-         height="29.795084"
-         x="291.02008"
-         y="576.24475" />
-    </g>
-    <g
-       id="g5529">
-      <text
-         sodipodi:linespacing="100%"
-         id="text8060"
-         y="557.45142"
-         x="430.06894"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="557.45142"
-           x="430.06894"
-           id="tspan8062"
-           sodipodi:role="line">share root hash</tspan></text>
-      <rect
-         y="536.65747"
-         x="420.48123"
-         height="31.027878"
-         width="162.62888"
-         id="rect8070"
-         style="fill:none;fill-opacity:1;stroke:black;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <flowRoot
-       xml:space="preserve"
-       id="flowRoot5444"
-       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"><flowRegion
-         id="flowRegion5446"><rect
-           id="rect5448"
-           width="440.86795"
-           height="206.59506"
-           x="212.52603"
-           y="478.04767" /></flowRegion><flowPara
-         id="flowPara5450"></flowPara></flowRoot>    <flowRoot
-       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"
-       id="flowRoot5452"
-       xml:space="preserve"><flowRegion
-         id="flowRegion5454"><rect
-           y="478.04767"
-           x="212.52603"
-           height="206.59506"
-           width="440.86795"
-           id="rect5456" /></flowRegion><flowPara
-         id="flowPara5458"></flowPara></flowRoot>    <rect
-       y="722.08801"
-       x="249.14307"
-       height="126.05428"
-       width="372.43307"
-       id="rect5460"
-       style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text5462"
-       y="750.73669"
-       x="264.42236"
-       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="750.73669"
-         x="264.42236"
-         id="tspan5464"
-         sodipodi:role="line">URI / &quot;file read-cap&quot;</tspan></text>
-    <g
-       id="g5498">
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="471.72757"
-         y="789.75726"
-         id="text5478"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan5480"
-           x="471.72757"
-           y="789.75726">UEB hash</tspan></text>
-      <rect
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect5486"
-         width="109.25024"
-         height="31.027878"
-         x="461.99792"
-         y="768.95331" />
-    </g>
-    <g
-       id="g5503">
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="275.49631"
-         y="792.89374"
-         id="text5474"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan5476"
-           x="275.49631"
-           y="792.89374">encryption key</tspan></text>
-      <rect
-         y="770.815"
-         x="268.32343"
-         height="36.37751"
-         width="148.71983"
-         id="rect5488"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       transform="translate(-97.251286,198.1785)"
-       id="g5490">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path5492"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text5494"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan5496"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <path
-       id="path5508"
-       d="M 490.16032,618.22602 L 500.19251,660.16729"
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       sodipodi:nodetypes="cc"
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 506.13565,695.45603 L 516.96501,767.91304"
-       id="path5510" />
-    <g
-       id="g5524"
-       transform="translate(-7.8396793,-5.701585)">
-      <rect
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect8072"
-         width="127.96149"
-         height="31.434599"
-         x="502.91043"
-         y="583.00134" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="507.92603"
-         y="603.99866"
-         id="text5520"
-         sodipodi:linespacing="100%"><tspan
-           sodipodi:role="line"
-           id="tspan5522"
-           x="507.92603"
-           y="603.99866">other hashes</tspan></text>
-    </g>
-  </g>
-</svg>
diff --git a/docs/file-encoding5.svg b/docs/file-encoding5.svg
deleted file mode 100644 (file)
index a20a136..0000000
+++ /dev/null
@@ -1,585 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/warner/work/tahoe-misc"
-   sodipodi:docname="file-encoding5.svg">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.79718499"
-     inkscape:cx="410.02658"
-     inkscape:cy="638.93685"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="900"
-     inkscape:window-height="756"
-     inkscape:window-x="699"
-     inkscape:window-y="165" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="93.755287"
-       y="98.537506"
-       id="text3632"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3634"
-         x="93.755287"
-         y="98.537506">block</tspan><tspan
-         sodipodi:role="line"
-         x="93.755287"
-         y="118.53751"
-         id="tspan3636">root hashes</tspan></text>
-    <g
-       id="g3642"
-       transform="translate(-279.7236,-129.0765)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3644"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3646"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3648"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       id="g3675"
-       transform="translate(63.82283,6.080481)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3331"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3653"
-         y="160.03162"
-         x="68.92907"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="160.03162"
-           x="68.92907"
-           id="tspan3655"
-           sodipodi:role="line">s1</tspan></text>
-    </g>
-    <g
-       id="g3686"
-       transform="translate(61.28203,2.918364)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3657"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="68.029869"
-         y="239.32857"
-         id="text3659"
-         sodipodi:linespacing="100%"><tspan
-           y="239.32857"
-           x="68.029869"
-           id="tspan3680"
-           sodipodi:role="line">s2</tspan></text>
-    </g>
-    <g
-       id="g3691"
-       transform="translate(59.37213,3.016624)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3663"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3665"
-         y="313.49518"
-         x="70.729767"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="313.49518"
-           x="70.729767"
-           id="tspan3682"
-           sodipodi:role="line">s3</tspan></text>
-    </g>
-    <g
-       id="g3696"
-       transform="translate(59.37213,12.6645)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3669"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="72.669769"
-         y="377.16217"
-         id="text3671"
-         sodipodi:linespacing="100%"><tspan
-           y="377.16217"
-           x="72.669769"
-           id="tspan3684"
-           sodipodi:role="line">s4</tspan></text>
-    </g>
-    <g
-       transform="translate(-281.8657,-284.0256)"
-       id="g3701">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3703"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3705"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3707"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-104.085,-218.3329)"
-       id="g3709">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3711"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3713"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3715"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 158.42099,162.17755 L 300.49915,189.57362"
-       id="path3717"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 162.96742,234.55883 C 166.53767,233.13073 301.2132,203.14059 301.2132,203.14059"
-       id="path3719"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 162.7053,312.06953 L 303.35535,341.66649"
-       id="path3721"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 160.30102,384.18868 L 302.6413,358.80371"
-       id="path3723"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 340.74813,350.49723 L 479.70796,268.57116"
-       id="path3725"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 341.59324,198.14223 L 480.55307,259.36082"
-       id="path3727"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="387.9295"
-       y="82.614281"
-       id="text3342"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan7297"
-         x="387.9295"
-         y="82.614281">share hash tree</tspan></text>
-    <g
-       transform="translate(-277.1965,175.8469)"
-       id="g6278">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path6280"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text6282"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan6284"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       id="g6374"
-       transform="translate(0,-6.583939)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path6288"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-170.1473,365.3129)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="130.1619"
-         y="471.03552"
-         id="text6290"
-         sodipodi:linespacing="100%"><tspan
-           y="471.03552"
-           x="130.1619"
-           id="tspan6366"
-           sodipodi:role="line">s5</tspan></text>
-    </g>
-    <g
-       id="g6379"
-       transform="translate(0,-4.389282)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-170.1473,437.7031)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path6296"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text6298"
-         y="544.97565"
-         x="130.2619"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="544.97565"
-           x="130.2619"
-           id="tspan6368"
-           sodipodi:role="line">s6</tspan></text>
-    </g>
-    <g
-       id="g6384"
-       transform="translate(0,-2.194656)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path6304"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-170.1473,510.0933)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="132.1519"
-         y="617.0459"
-         id="text6306"
-         sodipodi:linespacing="100%"><tspan
-           y="617.0459"
-           x="132.1519"
-           id="tspan6370"
-           sodipodi:role="line">s7</tspan></text>
-    </g>
-    <g
-       id="g6389">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-170.1473,582.4835)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path6312"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text6314"
-         y="688.16608"
-         x="130.03189"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="688.16608"
-           x="130.03189"
-           id="tspan6372"
-           sodipodi:role="line">s8</tspan></text>
-    </g>
-    <g
-       id="g6318"
-       transform="translate(-279.3386,20.89783)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path6320"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text6322"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan6324"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       id="g6326"
-       transform="translate(-101.5579,86.59053)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path6328"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text6330"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan6332"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <path
-       id="path6334"
-       d="M 160.94817,457.746 L 303.02633,494.49705"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path6336"
-       d="M 162.37628,533.2456 C 165.94653,531.8175 303.74038,508.06402 303.74038,508.06402"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path6338"
-       d="M 162.11415,609.19714 L 305.88253,646.58992"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path6340"
-       d="M 162.8282,682.87546 L 305.16848,663.72714"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path6342"
-       d="M 343.27531,653.86149 L 482.23514,575.05376"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       id="path6344"
-       d="M 341.0021,499.94733 L 481.52109,562.72508"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text6346"
-       y="424.95895"
-       x="480.79593"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="424.95895"
-         x="480.79593"
-         id="tspan6348"
-         sodipodi:role="line">Merkle Tree</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text6350"
-       y="384.32007"
-       x="593.30579"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="384.32007"
-         x="593.30579"
-         id="tspan6352"
-         sodipodi:role="line">&quot;share root hash&quot;</tspan></text>
-    <g
-       id="g6396"
-       transform="translate(65.86388,-62.41649)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path6398"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text6400"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan6402"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <path
-       id="path6404"
-       d="M 516.21962,265.18629 L 653.62028,407.4814"
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 516.21962,558.30913 L 653.62028,429.30971"
-       id="path6406"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 88.872351,202.61777 L 183.98136,204.17694 L 352.37108,321.11424 L 570.65404,564.34383 L 498.9325,650.09786 L 291.56368,394.39495 L 162.15306,280.57598 L 79.517367,263.42517 L 88.872351,202.61777 z "
-       id="path6408" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="430.70282"
-       y="734.79639"
-       id="text7299"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan7301"
-         x="430.70282"
-         y="734.79639">merkle hash chain</tspan><tspan
-         sodipodi:role="line"
-         x="430.70282"
-         y="754.79639"
-         id="tspan7303">to validate s1</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 519.99961,716.92402 C 528.23607,699.12899 558.20121,653.69346 528.55661,615.79625"
-       id="path7305"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>
diff --git a/docs/file-encoding6.svg b/docs/file-encoding6.svg
deleted file mode 100644 (file)
index 09ced3f..0000000
+++ /dev/null
@@ -1,760 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/warner/work/tahoe-misc"
-   sodipodi:docname="file-encoding6.svg">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path2976"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.60354902"
-     inkscape:cx="367.4898"
-     inkscape:cy="564.16839"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="900"
-     inkscape:window-height="756"
-     inkscape:window-x="732"
-     inkscape:window-y="176" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3308"
-       transform="translate(-492.4404,-287.9192)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3297"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3299"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3306"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-361.8975,-287.9192)"
-       id="g3313">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3315"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3317"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3319"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       id="g3321"
-       transform="translate(-427.1689,-180.8987)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3323"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3325"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3327"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-234.578,-287.9192)"
-       id="g3345">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3347"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3349"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3351"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       id="g3353"
-       transform="translate(-170.1124,-180.8987)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3355"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3357"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3359"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-105.6468,-287.9192)"
-       id="g3361">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3363"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3365"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3367"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <rect
-       ry="0"
-       y="47.720215"
-       x="76.855522"
-       height="54.581161"
-       width="62.568695"
-       id="rect2984"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text2988"
-       y="71.720772"
-       x="84.785179"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="71.720772"
-         x="84.785179"
-         id="tspan2990"
-         sodipodi:role="line">share</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text2992"
-       y="93.020752"
-       x="97.243141"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3042"
-         x="97.243141"
-         y="93.020752">A4</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3128"
-       width="62.568695"
-       height="54.581161"
-       x="207.39835"
-       y="47.720215"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="215.328"
-       y="71.720772"
-       id="text3130"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3132"
-         x="215.328"
-         y="71.720772">share</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="227.78596"
-       y="93.020752"
-       id="text3134"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3272"
-         x="227.78596"
-         y="93.020752">B4</tspan></text>
-    <rect
-       ry="0"
-       y="47.720215"
-       x="334.7179"
-       height="54.581161"
-       width="62.568695"
-       id="rect3186"
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
-    <text
-       sodipodi:linespacing="100%"
-       id="text3188"
-       y="71.720772"
-       x="342.64755"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="71.720772"
-         x="342.64755"
-         id="tspan3190"
-         sodipodi:role="line">share</tspan></text>
-    <text
-       sodipodi:linespacing="100%"
-       id="text3192"
-       y="93.020752"
-       x="355.10553"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan3282"
-         x="355.10553"
-         y="93.020752">C4</tspan></text>
-    <rect
-       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3245"
-       width="62.568695"
-       height="54.581161"
-       x="463.64905"
-       y="47.720215"
-       ry="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="471.5787"
-       y="71.720772"
-       id="text3247"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3249"
-         x="471.5787"
-         y="71.720772">share</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="484.03665"
-       y="93.020752"
-       id="text3251"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3293"
-         x="484.03665"
-         y="93.020752">D4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="479.80331"
-       y="521.89929"
-       id="text3833"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3835"
-         x="479.80331"
-         y="521.89929">share4</tspan></text>
-    <rect
-       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
-       id="rect3837"
-       width="95.533775"
-       height="81.721664"
-       x="608.88721"
-       y="272.46359" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="627.25848"
-       y="292.98965"
-       id="text3839"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3841"
-         x="627.25848"
-         y="292.98965">peer 4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 559.39381,305.84288 C 608.88721,309.29591 608.88721,309.29591 608.88721,309.29591"
-       id="path3843" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 106.27121,102.50451 L 108.15211,173.97895"
-       id="path2431" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 238.8751,102.50451 L 237.93464,173.03849"
-       id="path2433" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 366.77673,103.44496 L 366.77673,172.09804"
-       id="path2435" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 495.61881,103.44496 L 495.61881,173.03849"
-       id="path2437" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 489.97609,208.77571 L 438.25116,282.13106"
-       id="path2439" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 370.53854,207.83526 L 420.38255,282.13106"
-       id="path2441" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 236.05374,209.71617 L 183.38836,284.01197"
-       id="path2443" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 110.97347,207.83526 L 164.5793,282.13106"
-       id="path2445" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 178.6861,315.98737 L 289.65957,388.40226"
-       id="path2447" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 426.02527,315.98737 L 316.93271,389.34272"
-       id="path2449" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1"
-       id="rect3336"
-       width="474.92883"
-       height="334.80142"
-       x="61.129456"
-       y="140.12263" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="241.69646"
-       y="263.32199"
-       id="text3338"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3340"
-         x="241.69646"
-         y="263.32199">Merkle Tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="68.653069"
-       y="466.45987"
-       id="text3342"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3344"
-         x="68.653069"
-         y="466.45987">block hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="321.63498"
-       y="405.33044"
-       id="text3346"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3352"
-         x="321.63498"
-         y="405.33044">&quot;block root hash&quot;</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="88.648125"
-       y="598.72913"
-       id="text3632"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan3634"
-         x="88.648125"
-         y="598.72913">block</tspan><tspan
-         sodipodi:role="line"
-         x="88.648125"
-         y="618.72913"
-         id="tspan3636">root hashes</tspan></text>
-    <g
-       id="g3642"
-       transform="translate(-350.3156,360.201)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3644"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text3646"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan3648"
-           sodipodi:role="line">SHA</tspan></text>
-    </g>
-    <g
-       id="g3675"
-       transform="translate(52.10837,496.9171)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path5669"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3653"
-         y="160.03162"
-         x="68.92907"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="160.03162"
-           x="68.92907"
-           id="tspan3655"
-           sodipodi:role="line">s1</tspan></text>
-    </g>
-    <g
-       id="g3686"
-       transform="translate(52.10837,491.5603)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3657"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="68.029869"
-         y="239.32857"
-         id="text3659"
-         sodipodi:linespacing="100%"><tspan
-           y="239.32857"
-           x="68.029869"
-           id="tspan3680"
-           sodipodi:role="line">s2</tspan></text>
-    </g>
-    <g
-       id="g3691"
-       transform="translate(52.10837,489.4639)">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3663"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3665"
-         y="313.49518"
-         x="70.729767"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           y="313.49518"
-           x="70.729767"
-           id="tspan3682"
-           sodipodi:role="line">s3</tspan></text>
-    </g>
-    <g
-       id="g3696"
-       transform="translate(52.10837,496.9171)">
-      <path
-         sodipodi:type="arc"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         id="path3669"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
-      <text
-         xml:space="preserve"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         x="72.669769"
-         y="377.16217"
-         id="text3671"
-         sodipodi:linespacing="100%"><tspan
-           y="377.16217"
-           x="72.669769"
-           id="tspan3684"
-           sodipodi:role="line">s4</tspan></text>
-    </g>
-    <g
-       transform="translate(-352.4577,205.2519)"
-       id="g3701">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3703"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3705"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3707"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <g
-       transform="translate(-233.9253,270.9446)"
-       id="g3709">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path3711"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text3713"
-         y="483.09396"
-         x="591.47559"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan3715"
-           x="591.47559"
-           y="483.09396">SHA</tspan></text>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 147.07717,654.57336 L 229.9071,678.8511"
-       id="path3717" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 148.50528,723.83631 C 152.07553,722.40821 230.62115,692.41807 230.62115,692.41807"
-       id="path3719" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 151.36148,796.66952 L 232.7633,830.94397"
-       id="path3721" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 152.07553,868.78867 L 232.04925,848.08119"
-       id="path3723" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 267.03775,836.65638 L 349.86767,760.96697"
-       id="path3725" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
-       d="M 266.3237,687.41971 L 349.15362,742.40164"
-       id="path3727" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5560"
-       width="484.38986"
-       height="374.49551"
-       x="78.049934"
-       y="564.42963" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="358.2843"
-       y="865.40643"
-       id="text5700"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan5702"
-         x="358.2843"
-         y="865.40643">Merkle Tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="88.140358"
-       y="930.49945"
-       id="text5704"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan7497"
-         x="88.140358"
-         y="930.49945">share hash tree</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="356.4744"
-       y="786.95703"
-       id="text5566"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan5568"
-         x="356.4744"
-         y="786.95703">&quot;share root hash&quot;</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
-       d="M 290.30681,720.03728 L 108.29659,845.9841 L 74.309836,804.80832 L 190.42285,712.9661 L 239.36655,641.22131 L 299.69,669.98266 L 290.30681,720.03728 z "
-       id="path5949"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 32.468525,28.648698 L 557.69466,30.558611 L 561.51449,540.50544 L 374.34299,540.50544 L 296.03655,725.76702 L 80.216355,869.01051 L 30.558611,817.44286 L 164.25254,727.67694 L 234.91933,590.16318 L 219.64002,534.7757 L 36.288351,534.7757 L 32.468525,28.648698 z "
-       id="path5951" />
-    <text
-       xml:space="preserve"
-       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-       x="370.89407"
-       y="630.30597"
-       id="text7307"
-       sodipodi:linespacing="100%"><tspan
-         sodipodi:role="line"
-         id="tspan7499"
-         x="370.89407"
-         y="630.30597">merkle hash chain</tspan><tspan
-         sodipodi:role="line"
-         id="tspan7501"
-         x="370.89407"
-         y="650.30597">to validate s4</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="M 444.20214,656.77444 C 435.69736,681.11928 360.49372,712.77648 296.54955,691.10088"
-       id="path7317"
-       sodipodi:nodetypes="cc" />
-    <g
-       transform="translate(221.2501,29.91837)"
-       id="g7322">
-      <path
-         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)"
-         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
-         sodipodi:ry="34.073441"
-         sodipodi:rx="34.958466"
-         sodipodi:cy="196.10106"
-         sodipodi:cx="607.56927"
-         id="path7324"
-         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text7326"
-         y="377.16217"
-         x="72.669769"
-         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
-         xml:space="preserve"><tspan
-           sodipodi:role="line"
-           id="tspan7328"
-           x="72.669769"
-           y="377.16217">s4</tspan></text>
-    </g>
-  </g>
-</svg>
diff --git a/docs/mut.svg b/docs/mut.svg
deleted file mode 100644 (file)
index 3db01b8..0000000
+++ /dev/null
@@ -1,1602 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- 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"
-   width="278.36371"
-   height="295.09766"
-   id="svg2841"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docname="mut.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <defs
-     id="defs2843">
-    <marker
-       inkscape:stockid="Arrow1Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Send"
-       style="overflow:visible">
-      <path
-         id="path7680"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
-    </marker>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient7760">
-      <stop
-         style="stop-color:#ca1818;stop-opacity:1;"
-         offset="0"
-         id="stop7762" />
-      <stop
-         style="stop-color:#ca1818;stop-opacity:0;"
-         offset="1"
-         id="stop7764" />
-    </linearGradient>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible">
-      <path
-         id="path3751"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path3745"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective2849" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7760"
-       id="linearGradient7766"
-       x1="-0.41100001"
-       y1="412.36218"
-       x2="160.411"
-       y2="412.36218"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7760"
-       id="linearGradient7788"
-       gradientUnits="userSpaceOnUse"
-       x1="-0.41100001"
-       y1="412.36218"
-       x2="160.411"
-       y2="412.36218" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7760"
-       id="linearGradient7793"
-       gradientUnits="userSpaceOnUse"
-       x1="-0.41100001"
-       y1="412.36218"
-       x2="160.411"
-       y2="412.36218" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.3332515"
-     inkscape:cx="210.25878"
-     inkscape:cy="123.41841"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer2"
-     showgrid="true"
-     inkscape:window-width="1598"
-     inkscape:window-height="1198"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2883"
-       visible="true"
-       enabled="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata2846">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-217.17997,-198.38081)">
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.61650002;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect2885"
-       width="7.5"
-       height="0"
-       x="314.88028"
-       y="111.80756" />
-    <flowRoot
-       xml:space="preserve"
-       id="flowRoot7772"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion
-         id="flowRegion7774"><rect
-           id="rect7776"
-           width="378.57144"
-           height="65.714287"
-           x="-35.714287"
-           y="384.50504"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara
-         id="flowPara7778" /></flowRoot>    <path
-       sodipodi:type="arc"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="path8437"
-       sodipodi:cx="420"
-       sodipodi:cy="212.36218"
-       sodipodi:rx="80"
-       sodipodi:ry="20"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       transform="matrix(0.3375,0,0,0.3375,257.2117,137.23422)" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2919375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 438.13856,269.91499 C 446.63381,280.47335 453.38314,289.63578 453.38314,289.63578"
-       id="path9557"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 463.64994,293.69223 C 463.64994,297.55233 463.64994,302.1186 463.64994,302.1186"
-       id="path11208"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="467.92987"
-       y="288.97491"
-       id="text16751"><tspan
-         sodipodi:role="line"
-         id="tspan16753"
-         x="467.92987"
-         y="288.97491" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="464.14178"
-       y="291.24774"
-       id="text16755"><tspan
-         sodipodi:role="line"
-         id="tspan16757"
-         x="464.14178"
-         y="291.24774" /></text>
-    <text
-       transform="scale(0.8196045,1.2201006)"
-       xml:space="preserve"
-       style="font-size:13.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="589.64325"
-       y="218.94211"
-       id="text16759"
-       sodipodi:linespacing="100%"><tspan
-         y="218.94211"
-         x="589.64325"
-         id="tspan16761"
-         sodipodi:role="line" /></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32201561px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 372.25866,281.18125 C 391.14052,275.94279 412.5754,263.5215 412.5754,263.5215"
-       id="path21360"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 467.95624,303.64299 C 465.78336,307.89979 463.10818,312.90038 463.10818,312.90038"
-       id="path4716"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="445.04538"
-       y="385.5498"
-       id="text4926"><tspan
-         sodipodi:role="line"
-         id="tspan4928"
-         x="445.04538"
-         y="385.5498">shares</tspan></text>
-    <path
-       sodipodi:type="arc"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="path4938"
-       sodipodi:cx="420"
-       sodipodi:cy="212.36218"
-       sodipodi:rx="80"
-       sodipodi:ry="20"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       transform="matrix(0,0.1683097,-0.3399575,0,508.99378,294.48202)" />
-    <path
-       transform="matrix(0,0.1683097,-0.3399575,0,517.99378,294.48202)"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       sodipodi:ry="20"
-       sodipodi:rx="80"
-       sodipodi:cy="212.36218"
-       sodipodi:cx="420"
-       id="path4940"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       sodipodi:type="arc" />
-    <path
-       sodipodi:type="arc"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="path4942"
-       sodipodi:cx="420"
-       sodipodi:cy="212.36218"
-       sodipodi:rx="80"
-       sodipodi:ry="20"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       transform="matrix(0,0.1683097,-0.3399575,0,526.99378,294.48202)" />
-    <path
-       transform="matrix(0,0.1683097,-0.3399575,0,535.99378,294.48202)"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       sodipodi:ry="20"
-       sodipodi:rx="80"
-       sodipodi:cy="212.36218"
-       sodipodi:cx="420"
-       id="path4944"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       sodipodi:type="arc" />
-    <path
-       transform="matrix(0,0.1683097,-0.3399575,0,542.80003,294.65787)"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       sodipodi:ry="20"
-       sodipodi:rx="80"
-       sodipodi:cy="212.36218"
-       sodipodi:cx="420"
-       id="path4946"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       sodipodi:type="arc" />
-    <path
-       transform="matrix(0,0.1683097,-0.3399575,0,551.80003,294.58742)"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       sodipodi:ry="20"
-       sodipodi:rx="80"
-       sodipodi:cy="212.36218"
-       sodipodi:cx="420"
-       id="path4948"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       sodipodi:type="arc" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect4950"
-       width="60.860748"
-       height="2.1464994"
-       x="427.86215"
-       y="376.78323" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 436.85592,349.56271 C 436.85592,349.56271 434.60592,329.31271 461.60592,329.31271 C 445.85592,333.81271 445.85592,349.56271 445.85592,349.56271"
-       id="path4952" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 461.60592,329.31271 C 454.85592,336.06271 454.85592,349.56271 454.85592,349.56271"
-       id="path4954" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 461.60592,329.31271 C 463.85592,329.31271 463.85592,349.56271 463.85592,349.56271"
-       id="path4956" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 461.60592,329.31271 C 470.60592,329.31271 470.60592,349.56271 470.60592,349.56271"
-       id="path4958" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 461.60592,329.31271 C 479.60592,329.31271 479.60592,349.56271 479.60592,349.56271"
-       id="path4960" />
-    <rect
-       y="372.16623"
-       x="427.74518"
-       height="2.1464994"
-       width="60.860748"
-       id="rect4962"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect4964"
-       width="60.860748"
-       height="2.1464994"
-       x="427.74518"
-       y="367.66623" />
-    <rect
-       y="363.16623"
-       x="427.74518"
-       height="2.1464994"
-       width="60.860748"
-       id="rect4966"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect4968"
-       width="60.860748"
-       height="2.1464994"
-       x="427.74518"
-       y="358.66623" />
-    <rect
-       y="354.16623"
-       x="427.74518"
-       height="2.1464994"
-       width="60.860748"
-       id="rect4970"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect4972"
-       width="60.860748"
-       height="2.1464994"
-       x="427.74518"
-       y="354.16623" />
-    <g
-       transform="matrix(0,0.2054517,-0.1664743,0,467.60988,354.01332)"
-       id="g4974"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         d="M -0.53492796,252.21639 C -5.5179181,262.28794 39.328998,262.28794 39.328998,262.28794 C 59.260953,262.28794 59.260953,292.50259 59.260953,292.50259"
-         id="path4976" />
-      <path
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         d="M 120.64913,252.36218 C 125.63212,262.43373 80.7852,262.43373 80.7852,262.43373 C 60.85325,262.43373 60.85325,292.64838 60.85325,292.64838"
-         id="path4978" />
-    </g>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 407.29684,407.56445 L 411.94948,419.32947"
-       id="path4998"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.50278425px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="468.50412"
-       y="382.92706"
-       id="text5004"
-       sodipodi:linespacing="100%"
-       transform="scale(0.9062658,1.1034291)"><tspan
-         sodipodi:role="line"
-         id="tspan5006"
-         x="468.50412"
-         y="382.92706"
-         style="font-size:8.10000038px">Merkle Tree</tspan></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16140337px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 418.04929,366.13921 C 402.75501,384.90072 405.78989,392.50491 405.78989,392.50491 L 405.78989,392.50491"
-       id="path5008" />
-    <g
-       id="g9174"
-       transform="matrix(0.7985291,0,0,0.5813416,-172.4015,-45.31981)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9176"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9178"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9180"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9182" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9184" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="297.6908"
-       y="233.17752"
-       id="text9186"><tspan
-         sodipodi:role="line"
-         x="297.6908"
-         y="233.17752"
-         style="font-size:5px"
-         id="tspan9188">AES-CTR</tspan></text>
-    <g
-       id="g9877"
-       transform="matrix(0.7985291,0,0,0.5813416,-65.298876,150.88501)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9879"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9881"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9883"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9885" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9887" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="404.19336"
-       y="429.98233"
-       id="text9889"><tspan
-         sodipodi:role="line"
-         x="404.19336"
-         y="429.98233"
-         style="font-size:5px"
-         id="tspan9891">SHA256d</tspan></text>
-    <g
-       id="g9893"
-       transform="matrix(0.7985291,0,0,0.5813416,-7.0974465,151.48502)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9895"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9897"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9899"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9901" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9903" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="462.39481"
-       y="430.58234"
-       id="text9905"><tspan
-         sodipodi:role="line"
-         x="462.39481"
-         y="430.58234"
-         style="font-size:5px"
-         id="tspan9907">SHA256d</tspan></text>
-    <g
-       id="g9909"
-       transform="matrix(0.7985291,0,0,0.5813416,-37.39819,179.0857)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9911"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9913"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9915"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9917" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9919" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="432.09406"
-       y="458.18301"
-       id="text9921"><tspan
-         sodipodi:role="line"
-         x="432.09406"
-         y="458.18301"
-         style="font-size:5px"
-         id="tspan9923">SHA256d</tspan></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 424.55591,436.29471 L 429.20855,448.05973"
-       id="path9925"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 463.55687,407.19399 L 468.20951,418.95901"
-       id="path9927"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 484.06352,407.70392 L 479.41088,419.46894"
-       id="path9929"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 425.60846,407.49401 L 420.95582,419.25903"
-       id="path9931"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 458.90929,435.99471 L 454.25665,447.75973"
-       id="path9933"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g9935"
-       transform="matrix(0.7985291,0,0,0.5813416,-17.597704,43.482372)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9937"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9939"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9941"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9943" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9945" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="456.99469"
-       y="322.27969"
-       id="text9947"><tspan
-         sodipodi:role="line"
-         x="456.99469"
-         y="322.27969"
-         style="font-size:5px"
-         id="tspan9949">FEC</tspan></text>
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z"
-       id="path9993"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
-       id="path9995"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 26.114257,76.71179 L 26.114257,75.211753 L 53.11492,75.211753 L 80.115583,75.211753 L 80.115583,76.71179 L 80.115583,78.211827 L 53.11492,78.211827 L 26.114257,78.211827 L 26.114257,76.71179 z"
-       id="path9997"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 26.414265,133.7148 L 26.414265,132.21315 L 53.431371,132.21315 L 80.44846,132.21315 L 80.357032,133.63819 L 80.265587,135.06322 L 53.339926,135.13984 L 26.414265,135.21643 L 26.414265,133.7148 z"
-       id="path9999"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z"
-       id="path10001"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
-       id="path10003"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 26.414265,133.72419 L 26.414265,132.21315 L 53.432178,132.21315 L 80.450089,132.21315 L 80.357839,133.48818 L 80.265587,134.76322 L 73.515421,134.91631 C 69.80283,135.00052 57.686283,135.10673 46.58976,135.15233 L 26.414265,135.23524 L 26.414265,133.72419 z"
-       id="path10045"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
-       id="path10047"
-       transform="translate(216.27706,196.47119)" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="text"
-     transform="translate(-217.17997,-198.38081)">
-    <path
-       transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       sodipodi:ry="20"
-       sodipodi:rx="80"
-       sodipodi:cy="212.36218"
-       sodipodi:cx="420"
-       id="path12528"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       sodipodi:type="arc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 398.91941,217.38625 C 397.86315,236.37897 412.97295,261.62455 412.97295,261.62455"
-       id="path8489"
-       sodipodi:nodetypes="cc" />
-    <path
-       sodipodi:type="arc"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="path10092"
-       sodipodi:cx="420"
-       sodipodi:cy="212.36218"
-       sodipodi:rx="80"
-       sodipodi:ry="20"
-       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
-       transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" />
-    <text
-       xml:space="preserve"
-       style="font-size:8.09999943px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="556.67358"
-       y="169.5114"
-       id="text10094"
-       transform="scale(0.8252145,1.2118062)"><tspan
-         sodipodi:role="line"
-         id="tspan10096"
-         x="556.67358"
-         y="169.5114" /></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect13628"
-       width="7.5"
-       height="0"
-       x="524.88025"
-       y="299.30756" />
-    <g
-       id="g16785"
-       transform="matrix(0.364293,0,0,0.4974358,-16.906009,-38.001986)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <g
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="g16787"
-         transform="translate(-210,240)" />
-      <text
-         transform="scale(1.0714114,0.9333483)"
-         id="text16789"
-         y="325.48486"
-         x="362.67249"
-         style="font-size:32.76525116px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         xml:space="preserve"><tspan
-           id="tspan16791"
-           y="325.48486"
-           x="362.67249"
-           sodipodi:role="line" /></text>
-    </g>
-    <text
-       transform="scale(0.9161476,1.0915272)"
-       id="text16795"
-       y="124.86931"
-       x="159.02403"
-       style="font-size:13.94785595px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="124.86931"
-         x="159.02403"
-         id="tspan16797"
-         sodipodi:role="line" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:13.947855px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="247.0589"
-       y="116.87234"
-       id="text16801"
-       transform="scale(0.7061936,1.4160423)"><tspan
-         sodipodi:role="line"
-         id="tspan16803"
-         x="247.0589"
-         y="116.87234" /></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect20335"
-       width="4.5456867"
-       height="0"
-       x="206.55289"
-       y="326.09802" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.27742502;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect7836"
-       width="54"
-       height="3.375"
-       x="346.5321"
-       y="342.79144" />
-    <text
-       transform="scale(1.0705538,0.934096)"
-       id="text7838"
-       y="377.70102"
-       x="341.13809"
-       style="font-size:6.07499981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="377.70102"
-         x="341.13809"
-         id="tspan7840"
-         sodipodi:role="line"
-         style="font-size:8.10000038px">salt</tspan></text>
-    <g
-       transform="matrix(0.3375,0,0,0.3375,168.46227,275.21496)"
-       id="g8416"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <rect
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.82200003;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="rect8418"
-         width="160"
-         height="10"
-         x="535"
-         y="22.362183" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="332.31949"
-       y="313.88254"
-       id="text8424"
-       transform="scale(1.0714114,0.9333483)"><tspan
-         sodipodi:role="line"
-         id="tspan8426"
-         x="332.31949"
-         y="313.88254"
-         style="font-size:8.10000038px">encryption</tspan><tspan
-         sodipodi:role="line"
-         x="332.31949"
-         y="324.00754"
-         id="tspan8428"
-         style="font-size:8.10000038px">      key</tspan></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 298.98227,329.83819 C 326.42371,330.53571 348.95266,320.06453 348.95266,320.06453"
-       id="path21352"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 362.28379,341.51001 C 341.45603,329.97307 346.83916,321.99552 346.83916,321.99552"
-       id="path21354"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2438544px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 355.39701,305.53135 L 360.98003,293.64584"
-       id="path21358"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="487.03278"
-       y="411.55334"
-       id="text3034"><tspan
-         sodipodi:role="line"
-         id="tspan3036"
-         x="487.03278"
-         y="411.55334" /></text>
-    <flowRoot
-       xml:space="preserve"
-       id="flowRoot3254"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion
-         id="flowRegion3256"><rect
-           id="rect3258"
-           width="18.039574"
-           height="36.830799"
-           x="-31.569254"
-           y="-50.306789"
-           style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara
-         id="flowPara3260" /></flowRoot>    <rect
-       y="198.60286"
-       x="219.6953"
-       height="24.165203"
-       width="107.25604"
-       id="rect3282"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect5573"
-       width="54.139946"
-       height="3.3068728"
-       x="242.37775"
-       y="271.45877" />
-    <text
-       xml:space="preserve"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="235.36351"
-       y="301.57739"
-       id="text7107"
-       transform="scale(1.0705539,0.9340959)"><tspan
-         sodipodi:role="line"
-         id="tspan7109"
-         x="235.36351"
-         y="301.57739"
-         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text>
-    <text
-       transform="scale(1.0705539,0.9340959)"
-       id="text7768"
-       y="362.28162"
-       x="234.52074"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="362.28162"
-         x="234.52074"
-         id="tspan7770"
-         sodipodi:role="line"
-         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text>
-    <rect
-       y="356.53317"
-       x="230.62067"
-       height="24.165203"
-       width="107.25604"
-       id="rect3291"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="248.95004"
-       y="370.59125"
-       id="text3246"><tspan
-         sodipodi:role="line"
-         id="tspan3248"
-         x="248.95004"
-         y="370.59125"
-         style="font-size:8.10000038px">verifying (public) key</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="239.46277"
-       y="213.58257"
-       id="text3328"><tspan
-         sodipodi:role="line"
-         x="239.46277"
-         y="213.58257"
-         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="tspan3021">signing (private) key</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect4024"
-       width="54.139946"
-       height="3.3068728"
-       x="242.55493"
-       y="328.39029" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="381.61792"
-       y="386.57251"
-       id="text4229"><tspan
-         sodipodi:role="line"
-         id="tspan4231"
-         x="381.61792"
-         y="386.57251" /></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 234.50363,224.362 L 234.50363,354.01202"
-       id="path4243"
-       inkscape:connector-type="polyline" />
-    <rect
-       y="241.14568"
-       x="288.69962"
-       height="24.165203"
-       width="107.25604"
-       id="rect5564"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="306.05878"
-       y="255.20375"
-       id="text5566"><tspan
-         sodipodi:role="line"
-         id="tspan5568"
-         x="306.05878"
-         y="255.20375"
-         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">encrypted signing key</tspan></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 279.02164,269.72178 C 281.56206,241.33051 292.24088,235.15181 292.24088,235.15181"
-       id="path5574"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 285.08543,222.90932 L 291.78123,230.87533"
-       id="path6618"
-       inkscape:connector-type="polyline"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 322.35949,233.1782 L 335.48526,239.16028"
-       id="path8979"
-       sodipodi:nodetypes="cc" />
-    <text
-       transform="scale(1.0705539,0.9340959)"
-       id="text9528"
-       y="462.90314"
-       x="245.50374"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="462.90314"
-         x="245.50374"
-         id="tspan9530"
-         sodipodi:role="line"
-         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9554"
-       width="108.27989"
-       height="3.3068728"
-       x="222.74568"
-       y="419.13055" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect16799"
-       width="171.15405"
-       height="13.22591"
-       x="222.05762"
-       y="440.96823" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="279.37097"
-       y="462.55542"
-       id="text3313"><tspan
-         sodipodi:role="line"
-         x="279.37097"
-         y="462.55542"
-         id="tspan3317"
-         style="font-size:8.10000038px">read-write cap</tspan></text>
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 222.87392,420.82386 L 222.87392,419.36856 L 276.84166,419.36856 L 330.8094,419.36856 L 330.8094,420.82386 L 330.8094,422.27917 L 276.84166,422.27917 L 222.87392,422.27917 L 222.87392,420.82386 z"
-       id="path9564" />
-    <text
-       transform="scale(1.0705539,0.9340959)"
-       id="text9566"
-       y="483.10208"
-       x="304.77203"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="483.10208"
-         x="304.77203"
-         id="tspan9568"
-         sodipodi:role="line"
-         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9570"
-       width="108.27989"
-       height="3.3068728"
-       x="281.14557"
-       y="443.04819" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 281.27383,444.74153 L 281.27383,443.28622 L 335.24158,443.28622 L 389.20931,443.28622 L 389.20931,444.74153 L 389.20931,446.19684 L 335.24158,446.19684 L 281.27383,446.19684 L 281.27383,444.74153 z"
-       id="path9572" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9574"
-       width="54.139946"
-       height="3.3068728"
-       x="225.99055"
-       y="442.97894" />
-    <text
-       xml:space="preserve"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="223.80324"
-       y="483.19937"
-       id="text9576"
-       transform="scale(1.0705539,0.9340959)"><tspan
-         sodipodi:role="line"
-         id="tspan9578"
-         x="223.80324"
-         y="483.19937"
-         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="279.37097"
-       y="490.32758"
-       id="text9582"><tspan
-         sodipodi:role="line"
-         x="279.37097"
-         y="490.32758"
-         id="tspan9584"
-         style="font-size:8.10000038px">read-only cap</tspan></text>
-    <text
-       transform="scale(1.0705539,0.9340959)"
-       id="text9586"
-       y="512.94104"
-       x="305.00543"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       xml:space="preserve"><tspan
-         y="512.94104"
-         x="305.00543"
-         id="tspan9588"
-         sodipodi:role="line"
-         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9590"
-       width="108.27989"
-       height="3.3068728"
-       x="281.14554"
-       y="470.82034" />
-    <path
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       d="M 281.27383,472.51368 L 281.27383,471.05837 L 335.24157,471.05837 L 389.2093,471.05837 L 389.2093,472.51368 L 389.2093,473.96898 L 335.24157,473.96898 L 281.27383,473.96898 L 281.27383,472.51368 z"
-       id="path9592" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9594"
-       width="54.139946"
-       height="3.3068728"
-       x="225.99054"
-       y="470.7511" />
-    <text
-       xml:space="preserve"
-       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="224.83044"
-       y="512.93097"
-       id="text9596"
-       transform="scale(1.0705539,0.9340959)"><tspan
-         sodipodi:role="line"
-         id="tspan9598"
-         x="224.83044"
-         y="512.93097"
-         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="384.58023"
-       y="210.64319"
-       id="text3025"><tspan
-         sodipodi:role="line"
-         id="tspan3027"
-         x="384.58023"
-         y="210.64319">plaintext</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="451.8754"
-       y="298.79443"
-       id="text3029"><tspan
-         sodipodi:role="line"
-         id="tspan3031"
-         x="451.8754"
-         y="298.79443">ciphertext</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="102.84189"
-       y="100.84377"
-       id="text3459"
-       transform="translate(218.99833,196.47119)"><tspan
-         sodipodi:role="line"
-         id="tspan3461"
-         x="102.84189"
-         y="100.84377" /></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 48.719461,27.732616 L 48.719461,41.723846"
-       id="path3512"
-       transform="translate(218.99833,196.47119)"
-       inkscape:connector-type="polyline" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 267.71779,255.74642 L 267.71779,269.73765"
-       id="path4829"
-       inkscape:connector-type="polyline" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 266.96826,282.47967 L 266.96826,296.4709"
-       id="path4831"
-       inkscape:connector-type="polyline" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 266.96826,312.96055 L 266.96826,326.95178"
-       id="path4833"
-       inkscape:connector-type="polyline" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.14901878px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect5110"
-       width="113.09831"
-       height="7.6182923"
-       x="221.60002"
-       y="417.24417" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 49.877177,187.22739 L 50.127816,194.49593"
-       id="path5112"
-       transform="translate(218.99833,196.47119)"
-       inkscape:connector-type="polyline" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
-       d="M 50.127816,212.04066 L 50.127816,219.3092"
-       id="path5641"
-       transform="translate(218.99833,196.47119)"
-       inkscape:connector-type="polyline" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 22.500552,81.301996 C 3.3317037,108.63786 -8.6943462,156.11861 6.9001691,245.40603"
-       id="path7224"
-       transform="translate(218.99833,196.47119)"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 240.57714,332.04074 C 221.40829,359.37661 207.8822,408.95742 225.87678,470.34415"
-       id="path7753"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 90.602225,227.40558 L 105.30258,246.00604"
-       id="path7755"
-       transform="translate(218.99833,196.47119)"
-       inkscape:connector-type="polyline"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 367.86051,447.5929 L 367.5605,469.79345"
-       id="path8286"
-       inkscape:connector-type="polyline"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g9190"
-       transform="matrix(0.7985291,0,0,0.5813416,-211.70247,-29.719429)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9192"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9194"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9196"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9198" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9200" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="257.18979"
-       y="245.77785"
-       id="text9202"><tspan
-         sodipodi:role="line"
-         x="257.18979"
-         y="245.77785"
-         id="tspan9204"
-         style="font-size:5px">SHA256d</tspan><tspan
-         sodipodi:role="line"
-         x="257.18979"
-         y="252.02785"
-         style="font-size:5px"
-         id="tspan9206">truncated</tspan></text>
-    <g
-       id="g9208"
-       transform="matrix(0.7985291,0,0,0.5813416,-211.70247,28.482004)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9210"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9212"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9214"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9216" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9218" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="257.18979"
-       y="303.97925"
-       id="text9220"><tspan
-         sodipodi:role="line"
-         x="257.18979"
-         y="303.97925"
-         id="tspan9222"
-         style="font-size:5px">SHA256d</tspan><tspan
-         sodipodi:role="line"
-         x="257.18979"
-         y="310.22925"
-         style="font-size:5px"
-         id="tspan9224">truncated</tspan></text>
-    <g
-       id="g9226"
-       transform="matrix(0.7985291,0,0,0.5813416,-127.4004,35.982184)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9228"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9230"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9232"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9234" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9236" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="341.49188"
-       y="311.47946"
-       id="text9238"><tspan
-         sodipodi:role="line"
-         x="341.49188"
-         y="311.47946"
-         id="tspan9240"
-         style="font-size:5px">SHA256d</tspan><tspan
-         sodipodi:role="line"
-         x="341.49188"
-         y="317.72946"
-         style="font-size:5px"
-         id="tspan9242">truncated</tspan></text>
-    <g
-       id="g9244"
-       transform="matrix(0.7985291,0,0,0.5813416,-210.80245,122.98432)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9246"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9248"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9250"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9252" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9254" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="258.08981"
-       y="398.4816"
-       id="text9256"><tspan
-         sodipodi:role="line"
-         x="258.08981"
-         y="398.4816"
-         id="tspan9258"
-         style="font-size:5px">SHA256d</tspan><tspan
-         sodipodi:role="line"
-         x="258.08981"
-         y="404.7316"
-         style="font-size:5px"
-         id="tspan9260">truncated</tspan></text>
-    <g
-       id="g9262"
-       transform="matrix(0.7985291,0,0,0.5813416,-52.098552,-13.519031)"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
-      <path
-         sodipodi:type="arc"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         id="path9264"
-         sodipodi:cx="607.56927"
-         sodipodi:cy="196.10106"
-         sodipodi:rx="34.958466"
-         sodipodi:ry="34.073441"
-         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
-         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
-      <text
-         xml:space="preserve"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-         x="591.47559"
-         y="483.09396"
-         id="text9266"
-         sodipodi:linespacing="100%"><tspan
-           y="483.09396"
-           x="591.47559"
-           id="tspan9268"
-           sodipodi:role="line" /><tspan
-           y="493.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9270" /><tspan
-           y="503.09396"
-           x="591.47559"
-           sodipodi:role="line"
-           id="tspan9272" /></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="417.99377"
-       y="264.97833"
-       id="text9274"><tspan
-         sodipodi:role="line"
-         x="417.99377"
-         y="264.97833"
-         style="font-size:5px"
-         id="tspan9276">AES-CTR</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9845"
-       width="20.741352"
-       height="9.1972332"
-       x="395.21106"
-       y="396.4776"
-       inkscape:transform-center-y="4.6611973"
-       inkscape:transform-center-x="1.720467e-05" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 395.27984,401.04002 L 395.27984,396.56484 L 405.56868,396.56484 L 415.85752,396.56484 L 415.85752,401.04002 L 415.85752,405.51519 L 405.56868,405.51519 L 395.27984,405.51519 L 395.27984,401.04002 z"
-       id="path9847"
-       inkscape:transform-center-x="0.013044945"
-       inkscape:transform-center-y="4.6250009" />
-    <text
-       xml:space="preserve"
-       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="397.93158"
-       y="402.57623"
-       id="text9849"><tspan
-         sodipodi:role="line"
-         id="tspan9851"
-         x="397.93158"
-         y="402.57623">share 1</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9853"
-       width="20.741352"
-       height="9.1972332"
-       x="421.31168"
-       y="396.4776"
-       inkscape:transform-center-y="4.6611973"
-       inkscape:transform-center-x="1.720467e-05" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 421.38048,401.04003 L 421.38048,396.56485 L 431.66932,396.56485 L 441.95816,396.56485 L 441.95816,401.04003 L 441.95816,405.5152 L 431.66932,405.5152 L 421.38048,405.5152 L 421.38048,401.04003 z"
-       id="path9855"
-       inkscape:transform-center-x="0.013044945"
-       inkscape:transform-center-y="4.6250009" />
-    <text
-       xml:space="preserve"
-       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="424.0322"
-       y="402.57623"
-       id="text9857"><tspan
-         sodipodi:role="line"
-         id="tspan9859"
-         x="424.0322"
-         y="402.57623">share 2</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9861"
-       width="20.741352"
-       height="9.1972332"
-       x="446.81232"
-       y="396.4776"
-       inkscape:transform-center-y="4.6611973"
-       inkscape:transform-center-x="1.720467e-05" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 446.88111,401.04003 L 446.88111,396.56485 L 457.16995,396.56485 L 467.45879,396.56485 L 467.45879,401.04003 L 467.45879,405.5152 L 457.16995,405.5152 L 446.88111,405.5152 L 446.88111,401.04003 z"
-       id="path9863"
-       inkscape:transform-center-x="0.013044945"
-       inkscape:transform-center-y="4.6250009" />
-    <text
-       xml:space="preserve"
-       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="449.53284"
-       y="402.57623"
-       id="text9865"><tspan
-         sodipodi:role="line"
-         id="tspan9867"
-         x="449.53284"
-         y="402.57623">share 3</tspan></text>
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect9869"
-       width="20.741352"
-       height="9.1972332"
-       x="473.81299"
-       y="396.77759"
-       inkscape:transform-center-y="4.6611973"
-       inkscape:transform-center-x="1.720467e-05" />
-    <path
-       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 473.88178,401.34003 L 473.88178,396.86485 L 484.17062,396.86485 L 494.45946,396.86485 L 494.45946,401.34003 L 494.45946,405.8152 L 484.17062,405.8152 L 473.88178,405.8152 L 473.88178,401.34003 z"
-       id="path9871"
-       inkscape:transform-center-x="0.013044945"
-       inkscape:transform-center-y="4.6250009" />
-    <text
-       xml:space="preserve"
-       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       x="476.53351"
-       y="402.87622"
-       id="text9873"><tspan
-         sodipodi:role="line"
-         id="tspan9875"
-         x="476.53351"
-         y="402.87622">share 4</tspan></text>
-    <path
-       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 26.414265,133.71319 L 26.414265,132.21315 L 53.414928,132.21315 L 80.415591,132.21315 L 80.415591,133.51519 L 80.415591,134.81725 L 73.166834,135.01523 C 69.180018,135.12413 57.02972,135.21323 46.166171,135.21323 L 26.414265,135.21323 L 26.414265,133.71319 z"
-       id="path10049"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 9.9138595,248.166 L 9.9138595,246.51596 L 36.764519,246.51596 L 63.615178,246.51596 L 63.615178,248.166 L 63.615178,249.81604 L 36.764519,249.81604 L 9.9138595,249.81604 L 9.9138595,248.166 z"
-       id="path10051"
-       transform="translate(216.27706,196.47119)" />
-    <path
-       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 9.9138595,275.91668 L 9.9138595,274.41665 L 36.764519,274.41665 L 63.615178,274.41665 L 63.615178,275.91668 L 63.615178,277.41672 L 36.764519,277.41672 L 9.9138595,277.41672 L 9.9138595,275.91668 z"
-       id="path10055"
-       transform="translate(216.27706,196.47119)" />
-    <rect
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
-       id="rect2971"
-       width="171.15405"
-       height="13.22591"
-       x="222.20229"
-       y="469.1651" />
-  </g>
-</svg>
diff --git a/docs/mutable.txt b/docs/mutable.txt
deleted file mode 100644 (file)
index 40a5374..0000000
+++ /dev/null
@@ -1,648 +0,0 @@
-
-This describes the "RSA-based mutable files" which were shipped in Tahoe v0.8.0.
-
-= Mutable Files =
-
-Mutable File Slots are places with a stable identifier that can hold data
-that changes over time. In contrast to CHK slots, for which the
-URI/identifier is derived from the contents themselves, the Mutable File Slot
-URI remains fixed for the life of the slot, regardless of what data is placed
-inside it.
-
-Each mutable slot is referenced by two different URIs. The "read-write" URI
-grants read-write access to its holder, allowing them to put whatever
-contents they like into the slot. The "read-only" URI is less powerful, only
-granting read access, and not enabling modification of the data. The
-read-write URI can be turned into the read-only URI, but not the other way
-around.
-
-The data in these slots is distributed over a number of servers, using the
-same erasure coding that CHK files use, with 3-of-10 being a typical choice
-of encoding parameters. The data is encrypted and signed in such a way that
-only the holders of the read-write URI will be able to set the contents of
-the slot, and only the holders of the read-only URI will be able to read
-those contents. Holders of either URI will be able to validate the contents
-as being written by someone with the read-write URI. The servers who hold the
-shares cannot read or modify them: the worst they can do is deny service (by
-deleting or corrupting the shares), or attempt a rollback attack (which can
-only succeed with the cooperation of at least k servers).
-
-== Consistency vs Availability ==
-
-There is an age-old battle between consistency and availability. Epic papers
-have been written, elaborate proofs have been established, and generations of
-theorists have learned that you cannot simultaneously achieve guaranteed
-consistency with guaranteed reliability. In addition, the closer to 0 you get
-on either axis, the cost and complexity of the design goes up.
-
-Tahoe's design goals are to largely favor design simplicity, then slightly
-favor read availability, over the other criteria.
-
-As we develop more sophisticated mutable slots, the API may expose multiple
-read versions to the application layer. The tahoe philosophy is to defer most
-consistency recovery logic to the higher layers. Some applications have
-effective ways to merge multiple versions, so inconsistency is not
-necessarily a problem (i.e. directory nodes can usually merge multiple "add
-child" operations).
-
-== The Prime Coordination Directive: "Don't Do That" ==
-
-The current rule for applications which run on top of Tahoe is "do not
-perform simultaneous uncoordinated writes". That means you need non-tahoe
-means to make sure that two parties are not trying to modify the same mutable
-slot at the same time. For example:
-
- * don't give the read-write URI to anyone else. Dirnodes in a private
-   directory generally satisfy this case, as long as you don't use two
-   clients on the same account at the same time
- * if you give a read-write URI to someone else, stop using it yourself. An
-   inbox would be a good example of this.
- * if you give a read-write URI to someone else, call them on the phone
-   before you write into it
- * build an automated mechanism to have your agents coordinate writes.
-   For example, we expect a future release to include a FURL for a
-   "coordination server" in the dirnodes. The rule can be that you must
-   contact the coordination server and obtain a lock/lease on the file
-   before you're allowed to modify it.
-
-If you do not follow this rule, Bad Things will happen. The worst-case Bad
-Thing is that the entire file will be lost. A less-bad Bad Thing is that one
-or more of the simultaneous writers will lose their changes. An observer of
-the file may not see monotonically-increasing changes to the file, i.e. they
-may see version 1, then version 2, then 3, then 2 again.
-
-Tahoe takes some amount of care to reduce the badness of these Bad Things.
-One way you can help nudge it from the "lose your file" case into the "lose
-some changes" case is to reduce the number of competing versions: multiple
-versions of the file that different parties are trying to establish as the
-one true current contents. Each simultaneous writer counts as a "competing
-version", as does the previous version of the file. If the count "S" of these
-competing versions is larger than N/k, then the file runs the risk of being
-lost completely. [TODO] If at least one of the writers remains running after
-the collision is detected, it will attempt to recover, but if S>(N/k) and all
-writers crash after writing a few shares, the file will be lost.
-
-Note that Tahoe uses serialization internally to make sure that a single
-Tahoe node will not perform simultaneous modifications to a mutable file. It
-accomplishes this by using a weakref cache of the MutableFileNode (so that
-there will never be two distinct MutableFileNodes for the same file), and by
-forcing all mutable file operations to obtain a per-node lock before they
-run. The Prime Coordination Directive therefore applies to inter-node
-conflicts, not intra-node ones.
-
-
-== Small Distributed Mutable Files ==
-
-SDMF slots are suitable for small (<1MB) files that are editing by rewriting
-the entire file. The three operations are:
-
- * allocate (with initial contents)
- * set (with new contents)
- * get (old contents)
-
-The first use of SDMF slots will be to hold directories (dirnodes), which map
-encrypted child names to rw-URI/ro-URI pairs.
-
-=== SDMF slots overview ===
-
-Each SDMF slot is created with a public/private key pair. The public key is
-known as the "verification key", while the private key is called the
-"signature key". The private key is hashed and truncated to 16 bytes to form
-the "write key" (an AES symmetric key). The write key is then hashed and
-truncated to form the "read key". The read key is hashed and truncated to
-form the 16-byte "storage index" (a unique string used as an index to locate
-stored data).
-
-The public key is hashed by itself to form the "verification key hash".
-
-The write key is hashed a different way to form the "write enabler master".
-For each storage server on which a share is kept, the write enabler master is
-concatenated with the server's nodeid and hashed, and the result is called
-the "write enabler" for that particular server. Note that multiple shares of
-the same slot stored on the same server will all get the same write enabler,
-i.e. the write enabler is associated with the "bucket", rather than the
-individual shares.
-
-The private key is encrypted (using AES in counter mode) by the write key,
-and the resulting crypttext is stored on the servers. so it will be
-retrievable by anyone who knows the write key. The write key is not used to
-encrypt anything else, and the private key never changes, so we do not need
-an IV for this purpose.
-
-The actual data is encrypted (using AES in counter mode) with a key derived
-by concatenating the readkey with the IV, the hashing the results and
-truncating to 16 bytes. The IV is randomly generated each time the slot is
-updated, and stored next to the encrypted data.
-
-The read-write URI consists of the write key and the verification key hash.
-The read-only URI contains the read key and the verification key hash. The
-verify-only URI contains the storage index and the verification key hash.
-
- URI:SSK-RW:b2a(writekey):b2a(verification_key_hash)
- URI:SSK-RO:b2a(readkey):b2a(verification_key_hash)
- URI:SSK-Verify:b2a(storage_index):b2a(verification_key_hash)
-
-Note that this allows the read-only and verify-only URIs to be derived from
-the read-write URI without actually retrieving the public keys. Also note
-that it means the read-write agent must validate both the private key and the
-public key when they are first fetched. All users validate the public key in
-exactly the same way.
-
-The SDMF slot is allocated by sending a request to the storage server with a
-desired size, the storage index, and the write enabler for that server's
-nodeid. If granted, the write enabler is stashed inside the slot's backing
-store file. All further write requests must be accompanied by the write
-enabler or they will not be honored. The storage server does not share the
-write enabler with anyone else.
-
-The SDMF slot structure will be described in more detail below. The important
-pieces are:
-
-  * a sequence number
-  * a root hash "R"
-  * the encoding parameters (including k, N, file size, segment size)
-  * a signed copy of [seqnum,R,encoding_params], using the signature key
-  * the verification key (not encrypted)
-  * the share hash chain (part of a Merkle tree over the share hashes)
-  * the block hash tree (Merkle tree over blocks of share data)
-  * the share data itself (erasure-coding of read-key-encrypted file data)
-  * the signature key, encrypted with the write key
-
-The access pattern for read is:
- * hash read-key to get storage index
- * use storage index to locate 'k' shares with identical 'R' values
-   * either get one share, read 'k' from it, then read k-1 shares
-   * or read, say, 5 shares, discover k, either get more or be finished
-   * or copy k into the URIs
- * read verification key
- * hash verification key, compare against verification key hash
- * read seqnum, R, encoding parameters, signature
- * verify signature against verification key
- * read share data, compute block-hash Merkle tree and root "r"
- * read share hash chain (leading from "r" to "R")
- * validate share hash chain up to the root "R"
- * submit share data to erasure decoding
- * decrypt decoded data with read-key
- * submit plaintext to application
-
-The access pattern for write is:
- * hash write-key to get read-key, hash read-key to get storage index
- * use the storage index to locate at least one share
- * read verification key and encrypted signature key
- * decrypt signature key using write-key
- * hash signature key, compare against write-key
- * hash verification key, compare against verification key hash
- * encrypt plaintext from application with read-key
-   * application can encrypt some data with the write-key to make it only
-     available to writers (use this for transitive read-onlyness of dirnodes)
- * erasure-code crypttext to form shares
- * split shares into blocks
- * compute Merkle tree of blocks, giving root "r" for each share
- * compute Merkle tree of shares, find root "R" for the file as a whole
- * create share data structures, one per server:
-   * use seqnum which is one higher than the old version
-   * share hash chain has log(N) hashes, different for each server
-   * signed data is the same for each server
- * now we have N shares and need homes for them
- * walk through peers
-   * if share is not already present, allocate-and-set
-   * otherwise, try to modify existing share:
-   * send testv_and_writev operation to each one
-   * testv says to accept share if their(seqnum+R) <= our(seqnum+R)
-   * count how many servers wind up with which versions (histogram over R)
-   * keep going until N servers have the same version, or we run out of servers
-     * if any servers wound up with a different version, report error to
-       application
-     * if we ran out of servers, initiate recovery process (described below)
-
-=== Server Storage Protocol ===
-
-The storage servers will provide a mutable slot container which is oblivious
-to the details of the data being contained inside it. Each storage index
-refers to a "bucket", and each bucket has one or more shares inside it. (In a
-well-provisioned network, each bucket will have only one share). The bucket
-is stored as a directory, using the base32-encoded storage index as the
-directory name. Each share is stored in a single file, using the share number
-as the filename.
-
-The container holds space for a container magic number (for versioning), the
-write enabler, the nodeid which accepted the write enabler (used for share
-migration, described below), a small number of lease structures, the embedded
-data itself, and expansion space for additional lease structures.
-
- #   offset    size    name
- 1   0         32      magic verstr "tahoe mutable container v1" plus binary
- 2   32        20      write enabler's nodeid
- 3   52        32      write enabler
- 4   84        8       data size (actual share data present) (a)
- 5   92        8       offset of (8) count of extra leases (after data)
- 6   100       368     four leases, 92 bytes each
-                        0    4   ownerid (0 means "no lease here")
-                        4    4   expiration timestamp
-                        8   32   renewal token
-                        40  32   cancel token
-                        72  20   nodeid which accepted the tokens
- 7   468       (a)     data
- 8   ??        4       count of extra leases
- 9   ??        n*92    extra leases
-
-The "extra leases" field must be copied and rewritten each time the size of
-the enclosed data changes. The hope is that most buckets will have four or
-fewer leases and this extra copying will not usually be necessary.
-
-The (4) "data size" field contains the actual number of bytes of data present
-in field (7), such that a client request to read beyond 504+(a) will result
-in an error. This allows the client to (one day) read relative to the end of
-the file. The container size (that is, (8)-(7)) might be larger, especially
-if extra size was pre-allocated in anticipation of filling the container with
-a lot of data.
-
-The offset in (5) points at the *count* of extra leases, at (8). The actual
-leases (at (9)) begin 4 bytes later. If the container size changes, both (8)
-and (9) must be relocated by copying.
-
-The server will honor any write commands that provide the write token and do
-not exceed the server-wide storage size limitations. Read and write commands
-MUST be restricted to the 'data' portion of the container: the implementation
-of those commands MUST perform correct bounds-checking to make sure other
-portions of the container are inaccessible to the clients.
-
-The two methods provided by the storage server on these "MutableSlot" share
-objects are:
-
- * readv(ListOf(offset=int, length=int))
-   * returns a list of bytestrings, of the various requested lengths
-   * offset < 0 is interpreted relative to the end of the data
-   * spans which hit the end of the data will return truncated data
-
- * testv_and_writev(write_enabler, test_vector, write_vector)
-   * this is a test-and-set operation which performs the given tests and only
-     applies the desired writes if all tests succeed. This is used to detect
-     simultaneous writers, and to reduce the chance that an update will lose
-     data recently written by some other party (written after the last time
-     this slot was read).
-   * test_vector=ListOf(TupleOf(offset, length, opcode, specimen))
-   * the opcode is a string, from the set [gt, ge, eq, le, lt, ne]
-   * each element of the test vector is read from the slot's data and 
-     compared against the specimen using the desired (in)equality. If all
-     tests evaluate True, the write is performed
-   * write_vector=ListOf(TupleOf(offset, newdata))
-     * offset < 0 is not yet defined, it probably means relative to the
-       end of the data, which probably means append, but we haven't nailed
-       it down quite yet
-     * write vectors are executed in order, which specifies the results of
-       overlapping writes
-   * return value:
-     * error: OutOfSpace
-     * error: something else (io error, out of memory, whatever)
-     * (True, old_test_data): the write was accepted (test_vector passed)
-     * (False, old_test_data): the write was rejected (test_vector failed)
-       * both 'accepted' and 'rejected' return the old data that was used
-         for the test_vector comparison. This can be used by the client
-         to detect write collisions, including collisions for which the
-         desired behavior was to overwrite the old version.
-
-In addition, the storage server provides several methods to access these
-share objects:
-
- * allocate_mutable_slot(storage_index, sharenums=SetOf(int))
-   * returns DictOf(int, MutableSlot)
- * get_mutable_slot(storage_index)
-   * returns DictOf(int, MutableSlot)
-   * or raises KeyError
-
-We intend to add an interface which allows small slots to allocate-and-write
-in a single call, as well as do update or read in a single call. The goal is
-to allow a reasonably-sized dirnode to be created (or updated, or read) in
-just one round trip (to all N shareholders in parallel).
-
-==== migrating shares ====
-
-If a share must be migrated from one server to another, two values become
-invalid: the write enabler (since it was computed for the old server), and
-the lease renew/cancel tokens.
-
-Suppose that a slot was first created on nodeA, and was thus initialized with
-WE(nodeA) (= H(WEM+nodeA)). Later, for provisioning reasons, the share is
-moved from nodeA to nodeB.
-
-Readers may still be able to find the share in its new home, depending upon
-how many servers are present in the grid, where the new nodeid lands in the
-permuted index for this particular storage index, and how many servers the
-reading client is willing to contact.
-
-When a client attempts to write to this migrated share, it will get a "bad
-write enabler" error, since the WE it computes for nodeB will not match the
-WE(nodeA) that was embedded in the share. When this occurs, the "bad write
-enabler" message must include the old nodeid (e.g. nodeA) that was in the
-share.
-
-The client then computes H(nodeB+H(WEM+nodeA)), which is the same as
-H(nodeB+WE(nodeA)). The client sends this along with the new WE(nodeB), which
-is H(WEM+nodeB). Note that the client only sends WE(nodeB) to nodeB, never to
-anyone else. Also note that the client does not send a value to nodeB that
-would allow the node to impersonate the client to a third node: everything
-sent to nodeB will include something specific to nodeB in it.
-
-The server locally computes H(nodeB+WE(nodeA)), using its own node id and the
-old write enabler from the share. It compares this against the value supplied
-by the client. If they match, this serves as proof that the client was able
-to compute the old write enabler. The server then accepts the client's new
-WE(nodeB) and writes it into the container.
-
-This WE-fixup process requires an extra round trip, and requires the error
-message to include the old nodeid, but does not require any public key
-operations on either client or server.
-
-Migrating the leases will require a similar protocol. This protocol will be
-defined concretely at a later date.
-
-=== Code Details ===
-
-The MutableFileNode class is used to manipulate mutable files (as opposed to
-ImmutableFileNodes). These are initially generated with
-client.create_mutable_file(), and later recreated from URIs with
-client.create_node_from_uri(). Instances of this class will contain a URI and
-a reference to the client (for peer selection and connection).
-
-NOTE: this section is out of date. Please see src/allmydata/interfaces.py
-(the section on IMutableFilesystemNode) for more accurate information.
-
-The methods of MutableFileNode are:
-
- * download_to_data() -> [deferred] newdata, NotEnoughSharesError
-   * if there are multiple retrieveable versions in the grid, get() returns
-     the first version it can reconstruct, and silently ignores the others.
-     In the future, a more advanced API will signal and provide access to
-     the multiple heads.
- * update(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError
- * overwrite(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError
-
-download_to_data() causes a new retrieval to occur, pulling the current
-contents from the grid and returning them to the caller. At the same time,
-this call caches information about the current version of the file. This
-information will be used in a subsequent call to update(), and if another
-change has occured between the two, this information will be out of date,
-triggering the UncoordinatedWriteError.
-
-update() is therefore intended to be used just after a download_to_data(), in
-the following pattern:
-
- d = mfn.download_to_data()
- d.addCallback(apply_delta)
- d.addCallback(mfn.update)
-
-If the update() call raises UCW, then the application can simply return an
-error to the user ("you violated the Prime Coordination Directive"), and they
-can try again later. Alternatively, the application can attempt to retry on
-its own. To accomplish this, the app needs to pause, download the new
-(post-collision and post-recovery) form of the file, reapply their delta,
-then submit the update request again. A randomized pause is necessary to
-reduce the chances of colliding a second time with another client that is
-doing exactly the same thing:
-
- d = mfn.download_to_data()
- d.addCallback(apply_delta)
- d.addCallback(mfn.update)
- def _retry(f):
-   f.trap(UncoordinatedWriteError)
-   d1 = pause(random.uniform(5, 20))
-   d1.addCallback(lambda res: mfn.download_to_data())
-   d1.addCallback(apply_delta)
-   d1.addCallback(mfn.update)
-   return d1
- d.addErrback(_retry)
-
-Enthusiastic applications can retry multiple times, using a randomized
-exponential backoff between each. A particularly enthusiastic application can
-retry forever, but such apps are encouraged to provide a means to the user of
-giving up after a while.
-
-UCW does not mean that the update was not applied, so it is also a good idea
-to skip the retry-update step if the delta was already applied:
-
- d = mfn.download_to_data()
- d.addCallback(apply_delta)
- d.addCallback(mfn.update)
- def _retry(f):
-   f.trap(UncoordinatedWriteError)
-   d1 = pause(random.uniform(5, 20))
-   d1.addCallback(lambda res: mfn.download_to_data())
-   def _maybe_apply_delta(contents):
-     new_contents = apply_delta(contents)
-     if new_contents != contents:
-       return mfn.update(new_contents)
-   d1.addCallback(_maybe_apply_delta)
-   return d1
- d.addErrback(_retry)
-
-update() is the right interface to use for delta-application situations, like
-directory nodes (in which apply_delta might be adding or removing child
-entries from a serialized table).
-
-Note that any uncoordinated write has the potential to lose data. We must do
-more analysis to be sure, but it appears that two clients who write to the
-same mutable file at the same time (even if both eventually retry) will, with
-high probability, result in one client observing UCW and the other silently
-losing their changes. It is also possible for both clients to observe UCW.
-The moral of the story is that the Prime Coordination Directive is there for
-a reason, and that recovery/UCW/retry is not a subsitute for write
-coordination.
-
-overwrite() tells the client to ignore this cached version information, and
-to unconditionally replace the mutable file's contents with the new data.
-This should not be used in delta application, but rather in situations where
-you want to replace the file's contents with completely unrelated ones. When
-raw files are uploaded into a mutable slot through the tahoe webapi (using
-POST and the ?mutable=true argument), they are put in place with overwrite().
-
-
-
-The peer-selection and data-structure manipulation (and signing/verification)
-steps will be implemented in a separate class in allmydata/mutable.py .
-
-=== SMDF Slot Format ===
-
-This SMDF data lives inside a server-side MutableSlot container. The server
-is oblivious to this format.
-
-This data is tightly packed. In particular, the share data is defined to run
-all the way to the beginning of the encrypted private key (the encprivkey
-offset is used both to terminate the share data and to begin the encprivkey).
-
- #    offset   size    name
- 1    0        1       version byte, \x00 for this format
- 2    1        8       sequence number. 2^64-1 must be handled specially, TBD
- 3    9        32      "R" (root of share hash Merkle tree)
- 4    41       16      IV (share data is AES(H(readkey+IV)) )
- 5    57       18      encoding parameters:
-       57       1        k
-       58       1        N
-       59       8        segment size
-       67       8        data length (of original plaintext)
- 6    75       32      offset table:
-       75       4        (8) signature
-       79       4        (9) share hash chain
-       83       4        (10) block hash tree
-       87       4        (11) share data
-       91       8        (12) encrypted private key
-       99       8        (13) EOF
- 7    107      436ish  verification key (2048 RSA key)
- 8    543ish   256ish  signature=RSAenc(sigkey, H(version+seqnum+r+IV+encparm))
- 9    799ish   (a)     share hash chain, encoded as:
-                        "".join([pack(">H32s", shnum, hash)
-                                 for (shnum,hash) in needed_hashes])
-10    (927ish) (b)     block hash tree, encoded as:
-                        "".join([pack(">32s",hash) for hash in block_hash_tree])
-11    (935ish) LEN     share data (no gap between this and encprivkey)
-12    ??       1216ish encrypted private key= AESenc(write-key, RSA-key)
-13    ??       --      EOF
-
-(a) The share hash chain contains ceil(log(N)) hashes, each 32 bytes long.
-    This is the set of hashes necessary to validate this share's leaf in the
-    share Merkle tree. For N=10, this is 4 hashes, i.e. 128 bytes.
-(b) The block hash tree contains ceil(length/segsize) hashes, each 32 bytes
-    long. This is the set of hashes necessary to validate any given block of
-    share data up to the per-share root "r". Each "r" is a leaf of the share
-    has tree (with root "R"), from which a minimal subset of hashes is put in
-    the share hash chain in (8).
-
-=== Recovery ===
-
-The first line of defense against damage caused by colliding writes is the
-Prime Coordination Directive: "Don't Do That".
-
-The second line of defense is to keep "S" (the number of competing versions)
-lower than N/k. If this holds true, at least one competing version will have
-k shares and thus be recoverable. Note that server unavailability counts
-against us here: the old version stored on the unavailable server must be
-included in the value of S.
-
-The third line of defense is our use of testv_and_writev() (described below),
-which increases the convergence of simultaneous writes: one of the writers
-will be favored (the one with the highest "R"), and that version is more
-likely to be accepted than the others. This defense is least effective in the
-pathological situation where S simultaneous writers are active, the one with
-the lowest "R" writes to N-k+1 of the shares and then dies, then the one with
-the next-lowest "R" writes to N-2k+1 of the shares and dies, etc, until the
-one with the highest "R" writes to k-1 shares and dies. Any other sequencing
-will allow the highest "R" to write to at least k shares and establish a new
-revision.
-
-The fourth line of defense is the fact that each client keeps writing until
-at least one version has N shares. This uses additional servers, if
-necessary, to make sure that either the client's version or some
-newer/overriding version is highly available.
-
-The fifth line of defense is the recovery algorithm, which seeks to make sure
-that at least *one* version is highly available, even if that version is
-somebody else's.
-
-The write-shares-to-peers algorithm is as follows:
-
- * permute peers according to storage index
- * walk through peers, trying to assign one share per peer
- * for each peer:
-   * send testv_and_writev, using "old(seqnum+R) <= our(seqnum+R)" as the test
-     * this means that we will overwrite any old versions, and we will
-       overwrite simultaenous writers of the same version if our R is higher.
-       We will not overwrite writers using a higher seqnum.
-   * record the version that each share winds up with. If the write was
-     accepted, this is our own version. If it was rejected, read the
-     old_test_data to find out what version was retained.
-   * if old_test_data indicates the seqnum was equal or greater than our
-     own, mark the "Simultanous Writes Detected" flag, which will eventually
-     result in an error being reported to the writer (in their close() call).
-   * build a histogram of "R" values
-   * repeat until the histogram indicate that some version (possibly ours)
-     has N shares. Use new servers if necessary.
-   * If we run out of servers:
-     * if there are at least shares-of-happiness of any one version, we're
-       happy, so return. (the close() might still get an error)
-     * not happy, need to reinforce something, goto RECOVERY
-
-RECOVERY:
- * read all shares, count the versions, identify the recoverable ones,
-   discard the unrecoverable ones.
- * sort versions: locate max(seqnums), put all versions with that seqnum
-   in the list, sort by number of outstanding shares. Then put our own
-   version. (TODO: put versions with seqnum <max but >us ahead of us?).
- * for each version:
-   * attempt to recover that version
-   * if not possible, remove it from the list, go to next one
-   * if recovered, start at beginning of peer list, push that version,
-     continue until N shares are placed
-   * if pushing our own version, bump up the seqnum to one higher than
-     the max seqnum we saw
-   * if we run out of servers:
-     * schedule retry and exponential backoff to repeat RECOVERY
-   * admit defeat after some period? presumeably the client will be shut down
-     eventually, maybe keep trying (once per hour?) until then.
-
-
-
-
-== Medium Distributed Mutable Files ==
-
-These are just like the SDMF case, but:
-
- * we actually take advantage of the Merkle hash tree over the blocks, by
-   reading a single segment of data at a time (and its necessary hashes), to
-   reduce the read-time alacrity
- * we allow arbitrary writes to the file (i.e. seek() is provided, and
-   O_TRUNC is no longer required)
- * we write more code on the client side (in the MutableFileNode class), to
-   first read each segment that a write must modify. This looks exactly like
-   the way a normal filesystem uses a block device, or how a CPU must perform
-   a cache-line fill before modifying a single word.
- * we might implement some sort of copy-based atomic update server call,
-   to allow multiple writev() calls to appear atomic to any readers.
-
-MDMF slots provide fairly efficient in-place edits of very large files (a few
-GB). Appending data is also fairly efficient, although each time a power of 2
-boundary is crossed, the entire file must effectively be re-uploaded (because
-the size of the block hash tree changes), so if the filesize is known in
-advance, that space ought to be pre-allocated (by leaving extra space between
-the block hash tree and the actual data).
-
-MDMF1 uses the Merkle tree to enable low-alacrity random-access reads. MDMF2
-adds cache-line reads to allow random-access writes.
-
-== Large Distributed Mutable Files ==
-
-LDMF slots use a fundamentally different way to store the file, inspired by
-Mercurial's "revlog" format. They enable very efficient insert/remove/replace
-editing of arbitrary spans. Multiple versions of the file can be retained, in
-a revision graph that can have multiple heads. Each revision can be
-referenced by a cryptographic identifier. There are two forms of the URI, one
-that means "most recent version", and a longer one that points to a specific
-revision.
-
-Metadata can be attached to the revisions, like timestamps, to enable rolling
-back an entire tree to a specific point in history.
-
-LDMF1 provides deltas but tries to avoid dealing with multiple heads. LDMF2
-provides explicit support for revision identifiers and branching.
-
-== TODO ==
-
-improve allocate-and-write or get-writer-buckets API to allow one-call (or
-maybe two-call) updates. The challenge is in figuring out which shares are on
-which machines. First cut will have lots of round trips.
-
-(eventually) define behavior when seqnum wraps. At the very least make sure
-it can't cause a security problem. "the slot is worn out" is acceptable.
-
-(eventually) define share-migration lease update protocol. Including the
-nodeid who accepted the lease is useful, we can use the same protocol as we
-do for updating the write enabler. However we need to know which lease to
-update.. maybe send back a list of all old nodeids that we find, then try all
-of them when we accept the update?
-
- We now do this in a specially-formatted IndexError exception:
-  "UNABLE to renew non-existent lease. I have leases accepted by " +
-  "nodeids: '12345','abcde','44221' ."
-
-confirm that a repairer can regenerate shares without the private key. Hmm,
-without the write-enabler they won't be able to write those shares to the
-servers.. although they could add immutable new shares to new servers.
diff --git a/docs/specifications/CHK-hashes.svg b/docs/specifications/CHK-hashes.svg
new file mode 100644 (file)
index 0000000..22bd524
--- /dev/null
@@ -0,0 +1,723 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="/home/warner/trees/tahoe/docs"
+   sodipodi:docname="chk-hashes.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3237"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3391"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.58344932"
+     inkscape:cx="372.04724"
+     inkscape:cy="526.18109"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="791"
+     inkscape:window-height="827"
+     inkscape:window-x="591"
+     inkscape:window-y="150" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2168"
+       transform="translate(-8.75,0)">
+      <rect
+         y="80.555412"
+         x="53.132294"
+         height="135.40164"
+         width="197.10367"
+         id="rect2160"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text2162"
+         y="108.97614"
+         x="151.88493"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="108.97614"
+           x="151.88493"
+           id="tspan2164"
+           sodipodi:role="line">data</tspan><tspan
+           id="tspan2166"
+           y="132.97614"
+           x="151.88493"
+           sodipodi:role="line">(plaintext)</tspan></text>
+    </g>
+    <g
+       id="g2190"
+       transform="translate(-0.25,0)">
+      <rect
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect2178"
+         width="197.10367"
+         height="135.40164"
+         x="44.632294"
+         y="324.55542" />
+      <text
+         xml:space="preserve"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="143.38493"
+         y="352.97614"
+         id="text2180"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan2182"
+           x="143.38493"
+           y="352.97614">data</tspan><tspan
+           sodipodi:role="line"
+           x="143.38493"
+           y="376.97614"
+           id="tspan2184">(crypttext)</tspan></text>
+    </g>
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2198"
+       width="197.10367"
+       height="135.40164"
+       x="44.382294"
+       y="583.55542" />
+    <text
+       xml:space="preserve"
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="142.68532"
+       y="611.97614"
+       id="text2200"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="142.68532"
+         y="611.97614"
+         id="tspan2204">shares</tspan></text>
+    <g
+       id="g3193"
+       transform="translate(-10.413708,29.158381)">
+      <path
+         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         sodipodi:ry="20.567339"
+         sodipodi:rx="20.567339"
+         sodipodi:cy="133.6877"
+         sodipodi:cx="418.20258"
+         id="path2212"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path3185"
+         sodipodi:cx="418.20258"
+         sodipodi:cy="133.6877"
+         sodipodi:rx="20.567339"
+         sodipodi:ry="20.567339"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" />
+      <path
+         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         sodipodi:ry="20.567339"
+         sodipodi:rx="20.567339"
+         sodipodi:cy="133.6877"
+         sodipodi:cx="418.20258"
+         id="path3187"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path3189"
+         d="M 396.76226,145.32825 L 407.17597,134.91454"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         id="path3191"
+         d="M 433.21024,147.41099 L 423.8379,134.91454"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <g
+       id="g3200"
+       transform="translate(-9.3723369,269.71503)">
+      <path
+         sodipodi:type="arc"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path3202"
+         sodipodi:cx="418.20258"
+         sodipodi:cy="133.6877"
+         sodipodi:rx="20.567339"
+         sodipodi:ry="20.567339"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" />
+      <path
+         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         sodipodi:ry="20.567339"
+         sodipodi:rx="20.567339"
+         sodipodi:cy="133.6877"
+         sodipodi:cx="418.20258"
+         id="path3204"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path3206"
+         sodipodi:cx="418.20258"
+         sodipodi:cy="133.6877"
+         sodipodi:rx="20.567339"
+         sodipodi:ry="20.567339"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 396.76226,145.32825 L 407.17597,134.91454"
+         id="path3208" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 433.21024,147.41099 L 423.8379,134.91454"
+         id="path3210" />
+    </g>
+    <g
+       transform="translate(-6.2482246,538.38869)"
+       id="g3212">
+      <path
+         transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         sodipodi:ry="20.567339"
+         sodipodi:rx="20.567339"
+         sodipodi:cy="133.6877"
+         sodipodi:cx="418.20258"
+         id="path3214"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path3216"
+         sodipodi:cx="418.20258"
+         sodipodi:cy="133.6877"
+         sodipodi:rx="20.567339"
+         sodipodi:ry="20.567339"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" />
+      <path
+         transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)"
+         d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1  397.63524,133.6877 A 20.567339 20.567339 0 1 1  438.76991 133.6877 z"
+         sodipodi:ry="20.567339"
+         sodipodi:rx="20.567339"
+         sodipodi:cy="133.6877"
+         sodipodi:cx="418.20258"
+         id="path3218"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="path3220"
+         d="M 396.76226,145.32825 L 407.17597,134.91454"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         id="path3222"
+         d="M 433.21024,147.41099 L 423.8379,134.91454"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="399.88635"
+       y="110.96302"
+       id="text3224"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3226"
+         x="399.88635"
+         y="110.96302">plaintext</tspan><tspan
+         sodipodi:role="line"
+         x="399.88635"
+         y="130.96302"
+         id="tspan3228">hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="400.92773"
+       y="350.4783"
+       id="text3230"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3232"
+         x="400.92773"
+         y="350.4783">crypttext</tspan><tspan
+         sodipodi:role="line"
+         x="400.92773"
+         y="370.4783"
+         id="tspan3234">hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="405.09323"
+       y="618.1106"
+       id="text3236"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3238"
+         x="405.09323"
+         y="618.1106">share</tspan><tspan
+         sodipodi:role="line"
+         x="405.09323"
+         y="638.1106"
+         id="tspan3240">hash tree</tspan></text>
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.05825377;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3242"
+       width="207.32907"
+       height="421.5722"
+       x="527.92419"
+       y="161.13995" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="536.46478"
+       y="183.39211"
+       id="text3244"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3246"
+         x="536.46478"
+         y="183.39211">URI Extension Block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="536.95264"
+       y="245.09413"
+       id="text3248"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3250"
+         x="536.95264"
+         y="245.09413">plaintext root</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="536.95264"
+       y="281.08698"
+       id="text3252"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3254"
+         x="536.95264"
+         y="281.08698">plaintext (flat) hash</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="540.59265"
+       y="435.34201"
+       id="text3256"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3258"
+         x="540.59265"
+         y="435.34201">crypttext root</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="540.59265"
+       y="483.33246"
+       id="text3260"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3262"
+         x="540.59265"
+         y="483.33246">crypttext (flat) hash</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="539.89264"
+       y="558.74603"
+       id="text3264"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3266"
+         x="539.89264"
+         y="558.74603">share root</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+       d="M 239.95229,183.39211 L 363.35632,183.39211"
+       id="path3383" />
+    <path
+       id="path3583"
+       d="M 239.95229,425.05834 L 363.35632,425.05834"
+       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+       d="M 239.95229,692.43375 L 363.35632,692.43375"
+       id="path3585" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 417.58968,150.5351 C 470.69959,151.57647 472.62807,183.93923 479.03055,202.60364 C 487.14356,226.25457 499.85797,233.58442 529.01635,241.13436"
+       id="path3589"
+       sodipodi:nodetypes="csz" />
+    <path
+       sodipodi:nodetypes="csz"
+       id="path3591"
+       d="M 421.75516,391.09175 C 449.87218,392.13312 454.33789,400.8898 470.69958,411.91917 C 496.5159,429.32187 494.65112,422.07253 523.8095,429.62247"
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 420.71379,662.88952 C 420.71379,662.88952 471.01868,647.53267 473.30302,607.17618 C 475.6461,565.78169 496.083,554.97747 525.89224,551.46284"
+       id="path3595"
+       sodipodi:nodetypes="czz" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 241.59802,201.56227 C 288.98039,203.12433 310.58883,210.67426 381.1417,228.63791 C 451.69457,246.60156 477.72883,273.67719 523.80949,273.41685"
+       id="path3599"
+       sodipodi:nodetypes="czz" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 243.68076,448.36714 C 296.26998,448.88782 323.60597,457.47913 393.63815,465.02907 C 463.67033,472.57901 487.62186,479.8686 523.80949,478.56689"
+       id="path3601"
+       sodipodi:nodetypes="czz" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3603"
+       width="611.87836"
+       height="109.69247"
+       x="54.846237"
+       y="807.26807" />
+    <text
+       xml:space="preserve"
+       style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="329.71826"
+       y="910.10474"
+       id="text3605"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3607"
+         x="329.71826"
+         y="910.10474">URI</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="159.39687"
+       y="841.54694"
+       id="text3609"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3611"
+         x="159.39687"
+         y="841.54694">encryption</tspan><tspan
+         sodipodi:role="line"
+         x="159.39687"
+         y="861.54694"
+         id="tspan3613">key</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="359.92844"
+       y="842.72693"
+       id="text3615"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3617"
+         x="359.92844"
+         y="842.72693">storage</tspan><tspan
+         sodipodi:role="line"
+         x="359.92844"
+         y="862.72693"
+         id="tspan3619">index</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="570.74371"
+       y="844.42694"
+       id="text3621"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3623"
+         x="570.74371"
+         y="844.42694">UEB</tspan><tspan
+         sodipodi:role="line"
+         x="570.74371"
+         y="864.42694"
+         id="tspan3625">hash</tspan></text>
+    <path
+       style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:9,9;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 267.37541,557.0321 L 315.36587,66.843852 L 740.4242,73.699632 L 740.4242,752.42182 L 418.20256,752.42182 L 416.48862,713.00109 L 356.50054,646.15724 L 310.22403,661.58274 L 190.24789,659.8688 L 191.96183,557.0321 L 267.37541,557.0321 z "
+       id="path3627"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 358.21449,824.40751 C 362.49935,783.27283 382.20972,758.84911 414.77467,740.42421"
+       id="path3629"
+       sodipodi:nodetypes="cz" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 629.01779,582.74128 C 623.87595,661.15426 575.88549,723.71325 574.17154,814.12384"
+       id="path3631"
+       sodipodi:nodetypes="cz" />
+    <g
+       id="g3434">
+      <path
+         transform="translate(1.7139449,-5.1418348)"
+         d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1  101.12275,278.51605 A 36.849815 23.138256 0 1 1  174.82238 278.51605 z"
+         sodipodi:ry="23.138256"
+         sodipodi:rx="36.849815"
+         sodipodi:cy="278.51605"
+         sodipodi:cx="137.97256"
+         id="path3635"
+         style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3637"
+         y="281.24622"
+         x="115.93739"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="281.24622"
+           x="115.93739"
+           id="tspan3639"
+           sodipodi:role="line">AES</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+       d="M 133.6877,212.52917 L 135.40165,250.23596"
+       id="path3646" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+       d="M 138.82954,296.51247 L 138.82954,323.93559"
+       id="path3648" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 147.39926,817.55173 C 123.40403,754.13577 56.155146,767.27832 30.851008,736.99632 C 4.7133492,705.71682 5.5877376,315.58243 32.564954,281.08697 C 58.702614,247.66504 65.129907,260.94812 101.12275,272.51724"
+       id="path3650"
+       sodipodi:nodetypes="czzz" />
+    <g
+       id="g3426">
+      <path
+         transform="translate(-1.7139449,243.38018)"
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path3219"
+         sodipodi:cx="137.97256"
+         sodipodi:cy="278.51605"
+         sodipodi:rx="36.849815"
+         sodipodi:ry="23.138256"
+         d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1  101.12275,278.51605 A 36.849815 23.138256 0 1 1  174.82238 278.51605 z" />
+      <text
+         xml:space="preserve"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="112.5095"
+         y="529.76825"
+         id="text3221"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan3223"
+           x="112.5095"
+           y="529.76825">FEC</tspan></text>
+    </g>
+    <path
+       id="path3445"
+       d="M 195.38972,855.25852 L 318.79375,855.25852"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       id="path3447"
+       d="M 133.68771,457.62329 L 133.68771,498.75797"
+       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 133.68771,546.74843 L 133.68771,582.74127"
+       id="path3449"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path3451"
+       d="M 99.408806,943.93737 L 147.39926,943.93737"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="65.129906"
+       y="953.42938"
+       id="text3453"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3455"
+         x="65.129906"
+         y="953.42938">A</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="164.53871"
+       y="952.95337"
+       id="text3457"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="164.53871"
+         y="952.95337"
+         id="tspan3461">B :</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="217.67101"
+       y="952.95337"
+       id="text3465"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3467"
+         x="217.67101"
+         y="952.95337">B is derived from A by hashing, therefore B validates A</tspan></text>
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a10101;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 99.408806,969.64654 L 147.39926,969.64654"
+       id="path3469" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3471"
+       y="979.13855"
+       x="65.129906"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="979.13855"
+         x="65.129906"
+         id="tspan3473"
+         sodipodi:role="line">A</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3475"
+       y="978.66254"
+       x="164.53871"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         id="tspan3477"
+         y="978.66254"
+         x="164.53871"
+         sodipodi:role="line">B :</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3479"
+       y="978.66254"
+       x="217.67101"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="978.66254"
+         x="217.67101"
+         id="tspan3481"
+         sodipodi:role="line">B is derived from A by encryption or erasure coding</tspan></text>
+    <path
+       id="path3483"
+       d="M 99.408806,997.06966 L 147.39926,997.06966"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="65.129906"
+       y="1006.5616"
+       id="text3485"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3487"
+         x="65.129906"
+         y="1006.5616">A</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="164.53871"
+       y="1006.0856"
+       id="text3489"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="164.53871"
+         y="1006.0856"
+         id="tspan3491">B :</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="217.67101"
+       y="1006.0856"
+       id="text3493"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3495"
+         x="217.67101"
+         y="1006.0856">A is used as an index to retrieve data B</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#1bcc03;fill-opacity:1;stroke:#1bcc03;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="625.5899"
+       y="740.42419"
+       id="text3497"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3499"
+         x="625.5899"
+         y="740.42419">SHARE</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="249.20799"
+       y="30.851007"
+       id="text3501"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3503"
+         x="249.20799"
+         y="30.851007">CHK File Hashes</tspan></text>
+  </g>
+</svg>
diff --git a/docs/specifications/Makefile b/docs/specifications/Makefile
new file mode 100644 (file)
index 0000000..2625e04
--- /dev/null
@@ -0,0 +1,19 @@
+SOURCES = CHK-hashes.svg file-encoding1.svg file-encoding2.svg \
+       file-encoding3.svg file-encoding4.svg file-encoding5.svg \
+       file-encoding6.svg
+
+PNGS = $(patsubst %.svg,%.png,$(SOURCES))
+EPSS = $(patsubst %.svg,%.eps,$(SOURCES))
+
+.PHONY: images-png images-eps
+all: $(PNGS) $(EPSS)
+images-png: $(PNGS)
+images-eps: $(EPSS)
+
+%.png: %.svg
+       inkscape -b white -d 90 -D --export-png $@ $<
+%.eps: %.svg
+       inkscape --export-eps $@ $<
+
+clean:
+       rm -f *.png *.eps
diff --git a/docs/specifications/URI-extension.txt b/docs/specifications/URI-extension.txt
new file mode 100644 (file)
index 0000000..8ec383e
--- /dev/null
@@ -0,0 +1,61 @@
+
+"URI Extension Block"
+
+This block is a serialized dictionary with string keys and string values
+(some of which represent numbers, some of which are SHA-256 hashes). All
+buckets hold an identical copy. The hash of the serialized data is kept in
+the URI.
+
+The download process must obtain a valid copy of this data before any
+decoding can take place. The download process must also obtain other data
+before incremental validation can be performed. Full-file validation (for
+clients who do not wish to do incremental validation) can be performed solely
+with the data from this block.
+
+At the moment, this data block contains the following keys (and an estimate
+on their sizes):
+
+ size                5
+ segment_size        7
+ num_segments        2
+ needed_shares       2
+ total_shares        3
+
+ codec_name          3
+ codec_params        5+1+2+1+3=12
+ tail_codec_params   12
+
+ share_root_hash     32 (binary) or 52 (base32-encoded) each
+ plaintext_hash
+ plaintext_root_hash
+ crypttext_hash
+ crypttext_root_hash
+
+Some pieces are needed elsewhere (size should be visible without pulling the
+block, the Tahoe3 algorithm needs total_shares to find the right peers, all
+peer selection algorithms need needed_shares to ask a minimal set of peers).
+Some pieces are arguably redundant but are convenient to have present
+(test_encode.py makes use of num_segments).
+
+The rule for this data block is that it should be a constant size for all
+files, regardless of file size. Therefore hash trees (which have a size that
+depends linearly upon the number of segments) are stored elsewhere in the
+bucket, with only the hash tree root stored in this data block.
+
+This block will be serialized as follows:
+
+ assert that all keys match ^[a-zA-z_\-]+$
+ sort all the keys lexicographically
+ for k in keys:
+  write("%s:" % k)
+  write(netstring(data[k]))
+
+
+Serialized size:
+
+ dense binary (but decimal) packing: 160+46=206
+ including 'key:' (185) and netstring (6*3+7*4=46) on values: 231
+ including 'key:%d\n' (185+13=198) and printable values (46+5*52=306)=504
+
+We'll go with the 231-sized block, and provide a tool to dump it as text if
+we really want one.
diff --git a/docs/specifications/dirnodes.txt b/docs/specifications/dirnodes.txt
new file mode 100644 (file)
index 0000000..adc8fca
--- /dev/null
@@ -0,0 +1,433 @@
+
+= Tahoe Directory Nodes =
+
+As explained in the architecture docs, Tahoe can be roughly viewed as a
+collection of three layers. The lowest layer is the distributed filestore, or
+DHT: it provides operations that accept files and upload them to the mesh,
+creating a URI in the process which securely references the file's contents.
+The middle layer is the filesystem, creating a structure of directories and
+filenames resembling the traditional unix/windows filesystems. The top layer
+is the application layer, which uses the lower layers to provide useful
+services to users, like a backup application, or a way to share files with
+friends.
+
+This document examines the middle layer, the "filesystem".
+
+== DHT Primitives ==
+
+In the lowest layer (DHT), there are two operations that reference immutable
+data (which we refer to as "CHK URIs" or "CHK read-capabilities" or "CHK
+read-caps"). One puts data into the grid (but only if it doesn't exist
+already), the other retrieves it:
+
+ chk_uri = put(data)
+ data = get(chk_uri)
+
+We also have three operations which reference mutable data (which we refer to
+as "mutable slots", or "mutable write-caps and read-caps", or sometimes "SSK
+slots"). One creates a slot with some initial contents, a second replaces the
+contents of a pre-existing slot, and the third retrieves the contents:
+
+ mutable_uri = create(initial_data)
+ replace(mutable_uri, new_data)
+ data = get(mutable_uri)
+
+== Filesystem Goals ==
+
+The main goal for the middle (filesystem) layer is to give users a way to
+organize the data that they have uploaded into the mesh. The traditional way
+to do this in computer filesystems is to put this data into files, give those
+files names, and collect these names into directories.
+
+Each directory is a series of name-value pairs, which maps "child name" to an
+object of some kind. Those child objects might be files, or they might be
+other directories.
+
+The directory structure is therefore a directed graph of nodes, in which each
+node might be a directory node or a file node. All file nodes are terminal
+nodes.
+
+== Dirnode Goals ==
+
+What properties might be desirable for these directory nodes? In no
+particular order:
+
+ 1: functional. Code which does not work doesn't count.
+ 2: easy to document, explain, and understand
+ 3: confidential: it should not be possible for others to see the contents of
+                  a directory
+ 4: integrity: it should not be possible for others to modify the contents
+               of a directory
+ 5: available: directories should survive host failure, just like files do
+ 6: efficient: in storage, communication bandwidth, number of round-trips
+ 7: easy to delegate individual directories in a flexible way
+ 8: updateness: everybody looking at a directory should see the same contents
+ 9: monotonicity: everybody looking at a directory should see the same
+                  sequence of updates
+
+Some of these goals are mutually exclusive. For example, availability and
+consistency are opposing, so it is not possible to achieve #5 and #8 at the
+same time. Moreover, it takes a more complex architecture to get close to the
+available-and-consistent ideal, so #2/#6 is in opposition to #5/#8.
+
+Tahoe-0.7.0 introduced distributed mutable files, which use public key
+cryptography for integrity, and erasure coding for availability. These
+achieve roughly the same properties as immutable CHK files, but their
+contents can be replaced without changing their identity. Dirnodes are then
+just a special way of interpreting the contents of a specific mutable file.
+Earlier releases used a "vdrive server": this server was abolished in the
+0.7.0 release.
+
+For details of how mutable files work, please see "mutable.txt" in this
+directory.
+
+For the current 0.7.0 release, we achieve most of our desired properties. The
+integrity and availability of dirnodes is equivalent to that of regular
+(immutable) files, with the exception that there are more simultaneous-update
+failure modes for mutable slots. Delegation is quite strong: you can give
+read-write or read-only access to any subtree, and the data format used for
+dirnodes is such that read-only access is transitive: i.e. if you grant Bob
+read-only access to a parent directory, then Bob will get read-only access
+(and *not* read-write access) to its children.
+
+Relative to the previous "vdrive-server" based scheme, the current
+distributed dirnode approach gives better availability, but cannot guarantee
+updateness quite as well, and requires far more network traffic for each
+retrieval and update. Mutable files are somewhat less available than
+immutable files, simply because of the increased number of combinations
+(shares of an immutable file are either present or not, whereas there are
+multiple versions of each mutable file, and you might have some shares of
+version 1 and other shares of version 2). In extreme cases of simultaneous
+update, mutable files might suffer from non-monotonicity.
+
+
+== Dirnode secret values ==
+
+As mentioned before, dirnodes are simply a special way to interpret the
+contents of a mutable file, so the secret keys and capability strings
+described in "mutable.txt" are all the same. Each dirnode contains an RSA
+public/private keypair, and the holder of the "write capability" will be able
+to retrieve the private key (as well as the AES encryption key used for the
+data itself). The holder of the "read capability" will be able to obtain the
+public key and the AES data key, but not the RSA private key needed to modify
+the data.
+
+The "write capability" for a dirnode grants read-write access to its
+contents. This is expressed on concrete form as the "dirnode write cap": a
+printable string which contains the necessary secrets to grant this access.
+Likewise, the "read capability" grants read-only access to a dirnode, and can
+be represented by a "dirnode read cap" string.
+
+For example,
+URI:DIR2:swdi8ge1s7qko45d3ckkyw1aac%3Aar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o
+is a write-capability URI, while
+URI:DIR2-RO:buxjqykt637u61nnmjg7s8zkny:ar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o
+is a read-capability URI, both for the same dirnode.
+
+
+== Dirnode storage format ==
+
+Each dirnode is stored in a single mutable file, distributed in the Tahoe
+grid. The contents of this file are a serialized list of netstrings, one per
+child. Each child is a list of four netstrings: (name, rocap, rwcap,
+metadata). (remember that the contents of the mutable file are encrypted by
+the read-cap, so this section describes the plaintext contents of the mutable
+file, *after* it has been decrypted by the read-cap).
+
+The name is simple a UTF-8 -encoded child name. The 'rocap' is a read-only
+capability URI to that child, either an immutable (CHK) file, a mutable file,
+or a directory. The 'rwcap' is a read-write capability URI for that child,
+encrypted with the dirnode's write-cap: this enables the "transitive
+readonlyness" property, described further below. The 'metadata' is a
+JSON-encoded dictionary of type,value metadata pairs. Some metadata keys are
+pre-defined, the rest are left up to the application.
+
+Each rwcap is stored as IV + ciphertext + MAC. The IV is a 16-byte random
+value. The ciphertext is obtained by using AES in CTR mode on the rwcap URI
+string, using a key that is formed from a tagged hash of the IV and the
+dirnode's writekey. The MAC is a 32-byte SHA-256 -based HMAC (using that same
+AES key) over the (IV+ciphertext) pair.
+
+If Bob has read-only access to the 'bar' directory, and he adds it as a child
+to the 'foo' directory, then he will put the read-only cap for 'bar' in both
+the rwcap and rocap slots (encrypting the rwcap contents as described above).
+If he has full read-write access to 'bar', then he will put the read-write
+cap in the 'rwcap' slot, and the read-only cap in the 'rocap' slot. Since
+other users who have read-only access to 'foo' will be unable to decrypt its
+rwcap slot, this limits those users to read-only access to 'bar' as well,
+thus providing the transitive readonlyness that we desire.
+
+=== Dirnode sizes, mutable-file initial read sizes ===
+
+How big are dirnodes? When reading dirnode data out of mutable files, how
+large should our initial read be? If we guess exactly, we can read a dirnode
+in a single round-trip, and update one in two RTT. If we guess too high,
+we'll waste some amount of bandwidth. If we guess low, we need to make a
+second pass to get the data (or the encrypted privkey, for writes), which
+will cost us at least another RTT.
+
+Assuming child names are between 10 and 99 characters long, how long are the
+various pieces of a dirnode?
+
+ netstring(name) ~= 4+len(name)
+ chk-cap = 97 (for 4-char filesizes)
+ dir-rw-cap = 88
+ dir-ro-cap = 91
+ netstring(cap) = 4+len(cap)
+ encrypted(cap) = 16+cap+32
+ JSON({}) = 2
+ JSON({ctime=float,mtime=float}): 57
+ netstring(metadata) = 4+57 = 61
+
+so a CHK entry is:
+ 5+ 4+len(name) + 4+97 + 5+16+97+32 + 4+57
+And a 15-byte filename gives a 336-byte entry. When the entry points at a
+subdirectory instead of a file, the entry is a little bit smaller. So an
+empty directory uses 0 bytes, a directory with one child uses about 336
+bytes, a directory with two children uses about 672, etc.
+
+When the dirnode data is encoding using our default 3-of-10, that means we
+get 112ish bytes of data in each share per child.
+
+The pubkey, signature, and hashes form the first 935ish bytes of the
+container, then comes our data, then about 1216 bytes of encprivkey. So if we
+read the first:
+
+ 1kB: we get 65bytes of dirnode data : only empty directories
+ 1kiB: 89bytes of dirnode data : maybe one short-named subdir
+ 2kB: 1065bytes: about 9 entries
+ 3kB: 2065bytes: about 18 entries, or 7.5 entries plus the encprivkey
+ 4kB: 3065bytes: about 27 entries, or about 16.5 plus the encprivkey
+
+So we've written the code to do an initial read of 2kB from each share when
+we read the mutable file, which should give good performance (one RTT) for
+small directories.
+
+
+== Design Goals, redux ==
+
+How well does this design meet the goals?
+
+ #1 functional: YES: the code works and has extensive unit tests
+ #2 documentable: YES: this document is the existence proof
+ #3 confidential: YES: see below
+ #4 integrity: MOSTLY: a coalition of storage servers can rollback individual
+                       mutable files, but not a single one. No server can
+                       substitute fake data as genuine.
+ #5 availability: YES: as long as 'k' storage servers are present and have
+                       the same version of the mutable file, the dirnode will
+                       be available.
+ #6 efficient: MOSTLY:
+      network: single dirnode lookup is very efficient, since clients can
+               fetch specific keys rather than being required to get or set
+               the entire dirnode each time. Traversing many directories
+               takes a lot of roundtrips, and these can't be collapsed with
+               promise-pipelining because the intermediate values must only
+               be visible to the client. Modifying many dirnodes at once
+               (e.g. importing a large pre-existing directory tree) is pretty
+               slow, since each graph edge must be created independently.
+      storage: each child has a separate IV, which makes them larger than
+               if all children were aggregated into a single encrypted string
+ #7 delegation: VERY: each dirnode is a completely independent object,
+                to which clients can be granted separate read-write or
+                read-only access
+ #8 updateness: VERY: with only a single point of access, and no caching,
+                each client operation starts by fetching the current
+                value, so there are no opportunities for staleness
+ #9 monotonicity: VERY: the single point of access also protects against
+                  retrograde motion
+     
+
+
+=== Confidentiality leaks in the vdrive server ===
+
+Dirnode (and the mutable files upon which they are based) are very private
+against other clients: traffic between the client and the storage servers is
+protected by the Foolscap SSL connection, so they can observe very little.
+Storage index values are hashes of secrets and thus unguessable, and they are
+not made public, so other clients cannot snoop through encrypted dirnodes
+that they have not been told about.
+
+Storage servers can observe access patterns and see ciphertext, but they
+cannot see the plaintext (of child names, metadata, or URIs). If an attacker
+operates a significant number of storage servers, they can infer the shape of
+the directory structure by assuming that directories are usually accessed
+from root to leaf in rapid succession. Since filenames are usually much
+shorter than read-caps and write-caps, the attacker can use the length of the
+ciphertext to guess the number of children of each node, and might be able to
+guess the length of the child names (or at least their sum). From this, the
+attacker may be able to build up a graph with the same shape as the plaintext
+filesystem, but with unlabeled edges and unknown file contents.
+
+
+=== Integrity failures in the vdrive server ===
+
+The mutable file's integrity mechanism (RSA signature on the hash of the file
+contents) prevents the storage server from modifying the dirnode's contents
+without detection. Therefore the storage servers can make the dirnode
+unavailable, but not corrupt it.
+
+A sufficient number of colluding storage servers can perform a rollback
+attack: replace all shares of the whole mutable file with an earlier version.
+TODO: To prevent this, when retrieving the contents of a mutable file, the
+client should query more servers than necessary and use the highest available
+version number. This insures that one or two misbehaving storage servers
+cannot cause this rollback on their own.
+
+
+=== Improving the efficiency of dirnodes ===
+
+The current mutable-file -based dirnode scheme suffers from certain
+inefficiencies. A very large directory (with thousands or millions of
+children) will take a significant time to extract any single entry, because
+the whole file must be downloaded first, then parsed and searched to find the
+desired child entry. Likewise, modifying a single child will require the
+whole file to be re-uploaded.
+
+The current design assumes (and in some cases, requires) that dirnodes remain
+small. The mutable files on which dirnodes are based are currently using
+"SDMF" ("Small Distributed Mutable File") design rules, which state that the
+size of the data shall remain below one megabyte. More advanced forms of
+mutable files (MDMF and LDMF) are in the design phase to allow efficient
+manipulation of larger mutable files. This would reduce the work needed to
+modify a single entry in a large directory.
+
+Judicious caching may help improve the reading-large-directory case. Some
+form of mutable index at the beginning of the dirnode might help as well. The
+MDMF design rules allow for efficient random-access reads from the middle of
+the file, which would give the index something useful to point at.
+
+The current SDMF design generates a new RSA public/private keypair for each
+directory. This takes considerable time and CPU effort, generally one or two
+seconds per directory. We have designed (but not yet built) a DSA-based
+mutable file scheme which will use shared parameters to reduce the
+directory-creation effort to a bare minimum (picking a random number instead
+of generating two random primes).
+
+
+When a backup program is run for the first time, it needs to copy a large
+amount of data from a pre-existing filesystem into reliable storage. This
+means that a large and complex directory structure needs to be duplicated in
+the dirnode layer. With the one-object-per-dirnode approach described here,
+this requires as many operations as there are edges in the imported
+filesystem graph.
+
+Another approach would be to aggregate multiple directories into a single
+storage object. This object would contain a serialized graph rather than a
+single name-to-child dictionary. Most directory operations would fetch the
+whole block of data (and presumeably cache it for a while to avoid lots of
+re-fetches), and modification operations would need to replace the whole
+thing at once. This "realm" approach would have the added benefit of
+combining more data into a single encrypted bundle (perhaps hiding the shape
+of the graph from a determined attacker), and would reduce round-trips when
+performing deep directory traversals (assuming the realm was already cached).
+It would also prevent fine-grained rollback attacks from working: a coalition
+of storage servers could change the entire realm to look like an earlier
+state, but it could not independently roll back individual directories.
+
+The drawbacks of this aggregation would be that small accesses (adding a
+single child, looking up a single child) would require pulling or pushing a
+lot of unrelated data, increasing network overhead (and necessitating
+test-and-set semantics for the modification side, which increases the chances
+that a user operation will fail, making it more challenging to provide
+promises of atomicity to the user). 
+
+It would also make it much more difficult to enable the delegation
+("sharing") of specific directories. Since each aggregate "realm" provides
+all-or-nothing access control, the act of delegating any directory from the
+middle of the realm would require the realm first be split into the upper
+piece that isn't being shared and the lower piece that is. This splitting
+would have to be done in response to what is essentially a read operation,
+which is not traditionally supposed to be a high-effort action. On the other
+hand, it may be possible to aggregate the ciphertext, but use distinct
+encryption keys for each component directory, to get the benefits of both
+schemes at once.
+
+
+=== Dirnode expiration and leases ===
+
+Dirnodes are created any time a client wishes to add a new directory. How
+long do they live? What's to keep them from sticking around forever, taking
+up space that nobody can reach any longer?
+
+Mutable files are created with limited-time "leases", which keep the shares
+alive until the last lease has expired or been cancelled. Clients which know
+and care about specific dirnodes can ask to keep them alive for a while, by
+renewing a lease on them (with a typical period of one month). Clients are
+expected to assist in the deletion of dirnodes by canceling their leases as
+soon as they are done with them. This means that when a client deletes a
+directory, it should also cancel its lease on that directory. When the lease
+count on a given share goes to zero, the storage server can delete the
+related storage. Multiple clients may all have leases on the same dirnode:
+the server may delete the shares only after all of the leases have gone away.
+
+We expect that clients will periodically create a "manifest": a list of
+so-called "refresh capabilities" for all of the dirnodes and files that they
+can reach. They will give this manifest to the "repairer", which is a service
+that keeps files (and dirnodes) alive on behalf of clients who cannot take on
+this responsibility for themselves. These refresh capabilities include the
+storage index, but do *not* include the readkeys or writekeys, so the
+repairer does not get to read the files or directories that it is helping to
+keep alive.
+
+After each change to the user's vdrive, the client creates a manifest and
+looks for differences from their previous version. Anything which was removed
+prompts the client to send out lease-cancellation messages, allowing the data
+to be deleted.
+
+
+== Starting Points: root dirnodes ==
+
+Any client can record the URI of a directory node in some external form (say,
+in a local file) and use it as the starting point of later traversal. Each
+Tahoe user is expected to create a new (unattached) dirnode when they first
+start using the grid, and record its URI for later use.
+
+== Mounting and Sharing Directories ==
+
+The biggest benefit of this dirnode approach is that sharing individual
+directories is almost trivial. Alice creates a subdirectory that she wants to
+use to share files with Bob. This subdirectory is attached to Alice's
+filesystem at "~alice/share-with-bob". She asks her filesystem for the
+read-write directory URI for that new directory, and emails it to Bob. When
+Bob receives the URI, he asks his own local vdrive to attach the given URI,
+perhaps at a place named "~bob/shared-with-alice". Every time either party
+writes a file into this directory, the other will be able to read it. If
+Alice prefers, she can give a read-only URI to Bob instead, and then Bob will
+be able to read files but not change the contents of the directory. Neither
+Alice nor Bob will get access to any files above the mounted directory: there
+are no 'parent directory' pointers. If Alice creates a nested set of
+directories, "~alice/share-with-bob/subdir2", and gives a read-only URI to
+share-with-bob to Bob, then Bob will be unable to write to either
+share-with-bob/ or subdir2/.
+
+A suitable UI needs to be created to allow users to easily perform this
+sharing action: dragging a folder their vdrive to an IM or email user icon,
+for example. The UI will need to give the sending user an opportunity to
+indicate whether they want to grant read-write or read-only access to the
+recipient. The recipient then needs an interface to drag the new folder into
+their vdrive and give it a home.
+
+== Revocation ==
+
+When Alice decides that she no longer wants Bob to be able to access the
+shared directory, what should she do? Suppose she's shared this folder with
+both Bob and Carol, and now she wants Carol to retain access to it but Bob to
+be shut out. Ideally Carol should not have to do anything: her access should
+continue unabated.
+
+The current plan is to have her client create a deep copy of the folder in
+question, delegate access to the new folder to the remaining members of the
+group (Carol), asking the lucky survivors to replace their old reference with
+the new one. Bob may still have access to the old folder, but he is now the
+only one who cares: everyone else has moved on, and he will no longer be able
+to see their new changes. In a strict sense, this is the strongest form of
+revocation that can be accomplished: there is no point trying to force Bob to
+forget about the files that he read a moment before being kicked out. In
+addition it must be noted that anyone who can access the directory can proxy
+for Bob, reading files to him and accepting changes whenever he wants.
+Preventing delegation between communication parties is just as pointless as
+asking Bob to forget previously accessed files. However, there may be value
+to configuring the UI to ask Carol to not share files with Bob, or to
+removing all files from Bob's view at the same time his access is revoked.
+
diff --git a/docs/specifications/file-encoding.txt b/docs/specifications/file-encoding.txt
new file mode 100644 (file)
index 0000000..23862ea
--- /dev/null
@@ -0,0 +1,148 @@
+
+== FileEncoding ==
+
+When the client wishes to upload an immutable file, the first step is to
+decide upon an encryption key. There are two methods: convergent or random.
+The goal of the convergent-key method is to make sure that multiple uploads
+of the same file will result in only one copy on the grid, whereas the
+random-key method does not provide this "convergence" feature.
+
+The convergent-key method computes the SHA-256d hash of a single-purpose tag,
+the encoding parameters, a "convergence secret", and the contents of the
+file. It uses a portion of the resulting hash as the AES encryption key.
+There are security concerns with using convergence this approach (the
+"partial-information guessing attack", please see ticket #365 for some
+references), so Tahoe uses a separate (randomly-generated) "convergence
+secret" for each node, stored in NODEDIR/private/convergence . The encoding
+parameters (k, N, and the segment size) are included in the hash to make sure
+that two different encodings of the same file will get different keys. This
+method requires an extra IO pass over the file, to compute this key, and
+encryption cannot be started until the pass is complete. This means that the
+convergent-key method will require at least two total passes over the file.
+
+The random-key method simply chooses a random encryption key. Convergence is
+disabled, however this method does not require a separate IO pass, so upload
+can be done with a single pass. This mode makes it easier to perform
+streaming upload.
+
+Regardless of which method is used to generate the key, the plaintext file is
+encrypted (using AES in CTR mode) to produce a ciphertext. This ciphertext is
+then erasure-coded and uploaded to the servers. Two hashes of the ciphertext
+are generated as the encryption proceeds: a flat hash of the whole
+ciphertext, and a Merkle tree. These are used to verify the correctness of
+the erasure decoding step, and can be used by a "verifier" process to make
+sure the file is intact without requiring the decryption key.
+
+The encryption key is hashed (with SHA-256d and a single-purpose tag) to
+produce the "Storage Index". This Storage Index (or SI) is used to identify
+the shares produced by the method described below. The grid can be thought of
+as a large table that maps Storage Index to a ciphertext. Since the
+ciphertext is stored as erasure-coded shares, it can also be thought of as a
+table that maps SI to shares.
+
+Anybody who knows a Storage Index can retrieve the associated ciphertext:
+ciphertexts are not secret.
+
+
+[[Image(file-encoding1.png)]]
+
+The ciphertext file is then broken up into segments. The last segment is
+likely to be shorter than the rest. Each segment is erasure-coded into a
+number of "blocks". This takes place one segment at a time. (In fact,
+encryption and erasure-coding take place at the same time, once per plaintext
+segment). Larger segment sizes result in less overhead overall, but increase
+both the memory footprint and the "alacrity" (the number of bytes we have to
+receive before we can deliver validated plaintext to the user). The current
+default segment size is 128KiB.
+
+One block from each segment is sent to each shareholder (aka leaseholder,
+aka landlord, aka storage node, aka peer). The "share" held by each remote
+shareholder is nominally just a collection of these blocks. The file will
+be recoverable when a certain number of shares have been retrieved.
+
+[[Image(file-encoding2.png)]]
+
+The blocks are hashed as they are generated and transmitted. These
+block hashes are put into a Merkle hash tree. When the last share has been
+created, the merkle tree is completed and delivered to the peer. Later, when
+we retrieve these blocks, the peer will send many of the merkle hash tree
+nodes ahead of time, so we can validate each block independently.
+
+The root of this block hash tree is called the "block root hash" and
+used in the next step.
+
+[[Image(file-encoding3.png)]]
+
+There is a higher-level Merkle tree called the "share hash tree". Its leaves
+are the block root hashes from each share. The root of this tree is called
+the "share root hash" and is included in the "URI Extension Block", aka UEB.
+The ciphertext hash and Merkle tree are also put here, along with the
+original file size, and the encoding parameters. The UEB contains all the
+non-secret values that could be put in the URI, but would have made the URI
+too big. So instead, the UEB is stored with the share, and the hash of the
+UEB is put in the URI.
+
+The URI then contains the secret encryption key and the UEB hash. It also
+contains the basic encoding parameters (k and N) and the file size, to make
+download more efficient (by knowing the number of required shares ahead of
+time, sufficient download queries can be generated in parallel).
+
+The URI (also known as the immutable-file read-cap, since possessing it
+grants the holder the capability to read the file's plaintext) is then
+represented as a (relatively) short printable string like so:
+
+ URI:CHK:auxet66ynq55naiy2ay7cgrshm:6rudoctmbxsmbg7gwtjlimd6umtwrrsxkjzthuldsmo4nnfoc6fa:3:10:1000000
+
+[[Image(file-encoding4.png)]]
+
+During download, when a peer begins to transmit a share, it first transmits
+all of the parts of the share hash tree that are necessary to validate its
+block root hash. Then it transmits the portions of the block hash tree
+that are necessary to validate the first block. Then it transmits the
+first block. It then continues this loop: transmitting any portions of the
+block hash tree to validate block#N, then sending block#N.
+
+[[Image(file-encoding5.png)]]
+
+So the "share" that is sent to the remote peer actually consists of three
+pieces, sent in a specific order as they become available, and retrieved
+during download in a different order according to when they are needed.
+
+The first piece is the blocks themselves, one per segment. The last
+block will likely be shorter than the rest, because the last segment is
+probably shorter than the rest. The second piece is the block hash tree,
+consisting of a total of two SHA-1 hashes per block. The third piece is a
+hash chain from the share hash tree, consisting of log2(numshares) hashes.
+
+During upload, all blocks are sent first, followed by the block hash
+tree, followed by the share hash chain. During download, the share hash chain
+is delivered first, followed by the block root hash. The client then uses
+the hash chain to validate the block root hash. Then the peer delivers
+enough of the block hash tree to validate the first block, followed by
+the first block itself. The block hash chain is used to validate the
+block, then it is passed (along with the first block from several other
+peers) into decoding, to produce the first segment of crypttext, which is
+then decrypted to produce the first segment of plaintext, which is finally
+delivered to the user.
+
+[[Image(file-encoding6.png)]]
+
+== Hashes ==
+
+All hashes use SHA-256d, as defined in Practical Cryptography (by Ferguson
+and Schneier). All hashes use a single-purpose tag, e.g. the hash that
+converts an encryption key into a storage index is defined as follows:
+
+ SI = SHA256d(netstring("allmydata_immutable_key_to_storage_index_v1") + key)
+
+When two separate values need to be combined together in a hash, we wrap each
+in a netstring.
+
+Using SHA-256d (instead of plain SHA-256) guards against length-extension
+attacks. Using the tag protects our Merkle trees against attacks in which the
+hash of a leaf is confused with a hash of two children (allowing an attacker
+to generate corrupted data that nevertheless appears to be valid), and is
+simply good "cryptograhic hygiene". The "Chosen Protocol Attack" by Kelsey,
+Schneier, and Wagner (http://www.schneier.com/paper-chosen-protocol.html) is
+relevant. Putting the tag in a netstring guards against attacks that seek to
+confuse the end of the tag with the beginning of the subsequent value.
diff --git a/docs/specifications/file-encoding1.svg b/docs/specifications/file-encoding1.svg
new file mode 100644 (file)
index 0000000..06b702a
--- /dev/null
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/warner/trees/tahoe/docs"
+   sodipodi:docname="file-encoding1.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:modified="true">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3252"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective81" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0395661"
+     inkscape:cx="631.22458"
+     inkscape:cy="706.27996"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="1680"
+     inkscape:window-height="1050"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showgrid="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3081"
+       transform="translate(-198.1596,-0.9619396)">
+      <rect
+         y="17.505058"
+         x="210.76614"
+         height="78.85553"
+         width="305.95944"
+         id="rect1872"
+         style="fill:#e3f4d7;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text1874"
+         y="44.315933"
+         x="258.83313"
+         style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="44.315933"
+           x="258.83313"
+           id="tspan3079"
+           sodipodi:role="line">FILE (plaintext)</tspan></text>
+    </g>
+    <g
+       id="g4629"
+       transform="translate(-8.6574585,46.173112)">
+      <rect
+         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+         id="rect3033"
+         width="116.35974"
+         height="73.956482"
+         x="442.19803"
+         y="243.98456" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="501.92212"
+         y="264.25281"
+         id="text3035"
+         sodipodi:linespacing="100%"><tspan
+           y="264.25281"
+           x="501.92212"
+           id="tspan3047"
+           sodipodi:role="line">convergent</tspan><tspan
+           id="tspan4627"
+           y="284.25281"
+           x="501.92212"
+           sodipodi:role="line">encryption</tspan><tspan
+           y="304.25281"
+           x="501.92212"
+           sodipodi:role="line"
+           id="tspan4604">key</tspan></text>
+    </g>
+    <g
+       id="g3139"
+       transform="translate(-122.35224,48.551816)">
+      <path
+         transform="matrix(0.923205,0,0,0.923205,-231.4625,247.6493)"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3128"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3130"
+         y="434.10446"
+         x="299.26846"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="434.10446"
+           x="299.26846"
+           id="tspan3137"
+           sodipodi:role="line">AES-CTR</tspan></text>
+    </g>
+    <g
+       id="g3201"
+       transform="translate(-129.86188,50.020871)">
+      <rect
+         style="fill:#d5e5ff;stroke:#000000;stroke-width:0.96806562;stroke-opacity:1"
+         id="rect3154"
+         width="286.73019"
+         height="78.85553"
+         x="196.96533"
+         y="521.95709" />
+      <text
+         transform="scale(0.968066,1.032988)"
+         xml:space="preserve"
+         style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="249.83606"
+         y="531.24384"
+         id="text3156"
+         sodipodi:linespacing="100%"><tspan
+           y="531.24384"
+           x="249.83606"
+           id="tspan3163"
+           sodipodi:role="line">FILE (crypttext)</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 208.10132,509.1107 L 208.10132,568.80529"
+       id="path3170"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g4640"
+       transform="translate(447.30202,-236.63721)">
+      <rect
+         y="755.01099"
+         x="24.107248"
+         height="28.084265"
+         width="36.708984"
+         id="rect3195"
+         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3197"
+         y="771.30011"
+         x="32.327164"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="771.30011"
+           x="32.327164"
+           id="tspan3246"
+           sodipodi:role="line">tag</tspan></text>
+    </g>
+    <g
+       id="g4661"
+       transform="translate(1.9238797,4.8096992)">
+      <rect
+         y="702.01349"
+         x="514.47058"
+         height="55.723186"
+         width="100.84161"
+         id="rect3237"
+         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3239"
+         y="724.94507"
+         x="564.60577"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="724.94507"
+           x="564.60577"
+           id="tspan3253"
+           sodipodi:role="line">storage</tspan><tspan
+           id="tspan4659"
+           y="744.94507"
+           x="564.60577"
+           sodipodi:role="line">index</tspan></text>
+    </g>
+    <g
+       id="g3212"
+       transform="translate(-96.193983,-7.2527756)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+         id="path3214"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" />
+      <text
+         xml:space="preserve"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="548.34637"
+         y="181.94142"
+         id="text3216"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan3218"
+           x="548.34637"
+           y="181.94142">SHA-256</tspan></text>
+    </g>
+    <g
+       transform="translate(-9.1639282,440.10771)"
+       id="g3220">
+      <path
+         transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3222"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3224"
+         y="181.94142"
+         x="548.34637"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="181.94142"
+           x="548.34637"
+           id="tspan3226"
+           sodipodi:role="line">SHA-256</tspan></text>
+    </g>
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 320.32596,46.173119 C 407.86248,54.830577 448.26397,96.193988 468.4647,138.51934"
+       id="path2462"
+       sodipodi:nodetypes="cz" />
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 200.08348,97.15593 C 198.48026,294.3536 195.91508,353.03192 205.85512,444.41621"
+       id="path4024"
+       sodipodi:nodetypes="cs" />
+    <g
+       id="g4558"
+       transform="translate(141.40516,-11.543278)">
+      <rect
+         y="125.18694"
+         x="220.07802"
+         height="36.436913"
+         width="55.42865"
+         id="rect4549"
+         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text4551"
+         y="145.6524"
+         x="237.65776"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan4553"
+           x="237.65776"
+           y="145.6524">tag</tspan></text>
+    </g>
+    <path
+       sodipodi:nodetypes="cz"
+       id="path4563"
+       d="M 416.51994,129.86189 C 429.9871,127.93801 436.72069,133.70964 452.11173,151.9865"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <g
+       id="g4576"
+       transform="translate(12.505218,-12.505218)">
+      <rect
+         style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1"
+         id="rect4567"
+         width="161.24203"
+         height="40.284672"
+         x="481.72565"
+         y="69.394432" />
+      <text
+         xml:space="preserve"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="498.39401"
+         y="92.476768"
+         id="text4569"
+         sodipodi:linespacing="100%"><tspan
+           y="92.476768"
+           x="498.39401"
+           id="tspan4571"
+           sodipodi:role="line">encoding parameters</tspan></text>
+    </g>
+    <path
+       sodipodi:nodetypes="cz"
+       id="path4581"
+       d="M 564.65868,98.11787 C 565.62061,128.89994 533.87661,132.7477 507.90423,147.1768"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 479.04603,201.04543 C 487.70348,234.71332 489.62738,252.99018 491.55126,288.58195"
+       id="path4583"
+       sodipodi:nodetypes="cz" />
+    <g
+       id="g4616"
+       transform="translate(16.352977,64.449968)">
+      <rect
+         y="227.63158"
+         x="583.60315"
+         height="71.070618"
+         width="119.24558"
+         id="rect4587"
+         style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text4589"
+         y="246.66689"
+         x="644.2406"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan4591"
+           x="644.2406"
+           y="246.66689">random</tspan><tspan
+           id="tspan4600"
+           sodipodi:role="line"
+           x="644.2406"
+           y="266.66687">encryption</tspan><tspan
+           id="tspan4602"
+           sodipodi:role="line"
+           x="644.2406"
+           y="286.66687">key</tspan></text>
+    </g>
+    <path
+       sodipodi:nodetypes="cz"
+       id="path4593"
+       d="M 486.74156,365.53714 C 480.96991,415.55801 289.54389,464.61694 241.4469,469.42664"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 654.1191,362.65133 C 625.26089,454.03561 275.1148,476.16022 241.4469,480.00798"
+       id="path4595"
+       sodipodi:nodetypes="cz" />
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier 10 Pitch"
+       x="561.77289"
+       y="335.71701"
+       id="text4636"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan4638"
+         x="561.77289"
+         y="335.71701">or</tspan></text>
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 485.77962,367.46102 C 496.36095,429.98711 582.93553,528.10497 576.20196,584.85942"
+       id="path4645"
+       sodipodi:nodetypes="cz" />
+    <path
+       sodipodi:nodetypes="cz"
+       id="path4647"
+       d="M 654.1191,364.57521 C 642.57581,418.44383 597.36465,548.3057 582.93554,585.82136"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 507.90424,532.91467 C 534.83855,543.49601 533.87661,566.58256 548.30571,589.66912"
+       id="path4649"
+       sodipodi:nodetypes="cz" />
+    <path
+       sodipodi:nodetypes="cz"
+       id="path4651"
+       d="M 564.65869,648.34745 C 568.50644,671.43401 569.46838,687.78698 569.46838,704.13996"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  </g>
+</svg>
diff --git a/docs/specifications/file-encoding2.svg b/docs/specifications/file-encoding2.svg
new file mode 100644 (file)
index 0000000..6db3de3
--- /dev/null
@@ -0,0 +1,922 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.45"
+   sodipodi:docbase="/home/warner/trees/tahoe/docs"
+   sodipodi:docname="file-encoding2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:modified="true">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.51978303"
+     inkscape:cx="372.04724"
+     inkscape:cy="526.18109"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="900"
+     inkscape:window-height="756"
+     inkscape:window-x="779"
+     inkscape:window-y="153" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3201"
+       transform="translate(-5.78221,-477.996)">
+      <rect
+         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
+         id="rect3154"
+         width="286.73019"
+         height="78.85553"
+         x="196.96533"
+         y="521.95709" />
+      <text
+         transform="scale(0.968066,1.032988)"
+         xml:space="preserve"
+         style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="249.83606"
+         y="531.24384"
+         id="text3156"
+         sodipodi:linespacing="100%"><tspan
+           y="531.24384"
+           x="249.83606"
+           id="tspan3163"
+           sodipodi:role="line">FILE (crypttext)</tspan></text>
+    </g>
+    <g
+       id="g2022">
+      <rect
+         y="214.548"
+         x="40.845631"
+         height="80.782936"
+         width="80.498047"
+         id="rect3273"
+         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3275"
+         y="255.87878"
+         x="56.581703"
+         style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"
+         transform="scale(0.968066,1.032988)"><tspan
+           y="255.87878"
+           x="56.581703"
+           id="tspan1993"
+           sodipodi:role="line">segA</tspan></text>
+    </g>
+    <g
+       id="g2017">
+      <rect
+         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
+         id="rect3284"
+         width="80.498047"
+         height="80.782936"
+         x="161.45784"
+         y="214.548" />
+      <text
+         transform="scale(0.968066,1.032988)"
+         xml:space="preserve"
+         style="font-size:28;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="184.53419"
+         y="251.69087"
+         id="text3286"
+         sodipodi:linespacing="100%"><tspan
+           y="251.69087"
+           x="184.53419"
+           id="tspan1995"
+           sodipodi:role="line">segB</tspan></text>
+    </g>
+    <g
+       id="g2012">
+      <rect
+         y="214.548"
+         x="282.07007"
+         height="80.782936"
+         width="80.498047"
+         id="rect3290"
+         style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3292"
+         y="253.62892"
+         x="304.44913"
+         style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"
+         transform="scale(0.968066,1.032988)"><tspan
+           y="253.62892"
+           x="304.44913"
+           id="tspan1997"
+           sodipodi:role="line">segC</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 223.51231,125.60384 L 88.587195,212.82815"
+       id="path4243"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 297.10782,124.24096 L 205.79487,215.55391"
+       id="path4245"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 373.4291,122.87808 L 325.7283,212.82816"
+       id="path4247"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 458.9333,124.24096 L 443.56317,216.05143"
+       id="path4249"
+       sodipodi:nodetypes="cc" />
+    <rect
+       y="214.548"
+       x="422.02194"
+       height="80.782951"
+       width="61.22403"
+       id="rect3296"
+       style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3298"
+       y="253.42572"
+       x="440.45892"
+       style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"
+       transform="scale(0.968066,1.032988)"><tspan
+         sodipodi:role="line"
+         id="tspan1999"
+         x="440.45892"
+         y="253.42572">segD</tspan></text>
+    <rect
+       style="fill:white;fill-opacity:1;stroke:black;stroke-width:0.96806562;stroke-opacity:1"
+       id="rect3308"
+       width="32.312965"
+       height="80.782936"
+       x="484.21405"
+       y="214.548" />
+    <g
+       id="g2040"
+       transform="translate(-16.41804,-13.31249)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path2029"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" />
+      <text
+         xml:space="preserve"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="84.763"
+         y="377.10425"
+         id="text2031"
+         sodipodi:linespacing="100%"><tspan
+           y="377.10425"
+           x="84.763"
+           id="tspan2038"
+           sodipodi:role="line">FEC</tspan></text>
+    </g>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect2045"
+       width="62.568695"
+       height="54.581161"
+       x="106.49989"
+       y="400.05042"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="114.42955"
+       y="424.05099"
+       id="text2932"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan2934"
+         x="114.42955"
+         y="424.05099">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="126.88751"
+       y="445.35098"
+       id="text2936"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan2938"
+         x="126.88751"
+         y="445.35098">A1</tspan></text>
+    <rect
+       ry="0"
+       y="471.49408"
+       x="106.49989"
+       height="54.581161"
+       width="62.568695"
+       id="rect2956"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text2960"
+       y="495.49466"
+       x="114.42955"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3869"
+         x="114.42955"
+         y="495.49466">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text2964"
+       y="516.79468"
+       x="126.88751"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3018"
+         x="126.88751"
+         y="516.79468">A2</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect2970"
+       width="62.568695"
+       height="54.581161"
+       x="106.49989"
+       y="542.93781"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="114.42955"
+       y="566.93835"
+       id="text2974"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan2976"
+         x="114.42955"
+         y="566.93835">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="126.88751"
+       y="588.23834"
+       id="text2978"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3040"
+         x="126.88751"
+         y="588.23834">A3</tspan></text>
+    <rect
+       ry="0"
+       y="614.38141"
+       x="106.49989"
+       height="54.581161"
+       width="62.568695"
+       id="rect2984"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text2988"
+       y="638.38196"
+       x="114.42955"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="638.38196"
+         x="114.42955"
+         id="tspan2990"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text2992"
+       y="659.68195"
+       x="126.88751"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3042"
+         x="126.88751"
+         y="659.68195">A4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 79.874914,296.213 L 79.874914,326.83172"
+       id="path2996" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 90.524902,388.06915 C 85.442028,403.37176 95.420905,411.5033 105.16864,424.01286"
+       id="path3000"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 82.537411,389.4004 C 77.419162,441.79407 81.801856,464.47336 103.83739,495.90028"
+       id="path3002"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 71.887422,389.4004 C 62.3162,464.27336 66.595451,538.86154 105.16864,573.1127"
+       id="path3004"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 59.906185,384.0754 C 30.833264,497.98462 73.280777,611.91471 105.16864,643.66887"
+       id="path3006"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="translate(114.1248,-13.31249)"
+       id="g3090">
+      <path
+         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3092"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3094"
+         y="377.10425"
+         x="84.763"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3096"
+           x="84.763"
+           y="377.10425">FEC</tspan></text>
+    </g>
+    <rect
+       ry="0"
+       y="400.05042"
+       x="237.04271"
+       height="54.581161"
+       width="62.568695"
+       id="rect3098"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3100"
+       y="424.05099"
+       x="244.97237"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="424.05099"
+         x="244.97237"
+         id="tspan3102"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3104"
+       y="445.35098"
+       x="257.43033"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3266"
+         x="257.43033"
+         y="445.35098">B1</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3108"
+       width="62.568695"
+       height="54.581161"
+       x="237.04271"
+       y="471.49408"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="244.97237"
+       y="495.49466"
+       id="text3110"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3112"
+         x="244.97237"
+         y="495.49466">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="257.43033"
+       y="516.79468"
+       id="text3114"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3268"
+         x="257.43033"
+         y="516.79468">B2</tspan></text>
+    <rect
+       ry="0"
+       y="542.93781"
+       x="237.04271"
+       height="54.581161"
+       width="62.568695"
+       id="rect3118"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3120"
+       y="566.93835"
+       x="244.97237"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="566.93835"
+         x="244.97237"
+         id="tspan3122"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3124"
+       y="588.23834"
+       x="257.43033"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3270"
+         x="257.43033"
+         y="588.23834">B3</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3128"
+       width="62.568695"
+       height="54.581161"
+       x="237.04271"
+       y="614.38141"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="244.97237"
+       y="638.38196"
+       id="text3130"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3132"
+         x="244.97237"
+         y="638.38196">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="257.43033"
+       y="659.68195"
+       id="text3134"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3272"
+         x="257.43033"
+         y="659.68195">B4</tspan></text>
+    <path
+       id="path3138"
+       d="M 210.41773,296.213 L 210.41773,326.83172"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3140"
+       d="M 221.06772,388.06915 C 215.98484,403.37176 225.96372,411.5033 235.71146,424.01286"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3142"
+       d="M 213.08023,389.4004 C 207.96198,441.79407 212.34467,464.47336 234.38021,495.90028"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3144"
+       d="M 202.43024,389.4004 C 192.85902,464.27336 197.13827,538.86154 235.71146,573.1127"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3146"
+       d="M 190.449,384.0754 C 161.37608,497.98462 203.82359,611.91471 235.71146,643.66887"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <g
+       id="g3148"
+       transform="translate(241.4443,-13.31249)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3150"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" />
+      <text
+         xml:space="preserve"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="84.763"
+         y="377.10425"
+         id="text3152"
+         sodipodi:linespacing="100%"><tspan
+           y="377.10425"
+           x="84.763"
+           id="tspan3154"
+           sodipodi:role="line">FEC</tspan></text>
+    </g>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3156"
+       width="62.568695"
+       height="54.581161"
+       x="364.36224"
+       y="400.05042"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="372.2919"
+       y="424.05099"
+       id="text3158"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3160"
+         x="372.2919"
+         y="424.05099">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="384.74988"
+       y="445.35098"
+       id="text3162"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3274"
+         x="384.74988"
+         y="445.35098">C1</tspan></text>
+    <rect
+       ry="0"
+       y="471.49408"
+       x="364.36224"
+       height="54.581161"
+       width="62.568695"
+       id="rect3166"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3168"
+       y="495.49466"
+       x="372.2919"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="495.49466"
+         x="372.2919"
+         id="tspan3170"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3172"
+       y="516.79468"
+       x="384.74988"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3278"
+         x="384.74988"
+         y="516.79468">C2</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3176"
+       width="62.568695"
+       height="54.581161"
+       x="364.36224"
+       y="542.93781"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="372.2919"
+       y="566.93835"
+       id="text3178"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3180"
+         x="372.2919"
+         y="566.93835">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="384.74988"
+       y="588.23834"
+       id="text3182"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3280"
+         x="384.74988"
+         y="588.23834">C3</tspan></text>
+    <rect
+       ry="0"
+       y="614.38141"
+       x="364.36224"
+       height="54.581161"
+       width="62.568695"
+       id="rect3186"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3188"
+       y="638.38196"
+       x="372.2919"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="638.38196"
+         x="372.2919"
+         id="tspan3190"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3192"
+       y="659.68195"
+       x="384.74988"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3282"
+         x="384.74988"
+         y="659.68195">C4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 337.73727,296.213 L 337.73727,326.83172"
+       id="path3196" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 348.38726,388.06915 C 343.30438,403.37176 353.28326,411.5033 363.031,424.01286"
+       id="path3198"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 340.39977,389.4004 C 335.28152,441.79407 339.66421,464.47336 361.69975,495.90028"
+       id="path3200"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 329.74978,389.4004 C 320.17856,464.27336 324.45781,538.86154 363.031,573.1127"
+       id="path3202"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 317.76854,384.0754 C 288.69562,497.98462 331.14313,611.91471 363.031,643.66887"
+       id="path3204"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="translate(370.3755,-13.31249)"
+       id="g3207">
+      <path
+         transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3209"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3211"
+         y="377.10425"
+         x="84.763"
+         style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3213"
+           x="84.763"
+           y="377.10425">FEC</tspan></text>
+    </g>
+    <rect
+       ry="0"
+       y="400.05042"
+       x="493.29343"
+       height="54.581161"
+       width="62.568695"
+       id="rect3215"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3217"
+       y="424.05099"
+       x="501.22308"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="424.05099"
+         x="501.22308"
+         id="tspan3219"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3221"
+       y="445.35098"
+       x="513.68103"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3284"
+         x="513.68103"
+         y="445.35098">D1</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3225"
+       width="62.568695"
+       height="54.581161"
+       x="493.29343"
+       y="471.49408"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="501.22308"
+       y="495.49466"
+       id="text3227"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3229"
+         x="501.22308"
+         y="495.49466">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="513.68103"
+       y="516.79468"
+       id="text3231"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3286"
+         x="513.68103"
+         y="516.79468">D2</tspan></text>
+    <rect
+       ry="0"
+       y="542.93781"
+       x="493.29343"
+       height="54.581161"
+       width="62.568695"
+       id="rect3235"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3237"
+       y="566.93835"
+       x="501.22308"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="566.93835"
+         x="501.22308"
+         id="tspan3239"
+         sodipodi:role="line">block</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3241"
+       y="588.23834"
+       x="513.68103"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3288"
+         x="513.68103"
+         y="588.23834">D3</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3245"
+       width="62.568695"
+       height="54.581161"
+       x="493.29343"
+       y="614.38141"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="501.22308"
+       y="638.38196"
+       id="text3247"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3249"
+         x="501.22308"
+         y="638.38196">block</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="513.68103"
+       y="659.68195"
+       id="text3251"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3293"
+         x="513.68103"
+         y="659.68195">D4</tspan></text>
+    <path
+       id="path3256"
+       d="M 466.66845,296.213 L 466.66845,326.83172"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3258"
+       d="M 477.31844,388.06915 C 472.23556,403.37176 482.21444,411.5033 491.96218,424.01286"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3260"
+       d="M 469.33095,389.4004 C 464.2127,441.79407 468.59539,464.47336 490.63093,495.90028"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3262"
+       d="M 458.68096,389.4004 C 449.10974,464.27336 453.38899,538.86154 491.96218,573.1127"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3264"
+       d="M 446.69972,384.0754 C 417.6268,497.98462 460.07431,611.91471 491.96218,643.66887"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3831"
+       width="516.80328"
+       height="103.59095"
+       x="66.758537"
+       y="604.61957" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="80.570648"
+       y="700.15332"
+       id="text3833"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3835"
+         x="80.570648"
+         y="700.15332">share4</tspan></text>
+    <rect
+       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3837"
+       width="95.533775"
+       height="81.721664"
+       x="631.90411"
+       y="640.30084" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="650.27539"
+       y="660.8269"
+       id="text3839"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3841"
+         x="650.27539"
+         y="660.8269">peer 4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 582.41071,673.68012 C 631.90411,677.13315 631.90411,677.13315 631.90411,677.13315"
+       id="path3843" />
+  </g>
+</svg>
diff --git a/docs/specifications/file-encoding3.svg b/docs/specifications/file-encoding3.svg
new file mode 100644 (file)
index 0000000..fb5fd4c
--- /dev/null
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/warner/work/tahoe-misc"
+   sodipodi:docname="file-encoding3.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.523584"
+     inkscape:cx="372.04724"
+     inkscape:cy="526.18109"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="900"
+     inkscape:window-height="756"
+     inkscape:window-x="778"
+     inkscape:window-y="96" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3308"
+       transform="translate(-492.4404,-287.9192)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3297"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3299"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3306"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-361.8975,-287.9192)"
+       id="g3313">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3315"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3317"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3319"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       id="g3321"
+       transform="translate(-427.1689,-180.8987)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3323"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3325"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3327"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-298.6406,-78.23132)"
+       id="g3329">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3331"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3333"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3335"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-234.578,-287.9192)"
+       id="g3345">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3347"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3349"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3351"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       id="g3353"
+       transform="translate(-170.1124,-180.8987)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3355"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3357"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3359"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-105.6468,-287.9192)"
+       id="g3361">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3363"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3365"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3367"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <rect
+       ry="0"
+       y="47.720215"
+       x="76.855522"
+       height="54.581161"
+       width="62.568695"
+       id="rect2984"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text2988"
+       y="71.720772"
+       x="84.785179"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="71.720772"
+         x="84.785179"
+         id="tspan2990"
+         sodipodi:role="line">share</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text2992"
+       y="93.020752"
+       x="97.243141"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3042"
+         x="97.243141"
+         y="93.020752">A4</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3128"
+       width="62.568695"
+       height="54.581161"
+       x="207.39835"
+       y="47.720215"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="215.328"
+       y="71.720772"
+       id="text3130"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3132"
+         x="215.328"
+         y="71.720772">share</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="227.78596"
+       y="93.020752"
+       id="text3134"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3272"
+         x="227.78596"
+         y="93.020752">B4</tspan></text>
+    <rect
+       ry="0"
+       y="47.720215"
+       x="334.7179"
+       height="54.581161"
+       width="62.568695"
+       id="rect3186"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3188"
+       y="71.720772"
+       x="342.64755"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="71.720772"
+         x="342.64755"
+         id="tspan3190"
+         sodipodi:role="line">share</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3192"
+       y="93.020752"
+       x="355.10553"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3282"
+         x="355.10553"
+         y="93.020752">C4</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3245"
+       width="62.568695"
+       height="54.581161"
+       x="463.64905"
+       y="47.720215"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="471.5787"
+       y="71.720772"
+       id="text3247"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3249"
+         x="471.5787"
+         y="71.720772">share</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="484.03665"
+       y="93.020752"
+       id="text3251"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3293"
+         x="484.03665"
+         y="93.020752">D4</tspan></text>
+    <rect
+       style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3831"
+       width="516.80328"
+       height="491.99808"
+       x="37.114162"
+       y="37.958374" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="44.343109"
+       y="521.89929"
+       id="text3833"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3835"
+         x="44.343109"
+         y="521.89929">share4</tspan></text>
+    <rect
+       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3837"
+       width="95.533775"
+       height="81.721664"
+       x="602.25977"
+       y="73.639648" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="620.63104"
+       y="94.16571"
+       id="text3839"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3841"
+         x="620.63104"
+         y="94.16571">peer 4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 552.76635,107.01893 C 602.25975,110.47196 602.25975,110.47196 602.25975,110.47196"
+       id="path3843" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 106.27121,102.50451 L 108.15211,173.97895"
+       id="path2431" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 238.8751,102.50451 L 237.93464,173.03849"
+       id="path2433" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 366.77673,103.44496 L 366.77673,172.09804"
+       id="path2435" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 495.61881,103.44496 L 495.61881,173.03849"
+       id="path2437" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 489.97609,208.77571 L 438.25116,282.13106"
+       id="path2439" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 370.53854,207.83526 L 420.38255,282.13106"
+       id="path2441" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 236.05374,209.71617 L 183.38836,284.01197"
+       id="path2443" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 110.97347,207.83526 L 164.5793,282.13106"
+       id="path2445" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 178.6861,315.98737 L 289.65957,388.40226"
+       id="path2447" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 426.02527,315.98737 L 316.93271,389.34272"
+       id="path2449" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1"
+       id="rect3336"
+       width="474.92883"
+       height="334.80142"
+       x="61.129456"
+       y="140.12263" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="241.69646"
+       y="263.32199"
+       id="text3338"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3340"
+         x="241.69646"
+         y="263.32199">Merkle Tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="68.653069"
+       y="466.45987"
+       id="text3342"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3344"
+         x="68.653069"
+         y="466.45987">block hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="321.63498"
+       y="405.33044"
+       id="text3346"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3352"
+         x="321.63498"
+         y="405.33044">&quot;block root hash&quot;</tspan></text>
+  </g>
+</svg>
diff --git a/docs/specifications/file-encoding4.svg b/docs/specifications/file-encoding4.svg
new file mode 100644 (file)
index 0000000..f4b21d0
--- /dev/null
@@ -0,0 +1,675 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/warner/work/tahoe-misc"
+   sodipodi:docname="file-encoding4.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective5442" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0814091"
+     inkscape:cx="327.67132"
+     inkscape:cy="590.71497"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="1680"
+     inkscape:window-height="1050"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showgrid="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="212.25175"
+       y="109.45165"
+       id="text3632"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3634"
+         x="212.25175"
+         y="109.45165">block</tspan><tspan
+         sodipodi:role="line"
+         x="212.25175"
+         y="129.45165"
+         id="tspan3636">root hashes</tspan></text>
+    <g
+       id="g3642"
+       transform="translate(-226.712,-129.0765)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3644"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3646"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3648"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       id="g3675"
+       transform="translate(175.712,7.63966)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3331"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3653"
+         y="160.03162"
+         x="68.92907"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="160.03162"
+           x="68.92907"
+           id="tspan3655"
+           sodipodi:role="line">s1</tspan></text>
+    </g>
+    <g
+       id="g3686"
+       transform="translate(175.712,2.282887)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3657"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="68.029869"
+         y="239.32857"
+         id="text3659"
+         sodipodi:linespacing="100%"><tspan
+           y="239.32857"
+           x="68.029869"
+           id="tspan3680"
+           sodipodi:role="line">s2</tspan></text>
+    </g>
+    <g
+       id="g3691"
+       transform="translate(175.712,0.186429)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3663"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3665"
+         y="313.49518"
+         x="70.729767"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="313.49518"
+           x="70.729767"
+           id="tspan3682"
+           sodipodi:role="line">s3</tspan></text>
+    </g>
+    <g
+       id="g3696"
+       transform="translate(175.712,7.639653)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3669"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="72.669769"
+         y="377.16217"
+         id="text3671"
+         sodipodi:linespacing="100%"><tspan
+           y="377.16217"
+           x="72.669769"
+           id="tspan3684"
+           sodipodi:role="line">s4</tspan></text>
+    </g>
+    <g
+       transform="translate(-228.8541,-284.0256)"
+       id="g3701">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3703"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3705"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3707"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-110.3217,-218.3329)"
+       id="g3709">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3711"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3713"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3715"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 270.6808,165.29588 L 353.51073,189.57362"
+       id="path3717" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 272.10891,234.55883 C 275.67916,233.13073 354.22478,203.14059 354.22478,203.14059"
+       id="path3719" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 274.96511,307.39204 L 356.36693,341.66649"
+       id="path3721" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 275.67916,379.51119 L 355.65288,358.80371"
+       id="path3723" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 390.64138,347.3789 L 473.4713,271.68949"
+       id="path3725" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 389.92733,198.14223 L 472.75725,253.12416"
+       id="path3727" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="82.126266"
+       y="105.04523"
+       id="text4615"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan4617"
+         x="82.126266"
+         y="105.04523">shares</tspan></text>
+    <g
+       id="g4662"
+       transform="translate(0,-7.629395e-6)">
+      <rect
+         ry="0"
+         y="131.23222"
+         x="69.941055"
+         height="62.310936"
+         width="88.076958"
+         id="rect3245"
+         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text4619"
+         y="167.66769"
+         x="84.927971"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="167.66769"
+           x="84.927971"
+           id="tspan4621"
+           sodipodi:role="line">share1</tspan></text>
+    </g>
+    <g
+       id="g4657"
+       transform="translate(-0.77298,-0.515305)">
+      <rect
+         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="rect4623"
+         width="88.076958"
+         height="62.310936"
+         x="70.714035"
+         y="203.11914"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="85.700951"
+         y="239.55461"
+         id="text4625"
+         sodipodi:linespacing="100%"><tspan
+           y="239.55461"
+           x="85.700951"
+           id="tspan4641"
+           sodipodi:role="line">share2</tspan></text>
+    </g>
+    <g
+       id="g4652"
+       transform="translate(-3.864891,1.288307)">
+      <rect
+         ry="0"
+         y="272.68713"
+         x="73.805946"
+         height="62.310936"
+         width="88.076958"
+         id="rect4629"
+         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text4631"
+         y="309.12259"
+         x="88.792862"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="309.12259"
+           x="88.792862"
+           id="tspan4643"
+           sodipodi:role="line">share3</tspan></text>
+    </g>
+    <g
+       id="g4647"
+       transform="translate(-4.637871,0)">
+      <rect
+         style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="rect4635"
+         width="88.076958"
+         height="62.310936"
+         x="74.578926"
+         y="345.34702"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="89.565842"
+         y="381.78247"
+         id="text4637"
+         sodipodi:linespacing="100%"><tspan
+           y="381.78247"
+           x="89.565842"
+           id="tspan4645"
+           sodipodi:role="line">share4</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 159.23338,161.89201 L 234.98518,160.34605"
+       id="path4667" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 159.23338,233.77892 L 236.53114,233.00595"
+       id="path4669" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 160.77934,304.11988 L 239.62305,305.66584"
+       id="path4671" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 158.4604,374.46084 L 238.85007,377.55275"
+       id="path4673" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5560"
+       width="451.25253"
+       height="376.15237"
+       x="201.65356"
+       y="75.152138" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="320.79318"
+       y="271.27441"
+       id="text3338"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3340"
+         x="320.79318"
+         y="271.27441">Merkle Tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="211.74399"
+       y="441.22202"
+       id="text3342"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan7495"
+         x="211.74399"
+         y="441.22202">share hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="495.05698"
+       y="240.97345"
+       id="text5566"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan5568"
+         x="495.05698"
+         y="240.97345">&quot;share root hash&quot;</tspan></text>
+    <rect
+       style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect8042"
+       width="372.43307"
+       height="126.05428"
+       x="258.43817"
+       y="492.44629" />
+    <text
+       xml:space="preserve"
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="267.38785"
+       y="521.40631"
+       id="text8044"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan8046"
+         x="267.38785"
+         y="521.40631">URI Extension Block</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 491.09641,278.8051 L 505.57143,535.71157"
+       id="path8064"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5534">
+      <text
+         sodipodi:linespacing="100%"
+         id="text8048"
+         y="560.19122"
+         x="296.70987"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="560.19122"
+           x="296.70987"
+           id="tspan8050"
+           sodipodi:role="line">file size</tspan></text>
+      <rect
+         y="538.7973"
+         x="291.02008"
+         height="31.027878"
+         width="84.953964"
+         id="rect8066"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <g
+       id="g5539"
+       transform="translate(-21.380944,3.5634906)">
+      <text
+         sodipodi:linespacing="100%"
+         id="text8052"
+         y="595.66229"
+         x="296.09039"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="595.66229"
+           x="296.09039"
+           id="tspan8054"
+           sodipodi:role="line">encoding parameters</tspan></text>
+      <rect
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect8068"
+         width="205.77185"
+         height="29.795084"
+         x="291.02008"
+         y="576.24475" />
+    </g>
+    <g
+       id="g5529">
+      <text
+         sodipodi:linespacing="100%"
+         id="text8060"
+         y="557.45142"
+         x="430.06894"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="557.45142"
+           x="430.06894"
+           id="tspan8062"
+           sodipodi:role="line">share root hash</tspan></text>
+      <rect
+         y="536.65747"
+         x="420.48123"
+         height="31.027878"
+         width="162.62888"
+         id="rect8070"
+         style="fill:none;fill-opacity:1;stroke:black;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot5444"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"><flowRegion
+         id="flowRegion5446"><rect
+           id="rect5448"
+           width="440.86795"
+           height="206.59506"
+           x="212.52603"
+           y="478.04767" /></flowRegion><flowPara
+         id="flowPara5450"></flowPara></flowRoot>    <flowRoot
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"
+       id="flowRoot5452"
+       xml:space="preserve"><flowRegion
+         id="flowRegion5454"><rect
+           y="478.04767"
+           x="212.52603"
+           height="206.59506"
+           width="440.86795"
+           id="rect5456" /></flowRegion><flowPara
+         id="flowPara5458"></flowPara></flowRoot>    <rect
+       y="722.08801"
+       x="249.14307"
+       height="126.05428"
+       width="372.43307"
+       id="rect5460"
+       style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text5462"
+       y="750.73669"
+       x="264.42236"
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="750.73669"
+         x="264.42236"
+         id="tspan5464"
+         sodipodi:role="line">URI / &quot;file read-cap&quot;</tspan></text>
+    <g
+       id="g5498">
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="471.72757"
+         y="789.75726"
+         id="text5478"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan5480"
+           x="471.72757"
+           y="789.75726">UEB hash</tspan></text>
+      <rect
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect5486"
+         width="109.25024"
+         height="31.027878"
+         x="461.99792"
+         y="768.95331" />
+    </g>
+    <g
+       id="g5503">
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="275.49631"
+         y="792.89374"
+         id="text5474"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan5476"
+           x="275.49631"
+           y="792.89374">encryption key</tspan></text>
+      <rect
+         y="770.815"
+         x="268.32343"
+         height="36.37751"
+         width="148.71983"
+         id="rect5488"
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <g
+       transform="translate(-97.251286,198.1785)"
+       id="g5490">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path5492"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text5494"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan5496"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <path
+       id="path5508"
+       d="M 490.16032,618.22602 L 500.19251,660.16729"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 506.13565,695.45603 L 516.96501,767.91304"
+       id="path5510" />
+    <g
+       id="g5524"
+       transform="translate(-7.8396793,-5.701585)">
+      <rect
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect8072"
+         width="127.96149"
+         height="31.434599"
+         x="502.91043"
+         y="583.00134" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="507.92603"
+         y="603.99866"
+         id="text5520"
+         sodipodi:linespacing="100%"><tspan
+           sodipodi:role="line"
+           id="tspan5522"
+           x="507.92603"
+           y="603.99866">other hashes</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/docs/specifications/file-encoding5.svg b/docs/specifications/file-encoding5.svg
new file mode 100644 (file)
index 0000000..a20a136
--- /dev/null
@@ -0,0 +1,585 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/warner/work/tahoe-misc"
+   sodipodi:docname="file-encoding5.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.79718499"
+     inkscape:cx="410.02658"
+     inkscape:cy="638.93685"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="900"
+     inkscape:window-height="756"
+     inkscape:window-x="699"
+     inkscape:window-y="165" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="93.755287"
+       y="98.537506"
+       id="text3632"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3634"
+         x="93.755287"
+         y="98.537506">block</tspan><tspan
+         sodipodi:role="line"
+         x="93.755287"
+         y="118.53751"
+         id="tspan3636">root hashes</tspan></text>
+    <g
+       id="g3642"
+       transform="translate(-279.7236,-129.0765)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3644"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3646"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3648"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       id="g3675"
+       transform="translate(63.82283,6.080481)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3331"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3653"
+         y="160.03162"
+         x="68.92907"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="160.03162"
+           x="68.92907"
+           id="tspan3655"
+           sodipodi:role="line">s1</tspan></text>
+    </g>
+    <g
+       id="g3686"
+       transform="translate(61.28203,2.918364)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3657"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="68.029869"
+         y="239.32857"
+         id="text3659"
+         sodipodi:linespacing="100%"><tspan
+           y="239.32857"
+           x="68.029869"
+           id="tspan3680"
+           sodipodi:role="line">s2</tspan></text>
+    </g>
+    <g
+       id="g3691"
+       transform="translate(59.37213,3.016624)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3663"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3665"
+         y="313.49518"
+         x="70.729767"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="313.49518"
+           x="70.729767"
+           id="tspan3682"
+           sodipodi:role="line">s3</tspan></text>
+    </g>
+    <g
+       id="g3696"
+       transform="translate(59.37213,12.6645)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3669"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="72.669769"
+         y="377.16217"
+         id="text3671"
+         sodipodi:linespacing="100%"><tspan
+           y="377.16217"
+           x="72.669769"
+           id="tspan3684"
+           sodipodi:role="line">s4</tspan></text>
+    </g>
+    <g
+       transform="translate(-281.8657,-284.0256)"
+       id="g3701">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3703"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3705"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3707"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-104.085,-218.3329)"
+       id="g3709">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3711"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3713"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3715"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 158.42099,162.17755 L 300.49915,189.57362"
+       id="path3717"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 162.96742,234.55883 C 166.53767,233.13073 301.2132,203.14059 301.2132,203.14059"
+       id="path3719"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 162.7053,312.06953 L 303.35535,341.66649"
+       id="path3721"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 160.30102,384.18868 L 302.6413,358.80371"
+       id="path3723"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 340.74813,350.49723 L 479.70796,268.57116"
+       id="path3725"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 341.59324,198.14223 L 480.55307,259.36082"
+       id="path3727"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="387.9295"
+       y="82.614281"
+       id="text3342"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan7297"
+         x="387.9295"
+         y="82.614281">share hash tree</tspan></text>
+    <g
+       transform="translate(-277.1965,175.8469)"
+       id="g6278">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path6280"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text6282"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan6284"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       id="g6374"
+       transform="translate(0,-6.583939)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path6288"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-170.1473,365.3129)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="130.1619"
+         y="471.03552"
+         id="text6290"
+         sodipodi:linespacing="100%"><tspan
+           y="471.03552"
+           x="130.1619"
+           id="tspan6366"
+           sodipodi:role="line">s5</tspan></text>
+    </g>
+    <g
+       id="g6379"
+       transform="translate(0,-4.389282)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-170.1473,437.7031)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path6296"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text6298"
+         y="544.97565"
+         x="130.2619"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="544.97565"
+           x="130.2619"
+           id="tspan6368"
+           sodipodi:role="line">s6</tspan></text>
+    </g>
+    <g
+       id="g6384"
+       transform="translate(0,-2.194656)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path6304"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-170.1473,510.0933)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="132.1519"
+         y="617.0459"
+         id="text6306"
+         sodipodi:linespacing="100%"><tspan
+           y="617.0459"
+           x="132.1519"
+           id="tspan6370"
+           sodipodi:role="line">s7</tspan></text>
+    </g>
+    <g
+       id="g6389">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-170.1473,582.4835)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path6312"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text6314"
+         y="688.16608"
+         x="130.03189"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="688.16608"
+           x="130.03189"
+           id="tspan6372"
+           sodipodi:role="line">s8</tspan></text>
+    </g>
+    <g
+       id="g6318"
+       transform="translate(-279.3386,20.89783)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path6320"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text6322"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan6324"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       id="g6326"
+       transform="translate(-101.5579,86.59053)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path6328"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text6330"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan6332"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <path
+       id="path6334"
+       d="M 160.94817,457.746 L 303.02633,494.49705"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path6336"
+       d="M 162.37628,533.2456 C 165.94653,531.8175 303.74038,508.06402 303.74038,508.06402"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path6338"
+       d="M 162.11415,609.19714 L 305.88253,646.58992"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path6340"
+       d="M 162.8282,682.87546 L 305.16848,663.72714"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path6342"
+       d="M 343.27531,653.86149 L 482.23514,575.05376"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       id="path6344"
+       d="M 341.0021,499.94733 L 481.52109,562.72508"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text6346"
+       y="424.95895"
+       x="480.79593"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="424.95895"
+         x="480.79593"
+         id="tspan6348"
+         sodipodi:role="line">Merkle Tree</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text6350"
+       y="384.32007"
+       x="593.30579"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="384.32007"
+         x="593.30579"
+         id="tspan6352"
+         sodipodi:role="line">&quot;share root hash&quot;</tspan></text>
+    <g
+       id="g6396"
+       transform="translate(65.86388,-62.41649)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path6398"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text6400"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan6402"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <path
+       id="path6404"
+       d="M 516.21962,265.18629 L 653.62028,407.4814"
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 516.21962,558.30913 L 653.62028,429.30971"
+       id="path6406"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 88.872351,202.61777 L 183.98136,204.17694 L 352.37108,321.11424 L 570.65404,564.34383 L 498.9325,650.09786 L 291.56368,394.39495 L 162.15306,280.57598 L 79.517367,263.42517 L 88.872351,202.61777 z "
+       id="path6408" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="430.70282"
+       y="734.79639"
+       id="text7299"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan7301"
+         x="430.70282"
+         y="734.79639">merkle hash chain</tspan><tspan
+         sodipodi:role="line"
+         x="430.70282"
+         y="754.79639"
+         id="tspan7303">to validate s1</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 519.99961,716.92402 C 528.23607,699.12899 558.20121,653.69346 528.55661,615.79625"
+       id="path7305"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/docs/specifications/file-encoding6.svg b/docs/specifications/file-encoding6.svg
new file mode 100644 (file)
index 0000000..09ced3f
--- /dev/null
@@ -0,0 +1,760 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/warner/work/tahoe-misc"
+   sodipodi:docname="file-encoding6.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2976"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.60354902"
+     inkscape:cx="367.4898"
+     inkscape:cy="564.16839"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="900"
+     inkscape:window-height="756"
+     inkscape:window-x="732"
+     inkscape:window-y="176" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3308"
+       transform="translate(-492.4404,-287.9192)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3297"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3299"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3306"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-361.8975,-287.9192)"
+       id="g3313">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3315"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3317"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3319"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       id="g3321"
+       transform="translate(-427.1689,-180.8987)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3323"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3325"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3327"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-234.578,-287.9192)"
+       id="g3345">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3347"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3349"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3351"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       id="g3353"
+       transform="translate(-170.1124,-180.8987)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3355"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3357"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3359"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-105.6468,-287.9192)"
+       id="g3361">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3363"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3365"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3367"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <rect
+       ry="0"
+       y="47.720215"
+       x="76.855522"
+       height="54.581161"
+       width="62.568695"
+       id="rect2984"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text2988"
+       y="71.720772"
+       x="84.785179"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="71.720772"
+         x="84.785179"
+         id="tspan2990"
+         sodipodi:role="line">share</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text2992"
+       y="93.020752"
+       x="97.243141"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3042"
+         x="97.243141"
+         y="93.020752">A4</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3128"
+       width="62.568695"
+       height="54.581161"
+       x="207.39835"
+       y="47.720215"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="215.328"
+       y="71.720772"
+       id="text3130"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3132"
+         x="215.328"
+         y="71.720772">share</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="227.78596"
+       y="93.020752"
+       id="text3134"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3272"
+         x="227.78596"
+         y="93.020752">B4</tspan></text>
+    <rect
+       ry="0"
+       y="47.720215"
+       x="334.7179"
+       height="54.581161"
+       width="62.568695"
+       id="rect3186"
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text3188"
+       y="71.720772"
+       x="342.64755"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="71.720772"
+         x="342.64755"
+         id="tspan3190"
+         sodipodi:role="line">share</tspan></text>
+    <text
+       sodipodi:linespacing="100%"
+       id="text3192"
+       y="93.020752"
+       x="355.10553"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       xml:space="preserve"><tspan
+         sodipodi:role="line"
+         id="tspan3282"
+         x="355.10553"
+         y="93.020752">C4</tspan></text>
+    <rect
+       style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3245"
+       width="62.568695"
+       height="54.581161"
+       x="463.64905"
+       y="47.720215"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="471.5787"
+       y="71.720772"
+       id="text3247"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3249"
+         x="471.5787"
+         y="71.720772">share</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="484.03665"
+       y="93.020752"
+       id="text3251"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3293"
+         x="484.03665"
+         y="93.020752">D4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="479.80331"
+       y="521.89929"
+       id="text3833"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3835"
+         x="479.80331"
+         y="521.89929">share4</tspan></text>
+    <rect
+       style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1"
+       id="rect3837"
+       width="95.533775"
+       height="81.721664"
+       x="608.88721"
+       y="272.46359" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="627.25848"
+       y="292.98965"
+       id="text3839"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3841"
+         x="627.25848"
+         y="292.98965">peer 4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 559.39381,305.84288 C 608.88721,309.29591 608.88721,309.29591 608.88721,309.29591"
+       id="path3843" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 106.27121,102.50451 L 108.15211,173.97895"
+       id="path2431" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 238.8751,102.50451 L 237.93464,173.03849"
+       id="path2433" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 366.77673,103.44496 L 366.77673,172.09804"
+       id="path2435" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 495.61881,103.44496 L 495.61881,173.03849"
+       id="path2437" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 489.97609,208.77571 L 438.25116,282.13106"
+       id="path2439" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 370.53854,207.83526 L 420.38255,282.13106"
+       id="path2441" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 236.05374,209.71617 L 183.38836,284.01197"
+       id="path2443" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 110.97347,207.83526 L 164.5793,282.13106"
+       id="path2445" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 178.6861,315.98737 L 289.65957,388.40226"
+       id="path2447" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 426.02527,315.98737 L 316.93271,389.34272"
+       id="path2449" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1"
+       id="rect3336"
+       width="474.92883"
+       height="334.80142"
+       x="61.129456"
+       y="140.12263" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="241.69646"
+       y="263.32199"
+       id="text3338"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3340"
+         x="241.69646"
+         y="263.32199">Merkle Tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="68.653069"
+       y="466.45987"
+       id="text3342"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3344"
+         x="68.653069"
+         y="466.45987">block hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="321.63498"
+       y="405.33044"
+       id="text3346"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3352"
+         x="321.63498"
+         y="405.33044">&quot;block root hash&quot;</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="88.648125"
+       y="598.72913"
+       id="text3632"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3634"
+         x="88.648125"
+         y="598.72913">block</tspan><tspan
+         sodipodi:role="line"
+         x="88.648125"
+         y="618.72913"
+         id="tspan3636">root hashes</tspan></text>
+    <g
+       id="g3642"
+       transform="translate(-350.3156,360.201)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3644"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text3646"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan3648"
+           sodipodi:role="line">SHA</tspan></text>
+    </g>
+    <g
+       id="g3675"
+       transform="translate(52.10837,496.9171)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path5669"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3653"
+         y="160.03162"
+         x="68.92907"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="160.03162"
+           x="68.92907"
+           id="tspan3655"
+           sodipodi:role="line">s1</tspan></text>
+    </g>
+    <g
+       id="g3686"
+       transform="translate(52.10837,491.5603)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3657"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="68.029869"
+         y="239.32857"
+         id="text3659"
+         sodipodi:linespacing="100%"><tspan
+           y="239.32857"
+           x="68.029869"
+           id="tspan3680"
+           sodipodi:role="line">s2</tspan></text>
+    </g>
+    <g
+       id="g3691"
+       transform="translate(52.10837,489.4639)">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3663"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3665"
+         y="313.49518"
+         x="70.729767"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           y="313.49518"
+           x="70.729767"
+           id="tspan3682"
+           sodipodi:role="line">s3</tspan></text>
+    </g>
+    <g
+       id="g3696"
+       transform="translate(52.10837,496.9171)">
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         id="path3669"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" />
+      <text
+         xml:space="preserve"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         x="72.669769"
+         y="377.16217"
+         id="text3671"
+         sodipodi:linespacing="100%"><tspan
+           y="377.16217"
+           x="72.669769"
+           id="tspan3684"
+           sodipodi:role="line">s4</tspan></text>
+    </g>
+    <g
+       transform="translate(-352.4577,205.2519)"
+       id="g3701">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3703"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3705"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3707"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <g
+       transform="translate(-233.9253,270.9446)"
+       id="g3709">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path3711"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text3713"
+         y="483.09396"
+         x="591.47559"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan3715"
+           x="591.47559"
+           y="483.09396">SHA</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 147.07717,654.57336 L 229.9071,678.8511"
+       id="path3717" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 148.50528,723.83631 C 152.07553,722.40821 230.62115,692.41807 230.62115,692.41807"
+       id="path3719" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 151.36148,796.66952 L 232.7633,830.94397"
+       id="path3721" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 152.07553,868.78867 L 232.04925,848.08119"
+       id="path3723" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 267.03775,836.65638 L 349.86767,760.96697"
+       id="path3725" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+       d="M 266.3237,687.41971 L 349.15362,742.40164"
+       id="path3727" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5560"
+       width="484.38986"
+       height="374.49551"
+       x="78.049934"
+       y="564.42963" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="358.2843"
+       y="865.40643"
+       id="text5700"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan5702"
+         x="358.2843"
+         y="865.40643">Merkle Tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="88.140358"
+       y="930.49945"
+       id="text5704"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan7497"
+         x="88.140358"
+         y="930.49945">share hash tree</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="356.4744"
+       y="786.95703"
+       id="text5566"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan5568"
+         x="356.4744"
+         y="786.95703">&quot;share root hash&quot;</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0"
+       d="M 290.30681,720.03728 L 108.29659,845.9841 L 74.309836,804.80832 L 190.42285,712.9661 L 239.36655,641.22131 L 299.69,669.98266 L 290.30681,720.03728 z "
+       id="path5949"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 32.468525,28.648698 L 557.69466,30.558611 L 561.51449,540.50544 L 374.34299,540.50544 L 296.03655,725.76702 L 80.216355,869.01051 L 30.558611,817.44286 L 164.25254,727.67694 L 234.91933,590.16318 L 219.64002,534.7757 L 36.288351,534.7757 L 32.468525,28.648698 z "
+       id="path5951" />
+    <text
+       xml:space="preserve"
+       style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+       x="370.89407"
+       y="630.30597"
+       id="text7307"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan7499"
+         x="370.89407"
+         y="630.30597">merkle hash chain</tspan><tspan
+         sodipodi:role="line"
+         id="tspan7501"
+         x="370.89407"
+         y="650.30597">to validate s4</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 444.20214,656.77444 C 435.69736,681.11928 360.49372,712.77648 296.54955,691.10088"
+       id="path7317"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="translate(221.2501,29.91837)"
+       id="g7322">
+      <path
+         transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)"
+         d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1  572.61081,196.10106 A 34.958466 34.073441 0 1 1  642.52774 196.10106 z"
+         sodipodi:ry="34.073441"
+         sodipodi:rx="34.958466"
+         sodipodi:cy="196.10106"
+         sodipodi:cx="607.56927"
+         id="path7324"
+         style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="100%"
+         id="text7326"
+         y="377.16217"
+         x="72.669769"
+         style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
+         xml:space="preserve"><tspan
+           sodipodi:role="line"
+           id="tspan7328"
+           x="72.669769"
+           y="377.16217">s4</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/docs/specifications/mut.svg b/docs/specifications/mut.svg
new file mode 100644 (file)
index 0000000..3db01b8
--- /dev/null
@@ -0,0 +1,1602 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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"
+   width="278.36371"
+   height="295.09766"
+   id="svg2841"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="mut.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs2843">
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send"
+       style="overflow:visible">
+      <path
+         id="path7680"
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient7760">
+      <stop
+         style="stop-color:#ca1818;stop-opacity:1;"
+         offset="0"
+         id="stop7762" />
+      <stop
+         style="stop-color:#ca1818;stop-opacity:0;"
+         offset="1"
+         id="stop7764" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         id="path3751"
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3745"
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2849" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7760"
+       id="linearGradient7766"
+       x1="-0.41100001"
+       y1="412.36218"
+       x2="160.411"
+       y2="412.36218"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7760"
+       id="linearGradient7788"
+       gradientUnits="userSpaceOnUse"
+       x1="-0.41100001"
+       y1="412.36218"
+       x2="160.411"
+       y2="412.36218" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7760"
+       id="linearGradient7793"
+       gradientUnits="userSpaceOnUse"
+       x1="-0.41100001"
+       y1="412.36218"
+       x2="160.411"
+       y2="412.36218" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.3332515"
+     inkscape:cx="210.25878"
+     inkscape:cy="123.41841"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:window-width="1598"
+     inkscape:window-height="1198"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2883"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2846">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-217.17997,-198.38081)">
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.61650002;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect2885"
+       width="7.5"
+       height="0"
+       x="314.88028"
+       y="111.80756" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot7772"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion
+         id="flowRegion7774"><rect
+           id="rect7776"
+           width="378.57144"
+           height="65.714287"
+           x="-35.714287"
+           y="384.50504"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara
+         id="flowPara7778" /></flowRoot>    <path
+       sodipodi:type="arc"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="path8437"
+       sodipodi:cx="420"
+       sodipodi:cy="212.36218"
+       sodipodi:rx="80"
+       sodipodi:ry="20"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       transform="matrix(0.3375,0,0,0.3375,257.2117,137.23422)" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2919375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 438.13856,269.91499 C 446.63381,280.47335 453.38314,289.63578 453.38314,289.63578"
+       id="path9557"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 463.64994,293.69223 C 463.64994,297.55233 463.64994,302.1186 463.64994,302.1186"
+       id="path11208"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="467.92987"
+       y="288.97491"
+       id="text16751"><tspan
+         sodipodi:role="line"
+         id="tspan16753"
+         x="467.92987"
+         y="288.97491" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="464.14178"
+       y="291.24774"
+       id="text16755"><tspan
+         sodipodi:role="line"
+         id="tspan16757"
+         x="464.14178"
+         y="291.24774" /></text>
+    <text
+       transform="scale(0.8196045,1.2201006)"
+       xml:space="preserve"
+       style="font-size:13.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="589.64325"
+       y="218.94211"
+       id="text16759"
+       sodipodi:linespacing="100%"><tspan
+         y="218.94211"
+         x="589.64325"
+         id="tspan16761"
+         sodipodi:role="line" /></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32201561px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 372.25866,281.18125 C 391.14052,275.94279 412.5754,263.5215 412.5754,263.5215"
+       id="path21360"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 467.95624,303.64299 C 465.78336,307.89979 463.10818,312.90038 463.10818,312.90038"
+       id="path4716"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="445.04538"
+       y="385.5498"
+       id="text4926"><tspan
+         sodipodi:role="line"
+         id="tspan4928"
+         x="445.04538"
+         y="385.5498">shares</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="path4938"
+       sodipodi:cx="420"
+       sodipodi:cy="212.36218"
+       sodipodi:rx="80"
+       sodipodi:ry="20"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       transform="matrix(0,0.1683097,-0.3399575,0,508.99378,294.48202)" />
+    <path
+       transform="matrix(0,0.1683097,-0.3399575,0,517.99378,294.48202)"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       sodipodi:ry="20"
+       sodipodi:rx="80"
+       sodipodi:cy="212.36218"
+       sodipodi:cx="420"
+       id="path4940"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="path4942"
+       sodipodi:cx="420"
+       sodipodi:cy="212.36218"
+       sodipodi:rx="80"
+       sodipodi:ry="20"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       transform="matrix(0,0.1683097,-0.3399575,0,526.99378,294.48202)" />
+    <path
+       transform="matrix(0,0.1683097,-0.3399575,0,535.99378,294.48202)"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       sodipodi:ry="20"
+       sodipodi:rx="80"
+       sodipodi:cy="212.36218"
+       sodipodi:cx="420"
+       id="path4944"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       sodipodi:type="arc" />
+    <path
+       transform="matrix(0,0.1683097,-0.3399575,0,542.80003,294.65787)"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       sodipodi:ry="20"
+       sodipodi:rx="80"
+       sodipodi:cy="212.36218"
+       sodipodi:cx="420"
+       id="path4946"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       sodipodi:type="arc" />
+    <path
+       transform="matrix(0,0.1683097,-0.3399575,0,551.80003,294.58742)"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       sodipodi:ry="20"
+       sodipodi:rx="80"
+       sodipodi:cy="212.36218"
+       sodipodi:cx="420"
+       id="path4948"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       sodipodi:type="arc" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect4950"
+       width="60.860748"
+       height="2.1464994"
+       x="427.86215"
+       y="376.78323" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 436.85592,349.56271 C 436.85592,349.56271 434.60592,329.31271 461.60592,329.31271 C 445.85592,333.81271 445.85592,349.56271 445.85592,349.56271"
+       id="path4952" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 461.60592,329.31271 C 454.85592,336.06271 454.85592,349.56271 454.85592,349.56271"
+       id="path4954" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 461.60592,329.31271 C 463.85592,329.31271 463.85592,349.56271 463.85592,349.56271"
+       id="path4956" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 461.60592,329.31271 C 470.60592,329.31271 470.60592,349.56271 470.60592,349.56271"
+       id="path4958" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 461.60592,329.31271 C 479.60592,329.31271 479.60592,349.56271 479.60592,349.56271"
+       id="path4960" />
+    <rect
+       y="372.16623"
+       x="427.74518"
+       height="2.1464994"
+       width="60.860748"
+       id="rect4962"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect4964"
+       width="60.860748"
+       height="2.1464994"
+       x="427.74518"
+       y="367.66623" />
+    <rect
+       y="363.16623"
+       x="427.74518"
+       height="2.1464994"
+       width="60.860748"
+       id="rect4966"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect4968"
+       width="60.860748"
+       height="2.1464994"
+       x="427.74518"
+       y="358.66623" />
+    <rect
+       y="354.16623"
+       x="427.74518"
+       height="2.1464994"
+       width="60.860748"
+       id="rect4970"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect4972"
+       width="60.860748"
+       height="2.1464994"
+       x="427.74518"
+       y="354.16623" />
+    <g
+       transform="matrix(0,0.2054517,-0.1664743,0,467.60988,354.01332)"
+       id="g4974"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         d="M -0.53492796,252.21639 C -5.5179181,262.28794 39.328998,262.28794 39.328998,262.28794 C 59.260953,262.28794 59.260953,292.50259 59.260953,292.50259"
+         id="path4976" />
+      <path
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         d="M 120.64913,252.36218 C 125.63212,262.43373 80.7852,262.43373 80.7852,262.43373 C 60.85325,262.43373 60.85325,292.64838 60.85325,292.64838"
+         id="path4978" />
+    </g>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 407.29684,407.56445 L 411.94948,419.32947"
+       id="path4998"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.50278425px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="468.50412"
+       y="382.92706"
+       id="text5004"
+       sodipodi:linespacing="100%"
+       transform="scale(0.9062658,1.1034291)"><tspan
+         sodipodi:role="line"
+         id="tspan5006"
+         x="468.50412"
+         y="382.92706"
+         style="font-size:8.10000038px">Merkle Tree</tspan></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16140337px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 418.04929,366.13921 C 402.75501,384.90072 405.78989,392.50491 405.78989,392.50491 L 405.78989,392.50491"
+       id="path5008" />
+    <g
+       id="g9174"
+       transform="matrix(0.7985291,0,0,0.5813416,-172.4015,-45.31981)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9176"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9178"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9180"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9182" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9184" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="297.6908"
+       y="233.17752"
+       id="text9186"><tspan
+         sodipodi:role="line"
+         x="297.6908"
+         y="233.17752"
+         style="font-size:5px"
+         id="tspan9188">AES-CTR</tspan></text>
+    <g
+       id="g9877"
+       transform="matrix(0.7985291,0,0,0.5813416,-65.298876,150.88501)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9879"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9881"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9883"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9885" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9887" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="404.19336"
+       y="429.98233"
+       id="text9889"><tspan
+         sodipodi:role="line"
+         x="404.19336"
+         y="429.98233"
+         style="font-size:5px"
+         id="tspan9891">SHA256d</tspan></text>
+    <g
+       id="g9893"
+       transform="matrix(0.7985291,0,0,0.5813416,-7.0974465,151.48502)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9895"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9897"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9899"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9901" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9903" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="462.39481"
+       y="430.58234"
+       id="text9905"><tspan
+         sodipodi:role="line"
+         x="462.39481"
+         y="430.58234"
+         style="font-size:5px"
+         id="tspan9907">SHA256d</tspan></text>
+    <g
+       id="g9909"
+       transform="matrix(0.7985291,0,0,0.5813416,-37.39819,179.0857)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9911"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9913"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9915"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9917" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9919" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="432.09406"
+       y="458.18301"
+       id="text9921"><tspan
+         sodipodi:role="line"
+         x="432.09406"
+         y="458.18301"
+         style="font-size:5px"
+         id="tspan9923">SHA256d</tspan></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 424.55591,436.29471 L 429.20855,448.05973"
+       id="path9925"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 463.55687,407.19399 L 468.20951,418.95901"
+       id="path9927"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 484.06352,407.70392 L 479.41088,419.46894"
+       id="path9929"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 425.60846,407.49401 L 420.95582,419.25903"
+       id="path9931"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 458.90929,435.99471 L 454.25665,447.75973"
+       id="path9933"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g9935"
+       transform="matrix(0.7985291,0,0,0.5813416,-17.597704,43.482372)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9937"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9939"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9941"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9943" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9945" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="456.99469"
+       y="322.27969"
+       id="text9947"><tspan
+         sodipodi:role="line"
+         x="456.99469"
+         y="322.27969"
+         style="font-size:5px"
+         id="tspan9949">FEC</tspan></text>
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z"
+       id="path9993"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
+       id="path9995"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 26.114257,76.71179 L 26.114257,75.211753 L 53.11492,75.211753 L 80.115583,75.211753 L 80.115583,76.71179 L 80.115583,78.211827 L 53.11492,78.211827 L 26.114257,78.211827 L 26.114257,76.71179 z"
+       id="path9997"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 26.414265,133.7148 L 26.414265,132.21315 L 53.431371,132.21315 L 80.44846,132.21315 L 80.357032,133.63819 L 80.265587,135.06322 L 53.339926,135.13984 L 26.414265,135.21643 L 26.414265,133.7148 z"
+       id="path9999"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z"
+       id="path10001"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
+       id="path10003"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 26.414265,133.72419 L 26.414265,132.21315 L 53.432178,132.21315 L 80.450089,132.21315 L 80.357839,133.48818 L 80.265587,134.76322 L 73.515421,134.91631 C 69.80283,135.00052 57.686283,135.10673 46.58976,135.15233 L 26.414265,135.23524 L 26.414265,133.72419 z"
+       id="path10045"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z"
+       id="path10047"
+       transform="translate(216.27706,196.47119)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="text"
+     transform="translate(-217.17997,-198.38081)">
+    <path
+       transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       sodipodi:ry="20"
+       sodipodi:rx="80"
+       sodipodi:cy="212.36218"
+       sodipodi:cx="420"
+       id="path12528"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       sodipodi:type="arc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 398.91941,217.38625 C 397.86315,236.37897 412.97295,261.62455 412.97295,261.62455"
+       id="path8489"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:type="arc"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="path10092"
+       sodipodi:cx="420"
+       sodipodi:cy="212.36218"
+       sodipodi:rx="80"
+       sodipodi:ry="20"
+       d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z"
+       transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" />
+    <text
+       xml:space="preserve"
+       style="font-size:8.09999943px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="556.67358"
+       y="169.5114"
+       id="text10094"
+       transform="scale(0.8252145,1.2118062)"><tspan
+         sodipodi:role="line"
+         id="tspan10096"
+         x="556.67358"
+         y="169.5114" /></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect13628"
+       width="7.5"
+       height="0"
+       x="524.88025"
+       y="299.30756" />
+    <g
+       id="g16785"
+       transform="matrix(0.364293,0,0,0.4974358,-16.906009,-38.001986)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <g
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="g16787"
+         transform="translate(-210,240)" />
+      <text
+         transform="scale(1.0714114,0.9333483)"
+         id="text16789"
+         y="325.48486"
+         x="362.67249"
+         style="font-size:32.76525116px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         xml:space="preserve"><tspan
+           id="tspan16791"
+           y="325.48486"
+           x="362.67249"
+           sodipodi:role="line" /></text>
+    </g>
+    <text
+       transform="scale(0.9161476,1.0915272)"
+       id="text16795"
+       y="124.86931"
+       x="159.02403"
+       style="font-size:13.94785595px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="124.86931"
+         x="159.02403"
+         id="tspan16797"
+         sodipodi:role="line" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13.947855px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="247.0589"
+       y="116.87234"
+       id="text16801"
+       transform="scale(0.7061936,1.4160423)"><tspan
+         sodipodi:role="line"
+         id="tspan16803"
+         x="247.0589"
+         y="116.87234" /></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect20335"
+       width="4.5456867"
+       height="0"
+       x="206.55289"
+       y="326.09802" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.27742502;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect7836"
+       width="54"
+       height="3.375"
+       x="346.5321"
+       y="342.79144" />
+    <text
+       transform="scale(1.0705538,0.934096)"
+       id="text7838"
+       y="377.70102"
+       x="341.13809"
+       style="font-size:6.07499981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="377.70102"
+         x="341.13809"
+         id="tspan7840"
+         sodipodi:role="line"
+         style="font-size:8.10000038px">salt</tspan></text>
+    <g
+       transform="matrix(0.3375,0,0,0.3375,168.46227,275.21496)"
+       id="g8416"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <rect
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.82200003;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="rect8418"
+         width="160"
+         height="10"
+         x="535"
+         y="22.362183" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="332.31949"
+       y="313.88254"
+       id="text8424"
+       transform="scale(1.0714114,0.9333483)"><tspan
+         sodipodi:role="line"
+         id="tspan8426"
+         x="332.31949"
+         y="313.88254"
+         style="font-size:8.10000038px">encryption</tspan><tspan
+         sodipodi:role="line"
+         x="332.31949"
+         y="324.00754"
+         id="tspan8428"
+         style="font-size:8.10000038px">      key</tspan></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 298.98227,329.83819 C 326.42371,330.53571 348.95266,320.06453 348.95266,320.06453"
+       id="path21352"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 362.28379,341.51001 C 341.45603,329.97307 346.83916,321.99552 346.83916,321.99552"
+       id="path21354"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2438544px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 355.39701,305.53135 L 360.98003,293.64584"
+       id="path21358"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="487.03278"
+       y="411.55334"
+       id="text3034"><tspan
+         sodipodi:role="line"
+         id="tspan3036"
+         x="487.03278"
+         y="411.55334" /></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3254"
+       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion
+         id="flowRegion3256"><rect
+           id="rect3258"
+           width="18.039574"
+           height="36.830799"
+           x="-31.569254"
+           y="-50.306789"
+           style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara
+         id="flowPara3260" /></flowRoot>    <rect
+       y="198.60286"
+       x="219.6953"
+       height="24.165203"
+       width="107.25604"
+       id="rect3282"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect5573"
+       width="54.139946"
+       height="3.3068728"
+       x="242.37775"
+       y="271.45877" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="235.36351"
+       y="301.57739"
+       id="text7107"
+       transform="scale(1.0705539,0.9340959)"><tspan
+         sodipodi:role="line"
+         id="tspan7109"
+         x="235.36351"
+         y="301.57739"
+         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text>
+    <text
+       transform="scale(1.0705539,0.9340959)"
+       id="text7768"
+       y="362.28162"
+       x="234.52074"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="362.28162"
+         x="234.52074"
+         id="tspan7770"
+         sodipodi:role="line"
+         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text>
+    <rect
+       y="356.53317"
+       x="230.62067"
+       height="24.165203"
+       width="107.25604"
+       id="rect3291"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="248.95004"
+       y="370.59125"
+       id="text3246"><tspan
+         sodipodi:role="line"
+         id="tspan3248"
+         x="248.95004"
+         y="370.59125"
+         style="font-size:8.10000038px">verifying (public) key</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="239.46277"
+       y="213.58257"
+       id="text3328"><tspan
+         sodipodi:role="line"
+         x="239.46277"
+         y="213.58257"
+         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="tspan3021">signing (private) key</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect4024"
+       width="54.139946"
+       height="3.3068728"
+       x="242.55493"
+       y="328.39029" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="381.61792"
+       y="386.57251"
+       id="text4229"><tspan
+         sodipodi:role="line"
+         id="tspan4231"
+         x="381.61792"
+         y="386.57251" /></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 234.50363,224.362 L 234.50363,354.01202"
+       id="path4243"
+       inkscape:connector-type="polyline" />
+    <rect
+       y="241.14568"
+       x="288.69962"
+       height="24.165203"
+       width="107.25604"
+       id="rect5564"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="306.05878"
+       y="255.20375"
+       id="text5566"><tspan
+         sodipodi:role="line"
+         id="tspan5568"
+         x="306.05878"
+         y="255.20375"
+         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">encrypted signing key</tspan></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 279.02164,269.72178 C 281.56206,241.33051 292.24088,235.15181 292.24088,235.15181"
+       id="path5574"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 285.08543,222.90932 L 291.78123,230.87533"
+       id="path6618"
+       inkscape:connector-type="polyline"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 322.35949,233.1782 L 335.48526,239.16028"
+       id="path8979"
+       sodipodi:nodetypes="cc" />
+    <text
+       transform="scale(1.0705539,0.9340959)"
+       id="text9528"
+       y="462.90314"
+       x="245.50374"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="462.90314"
+         x="245.50374"
+         id="tspan9530"
+         sodipodi:role="line"
+         style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9554"
+       width="108.27989"
+       height="3.3068728"
+       x="222.74568"
+       y="419.13055" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect16799"
+       width="171.15405"
+       height="13.22591"
+       x="222.05762"
+       y="440.96823" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="279.37097"
+       y="462.55542"
+       id="text3313"><tspan
+         sodipodi:role="line"
+         x="279.37097"
+         y="462.55542"
+         id="tspan3317"
+         style="font-size:8.10000038px">read-write cap</tspan></text>
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 222.87392,420.82386 L 222.87392,419.36856 L 276.84166,419.36856 L 330.8094,419.36856 L 330.8094,420.82386 L 330.8094,422.27917 L 276.84166,422.27917 L 222.87392,422.27917 L 222.87392,420.82386 z"
+       id="path9564" />
+    <text
+       transform="scale(1.0705539,0.9340959)"
+       id="text9566"
+       y="483.10208"
+       x="304.77203"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="483.10208"
+         x="304.77203"
+         id="tspan9568"
+         sodipodi:role="line"
+         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9570"
+       width="108.27989"
+       height="3.3068728"
+       x="281.14557"
+       y="443.04819" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 281.27383,444.74153 L 281.27383,443.28622 L 335.24158,443.28622 L 389.20931,443.28622 L 389.20931,444.74153 L 389.20931,446.19684 L 335.24158,446.19684 L 281.27383,446.19684 L 281.27383,444.74153 z"
+       id="path9572" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9574"
+       width="54.139946"
+       height="3.3068728"
+       x="225.99055"
+       y="442.97894" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="223.80324"
+       y="483.19937"
+       id="text9576"
+       transform="scale(1.0705539,0.9340959)"><tspan
+         sodipodi:role="line"
+         id="tspan9578"
+         x="223.80324"
+         y="483.19937"
+         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="279.37097"
+       y="490.32758"
+       id="text9582"><tspan
+         sodipodi:role="line"
+         x="279.37097"
+         y="490.32758"
+         id="tspan9584"
+         style="font-size:8.10000038px">read-only cap</tspan></text>
+    <text
+       transform="scale(1.0705539,0.9340959)"
+       id="text9586"
+       y="512.94104"
+       x="305.00543"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       xml:space="preserve"><tspan
+         y="512.94104"
+         x="305.00543"
+         id="tspan9588"
+         sodipodi:role="line"
+         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9590"
+       width="108.27989"
+       height="3.3068728"
+       x="281.14554"
+       y="470.82034" />
+    <path
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       d="M 281.27383,472.51368 L 281.27383,471.05837 L 335.24157,471.05837 L 389.2093,471.05837 L 389.2093,472.51368 L 389.2093,473.96898 L 335.24157,473.96898 L 281.27383,473.96898 L 281.27383,472.51368 z"
+       id="path9592" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9594"
+       width="54.139946"
+       height="3.3068728"
+       x="225.99054"
+       y="470.7511" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="224.83044"
+       y="512.93097"
+       id="text9596"
+       transform="scale(1.0705539,0.9340959)"><tspan
+         sodipodi:role="line"
+         id="tspan9598"
+         x="224.83044"
+         y="512.93097"
+         style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="384.58023"
+       y="210.64319"
+       id="text3025"><tspan
+         sodipodi:role="line"
+         id="tspan3027"
+         x="384.58023"
+         y="210.64319">plaintext</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="451.8754"
+       y="298.79443"
+       id="text3029"><tspan
+         sodipodi:role="line"
+         id="tspan3031"
+         x="451.8754"
+         y="298.79443">ciphertext</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="102.84189"
+       y="100.84377"
+       id="text3459"
+       transform="translate(218.99833,196.47119)"><tspan
+         sodipodi:role="line"
+         id="tspan3461"
+         x="102.84189"
+         y="100.84377" /></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 48.719461,27.732616 L 48.719461,41.723846"
+       id="path3512"
+       transform="translate(218.99833,196.47119)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 267.71779,255.74642 L 267.71779,269.73765"
+       id="path4829"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 266.96826,282.47967 L 266.96826,296.4709"
+       id="path4831"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 266.96826,312.96055 L 266.96826,326.95178"
+       id="path4833"
+       inkscape:connector-type="polyline" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.14901878px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect5110"
+       width="113.09831"
+       height="7.6182923"
+       x="221.60002"
+       y="417.24417" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 49.877177,187.22739 L 50.127816,194.49593"
+       id="path5112"
+       transform="translate(218.99833,196.47119)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+       d="M 50.127816,212.04066 L 50.127816,219.3092"
+       id="path5641"
+       transform="translate(218.99833,196.47119)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 22.500552,81.301996 C 3.3317037,108.63786 -8.6943462,156.11861 6.9001691,245.40603"
+       id="path7224"
+       transform="translate(218.99833,196.47119)"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 240.57714,332.04074 C 221.40829,359.37661 207.8822,408.95742 225.87678,470.34415"
+       id="path7753"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90.602225,227.40558 L 105.30258,246.00604"
+       id="path7755"
+       transform="translate(218.99833,196.47119)"
+       inkscape:connector-type="polyline"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 367.86051,447.5929 L 367.5605,469.79345"
+       id="path8286"
+       inkscape:connector-type="polyline"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g9190"
+       transform="matrix(0.7985291,0,0,0.5813416,-211.70247,-29.719429)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9192"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9194"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9196"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9198" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9200" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="257.18979"
+       y="245.77785"
+       id="text9202"><tspan
+         sodipodi:role="line"
+         x="257.18979"
+         y="245.77785"
+         id="tspan9204"
+         style="font-size:5px">SHA256d</tspan><tspan
+         sodipodi:role="line"
+         x="257.18979"
+         y="252.02785"
+         style="font-size:5px"
+         id="tspan9206">truncated</tspan></text>
+    <g
+       id="g9208"
+       transform="matrix(0.7985291,0,0,0.5813416,-211.70247,28.482004)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9210"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9212"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9214"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9216" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9218" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="257.18979"
+       y="303.97925"
+       id="text9220"><tspan
+         sodipodi:role="line"
+         x="257.18979"
+         y="303.97925"
+         id="tspan9222"
+         style="font-size:5px">SHA256d</tspan><tspan
+         sodipodi:role="line"
+         x="257.18979"
+         y="310.22925"
+         style="font-size:5px"
+         id="tspan9224">truncated</tspan></text>
+    <g
+       id="g9226"
+       transform="matrix(0.7985291,0,0,0.5813416,-127.4004,35.982184)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9228"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9230"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9232"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9234" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9236" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="341.49188"
+       y="311.47946"
+       id="text9238"><tspan
+         sodipodi:role="line"
+         x="341.49188"
+         y="311.47946"
+         id="tspan9240"
+         style="font-size:5px">SHA256d</tspan><tspan
+         sodipodi:role="line"
+         x="341.49188"
+         y="317.72946"
+         style="font-size:5px"
+         id="tspan9242">truncated</tspan></text>
+    <g
+       id="g9244"
+       transform="matrix(0.7985291,0,0,0.5813416,-210.80245,122.98432)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9246"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9248"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9250"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9252" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9254" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="258.08981"
+       y="398.4816"
+       id="text9256"><tspan
+         sodipodi:role="line"
+         x="258.08981"
+         y="398.4816"
+         id="tspan9258"
+         style="font-size:5px">SHA256d</tspan><tspan
+         sodipodi:role="line"
+         x="258.08981"
+         y="404.7316"
+         style="font-size:5px"
+         id="tspan9260">truncated</tspan></text>
+    <g
+       id="g9262"
+       transform="matrix(0.7985291,0,0,0.5813416,-52.098552,-13.519031)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">
+      <path
+         sodipodi:type="arc"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         id="path9264"
+         sodipodi:cx="607.56927"
+         sodipodi:cy="196.10106"
+         sodipodi:rx="34.958466"
+         sodipodi:ry="34.073441"
+         d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z"
+         transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" />
+      <text
+         xml:space="preserve"
+         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+         x="591.47559"
+         y="483.09396"
+         id="text9266"
+         sodipodi:linespacing="100%"><tspan
+           y="483.09396"
+           x="591.47559"
+           id="tspan9268"
+           sodipodi:role="line" /><tspan
+           y="493.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9270" /><tspan
+           y="503.09396"
+           x="591.47559"
+           sodipodi:role="line"
+           id="tspan9272" /></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="417.99377"
+       y="264.97833"
+       id="text9274"><tspan
+         sodipodi:role="line"
+         x="417.99377"
+         y="264.97833"
+         style="font-size:5px"
+         id="tspan9276">AES-CTR</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9845"
+       width="20.741352"
+       height="9.1972332"
+       x="395.21106"
+       y="396.4776"
+       inkscape:transform-center-y="4.6611973"
+       inkscape:transform-center-x="1.720467e-05" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 395.27984,401.04002 L 395.27984,396.56484 L 405.56868,396.56484 L 415.85752,396.56484 L 415.85752,401.04002 L 415.85752,405.51519 L 405.56868,405.51519 L 395.27984,405.51519 L 395.27984,401.04002 z"
+       id="path9847"
+       inkscape:transform-center-x="0.013044945"
+       inkscape:transform-center-y="4.6250009" />
+    <text
+       xml:space="preserve"
+       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="397.93158"
+       y="402.57623"
+       id="text9849"><tspan
+         sodipodi:role="line"
+         id="tspan9851"
+         x="397.93158"
+         y="402.57623">share 1</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9853"
+       width="20.741352"
+       height="9.1972332"
+       x="421.31168"
+       y="396.4776"
+       inkscape:transform-center-y="4.6611973"
+       inkscape:transform-center-x="1.720467e-05" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 421.38048,401.04003 L 421.38048,396.56485 L 431.66932,396.56485 L 441.95816,396.56485 L 441.95816,401.04003 L 441.95816,405.5152 L 431.66932,405.5152 L 421.38048,405.5152 L 421.38048,401.04003 z"
+       id="path9855"
+       inkscape:transform-center-x="0.013044945"
+       inkscape:transform-center-y="4.6250009" />
+    <text
+       xml:space="preserve"
+       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="424.0322"
+       y="402.57623"
+       id="text9857"><tspan
+         sodipodi:role="line"
+         id="tspan9859"
+         x="424.0322"
+         y="402.57623">share 2</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9861"
+       width="20.741352"
+       height="9.1972332"
+       x="446.81232"
+       y="396.4776"
+       inkscape:transform-center-y="4.6611973"
+       inkscape:transform-center-x="1.720467e-05" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 446.88111,401.04003 L 446.88111,396.56485 L 457.16995,396.56485 L 467.45879,396.56485 L 467.45879,401.04003 L 467.45879,405.5152 L 457.16995,405.5152 L 446.88111,405.5152 L 446.88111,401.04003 z"
+       id="path9863"
+       inkscape:transform-center-x="0.013044945"
+       inkscape:transform-center-y="4.6250009" />
+    <text
+       xml:space="preserve"
+       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="449.53284"
+       y="402.57623"
+       id="text9865"><tspan
+         sodipodi:role="line"
+         id="tspan9867"
+         x="449.53284"
+         y="402.57623">share 3</tspan></text>
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect9869"
+       width="20.741352"
+       height="9.1972332"
+       x="473.81299"
+       y="396.77759"
+       inkscape:transform-center-y="4.6611973"
+       inkscape:transform-center-x="1.720467e-05" />
+    <path
+       style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 473.88178,401.34003 L 473.88178,396.86485 L 484.17062,396.86485 L 494.45946,396.86485 L 494.45946,401.34003 L 494.45946,405.8152 L 484.17062,405.8152 L 473.88178,405.8152 L 473.88178,401.34003 z"
+       id="path9871"
+       inkscape:transform-center-x="0.013044945"
+       inkscape:transform-center-y="4.6250009" />
+    <text
+       xml:space="preserve"
+       style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       x="476.53351"
+       y="402.87622"
+       id="text9873"><tspan
+         sodipodi:role="line"
+         id="tspan9875"
+         x="476.53351"
+         y="402.87622">share 4</tspan></text>
+    <path
+       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 26.414265,133.71319 L 26.414265,132.21315 L 53.414928,132.21315 L 80.415591,132.21315 L 80.415591,133.51519 L 80.415591,134.81725 L 73.166834,135.01523 C 69.180018,135.12413 57.02972,135.21323 46.166171,135.21323 L 26.414265,135.21323 L 26.414265,133.71319 z"
+       id="path10049"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 9.9138595,248.166 L 9.9138595,246.51596 L 36.764519,246.51596 L 63.615178,246.51596 L 63.615178,248.166 L 63.615178,249.81604 L 36.764519,249.81604 L 9.9138595,249.81604 L 9.9138595,248.166 z"
+       id="path10051"
+       transform="translate(216.27706,196.47119)" />
+    <path
+       style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 9.9138595,275.91668 L 9.9138595,274.41665 L 36.764519,274.41665 L 63.615178,274.41665 L 63.615178,275.91668 L 63.615178,277.41672 L 36.764519,277.41672 L 9.9138595,277.41672 L 9.9138595,275.91668 z"
+       id="path10055"
+       transform="translate(216.27706,196.47119)" />
+    <rect
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"
+       id="rect2971"
+       width="171.15405"
+       height="13.22591"
+       x="222.20229"
+       y="469.1651" />
+  </g>
+</svg>
diff --git a/docs/specifications/mutable.txt b/docs/specifications/mutable.txt
new file mode 100644 (file)
index 0000000..40a5374
--- /dev/null
@@ -0,0 +1,648 @@
+
+This describes the "RSA-based mutable files" which were shipped in Tahoe v0.8.0.
+
+= Mutable Files =
+
+Mutable File Slots are places with a stable identifier that can hold data
+that changes over time. In contrast to CHK slots, for which the
+URI/identifier is derived from the contents themselves, the Mutable File Slot
+URI remains fixed for the life of the slot, regardless of what data is placed
+inside it.
+
+Each mutable slot is referenced by two different URIs. The "read-write" URI
+grants read-write access to its holder, allowing them to put whatever
+contents they like into the slot. The "read-only" URI is less powerful, only
+granting read access, and not enabling modification of the data. The
+read-write URI can be turned into the read-only URI, but not the other way
+around.
+
+The data in these slots is distributed over a number of servers, using the
+same erasure coding that CHK files use, with 3-of-10 being a typical choice
+of encoding parameters. The data is encrypted and signed in such a way that
+only the holders of the read-write URI will be able to set the contents of
+the slot, and only the holders of the read-only URI will be able to read
+those contents. Holders of either URI will be able to validate the contents
+as being written by someone with the read-write URI. The servers who hold the
+shares cannot read or modify them: the worst they can do is deny service (by
+deleting or corrupting the shares), or attempt a rollback attack (which can
+only succeed with the cooperation of at least k servers).
+
+== Consistency vs Availability ==
+
+There is an age-old battle between consistency and availability. Epic papers
+have been written, elaborate proofs have been established, and generations of
+theorists have learned that you cannot simultaneously achieve guaranteed
+consistency with guaranteed reliability. In addition, the closer to 0 you get
+on either axis, the cost and complexity of the design goes up.
+
+Tahoe's design goals are to largely favor design simplicity, then slightly
+favor read availability, over the other criteria.
+
+As we develop more sophisticated mutable slots, the API may expose multiple
+read versions to the application layer. The tahoe philosophy is to defer most
+consistency recovery logic to the higher layers. Some applications have
+effective ways to merge multiple versions, so inconsistency is not
+necessarily a problem (i.e. directory nodes can usually merge multiple "add
+child" operations).
+
+== The Prime Coordination Directive: "Don't Do That" ==
+
+The current rule for applications which run on top of Tahoe is "do not
+perform simultaneous uncoordinated writes". That means you need non-tahoe
+means to make sure that two parties are not trying to modify the same mutable
+slot at the same time. For example:
+
+ * don't give the read-write URI to anyone else. Dirnodes in a private
+   directory generally satisfy this case, as long as you don't use two
+   clients on the same account at the same time
+ * if you give a read-write URI to someone else, stop using it yourself. An
+   inbox would be a good example of this.
+ * if you give a read-write URI to someone else, call them on the phone
+   before you write into it
+ * build an automated mechanism to have your agents coordinate writes.
+   For example, we expect a future release to include a FURL for a
+   "coordination server" in the dirnodes. The rule can be that you must
+   contact the coordination server and obtain a lock/lease on the file
+   before you're allowed to modify it.
+
+If you do not follow this rule, Bad Things will happen. The worst-case Bad
+Thing is that the entire file will be lost. A less-bad Bad Thing is that one
+or more of the simultaneous writers will lose their changes. An observer of
+the file may not see monotonically-increasing changes to the file, i.e. they
+may see version 1, then version 2, then 3, then 2 again.
+
+Tahoe takes some amount of care to reduce the badness of these Bad Things.
+One way you can help nudge it from the "lose your file" case into the "lose
+some changes" case is to reduce the number of competing versions: multiple
+versions of the file that different parties are trying to establish as the
+one true current contents. Each simultaneous writer counts as a "competing
+version", as does the previous version of the file. If the count "S" of these
+competing versions is larger than N/k, then the file runs the risk of being
+lost completely. [TODO] If at least one of the writers remains running after
+the collision is detected, it will attempt to recover, but if S>(N/k) and all
+writers crash after writing a few shares, the file will be lost.
+
+Note that Tahoe uses serialization internally to make sure that a single
+Tahoe node will not perform simultaneous modifications to a mutable file. It
+accomplishes this by using a weakref cache of the MutableFileNode (so that
+there will never be two distinct MutableFileNodes for the same file), and by
+forcing all mutable file operations to obtain a per-node lock before they
+run. The Prime Coordination Directive therefore applies to inter-node
+conflicts, not intra-node ones.
+
+
+== Small Distributed Mutable Files ==
+
+SDMF slots are suitable for small (<1MB) files that are editing by rewriting
+the entire file. The three operations are:
+
+ * allocate (with initial contents)
+ * set (with new contents)
+ * get (old contents)
+
+The first use of SDMF slots will be to hold directories (dirnodes), which map
+encrypted child names to rw-URI/ro-URI pairs.
+
+=== SDMF slots overview ===
+
+Each SDMF slot is created with a public/private key pair. The public key is
+known as the "verification key", while the private key is called the
+"signature key". The private key is hashed and truncated to 16 bytes to form
+the "write key" (an AES symmetric key). The write key is then hashed and
+truncated to form the "read key". The read key is hashed and truncated to
+form the 16-byte "storage index" (a unique string used as an index to locate
+stored data).
+
+The public key is hashed by itself to form the "verification key hash".
+
+The write key is hashed a different way to form the "write enabler master".
+For each storage server on which a share is kept, the write enabler master is
+concatenated with the server's nodeid and hashed, and the result is called
+the "write enabler" for that particular server. Note that multiple shares of
+the same slot stored on the same server will all get the same write enabler,
+i.e. the write enabler is associated with the "bucket", rather than the
+individual shares.
+
+The private key is encrypted (using AES in counter mode) by the write key,
+and the resulting crypttext is stored on the servers. so it will be
+retrievable by anyone who knows the write key. The write key is not used to
+encrypt anything else, and the private key never changes, so we do not need
+an IV for this purpose.
+
+The actual data is encrypted (using AES in counter mode) with a key derived
+by concatenating the readkey with the IV, the hashing the results and
+truncating to 16 bytes. The IV is randomly generated each time the slot is
+updated, and stored next to the encrypted data.
+
+The read-write URI consists of the write key and the verification key hash.
+The read-only URI contains the read key and the verification key hash. The
+verify-only URI contains the storage index and the verification key hash.
+
+ URI:SSK-RW:b2a(writekey):b2a(verification_key_hash)
+ URI:SSK-RO:b2a(readkey):b2a(verification_key_hash)
+ URI:SSK-Verify:b2a(storage_index):b2a(verification_key_hash)
+
+Note that this allows the read-only and verify-only URIs to be derived from
+the read-write URI without actually retrieving the public keys. Also note
+that it means the read-write agent must validate both the private key and the
+public key when they are first fetched. All users validate the public key in
+exactly the same way.
+
+The SDMF slot is allocated by sending a request to the storage server with a
+desired size, the storage index, and the write enabler for that server's
+nodeid. If granted, the write enabler is stashed inside the slot's backing
+store file. All further write requests must be accompanied by the write
+enabler or they will not be honored. The storage server does not share the
+write enabler with anyone else.
+
+The SDMF slot structure will be described in more detail below. The important
+pieces are:
+
+  * a sequence number
+  * a root hash "R"
+  * the encoding parameters (including k, N, file size, segment size)
+  * a signed copy of [seqnum,R,encoding_params], using the signature key
+  * the verification key (not encrypted)
+  * the share hash chain (part of a Merkle tree over the share hashes)
+  * the block hash tree (Merkle tree over blocks of share data)
+  * the share data itself (erasure-coding of read-key-encrypted file data)
+  * the signature key, encrypted with the write key
+
+The access pattern for read is:
+ * hash read-key to get storage index
+ * use storage index to locate 'k' shares with identical 'R' values
+   * either get one share, read 'k' from it, then read k-1 shares
+   * or read, say, 5 shares, discover k, either get more or be finished
+   * or copy k into the URIs
+ * read verification key
+ * hash verification key, compare against verification key hash
+ * read seqnum, R, encoding parameters, signature
+ * verify signature against verification key
+ * read share data, compute block-hash Merkle tree and root "r"
+ * read share hash chain (leading from "r" to "R")
+ * validate share hash chain up to the root "R"
+ * submit share data to erasure decoding
+ * decrypt decoded data with read-key
+ * submit plaintext to application
+
+The access pattern for write is:
+ * hash write-key to get read-key, hash read-key to get storage index
+ * use the storage index to locate at least one share
+ * read verification key and encrypted signature key
+ * decrypt signature key using write-key
+ * hash signature key, compare against write-key
+ * hash verification key, compare against verification key hash
+ * encrypt plaintext from application with read-key
+   * application can encrypt some data with the write-key to make it only
+     available to writers (use this for transitive read-onlyness of dirnodes)
+ * erasure-code crypttext to form shares
+ * split shares into blocks
+ * compute Merkle tree of blocks, giving root "r" for each share
+ * compute Merkle tree of shares, find root "R" for the file as a whole
+ * create share data structures, one per server:
+   * use seqnum which is one higher than the old version
+   * share hash chain has log(N) hashes, different for each server
+   * signed data is the same for each server
+ * now we have N shares and need homes for them
+ * walk through peers
+   * if share is not already present, allocate-and-set
+   * otherwise, try to modify existing share:
+   * send testv_and_writev operation to each one
+   * testv says to accept share if their(seqnum+R) <= our(seqnum+R)
+   * count how many servers wind up with which versions (histogram over R)
+   * keep going until N servers have the same version, or we run out of servers
+     * if any servers wound up with a different version, report error to
+       application
+     * if we ran out of servers, initiate recovery process (described below)
+
+=== Server Storage Protocol ===
+
+The storage servers will provide a mutable slot container which is oblivious
+to the details of the data being contained inside it. Each storage index
+refers to a "bucket", and each bucket has one or more shares inside it. (In a
+well-provisioned network, each bucket will have only one share). The bucket
+is stored as a directory, using the base32-encoded storage index as the
+directory name. Each share is stored in a single file, using the share number
+as the filename.
+
+The container holds space for a container magic number (for versioning), the
+write enabler, the nodeid which accepted the write enabler (used for share
+migration, described below), a small number of lease structures, the embedded
+data itself, and expansion space for additional lease structures.
+
+ #   offset    size    name
+ 1   0         32      magic verstr "tahoe mutable container v1" plus binary
+ 2   32        20      write enabler's nodeid
+ 3   52        32      write enabler
+ 4   84        8       data size (actual share data present) (a)
+ 5   92        8       offset of (8) count of extra leases (after data)
+ 6   100       368     four leases, 92 bytes each
+                        0    4   ownerid (0 means "no lease here")
+                        4    4   expiration timestamp
+                        8   32   renewal token
+                        40  32   cancel token
+                        72  20   nodeid which accepted the tokens
+ 7   468       (a)     data
+ 8   ??        4       count of extra leases
+ 9   ??        n*92    extra leases
+
+The "extra leases" field must be copied and rewritten each time the size of
+the enclosed data changes. The hope is that most buckets will have four or
+fewer leases and this extra copying will not usually be necessary.
+
+The (4) "data size" field contains the actual number of bytes of data present
+in field (7), such that a client request to read beyond 504+(a) will result
+in an error. This allows the client to (one day) read relative to the end of
+the file. The container size (that is, (8)-(7)) might be larger, especially
+if extra size was pre-allocated in anticipation of filling the container with
+a lot of data.
+
+The offset in (5) points at the *count* of extra leases, at (8). The actual
+leases (at (9)) begin 4 bytes later. If the container size changes, both (8)
+and (9) must be relocated by copying.
+
+The server will honor any write commands that provide the write token and do
+not exceed the server-wide storage size limitations. Read and write commands
+MUST be restricted to the 'data' portion of the container: the implementation
+of those commands MUST perform correct bounds-checking to make sure other
+portions of the container are inaccessible to the clients.
+
+The two methods provided by the storage server on these "MutableSlot" share
+objects are:
+
+ * readv(ListOf(offset=int, length=int))
+   * returns a list of bytestrings, of the various requested lengths
+   * offset < 0 is interpreted relative to the end of the data
+   * spans which hit the end of the data will return truncated data
+
+ * testv_and_writev(write_enabler, test_vector, write_vector)
+   * this is a test-and-set operation which performs the given tests and only
+     applies the desired writes if all tests succeed. This is used to detect
+     simultaneous writers, and to reduce the chance that an update will lose
+     data recently written by some other party (written after the last time
+     this slot was read).
+   * test_vector=ListOf(TupleOf(offset, length, opcode, specimen))
+   * the opcode is a string, from the set [gt, ge, eq, le, lt, ne]
+   * each element of the test vector is read from the slot's data and 
+     compared against the specimen using the desired (in)equality. If all
+     tests evaluate True, the write is performed
+   * write_vector=ListOf(TupleOf(offset, newdata))
+     * offset < 0 is not yet defined, it probably means relative to the
+       end of the data, which probably means append, but we haven't nailed
+       it down quite yet
+     * write vectors are executed in order, which specifies the results of
+       overlapping writes
+   * return value:
+     * error: OutOfSpace
+     * error: something else (io error, out of memory, whatever)
+     * (True, old_test_data): the write was accepted (test_vector passed)
+     * (False, old_test_data): the write was rejected (test_vector failed)
+       * both 'accepted' and 'rejected' return the old data that was used
+         for the test_vector comparison. This can be used by the client
+         to detect write collisions, including collisions for which the
+         desired behavior was to overwrite the old version.
+
+In addition, the storage server provides several methods to access these
+share objects:
+
+ * allocate_mutable_slot(storage_index, sharenums=SetOf(int))
+   * returns DictOf(int, MutableSlot)
+ * get_mutable_slot(storage_index)
+   * returns DictOf(int, MutableSlot)
+   * or raises KeyError
+
+We intend to add an interface which allows small slots to allocate-and-write
+in a single call, as well as do update or read in a single call. The goal is
+to allow a reasonably-sized dirnode to be created (or updated, or read) in
+just one round trip (to all N shareholders in parallel).
+
+==== migrating shares ====
+
+If a share must be migrated from one server to another, two values become
+invalid: the write enabler (since it was computed for the old server), and
+the lease renew/cancel tokens.
+
+Suppose that a slot was first created on nodeA, and was thus initialized with
+WE(nodeA) (= H(WEM+nodeA)). Later, for provisioning reasons, the share is
+moved from nodeA to nodeB.
+
+Readers may still be able to find the share in its new home, depending upon
+how many servers are present in the grid, where the new nodeid lands in the
+permuted index for this particular storage index, and how many servers the
+reading client is willing to contact.
+
+When a client attempts to write to this migrated share, it will get a "bad
+write enabler" error, since the WE it computes for nodeB will not match the
+WE(nodeA) that was embedded in the share. When this occurs, the "bad write
+enabler" message must include the old nodeid (e.g. nodeA) that was in the
+share.
+
+The client then computes H(nodeB+H(WEM+nodeA)), which is the same as
+H(nodeB+WE(nodeA)). The client sends this along with the new WE(nodeB), which
+is H(WEM+nodeB). Note that the client only sends WE(nodeB) to nodeB, never to
+anyone else. Also note that the client does not send a value to nodeB that
+would allow the node to impersonate the client to a third node: everything
+sent to nodeB will include something specific to nodeB in it.
+
+The server locally computes H(nodeB+WE(nodeA)), using its own node id and the
+old write enabler from the share. It compares this against the value supplied
+by the client. If they match, this serves as proof that the client was able
+to compute the old write enabler. The server then accepts the client's new
+WE(nodeB) and writes it into the container.
+
+This WE-fixup process requires an extra round trip, and requires the error
+message to include the old nodeid, but does not require any public key
+operations on either client or server.
+
+Migrating the leases will require a similar protocol. This protocol will be
+defined concretely at a later date.
+
+=== Code Details ===
+
+The MutableFileNode class is used to manipulate mutable files (as opposed to
+ImmutableFileNodes). These are initially generated with
+client.create_mutable_file(), and later recreated from URIs with
+client.create_node_from_uri(). Instances of this class will contain a URI and
+a reference to the client (for peer selection and connection).
+
+NOTE: this section is out of date. Please see src/allmydata/interfaces.py
+(the section on IMutableFilesystemNode) for more accurate information.
+
+The methods of MutableFileNode are:
+
+ * download_to_data() -> [deferred] newdata, NotEnoughSharesError
+   * if there are multiple retrieveable versions in the grid, get() returns
+     the first version it can reconstruct, and silently ignores the others.
+     In the future, a more advanced API will signal and provide access to
+     the multiple heads.
+ * update(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError
+ * overwrite(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError
+
+download_to_data() causes a new retrieval to occur, pulling the current
+contents from the grid and returning them to the caller. At the same time,
+this call caches information about the current version of the file. This
+information will be used in a subsequent call to update(), and if another
+change has occured between the two, this information will be out of date,
+triggering the UncoordinatedWriteError.
+
+update() is therefore intended to be used just after a download_to_data(), in
+the following pattern:
+
+ d = mfn.download_to_data()
+ d.addCallback(apply_delta)
+ d.addCallback(mfn.update)
+
+If the update() call raises UCW, then the application can simply return an
+error to the user ("you violated the Prime Coordination Directive"), and they
+can try again later. Alternatively, the application can attempt to retry on
+its own. To accomplish this, the app needs to pause, download the new
+(post-collision and post-recovery) form of the file, reapply their delta,
+then submit the update request again. A randomized pause is necessary to
+reduce the chances of colliding a second time with another client that is
+doing exactly the same thing:
+
+ d = mfn.download_to_data()
+ d.addCallback(apply_delta)
+ d.addCallback(mfn.update)
+ def _retry(f):
+   f.trap(UncoordinatedWriteError)
+   d1 = pause(random.uniform(5, 20))
+   d1.addCallback(lambda res: mfn.download_to_data())
+   d1.addCallback(apply_delta)
+   d1.addCallback(mfn.update)
+   return d1
+ d.addErrback(_retry)
+
+Enthusiastic applications can retry multiple times, using a randomized
+exponential backoff between each. A particularly enthusiastic application can
+retry forever, but such apps are encouraged to provide a means to the user of
+giving up after a while.
+
+UCW does not mean that the update was not applied, so it is also a good idea
+to skip the retry-update step if the delta was already applied:
+
+ d = mfn.download_to_data()
+ d.addCallback(apply_delta)
+ d.addCallback(mfn.update)
+ def _retry(f):
+   f.trap(UncoordinatedWriteError)
+   d1 = pause(random.uniform(5, 20))
+   d1.addCallback(lambda res: mfn.download_to_data())
+   def _maybe_apply_delta(contents):
+     new_contents = apply_delta(contents)
+     if new_contents != contents:
+       return mfn.update(new_contents)
+   d1.addCallback(_maybe_apply_delta)
+   return d1
+ d.addErrback(_retry)
+
+update() is the right interface to use for delta-application situations, like
+directory nodes (in which apply_delta might be adding or removing child
+entries from a serialized table).
+
+Note that any uncoordinated write has the potential to lose data. We must do
+more analysis to be sure, but it appears that two clients who write to the
+same mutable file at the same time (even if both eventually retry) will, with
+high probability, result in one client observing UCW and the other silently
+losing their changes. It is also possible for both clients to observe UCW.
+The moral of the story is that the Prime Coordination Directive is there for
+a reason, and that recovery/UCW/retry is not a subsitute for write
+coordination.
+
+overwrite() tells the client to ignore this cached version information, and
+to unconditionally replace the mutable file's contents with the new data.
+This should not be used in delta application, but rather in situations where
+you want to replace the file's contents with completely unrelated ones. When
+raw files are uploaded into a mutable slot through the tahoe webapi (using
+POST and the ?mutable=true argument), they are put in place with overwrite().
+
+
+
+The peer-selection and data-structure manipulation (and signing/verification)
+steps will be implemented in a separate class in allmydata/mutable.py .
+
+=== SMDF Slot Format ===
+
+This SMDF data lives inside a server-side MutableSlot container. The server
+is oblivious to this format.
+
+This data is tightly packed. In particular, the share data is defined to run
+all the way to the beginning of the encrypted private key (the encprivkey
+offset is used both to terminate the share data and to begin the encprivkey).
+
+ #    offset   size    name
+ 1    0        1       version byte, \x00 for this format
+ 2    1        8       sequence number. 2^64-1 must be handled specially, TBD
+ 3    9        32      "R" (root of share hash Merkle tree)
+ 4    41       16      IV (share data is AES(H(readkey+IV)) )
+ 5    57       18      encoding parameters:
+       57       1        k
+       58       1        N
+       59       8        segment size
+       67       8        data length (of original plaintext)
+ 6    75       32      offset table:
+       75       4        (8) signature
+       79       4        (9) share hash chain
+       83       4        (10) block hash tree
+       87       4        (11) share data
+       91       8        (12) encrypted private key
+       99       8        (13) EOF
+ 7    107      436ish  verification key (2048 RSA key)
+ 8    543ish   256ish  signature=RSAenc(sigkey, H(version+seqnum+r+IV+encparm))
+ 9    799ish   (a)     share hash chain, encoded as:
+                        "".join([pack(">H32s", shnum, hash)
+                                 for (shnum,hash) in needed_hashes])
+10    (927ish) (b)     block hash tree, encoded as:
+                        "".join([pack(">32s",hash) for hash in block_hash_tree])
+11    (935ish) LEN     share data (no gap between this and encprivkey)
+12    ??       1216ish encrypted private key= AESenc(write-key, RSA-key)
+13    ??       --      EOF
+
+(a) The share hash chain contains ceil(log(N)) hashes, each 32 bytes long.
+    This is the set of hashes necessary to validate this share's leaf in the
+    share Merkle tree. For N=10, this is 4 hashes, i.e. 128 bytes.
+(b) The block hash tree contains ceil(length/segsize) hashes, each 32 bytes
+    long. This is the set of hashes necessary to validate any given block of
+    share data up to the per-share root "r". Each "r" is a leaf of the share
+    has tree (with root "R"), from which a minimal subset of hashes is put in
+    the share hash chain in (8).
+
+=== Recovery ===
+
+The first line of defense against damage caused by colliding writes is the
+Prime Coordination Directive: "Don't Do That".
+
+The second line of defense is to keep "S" (the number of competing versions)
+lower than N/k. If this holds true, at least one competing version will have
+k shares and thus be recoverable. Note that server unavailability counts
+against us here: the old version stored on the unavailable server must be
+included in the value of S.
+
+The third line of defense is our use of testv_and_writev() (described below),
+which increases the convergence of simultaneous writes: one of the writers
+will be favored (the one with the highest "R"), and that version is more
+likely to be accepted than the others. This defense is least effective in the
+pathological situation where S simultaneous writers are active, the one with
+the lowest "R" writes to N-k+1 of the shares and then dies, then the one with
+the next-lowest "R" writes to N-2k+1 of the shares and dies, etc, until the
+one with the highest "R" writes to k-1 shares and dies. Any other sequencing
+will allow the highest "R" to write to at least k shares and establish a new
+revision.
+
+The fourth line of defense is the fact that each client keeps writing until
+at least one version has N shares. This uses additional servers, if
+necessary, to make sure that either the client's version or some
+newer/overriding version is highly available.
+
+The fifth line of defense is the recovery algorithm, which seeks to make sure
+that at least *one* version is highly available, even if that version is
+somebody else's.
+
+The write-shares-to-peers algorithm is as follows:
+
+ * permute peers according to storage index
+ * walk through peers, trying to assign one share per peer
+ * for each peer:
+   * send testv_and_writev, using "old(seqnum+R) <= our(seqnum+R)" as the test
+     * this means that we will overwrite any old versions, and we will
+       overwrite simultaenous writers of the same version if our R is higher.
+       We will not overwrite writers using a higher seqnum.
+   * record the version that each share winds up with. If the write was
+     accepted, this is our own version. If it was rejected, read the
+     old_test_data to find out what version was retained.
+   * if old_test_data indicates the seqnum was equal or greater than our
+     own, mark the "Simultanous Writes Detected" flag, which will eventually
+     result in an error being reported to the writer (in their close() call).
+   * build a histogram of "R" values
+   * repeat until the histogram indicate that some version (possibly ours)
+     has N shares. Use new servers if necessary.
+   * If we run out of servers:
+     * if there are at least shares-of-happiness of any one version, we're
+       happy, so return. (the close() might still get an error)
+     * not happy, need to reinforce something, goto RECOVERY
+
+RECOVERY:
+ * read all shares, count the versions, identify the recoverable ones,
+   discard the unrecoverable ones.
+ * sort versions: locate max(seqnums), put all versions with that seqnum
+   in the list, sort by number of outstanding shares. Then put our own
+   version. (TODO: put versions with seqnum <max but >us ahead of us?).
+ * for each version:
+   * attempt to recover that version
+   * if not possible, remove it from the list, go to next one
+   * if recovered, start at beginning of peer list, push that version,
+     continue until N shares are placed
+   * if pushing our own version, bump up the seqnum to one higher than
+     the max seqnum we saw
+   * if we run out of servers:
+     * schedule retry and exponential backoff to repeat RECOVERY
+   * admit defeat after some period? presumeably the client will be shut down
+     eventually, maybe keep trying (once per hour?) until then.
+
+
+
+
+== Medium Distributed Mutable Files ==
+
+These are just like the SDMF case, but:
+
+ * we actually take advantage of the Merkle hash tree over the blocks, by
+   reading a single segment of data at a time (and its necessary hashes), to
+   reduce the read-time alacrity
+ * we allow arbitrary writes to the file (i.e. seek() is provided, and
+   O_TRUNC is no longer required)
+ * we write more code on the client side (in the MutableFileNode class), to
+   first read each segment that a write must modify. This looks exactly like
+   the way a normal filesystem uses a block device, or how a CPU must perform
+   a cache-line fill before modifying a single word.
+ * we might implement some sort of copy-based atomic update server call,
+   to allow multiple writev() calls to appear atomic to any readers.
+
+MDMF slots provide fairly efficient in-place edits of very large files (a few
+GB). Appending data is also fairly efficient, although each time a power of 2
+boundary is crossed, the entire file must effectively be re-uploaded (because
+the size of the block hash tree changes), so if the filesize is known in
+advance, that space ought to be pre-allocated (by leaving extra space between
+the block hash tree and the actual data).
+
+MDMF1 uses the Merkle tree to enable low-alacrity random-access reads. MDMF2
+adds cache-line reads to allow random-access writes.
+
+== Large Distributed Mutable Files ==
+
+LDMF slots use a fundamentally different way to store the file, inspired by
+Mercurial's "revlog" format. They enable very efficient insert/remove/replace
+editing of arbitrary spans. Multiple versions of the file can be retained, in
+a revision graph that can have multiple heads. Each revision can be
+referenced by a cryptographic identifier. There are two forms of the URI, one
+that means "most recent version", and a longer one that points to a specific
+revision.
+
+Metadata can be attached to the revisions, like timestamps, to enable rolling
+back an entire tree to a specific point in history.
+
+LDMF1 provides deltas but tries to avoid dealing with multiple heads. LDMF2
+provides explicit support for revision identifiers and branching.
+
+== TODO ==
+
+improve allocate-and-write or get-writer-buckets API to allow one-call (or
+maybe two-call) updates. The challenge is in figuring out which shares are on
+which machines. First cut will have lots of round trips.
+
+(eventually) define behavior when seqnum wraps. At the very least make sure
+it can't cause a security problem. "the slot is worn out" is acceptable.
+
+(eventually) define share-migration lease update protocol. Including the
+nodeid who accepted the lease is useful, we can use the same protocol as we
+do for updating the write enabler. However we need to know which lease to
+update.. maybe send back a list of all old nodeids that we find, then try all
+of them when we accept the update?
+
+ We now do this in a specially-formatted IndexError exception:
+  "UNABLE to renew non-existent lease. I have leases accepted by " +
+  "nodeids: '12345','abcde','44221' ."
+
+confirm that a repairer can regenerate shares without the private key. Hmm,
+without the write-enabler they won't be able to write those shares to the
+servers.. although they could add immutable new shares to new servers.
diff --git a/docs/specifications/uri.txt b/docs/specifications/uri.txt
new file mode 100644 (file)
index 0000000..5599fa1
--- /dev/null
@@ -0,0 +1,187 @@
+
+= Tahoe URIs =
+
+Each file and directory in a Tahoe filesystem is described by a "URI". There
+are different kinds of URIs for different kinds of objects, and there are
+different kinds of URIs to provide different kinds of access to those
+objects. Each URI is a string representation of a "capability" or "cap", and
+there are read-caps, write-caps, verify-caps, and others.
+
+Each URI provides both '''location''' and '''identification''' properties.
+'''location''' means that holding the URI is sufficient to locate the data it
+represents (this means it contains a storage index or a lookup key, whatever
+is necessary to find the place or places where the data is being kept).
+'''identification''' means that the URI also serves to validate the data: an
+attacker who wants to trick you into into using the wrong data will be
+limited in their abilities by the identification properties of the URI.
+
+Some URIs are subsets of others. In particular, if you know a URI which
+allows you to modify some object, you can produce a weaker read-only URI and
+give it to someone else, and they will be able to read that object but not
+modify it. Directories, for example, have a read-cap which is derived from
+the write-cap: anyone with read/write access to the directory can produce a
+limited URI that grants read-only access, but not the other way around.
+
+source:src/allmydata/uri.py is the main place where URIs are processed. It is
+the authoritative definition point for all the the URI types described
+herein.
+
+== File URIs ==
+
+The lowest layer of the Tahoe architecture (the "grid") is reponsible for
+mapping URIs to data. This is basically a distributed hash table, in which
+the URI is the key, and some sequence of bytes is the value.
+
+There are two kinds of entries in this table: immutable and mutable. For
+immutable entries, the URI represents a fixed chunk of data. The URI itself
+is derived from the data when it is uploaded into the grid, and can be used
+to locate and download that data from the grid at some time in the future.
+
+For mutable entries, the URI identifies a "slot" or "container", which can be
+filled with different pieces of data at different times.
+
+It is important to note that the "files" described by these URIs are just a
+bunch of bytes, and that __no__ filenames or other metadata is retained at
+this layer. The vdrive layer (which sits above the grid layer) is entirely
+responsible for directories and filenames and the like.
+
+=== CHI URIs ===
+
+CHK (Content Hash Keyed) files are immutable sequences of bytes. They are
+uploaded in a distributed fashion using a "storage index" (for the "location"
+property), and encrypted using a "read key". A secure hash of the data is
+computed to help validate the data afterwards (providing the "identification"
+property). All of these pieces, plus information about the file's size and
+the number of shares into which it has been distributed, are put into the
+"CHK" uri. The storage index is derived by hashing the read key (using a
+tagged SHA-256d hash, then truncated to 128 bits), so it does not need to be
+physically present in the URI.
+
+The current format for CHK URIs is the concatenation of the following
+strings:
+
+ URI:CHK:(key):(hash):(needed-shares):(total-shares):(size)
+
+Where (key) is the base32 encoding of the 16-byte AES read key, (hash) is the
+base32 encoding of the SHA-256 hash of the URI Extension Block,
+(needed-shares) is an ascii decimal representation of the number of shares
+required to reconstruct this file, (total-shares) is the same representation
+of the total number of shares created, and (size) is an ascii decimal
+representation of the size of the data represented by this URI. All base32
+encodings are expressed in lower-case, with the trailing '=' signs removed.
+
+For example, the following is a CHK URI, generated from the contents of the
+architecture.txt document that lives next to this one in the source tree:
+
+URI:CHK:ihrbeov7lbvoduupd4qblysj7a:bg5agsdt62jb34hxvxmdsbza6do64f4fg5anxxod2buttbo6udzq:3:10:28733
+
+Historical note: The name "CHK" is somewhat inaccurate and continues to be
+used for historical reasons. "Content Hash Key" means that the encryption key
+is derived by hashing the contents, which gives the useful property that
+encoding the same file twice will result in the same URI. However, this is an
+optional step: by passing a different flag to the appropriate API call, Tahoe
+will generate a random encryption key instead of hashing the file: this gives
+the useful property that the URI or storage index does not reveal anything
+about the file's contents (except filesize), which improves privacy. The
+URI:CHK: prefix really indicates that an immutable file is in use, without
+saying anything about how the key was derived.
+
+=== LIT URIs ===
+
+LITeral files are also an immutable sequence of bytes, but they are so short
+that the data is stored inside the URI itself. These are used for files of 55
+bytes or shorter, which is the point at which the LIT URI is the same length
+as a CHK URI would be.
+
+LIT URIs do not require an upload or download phase, as their data is stored
+directly in the URI.
+
+The format of a LIT URI is simply a fixed prefix concatenated with the base32
+encoding of the file's data:
+
+ URI:LIT:bjuw4y3movsgkidbnrwg26lemf2gcl3xmvrc6kropbuhi3lmbi
+
+The LIT URI for an empty file is "URI:LIT:", and the LIT URI for a 5-byte
+file that contains the string "hello" is "URI:LIT:nbswy3dp".
+
+=== Mutable File URIs ===
+
+The other kind of DHT entry is the "mutable slot", in which the URI names a
+container to which data can be placed and retrieved without changing the
+identity of the container.
+
+These slots have write-caps (which allow read/write access), read-caps (which
+only allow read-access), and verify-caps (which allow a file checker/repairer
+to confirm that the contents exist, but does not let it decrypt the
+contents).
+
+Mutable slots use public key technology to provide data integrity, and put a
+hash of the public key in the URI. As a result, the data validation is
+limited to confirming that the data retrieved matches _some_ data that was
+uploaded in the past, but not _which_ version of that data.
+
+The format of the write-cap for mutable files is:
+
+ URI:SSK:(writekey):(fingerprint)
+
+Where (writekey) is the base32 encoding of the 16-byte AES encryption key
+that is used to encrypt the RSA private key, and (fingerprint) is the base32
+encoded 32-byte SHA-256 hash of the RSA public key. For more details about
+the way these keys are used, please see docs/mutable.txt .
+
+The format for mutable read-caps is:
+
+ URI:SSK-RO:(readkey):(fingerprint)
+
+The read-cap is just like the write-cap except it contains the other AES
+encryption key: the one used for encrypting the mutable file's contents. This
+second key is derived by hashing the writekey, which allows the holder of a
+write-cap to produce a read-cap, but not the other way around. The
+fingerprint is the same in both caps.
+
+Historical note: the "SSK" prefix is a perhaps-inaccurate reference to
+"Sub-Space Keys" from the Freenet project, which uses a vaguely similar
+structure to provide mutable file access.
+
+== Directory URIs ==
+
+The grid layer provides a mapping from URI to data. To turn this into a graph
+of directories and files, the "vdrive" layer (which sits on top of the grid
+layer) needs to keep track of "directory nodes", or "dirnodes" for short.
+source:docs/dirnodes.txt describes how these work.
+
+Dirnodes are contained inside mutable files, and are thus simply a particular
+way to interpret the contents of these files. As a result, a directory
+write-cap looks a lot like a mutable-file write-cap:
+
+ URI:DIR2:(writekey):(fingerprint)
+
+Likewise directory read-caps (which provide read-only access to the
+directory) look much like mutable-file read-caps:
+
+ URI:DIR2-RO:(readkey):(fingerprint)
+
+Historical note: the "DIR2" prefix is used because the non-distributed
+dirnodes in earlier Tahoe releases had already claimed the "DIR" prefix.
+
+== Internal Usage of URIs ==
+
+The classes in source:src/allmydata/uri.py are used to pack and unpack these
+various kinds of URIs. Three Interfaces are defined (IURI, IFileURI, and
+IDirnodeURI) which are implemented by these classes, and string-to-URI-class
+conversion routines have been registered as adapters, so that code which
+wants to extract e.g. the size of a CHK or LIT uri can do:
+
+{{{
+print IFileURI(uri).get_size()
+}}}
+
+If the URI does not represent a CHK or LIT uri (for example, if it was for a
+directory instead), the adaptation will fail, raising a TypeError inside the
+IFileURI() call.
+
+Several utility methods are provided on these objects. The most important is
+{{{ to_string() }}}, which returns the string form of the URI. Therefore {{{
+IURI(uri).to_string == uri }}} is true for any valid URI. See the IURI class
+in source:src/allmydata/interfaces.py for more details.
+
diff --git a/docs/uri.txt b/docs/uri.txt
deleted file mode 100644 (file)
index 5599fa1..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-
-= Tahoe URIs =
-
-Each file and directory in a Tahoe filesystem is described by a "URI". There
-are different kinds of URIs for different kinds of objects, and there are
-different kinds of URIs to provide different kinds of access to those
-objects. Each URI is a string representation of a "capability" or "cap", and
-there are read-caps, write-caps, verify-caps, and others.
-
-Each URI provides both '''location''' and '''identification''' properties.
-'''location''' means that holding the URI is sufficient to locate the data it
-represents (this means it contains a storage index or a lookup key, whatever
-is necessary to find the place or places where the data is being kept).
-'''identification''' means that the URI also serves to validate the data: an
-attacker who wants to trick you into into using the wrong data will be
-limited in their abilities by the identification properties of the URI.
-
-Some URIs are subsets of others. In particular, if you know a URI which
-allows you to modify some object, you can produce a weaker read-only URI and
-give it to someone else, and they will be able to read that object but not
-modify it. Directories, for example, have a read-cap which is derived from
-the write-cap: anyone with read/write access to the directory can produce a
-limited URI that grants read-only access, but not the other way around.
-
-source:src/allmydata/uri.py is the main place where URIs are processed. It is
-the authoritative definition point for all the the URI types described
-herein.
-
-== File URIs ==
-
-The lowest layer of the Tahoe architecture (the "grid") is reponsible for
-mapping URIs to data. This is basically a distributed hash table, in which
-the URI is the key, and some sequence of bytes is the value.
-
-There are two kinds of entries in this table: immutable and mutable. For
-immutable entries, the URI represents a fixed chunk of data. The URI itself
-is derived from the data when it is uploaded into the grid, and can be used
-to locate and download that data from the grid at some time in the future.
-
-For mutable entries, the URI identifies a "slot" or "container", which can be
-filled with different pieces of data at different times.
-
-It is important to note that the "files" described by these URIs are just a
-bunch of bytes, and that __no__ filenames or other metadata is retained at
-this layer. The vdrive layer (which sits above the grid layer) is entirely
-responsible for directories and filenames and the like.
-
-=== CHI URIs ===
-
-CHK (Content Hash Keyed) files are immutable sequences of bytes. They are
-uploaded in a distributed fashion using a "storage index" (for the "location"
-property), and encrypted using a "read key". A secure hash of the data is
-computed to help validate the data afterwards (providing the "identification"
-property). All of these pieces, plus information about the file's size and
-the number of shares into which it has been distributed, are put into the
-"CHK" uri. The storage index is derived by hashing the read key (using a
-tagged SHA-256d hash, then truncated to 128 bits), so it does not need to be
-physically present in the URI.
-
-The current format for CHK URIs is the concatenation of the following
-strings:
-
- URI:CHK:(key):(hash):(needed-shares):(total-shares):(size)
-
-Where (key) is the base32 encoding of the 16-byte AES read key, (hash) is the
-base32 encoding of the SHA-256 hash of the URI Extension Block,
-(needed-shares) is an ascii decimal representation of the number of shares
-required to reconstruct this file, (total-shares) is the same representation
-of the total number of shares created, and (size) is an ascii decimal
-representation of the size of the data represented by this URI. All base32
-encodings are expressed in lower-case, with the trailing '=' signs removed.
-
-For example, the following is a CHK URI, generated from the contents of the
-architecture.txt document that lives next to this one in the source tree:
-
-URI:CHK:ihrbeov7lbvoduupd4qblysj7a:bg5agsdt62jb34hxvxmdsbza6do64f4fg5anxxod2buttbo6udzq:3:10:28733
-
-Historical note: The name "CHK" is somewhat inaccurate and continues to be
-used for historical reasons. "Content Hash Key" means that the encryption key
-is derived by hashing the contents, which gives the useful property that
-encoding the same file twice will result in the same URI. However, this is an
-optional step: by passing a different flag to the appropriate API call, Tahoe
-will generate a random encryption key instead of hashing the file: this gives
-the useful property that the URI or storage index does not reveal anything
-about the file's contents (except filesize), which improves privacy. The
-URI:CHK: prefix really indicates that an immutable file is in use, without
-saying anything about how the key was derived.
-
-=== LIT URIs ===
-
-LITeral files are also an immutable sequence of bytes, but they are so short
-that the data is stored inside the URI itself. These are used for files of 55
-bytes or shorter, which is the point at which the LIT URI is the same length
-as a CHK URI would be.
-
-LIT URIs do not require an upload or download phase, as their data is stored
-directly in the URI.
-
-The format of a LIT URI is simply a fixed prefix concatenated with the base32
-encoding of the file's data:
-
- URI:LIT:bjuw4y3movsgkidbnrwg26lemf2gcl3xmvrc6kropbuhi3lmbi
-
-The LIT URI for an empty file is "URI:LIT:", and the LIT URI for a 5-byte
-file that contains the string "hello" is "URI:LIT:nbswy3dp".
-
-=== Mutable File URIs ===
-
-The other kind of DHT entry is the "mutable slot", in which the URI names a
-container to which data can be placed and retrieved without changing the
-identity of the container.
-
-These slots have write-caps (which allow read/write access), read-caps (which
-only allow read-access), and verify-caps (which allow a file checker/repairer
-to confirm that the contents exist, but does not let it decrypt the
-contents).
-
-Mutable slots use public key technology to provide data integrity, and put a
-hash of the public key in the URI. As a result, the data validation is
-limited to confirming that the data retrieved matches _some_ data that was
-uploaded in the past, but not _which_ version of that data.
-
-The format of the write-cap for mutable files is:
-
- URI:SSK:(writekey):(fingerprint)
-
-Where (writekey) is the base32 encoding of the 16-byte AES encryption key
-that is used to encrypt the RSA private key, and (fingerprint) is the base32
-encoded 32-byte SHA-256 hash of the RSA public key. For more details about
-the way these keys are used, please see docs/mutable.txt .
-
-The format for mutable read-caps is:
-
- URI:SSK-RO:(readkey):(fingerprint)
-
-The read-cap is just like the write-cap except it contains the other AES
-encryption key: the one used for encrypting the mutable file's contents. This
-second key is derived by hashing the writekey, which allows the holder of a
-write-cap to produce a read-cap, but not the other way around. The
-fingerprint is the same in both caps.
-
-Historical note: the "SSK" prefix is a perhaps-inaccurate reference to
-"Sub-Space Keys" from the Freenet project, which uses a vaguely similar
-structure to provide mutable file access.
-
-== Directory URIs ==
-
-The grid layer provides a mapping from URI to data. To turn this into a graph
-of directories and files, the "vdrive" layer (which sits on top of the grid
-layer) needs to keep track of "directory nodes", or "dirnodes" for short.
-source:docs/dirnodes.txt describes how these work.
-
-Dirnodes are contained inside mutable files, and are thus simply a particular
-way to interpret the contents of these files. As a result, a directory
-write-cap looks a lot like a mutable-file write-cap:
-
- URI:DIR2:(writekey):(fingerprint)
-
-Likewise directory read-caps (which provide read-only access to the
-directory) look much like mutable-file read-caps:
-
- URI:DIR2-RO:(readkey):(fingerprint)
-
-Historical note: the "DIR2" prefix is used because the non-distributed
-dirnodes in earlier Tahoe releases had already claimed the "DIR" prefix.
-
-== Internal Usage of URIs ==
-
-The classes in source:src/allmydata/uri.py are used to pack and unpack these
-various kinds of URIs. Three Interfaces are defined (IURI, IFileURI, and
-IDirnodeURI) which are implemented by these classes, and string-to-URI-class
-conversion routines have been registered as adapters, so that code which
-wants to extract e.g. the size of a CHK or LIT uri can do:
-
-{{{
-print IFileURI(uri).get_size()
-}}}
-
-If the URI does not represent a CHK or LIT uri (for example, if it was for a
-directory instead), the adaptation will fail, raising a TypeError inside the
-IFileURI() call.
-
-Several utility methods are provided on these objects. The most important is
-{{{ to_string() }}}, which returns the string form of the URI. Therefore {{{
-IURI(uri).to_string == uri }}} is true for any valid URI. See the IURI class
-in source:src/allmydata/interfaces.py for more details.
-