Re: Can't seem to get correct hash for binary download

"Bastian Eicher" <[email protected]> Wed, 12 Apr 2023 13:27:48 +0200
Newsgroups gmane.comp.file-systems.zero-install.devel
Message-ID <[email protected]>
This is a multipart message in MIME format.

--===============2714879272240115849==
Content-Type: multipart/alternative;
 boundary="----=_NextPart_000_0005_01D96D42.937BE620"
Content-Language: de

This is a multipart message in MIME format.

------=_NextPart_000_0005_01D96D42.937BE620
Content-Type: text/plain;
	charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

I forgot an import detail last time: The manifest digest also covers =
files=E2=80=99 last changed timestamp. Unlike for files extracted from =
<archive>s, for <file>s this is always set to 0 Unix time.

=20

So, to manually calculate the digest you could run:

touch --date=3D@0 o/bins/v2.32.2/gnu/amd64/direnv.linux-amd64

0install digest --algorithm=3Dsha1new o/bins/v2.32.2/gnu/amd64

=20

I created a PR for you feed that adjusts the feed accordingly and it =
works for me locally: https://github.com/ohmrun/0install_direnv/pull/1

=20

The whole experience of creating feeds is generally a lot smoother when =
using <archive>s and/or tools like 0template, so you don=E2=80=99t have =
to figure out digests by hand.

But I=E2=80=99ll definitely write these steps up in a proper tutorial =
soon-ish.

=20

From: Laurence Taylor <[email protected]>=20
Sent: 12th of April 2023 12:44
To: Bastian Eicher <[email protected]>
Subject: Re: [Zero-install-devel] Can't seem to get correct hash for =
binary download

=20

Thanks. I can affect the sha by changing executable and dest, but no =
luck getting the correct digest by modifying the user/write bit of the =
file (which as far as I can tell is the only thing in stat which is =
used)

=20

Is there any way I can stop it from removing the tmp directory to =
inspect what properties of the download are?

=20

Code here <https://github.com/ohmrun/0install_direnv>  including the =
binary so if you have the time you can see what results you get.

=20

current XML:

=20

<?xml version=3D"1.0" ?>

<?xml-stylesheet type=3D'text/xsl' href=3D'interface.xsl'?>

<interface =
uri=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dire=
nv.xml" =
xmlns=3D"http://zero-install.sourceforge.net/2004/injector/interface" =
xmlns:compile=3D"http://zero-install.sourceforge.net/2006/namespaces/0com=
pile" =
xmlns:ns=3D"http://zero-install.sourceforge.net/2006/namespaces/0compile"=
 =
xmlns:release=3D"http://zero-install.sourceforge.net/2007/namespaces/0rel=
ease">

=20

  <name>direnv</name>

  <summary>Unclutter your .profile</summary>

  <homepage>http://direnv.net/</homepage>

  <description>

direnv is a shell extension that loads different environment variables =
depending

on your path.

=20

Instead of putting every environment variable in your =
&quot;~/.profile&quot;, have

directory-specific &quot;.envrc&quot; files for your AWSACCESSKEY, =
LIBRARY_PATH or other

environment variables.

=20

It does some of the job of rvm, rbenv or virtualenv but in a =
language-agnostic

way.</description>

  <category>Development</category>

  <needs-terminal/>

  <group released=3D"2022-24-11" version=3D"2.32.2">   =20

    <implementation arch=3D"Linux-x86_64" =
id=3D"f6c285b6cba7efd56c78ab780116a2dca9ce3b38" =
main=3D"direnv.linux-amd64" released=3D"2022-11-24" version=3D"2.32.2">

    <manifest-digest =
sha1new=3D"f6c285b6cba7efd56c78ab780116a2dca9ce3b38"/>

    <file dest=3D"direnv.linux-amd64" executable=3D"true" =
href=3D"https://github.com/direnv/direnv/releases/download/v2.32.2/direnv=
.linux-amd64" size=3D"8988761"/>=20

    </implementation>

  </group>

</interface>

=20

=20

On Tue, Apr 4, 2023 at 5:10=E2=80=AFPM Bastian Eicher =
<[email protected] <mailto:[email protected]> > wrote:

