Last-Modified: Sun, 09 Feb 2025 14:04:36 GMT
Expires: Wed, 07 Feb 2035 14:04:36 GMT

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<title>cpython.git - https://github.com/python/cpython.git</title>
<meta name='generator' content='cgit v0.12'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit-data/cgit-techsat.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://service.techsat.com/oss-git/cpython.git/atom/Doc/lib/libstruct.tex?h=v3.14.0a3' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/oss-git/'><img src='/cgit-data/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/oss-git/'>index</a> : <a title='cpython.git' href='/oss-git/cpython.git/'>cpython.git</a></td><td class='form'><form method='get' action=''>
<input type='hidden' name='id' value='be260101cb3537be622f5457233a537dfb5044e4'/><select name='h' onchange='this.form.submit();'>
<option value='2.7'>2.7</option>
<option value='3.3'>3.3</option>
<option value='3.4'>3.4</option>
<option value='3.5'>3.5</option>
<option value='3.6'>3.6</option>
<option value='benjamin-clang'>benjamin-clang</option>
<option value='benjamin-iteration-torture'>benjamin-iteration-torture</option>
<option value='buildbot-custom'>buildbot-custom</option>
<option value='master'>master</option>
</select> <input type='submit' name='' value='switch'/></form></td></tr>
<tr><td class='sub'>https://github.com/python/cpython.git</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/oss-git/cpython.git/?h=v3.14.0a3'>summary</a><a href='/oss-git/cpython.git/refs/?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>refs</a><a href='/oss-git/cpython.git/log/Doc/lib/libstruct.tex?h=v3.14.0a3'>log</a><a class='active' href='/oss-git/cpython.git/tree/Doc/lib/libstruct.tex?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>tree</a><a href='/oss-git/cpython.git/commit/Doc/lib/libstruct.tex?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>commit</a><a href='/oss-git/cpython.git/diff/Doc/lib/libstruct.tex?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>diff</a><a href='/oss-git/cpython.git/stats/Doc/lib/libstruct.tex?h=v3.14.0a3'>stats</a></td><td class='form'><form class='right' method='get' action='/oss-git/cpython.git/log/Doc/lib/libstruct.tex'>
<input type='hidden' name='h' value='v3.14.0a3'/><input type='hidden' name='id' value='be260101cb3537be622f5457233a537dfb5044e4'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='text' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/oss-git/cpython.git/tree/?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>root</a>/<a href='/oss-git/cpython.git/tree/Doc?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>Doc</a>/<a href='/oss-git/cpython.git/tree/Doc/lib?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>lib</a>/<a href='/oss-git/cpython.git/tree/Doc/lib/libstruct.tex?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>libstruct.tex</a></div><div class='content'>blob: 5925328e9c3393898c1d52910d438de9491b758b (<a href='/oss-git/cpython.git/plain/Doc/lib/libstruct.tex?h=v3.14.0a3&amp;id=be260101cb3537be622f5457233a537dfb5044e4'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
</pre></td>
<td class='lines'><pre><code><span class="hl kwa">\section</span><span class="hl opt">{</span>Built-in Module <span class="hl kwa">\module</span><span class="hl opt">{</span>struct<span class="hl opt">}}</span>
<span class="hl kwa">\label</span><span class="hl opt">{</span>module-struct<span class="hl opt">}</span>
<span class="hl kwa">\bimodindex</span><span class="hl opt">{</span>struct<span class="hl opt">}</span>
<span class="hl kwa">\indexii</span><span class="hl opt">{</span>C&#64;<span class="hl kwa">\C</span><span class="hl opt">{}}{</span>structures<span class="hl opt">}</span>

This module performs conversions between Python values and C
structs represented as Python strings.  It uses <span class="hl kwa">\dfn</span><span class="hl opt">{</span>format strings<span class="hl opt">}</span>
(explained below) as compact descriptions of the lay-out of the C
structs and the intended conversion to/from Python values.

The module defines the following exception and functions:


<span class="hl kwa">\begin</span><span class="hl opt">{</span>excdesc<span class="hl opt">}{</span>error<span class="hl opt">}</span>
  Exception raised on various occasions; argument is a string
  describing what is wrong.
<span class="hl kwa">\end</span><span class="hl opt">{</span>excdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>pack<span class="hl opt">}{</span>fmt, v1, v2, <span class="hl opt">{</span><span class="hl kwa">\rm \ldots</span><span class="hl opt">}}</span>
  Return a string containing the values
  <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>v1<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>v2<span class="hl opt">}</span>, <span class="hl opt">{</span><span class="hl kwa">\rm \ldots</span><span class="hl opt">}}</span> packed according to the given
  format.  The arguments must match the values required by the format
  exactly.
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>unpack<span class="hl opt">}{</span>fmt, string<span class="hl opt">}</span>
  Unpack the string (presumably packed by <span class="hl kwa">\code</span><span class="hl opt">{</span>pack(<span class="hl kwa">\var</span><span class="hl opt">{</span>fmt<span class="hl opt">}</span>, <span class="hl opt">{</span><span class="hl kwa">\rm \ldots</span><span class="hl opt">}</span>)<span class="hl opt">}</span>)
  according to the given format.  The result is a tuple even if it
  contains exactly one item.  The string must contain exactly the
  amount of data required by the format (i.e.  <span class="hl kwa">\code</span><span class="hl opt">{</span>len(<span class="hl kwa">\var</span><span class="hl opt">{</span>string<span class="hl opt">}</span>)<span class="hl opt">}</span> must
  equal <span class="hl kwa">\code</span><span class="hl opt">{</span>calcsize(<span class="hl kwa">\var</span><span class="hl opt">{</span>fmt<span class="hl opt">}</span>)<span class="hl opt">}</span>).
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>calcsize<span class="hl opt">}{</span>fmt<span class="hl opt">}</span>
  Return the size of the struct (and hence of the string)
  corresponding to the given format.
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