Hi Laurence,

=20

the manifest digest <https://docs.0install.net/specifications/manifest/> =
 always covers an entire directory with file names and contents. Even =
for a single file it still covers that file=E2=80=99s name as well, so =
sha256sum by itself is not enough.

=20

To get a suitable manifest digest for a single file you can do one of =
the following:

*	Create an empty directory, place the file inside it and then run =
0install digest dir-path.

or

*	Create a feed with everything except the IDs and <manifest-digest>s =
and then run the following (only works on Windows):
0install run --command=3D0publish =
https://apps.0install.net/0install/0publish-win.xml --add-missing =
your-feed.xml
This will automatically download the <file>s referenced in the feed and =
calculate and insert any missing <manifest-digest>s.

=20

Implementation IDs can be anything, as long as they=E2=80=99re unique =
within the feed. But historically they=E2=80=99re usually set equal to =
the digest.

=20

For a single executable <file> the main=3D attribute of the =
<implementation> should match the <file>=E2=80=99s dest=3D. In your case =
that would be main=3D"direnv" instead of =
main=3D"./o/bins/v2.32.2/gnu/amd64/direnv".

Basically <file dest=3D"direnv" .../> tells 0install to download the =
file and put it into the implementation directory under the name direnv. =
And main=3D"direnv" tells 0install that to run that implementation it =
needs to look for a file named direnv in the directory.

=20

Hope this helps. We definitely need to add some more comprehensive =
tutorials to the docs.

=20

Regards

Bastian

=20

From: Laurence Taylor <[email protected] =
<mailto:[email protected]> >=20
Sent: 4th of April 2023 16:39
To: [email protected] =
<mailto:[email protected]>=20
Subject: [Zero-install-devel] Can't seem to get correct hash for binary =
download

=20

Hi all.

I'm hoping to remove some of the pain in installing direnv on windows by =
using 0install, but it's distributed as a bare binary and I'm running =
into problems.

=20

Show stopper being that the downloads made by 0install are consistently =
reporting a different hash to the curl + sha256sum thing I'm using to do =
the manifest-digest on the binary.=20

=20

=20

info: 0install 2.18 (OCaml version): verbose mode on
info: Missing selection of =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml:=
 <implementation> at =
/mnt/dat/i/prj/bertha/.local/bertha/o/var/0install/cache/interfaces/https=
%3a%2f%2fraw.githubusercontent.com <http://2fraw.githubusercontent.com> =
%2fohmrun%2f0install_direnv%2fmain%2fDirenv.xml:22:152
info: Checking for GTK plugin at =
'/mnt/dat/i/prj/bertha/.local/bertha/o/os/linux/prg/0install/lib/0install=
-gtk/gui_gtk.cmxs'
info: Checking for GTK plugin at =
'/mnt/dat/i/prj/bertha/.local/bertha/o/os/linux/prg/0install/lib/0install=
.net/gui_gtk.cmxs <http://0install.net/gui_gtk.cmxs> '
info: Initialising GTK GUI
info: Switching to GLib mainloop...
debug: download_icon =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
info: No PNG icons found in =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
debug: download_icon =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
info: No PNG icons found in =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
info: Starting download of feed =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml=
'
debug: download_and_import_feed =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
debug: Download URL =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml=
'... (for =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml)=

debug: start_monitoring =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
debug: Scheduling download of =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
info: HTTP GET =
"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml=
"
debug: Checking for certificate file =
"/etc/ssl/certs/ca-certificates.crt"
info: Download =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml=
' completed successfully (2415 bytes)
info: Running GnuPG: /usr/bin/gpg --no-secmem-warning --batch =
--status-fd 1 --keyserver-options no-auto-key-retrieve --verify =
/tmp/0install-b37581-gpg -
debug: Updating =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml=
' from network; modified at 2023-04-04 16:16
debug: No change
info: Updated feed cache checked time for =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml =
(modified 2023-04-04 16:16)
debug: stop_monitoring =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml
info: OK button =3D> true
info: Missing selection of =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml:=
 <implementation> at =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml:=
22:152
debug: download_impls: for =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml =
get 2.32.2
debug: Download URL =
'https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/am=
d64/direnv'... (for =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml)=