Format characters have the following meaning; the conversion between C
and Python values should be obvious given their types:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>tableiii<span class="hl opt">}{</span>c|l|l<span class="hl opt">}{</span>samp<span class="hl opt">}{</span>Format<span class="hl opt">}{</span>C Type<span class="hl opt">}{</span>Python<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>x<span class="hl opt">}{</span>pad byte<span class="hl opt">}{</span>no value<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>c<span class="hl opt">}{</span>char<span class="hl opt">}{</span>string of length <span class="hl num">1</span><span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>b<span class="hl opt">}{</span>signed char<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>B<span class="hl opt">}{</span>unsigned char<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>h<span class="hl opt">}{</span>short<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>H<span class="hl opt">}{</span>unsigned short<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>i<span class="hl opt">}{</span>int<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>I<span class="hl opt">}{</span>unsigned int<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>l<span class="hl opt">}{</span>long<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>L<span class="hl opt">}{</span>unsigned long<span class="hl opt">}{</span>integer<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>f<span class="hl opt">}{</span>float<span class="hl opt">}{</span>float<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>d<span class="hl opt">}{</span>double<span class="hl opt">}{</span>float<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>s<span class="hl opt">}{</span>char<span class="hl opt">[]}{</span>string<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>tableiii<span class="hl opt">}</span>

A format character may be preceded by an integral repeat count; e.g.\
the format string <span class="hl kwa">\code</span><span class="hl opt">{</span>'<span class="hl num">4</span>h'<span class="hl opt">}</span> means exactly the same as <span class="hl kwa">\code</span><span class="hl opt">{</span>'hhhh'<span class="hl opt">}</span>.

Whitespace characters between formats are ignored; a count and its
format must not contain whitespace though.

For the <span class="hl kwa">\code</span><span class="hl opt">{</span>'s'<span class="hl opt">}</span> format character, the count is interpreted as the
size of the string, not a repeat count like for the other format
characters; e.g. <span class="hl kwa">\code</span><span class="hl opt">{</span>'<span class="hl num">10</span>s'<span class="hl opt">}</span> means a single <span class="hl num">10</span>-byte string, while
<span class="hl kwa">\code</span><span class="hl opt">{</span>'<span class="hl num">10</span>c'<span class="hl opt">}</span> means <span class="hl num">10</span> characters.  For packing, the string is
truncated or padded with null bytes as appropriate to make it fit.
For unpacking, the resulting string always has exactly the specified
number of bytes.  As a special case, <span class="hl kwa">\code</span><span class="hl opt">{</span>'<span class="hl num">0</span>s'<span class="hl opt">}</span> means a single, empty
string (while <span class="hl kwa">\code</span><span class="hl opt">{</span>'<span class="hl num">0</span>c'<span class="hl opt">}</span> means <span class="hl num">0</span> characters).

For the <span class="hl kwa">\code</span><span class="hl opt">{</span>'I'<span class="hl opt">}</span> and <span class="hl kwa">\code</span><span class="hl opt">{</span>'L'<span class="hl opt">}</span> format characters, the return
value is a Python long integer.

By default, C numbers are represented in the machine's native format
and byte order, and properly aligned by skipping pad bytes if
necessary (according to the rules used by the C compiler).

Alternatively, the first character of the format string can be used to
indicate the byte order, size and alignment of the packed data,
according to the following table:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>tableiii<span class="hl opt">}{</span>c|l|l<span class="hl opt">}{</span>samp<span class="hl opt">}{</span>Character<span class="hl opt">}{</span>Byte order<span class="hl opt">}{</span>Size and alignment<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>&#64;<span class="hl opt">}{</span>native<span class="hl opt">}{</span>native<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>=<span class="hl opt">}{</span>native<span class="hl opt">}{</span>standard<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>&lt;<span class="hl opt">}{</span>little-endian<span class="hl opt">}{</span>standard<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>&gt;<span class="hl opt">}{</span>big-endian<span class="hl opt">}{</span>standard<span class="hl opt">}</span>
  <span class="hl kwa">\lineiii</span><span class="hl opt">{</span>!<span class="hl opt">}{</span>network (= big-endian)<span class="hl opt">}{</span>standard<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>tableiii<span class="hl opt">}</span>

If the first character is not one of these, <span class="hl kwa">\code</span><span class="hl opt">{</span>'&#64;'<span class="hl opt">}</span> is assumed.

Native byte order is big-endian or little-endian, depending on the
host system (e.g. Motorola and Sun are big-endian; Intel and DEC are
little-endian).

Native size and alignment are determined using the C compiler's sizeof
expression.  This is always combined with native byte order.

Standard size and alignment are as follows: no alignment is required
for any type (so you have to use pad bytes); short is <span class="hl num">2</span> bytes; int and
long are <span class="hl num">4</span> bytes.  Float and double are <span class="hl num">32</span>-bit and <span class="hl num">64</span>-bit IEEE floating
point numbers, respectively.

Note the difference between <span class="hl kwa">\code</span><span class="hl opt">{</span>'&#64;'<span class="hl opt">}</span> and <span class="hl kwa">\code</span><span class="hl opt">{</span>'='<span class="hl opt">}</span>: both use native
byte order, but the size and alignment of the latter is standardized.

The form <span class="hl kwa">\code</span><span class="hl opt">{</span>'!'<span class="hl opt">}</span> is available for those poor souls who claim they
can't remember whether network byte order is big-endian or
little-endian.

There is no way to indicate non-native byte order (i.e. force
byte-swapping); use the appropriate choice of <span class="hl kwa">\code</span><span class="hl opt">{</span>'&lt;'<span class="hl opt">}</span> or
<span class="hl kwa">\code</span><span class="hl opt">{</span>'&gt;'<span class="hl opt">}</span>.

Examples (all using native byte order, size and alignment, on a
big-endian machine):

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; from struct import *
&gt;&gt;&gt; pack('hhl', <span class="hl num">1</span>, <span class="hl num">2</span>, <span class="hl num">3</span>)
'<span class="hl kwa">\000\001\000\002\000\000\000\003</span>'
&gt;&gt;&gt; unpack('hhl', '<span class="hl kwa">\000\001\000\002\000\000\000\003</span>')
(<span class="hl num">1</span>, <span class="hl num">2</span>, <span class="hl num">3</span>)
&gt;&gt;&gt; calcsize('hhl')
<span class="hl num">8</span>
&gt;&gt;&gt; 
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
<span class="hl slc">%</span>
Hint: to align the end of a structure to the alignment requirement of
a particular type, end the format with the code for that type with a
repeat count of zero, e.g.\ the format <span class="hl kwa">\code</span><span class="hl opt">{</span>'llh0l'<span class="hl opt">}</span> specifies two
pad bytes at the end, assuming longs are aligned on <span class="hl num">4</span>-byte boundaries.
This only works when native size and alignment are in effect;
standard size and alignment does not enforce any alignment.

<span class="hl kwa">\begin</span><span class="hl opt">{</span>seealso<span class="hl opt">}</span>
<span class="hl kwa">\seemodule</span><span class="hl opt">{</span>array<span class="hl opt">}{</span>packed binary storage of homogeneous data<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>seealso<span class="hl opt">}</span>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='http://git.zx2c4.com/cgit/about/'>cgit v0.12</a> at 2025-02-09 14:04:36 (GMT)</div>
</div> <!-- id=cgit -->
</body>
</html>