debug: start_monitoring =
https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/amd=
64/direnv
debug: Scheduling download of =
https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/amd=
64/direnv
info: HTTP GET =
"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/am=
d64/direnv"
info: Redirect from =
'https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/am=
d64/direnv' to =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/bins/v2.=
32.2/gnu/amd64/direnv' =
(https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/bins/v2.=
32.2/gnu/amd64/direnv)
debug: Scheduling download of =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/bins/v2.3=
2.2/gnu/amd64/direnv
info: HTTP GET =
"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/bins/v2.=
32.2/gnu/amd64/direnv"
info: Download =
'https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/bins/v2.=
32.2/gnu/amd64/direnv' completed successfully (8988761 bytes)
info: Removing temporary directory =
'/mnt/dat/i/prj/bertha/.local/bertha/o/var/0install/cache/implementations=
/tmp-2e3a418d'
info: OK button =3D> false
info: Reporting error to user: Incorrect manifest -- archive is =
corrupted.
Required digest: =
sha256=3D43e7200746d526aec6f37e689dcced23d5e42cfac7022e301d6b37420d625663=

Actual digest: =
sha256=3Def1810692d07fb818f121fae5032d69719e982c636e305ff11e3d8955fc5d1cc=

... downloading implementation =
https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Direnv.xml =
2.32.2 (id=3D./o/bins/v2.32.2/gnu/amd64)
Raised at Zeroinstall__Fetch.fetcher#download_impls.(fun) in file =
"src/zeroinstall/fetch.ml <http://fetch.ml> ", line 648, characters =
10-21
Called from =
Lwt.Sequential_composition.bind.create_result_promise_and_callback_if_def=
erred.callback in file "src/core/lwt.ml <http://lwt.ml> ", line 1849, =
characters 23-26

debug: stop_monitoring =
https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2/gnu/amd=
64/direnv

=20

Still reading the docs but it's been confusing me the entire day so I =
thought I'd sent a note in.

=20

regards,

Loz


------=_NextPart_000_0005_01D96D42.937BE620
Content-Type: text/html;
	charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" =
xmlns=3D"http://www.w3.org/TR/REC-html40"><head><meta =
http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8"><meta =
name=3DGenerator content=3D"Microsoft Word 15 (filtered =
medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
span.EmailStyle18
	{mso-style-type:personal-reply;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Calibri",sans-serif;
	mso-ligatures:standardcontextual;
	mso-fareast-language:EN-US;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
	{page:WordSection1;}
/* List Definitions */
@list l0
	{mso-list-id:295257340;
	mso-list-template-ids:-2103168604;}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:36.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level2
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:72.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level3
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:108.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level4
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:144.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level5
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:180.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level6
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:216.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level7
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:252.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level8
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:288.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level9
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:324.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1
	{mso-list-id:683367233;
	mso-list-template-ids:1093451504;}
@list l1:level1
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:36.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level2
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:72.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level3
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:108.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level4
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:144.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level5
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:180.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level6
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:216.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level7
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:252.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level8
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:288.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level9
	{mso-level-number-format:bullet;
	mso-level-text:=EF=82=B7;
	mso-level-tab-stop:324.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
ol
	{margin-bottom:0cm;}
ul
	{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DDE link=3Dblue =
vlink=3Dpurple style=3D'word-wrap:break-word'><div =
class=3DWordSection1><p class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'>I forgot an import detail last =
time: The manifest digest also covers files=E2=80=99 last changed =
timestamp. Unlike for files extracted from &lt;archive&gt;s, for =
&lt;file&gt;s this is always set to 0 Unix time.<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'>So, to manually calculate the =
digest you could run:<o:p></o:p></span></p><p class=3DMsoNormal><span =
lang=3DEN-US =
style=3D'font-family:Consolas;mso-fareast-language:EN-US'>touch =
--date=3D@0 =
o/bins/v2.32.2/gnu/amd64/direnv.linux-amd64<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-family:Consolas;mso-fareast-language:EN-US'>0install =
digest --algorithm=3Dsha1new =
o/bins/v2.32.2/gnu/amd64<o:p></o:p></span></p><p class=3DMsoNormal><span =
lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'>I created a PR for you feed that =
adjusts the feed accordingly and it works for me locally: <a =
href=3D"https://github.com/ohmrun/0install_direnv/pull/1">https://github.=
com/ohmrun/0install_direnv/pull/1</a><o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'>The whole experience of creating =
feeds is generally a lot smoother when using &lt;archive&gt;s and/or =
tools like 0template, so you don=E2=80=99t have to figure out digests by =
hand.<o:p></o:p></span></p><p class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'>But I=E2=80=99ll definitely write =
these steps up in a proper tutorial soon-ish.<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><div =
style=3D'border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm =
0cm 0cm'><p class=3DMsoNormal><b><span =
lang=3DEN-US>From:</span></b><span lang=3DEN-US> Laurence Taylor =
&lt;[email protected]&gt; <br><b>Sent:</b> 12<sup>th</sup> of April =
2023 12:44<br><b>To:</b> Bastian Eicher =
&lt;[email protected]&gt;<br><b>Subject:</b> Re: [Zero-install-devel] =
Can't seem to get correct hash for binary =
download<o:p></o:p></span></p></div><p class=3DMsoNormal><span =
lang=3DEN-US><o:p>&nbsp;</o:p></span></p><div><div><p =
class=3DMsoNormal>Thanks. I can affect the sha by changing <span =
style=3D'font-family:"Courier New"'>executable</span> and <span =
style=3D'font-family:"Courier New"'>dest</span>, but no luck getting the =
correct digest by modifying the user/write bit of the file (which as far =
as I can tell is the only thing in stat which is =
used)<o:p></o:p></p></div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p><div><div><p class=3DMsoNormal>Is =
there any way I can stop it from removing the tmp directory to inspect =
what properties of the download are?<o:p></o:p></p></div><div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p =
class=3DMsoNormal>Code <a =
href=3D"https://github.com/ohmrun/0install_direnv">here</a> including =
the binary so if you have the time you can see what results you =
get.<o:p></o:p></p></div><div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p =
class=3DMsoNormal>current XML:<o:p></o:p></p></div><div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;?</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>xml</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#9CDCFE'> =
version</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;1.0&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>?&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;?</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>xml-stylesheet</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#9CDCFE'> =
type</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>'text/xsl'</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#9CDCFE'> =
href</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>'interface.xsl'</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>?&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>interface</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>uri</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml">https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Di=
renv.xml</a>&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>xmlns</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"http://zero-install.sourceforge.net/2004/injector/interface">http=
://zero-install.sourceforge.net/2004/injector/interface</a>&quot;</span><=
span style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>xmlns:compile</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"http://zero-install.sourceforge.net/2006/namespaces/0compile">htt=
p://zero-install.sourceforge.net/2006/namespaces/0compile</a>&quot;</span=
><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'> </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>xmlns:ns</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"http://zero-install.sourceforge.net/2006/namespaces/0compile">htt=
p://zero-install.sourceforge.net/2006/namespaces/0compile</a>&quot;</span=
><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'> </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>xmlns:release</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"http://zero-install.sourceforge.net/2007/namespaces/0release">htt=
p://zero-install.sourceforge.net/2007/namespaces/0release</a>&quot;</span=
><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p>&nbsp;</o:p></span></p><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>name</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>direnv</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>name</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>summary</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>Unclutter your .profile</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>summary</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>homepage</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'><a =
href=3D"http://direnv.net/">http://direnv.net/</a></span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>homepage</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>description</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>direnv =
is a shell extension that loads different environment variables =
depending<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>on =
your path.<o:p></o:p></span></p></div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p>&nbsp;</o:p></span></p><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>Instead of putting every environment variable in =
your </span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>&amp;quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>~/.profile</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>&amp;quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>, =
have<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>directory-specific </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>&amp;quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>.envrc</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>&amp;quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> files =
for your AWSACCESSKEY, LIBRARY_PATH or =
other<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>environment variables.<o:p></o:p></span></p></div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p>&nbsp;</o:p></span></p><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>It =
does some of the job of rvm, rbenv or virtualenv but in a =
language-agnostic<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>way.</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>description</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>category</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>Development</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>category</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>needs-terminal</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>/&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>group</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>released</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;2022-24-11&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>version</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;2.32.2&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=C2=A0=C2=A0=C2=A0 =
<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=C2=A0=C2=A0=C2=A0=C2=A0</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>implementation</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>arch</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;Linux-x86_64&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>id</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;f6c285b6cba7efd56c78ab780116a2dca9ce3b38&quot;<=
/span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'> </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>main</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;direnv.linux-amd64&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>released</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;2022-11-24&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>version</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;2.32.2&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=C2=A0=C2=A0=C2=A0 </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>manifest-digest</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>sha1new</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;f6c285b6cba7efd56c78ab780116a2dca9ce3b38&quot;<=
/span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>/&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=C2=A0=C2=A0=C2=A0 </span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>file</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>dest</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;direnv.linux-amd64&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>executable</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;true&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>href</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;<a =
href=3D"https://github.com/direnv/direnv/releases/download/v2.32.2/direnv=
.linux-amd64">https://github.com/direnv/direnv/releases/download/v2.32.2/=
direnv.linux-amd64</a>&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#9CDCFE'>size</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=3D</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#CE9178'>&quot;8988761&quot;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>/&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'> =
<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'>=C2=A0=C2=A0=C2=A0=C2=A0</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>implementation</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier New";color:#D4D4D4'>=C2=A0 =
</span><span style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>group</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'line-height:8.25pt;background:#1E1E1E'><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&lt;/</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#569CD6'>interface</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:gray'>&gt;</span><span =
style=3D'font-size:6.0pt;font-family:"Courier =
New";color:#D4D4D4'><o:p></o:p></span></p></div></div></div><div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p></div></div></div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p><div><div><p class=3DMsoNormal>On =
Tue, Apr 4, 2023 at 5:10=E2=80=AFPM Bastian Eicher &lt;<a =
href=3D"mailto:[email protected]">[email protected]</a>&gt; =
wrote:<o:p></o:p></p></div><blockquote =
style=3D'border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm =
6.0pt;margin-left:4.8pt;margin-right:0cm'><div><div><div><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi =
Laurence,<o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>the <a =
href=3D"https://docs.0install.net/specifications/manifest/" =
target=3D"_blank">manifest digest</a> always covers an entire directory =
with file names and contents. Even for a single file it still covers =
that file=E2=80=99s name as well, so sha256sum by itself is not =
enough.</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>To get a suitable manifest digest for a single =
file&nbsp;you can do one of the following:</span><o:p></o:p></p><ul =
type=3Ddisc><li class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 =
level1 lfo1'><span lang=3DEN-US>Create an empty directory, place the =
file inside it and then run&nbsp;</span><span lang=3DEN-US =
style=3D'font-family:Consolas'>0install digest dir-path</span><span =
lang=3DEN-US>.</span><o:p></o:p></li></ul><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>or<o:p></o:p=
></p><ul type=3Ddisc><li class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 =
level1 lfo2'><span lang=3DEN-US>Create a feed with everything except the =
IDs and&nbsp;</span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;manifest-digest&gt;</span><span =
lang=3DEN-US>s and then run the following (only works on =
Windows):<br></span><span lang=3DEN-US =
style=3D'font-family:Consolas'>0install run --command=3D0publish <a =
href=3D"https://apps.0install.net/0install/0publish-win.xml" =
target=3D"_blank">https://apps.0install.net/0install/0publish-win.xml</a>=
 --add-missing your-feed.xml<br></span><span lang=3DEN-US>This will =
automatically download the&nbsp;</span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;file&gt;</span><span lang=3DEN-US>s =
referenced in the feed and calculate and insert any =
missing&nbsp;</span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;manifest-digest&gt;</span><span =
lang=3DEN-US>s.</span><o:p></o:p></li></ul><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>Implementation IDs can be anything, as long as =
they=E2=80=99re unique within the feed. But historically they=E2=80=99re =
usually set equal to the digest.</span><o:p></o:p></p><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>For a single executable </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;file&gt;</span><span lang=3DEN-US> =
the </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>main=3D</span><span lang=3DEN-US> =
attribute of the </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;implementation&gt;</span><span =
lang=3DEN-US> should match the </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;file&gt;</span><span =
lang=3DEN-US>=E2=80=99s </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>dest=3D</span><span lang=3DEN-US>. In =
your case that would be </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>main=3D&quot;direnv&quot;</span><span =
lang=3DEN-US> instead of </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>main=3D&quot;./o/bins/v2.32.2/gnu/amd64/di=
renv&quot;</span><span lang=3DEN-US>.</span><o:p></o:p></p><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>Basically </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>&lt;file dest=3D&quot;direnv&quot; =
.../&gt;</span><span lang=3DEN-US> tells 0install to download the file =
and put it into the implementation directory under the name </span><span =
lang=3DEN-US style=3D'font-family:Consolas'>direnv</span><span =
lang=3DEN-US>. And </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>main=3D&quot;direnv&quot;</span><span =
lang=3DEN-US> tells 0install that to run that implementation it needs to =
look for a file named </span><span lang=3DEN-US =
style=3D'font-family:Consolas'>direnv</span><span lang=3DEN-US> in the =
directory.</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>Hope this helps. We definitely need to add some more =
comprehensive tutorials to the docs.</span><o:p></o:p></p><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>Regards</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>Bastian</span><o:p></o:p></p><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><div =
style=3D'border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0cm =
0cm 0cm;border-color:currentcolor currentcolor'><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span =
lang=3DEN-US>From:</span></b><span lang=3DEN-US> Laurence Taylor &lt;<a =
href=3D"mailto:[email protected]" =
target=3D"_blank">[email protected]</a>&gt; <br><b>Sent:</b> =
4<sup>th</sup> of April 2023 16:39<br><b>To:</b> <a =
href=3D"mailto:[email protected]" =
target=3D"_blank">[email protected]</a><br><b>Subj=
ect:</b> [Zero-install-devel] Can't seem to get correct hash for binary =
download</span><o:p></o:p></p></div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
lang=3DEN-US>&nbsp;</span><o:p></o:p></p><div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi =
all.<o:p></o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I'm hoping =
to remove some of the pain in installing direnv on windows by using =
0install, but it's distributed as a bare binary and I'm running into =
problems.<o:p></o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p><=
/o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Show =
stopper being that the downloads made by 0install are consistently =
reporting a different hash to the curl + sha256sum thing I'm using to do =
the manifest-digest on the binary. <o:p></o:p></p></div><div><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p><=
/o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p><=
/o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span =
style=3D'font-family:"Courier New"'>info: 0install 2.18 (OCaml version): =
verbose mode on<br>info: Missing selection of <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>: &lt;implementation&gt; at =
/mnt/dat/i/prj/bertha/.local/bertha/o/var/0install/cache/interfaces/https=
%3a%2f%<a href=3D"http://2fraw.githubusercontent.com" =
target=3D"_blank">2fraw.githubusercontent.com</a>%2fohmrun%2f0install_dir=
env%2fmain%2fDirenv.xml:22:152<br>info: Checking for GTK plugin at =
'/mnt/dat/i/prj/bertha/.local/bertha/o/os/linux/prg/0install/lib/0install=
-gtk/gui_gtk.cmxs'<br>info: Checking for GTK plugin at =
'/mnt/dat/i/prj/bertha/.local/bertha/o/os/linux/prg/0install/lib/<a =
href=3D"http://0install.net/gui_gtk.cmxs" =
target=3D"_blank">0install.net/gui_gtk.cmxs</a>'<br>info: Initialising =
GTK GUI<br>info: Switching to GLib mainloop...<br>debug: download_icon =
<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>info: No PNG icons found in <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>debug: download_icon <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>info: No PNG icons found in <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>info: Starting download of feed '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>'<br>debug: download_and_import_feed <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>debug: Download URL '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml'." =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml'.</a>.. (for <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>)<br>debug: start_monitoring <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>debug: Scheduling download of <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>info: HTTP GET &quot;<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>&quot;<br>debug: Checking for certificate file =
&quot;/etc/ssl/certs/ca-certificates.crt&quot;<br>info: Download '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>' completed successfully (2415 bytes)<br>info: =
Running GnuPG: /usr/bin/gpg --no-secmem-warning --batch --status-fd 1 =
--keyserver-options no-auto-key-retrieve --verify =
/tmp/0install-b37581-gpg -<br>debug: Updating '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>' from network; modified at 2023-04-04 =
16:16<br>debug: No change<br>info: Updated feed cache checked time for =
<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a> (modified 2023-04-04 16:16)<br>debug: =
stop_monitoring <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a><br>info: OK button =3D&gt; true<br>info: Missing =
selection of <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>: &lt;implementation&gt; at <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml:22:152" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml:22:152</a><br>debug: download_impls: for <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a> get 2.32.2<br>debug: Download URL '<a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv'." =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv'.</a>.. (for <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a>)<br>debug: start_monitoring <a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv" =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv</a><br>debug: Scheduling download of <a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv" =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv</a><br>info: HTTP GET &quot;<a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv" =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv</a>&quot;<br>info: Redirect from '<a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv" =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv</a>' to '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/b=
ins/v2.32.2/gnu/amd64/direnv" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/o/bins/v2.32.2/gnu/amd64/direnv</a>' (<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/b=
ins/v2.32.2/gnu/amd64/direnv" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/o/bins/v2.32.2/gnu/amd64/direnv</a>)<br>debug: Scheduling =
download of <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/b=
ins/v2.32.2/gnu/amd64/direnv" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/o/bins/v2.32.2/gnu/amd64/direnv</a><br>info: HTTP GET &quot;<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/b=
ins/v2.32.2/gnu/amd64/direnv" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/o/bins/v2.32.2/gnu/amd64/direnv</a>&quot;<br>info: Download '<a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/o/b=
ins/v2.32.2/gnu/amd64/direnv" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/o/bins/v2.32.2/gnu/amd64/direnv</a>' completed successfully =
(8988761 bytes)<br>info: Removing temporary directory =
'/mnt/dat/i/prj/bertha/.local/bertha/o/var/0install/cache/implementations=
/tmp-2e3a418d'<br>info: OK button =3D&gt; false<br>info: Reporting error =
to user: Incorrect manifest -- archive is corrupted.<br>Required digest: =
sha256=3D43e7200746d526aec6f37e689dcced23d5e42cfac7022e301d6b37420d625663=
<br>Actual digest: =
sha256=3Def1810692d07fb818f121fae5032d69719e982c636e305ff11e3d8955fc5d1cc=
<br>... downloading implementation <a =
href=3D"https://raw.githubusercontent.com/ohmrun/0install_direnv/main/Dir=
env.xml" =
target=3D"_blank">https://raw.githubusercontent.com/ohmrun/0install_diren=
v/main/Direnv.xml</a> 2.32.2 (id=3D./o/bins/v2.32.2/gnu/amd64)<br>Raised =
at Zeroinstall__Fetch.fetcher#download_impls.(fun) in file =
&quot;src/zeroinstall/<a href=3D"http://fetch.ml" =
target=3D"_blank">fetch.ml</a>&quot;, line 648, characters =
10-21<br>Called from =
Lwt.Sequential_composition.bind.create_result_promise_and_callback_if_def=
erred.callback in file &quot;src/core/<a href=3D"http://lwt.ml" =
target=3D"_blank">lwt.ml</a>&quot;, line 1849, characters =
23-26<br><br>debug: stop_monitoring <a =
href=3D"https://github.com/ohmrun/0install_direnv/raw/main/o/bins/v2.32.2=
/gnu/amd64/direnv" =
target=3D"_blank">https://github.com/ohmrun/0install_direnv/raw/main/o/bi=
ns/v2.32.2/gnu/amd64/direnv</a></span><o:p></o:p></p></div><div><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p><=
/o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Still =
reading the docs but it's been confusing me the entire day so I thought =
I'd sent a note in.<o:p></o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p><=
/o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>regards,<o:p=
></o:p></p></div><div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Loz<o:p></o:=
p></p></div></div></div></div></div></blockquote></div></div></body></htm=
l>
------=_NextPart_000_0005_01D96D42.937BE620--



--===============2714879272240115849==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============2714879272240115849==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Zero-install-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/zero-install-devel

--===============2714879272240115849==--